ステッピングモーター制御ライブラリを作りたい(その3)「最大速度」

その1はこちらです。

 前回の記事で、S字と台形を使って滑らかな加減速を行う手法を説明しました。S字も台形も、加速に30ステップ、減速に30ステップを使っています。つまり、今の仕様のままだと最低でも合計60ステップ最低でも必要になるのです。
 例えば、前回と同じ仕様のモーター(1ステップ1.8度)だと、90度動かすのに50ステップですが、加速減速合わせて60ステップ使うのでおかしなことになります。では実際に見てみましょう。

台形型

f:id:takumus:20160911200033g:plain  90度は50ステップですので、最大速度に達する(30ステップ)事が出来ても、減速分のステップ(30ステップ)が足りないので、おかしなグラフになっています。今の仕様のままでは最低でも60ステップ分の移動がないと回転できない事になります。

S字型

f:id:takumus:20160911200034g:plain  S字も同じです。台形をベースに作っているので、同じく減速分が足りていません。

ステップが足りない場合はどうすれば良いか!

 足りないステップを無理やり足らせる方法もあります。傾斜を急にすれば良いのです。しかし、傾斜が急になればなるほど脱調の可能性は上がってしまうので、だめです。
 もう一つの方法は最大速度を下げる方法です。そもそも無理して最大速度に達しなくて良いのです。傾斜はそのままで、加減速分のステップに足りる分の、可能な限りの最大速度を計算します。今回はこの方法で行きたいと思います。

最大速度を下げる

最大速度を下げるように改良したバージョンを作りました。

台形型

f:id:takumus:20160911200035g:plain

S字型

f:id:takumus:20160911200036g:plain  アニメーションの通り、最初180度で回したときは最大速度に達して回りますが、90度で回したときは、最大速度を下げて回ります。こうすることで、加減速の傾斜を変えることなく、どのような角度に対しても緩やかに移行できます。
 どれだけ下げるべきかは、一次関数による簡単な式で導く事が出来ます。本当はもう少し細かい計算をしているのですが、後日ソースコードを公開するつもりです。  まだステッピングモーター現物を扱ったことがないのに色々と書いてしまいましたが、明日届くはずなので試したいです。これらのアニメーションはflashで作っています。アニメーションというか疑似ステッピングモーターを実際に制御するプログラムは書いているので、これをArduino(C++)へ移植してちゃんと動いてくれれば嬉しいです。

その4はこちらです。

ステッピングモーター制御ライブラリを作りたい(その2)「脱調を防ぐ方法」

その1はこちらです。

 前日、ステッピングモーターと、脱調について簡単な説明をしました。前日の説明と被りますが、

主な脱調の原因は

  1. 完全停止状態からの急発進。
  2. 高速回転中の急停止。
  3. 電気信号を送る間隔を短くしすぎる。
  4. とても重い物を動かす。

と言われています。
 cについては、電気信号を送る(以降ステップと呼びます)間隔を短くしすぎなければ良いですし、dは重い物を動かすことが出来るモーターを選べばよい話です。a bは、簡単に解決できる問題ではないので、今回から考えていきます。

急発進・急停止をしない工夫

 急発進・急停止はしないようにする方法はいくつか方法があります。その説明のために、前日のと同じく1ステップ1.8度のモーターを例に挙げます。

180度を急発進・急停止

f:id:takumus:20160911135302g:plain  これはflashでシミュレーションしたステッピングモーターなので脱調は起こりませんが、急加速、急停止をしていることが分かります。実際にこれを行うと、脱調してしまうかもしれません。

180度を徐々に発進・徐々に停止(台形型)

f:id:takumus:20160911140028g:plain  次は、徐々に加速し、徐々に減速するようにしました。これはステッピングモーター制御で良く行われる方法のひとつです。今回は、30ステップ分を加速と減速のために使っています。合計60ステップです。こうすることで、急な加速と停止は少なくなりました。しかし、台形の上辺の頂点に当たる部分で加速の大きな変化があります。これもまだ脱調の心配があるのです。それも無くしたいです。

180度を徐々に発進・徐々に停止(S字型)

f:id:takumus:20160911141255g:plain  台形での加速の変化をさらに少なくした物がこれです。今回はcos波を使って再現したのでカーブがやや急ですが、その辺は検証しながら調整したいと思います。(未だ実物を持っていないので笑)台形と同じく、30ステップ分を加速と減速に使っています。台形に比べて角が取れています。つまり急な速度変化が無くなったので脱調の可能性はグンと下がりました。

今回はここまで

 です。
 脱調が起きる原因と、それを防ぐいくつかの方法を紹介しました。このままではまだ問題があるので、次回その問題の解決を考えていきます。

その3はこちらです。

ステッピングモーター制御ライブラリを作りたい(その1)「ステッピングモーターとは」

 今までステッピングモーターを使った事がなかったので、使ってみようと思うのですが、せっかくなのでArduino用のライブラリを書きたくなりました。

サーボモーターとの違い

サーボモーターとは

ステッピングサーボはここでは扱いません。

 サーボは指定した角度へ回転することが出来ます。
 例えば、現在の軸の角度が0度でも、180度でも、軸を90度の位置へ回転しろ!と命令すれば、90度の位置まで回転します。
 本体の中には、可変抵抗と一般的なDCモーターが入っています。自分が向いている角度を可変抵抗で測りながらDCモーターを制御するため、絶対的な角度の制御が可能になっています。
 角度制御が可能なサーボの多くは、連続回転せず、180度しか回らなかったりするものが多いです。 f:id:takumus:20160910235120p:plain  可変抵抗が入っているという事はつまり。サーボの電源を切っても、自分の向いている角度を記憶しているので、電源投入時に元の角度へ戻ることが出来ます。
 また、もしも重い力がかかりすぎて、モーターが止まっても、重い力が外れた瞬間、直ちにその角度に到達します。

まとめ

  • 可変抵抗があるので角度を覚えることが出来る。
  • 回転中にモーターが止まっても、動ける状態になれば絶対に指定した角度にたどり着く。
  • 絶対的な角度指定が出来る。
  • 角度指定のできる一般的なサーボは180度しか回らない。

ステッピングモーターとは

 ステッピングモーターは電気信号を送った回数分回転します。1回の電気信号(以降1ステップと表現します)で、何度回転するかどうかは、モーターによって異なります。例えば、1ステップで1.8度回転するタイプのモーターを90度回転させるには、50ステップ送れば良いのです。ステップを送る間隔が短ければ早く。広ければ遅く回ります。 f:id:takumus:20160911130028p:plain
 また、連続回転が可能です。電気信号を送り続ければ、無限回転出来ます。
 しかしサーボと違い自分の絶対角度を知ることはできません。つまり、相対的な角度の制御しかできないのです。
 プリンターなどで用いられている物は、一番端にスイッチがあり、電源投入時にスイッチの位置までモーターを回し、触れた位置からの相対角度で制御しています。(多分ロータリーエンコーダーも合わせて使っています)
 ここでは詳しい説明を割愛しますが、雰囲気はこんな感じです。

気を付けること!

 送った回数分回るといっても、気を付けなければならない点がいくつかあります。例えば1回1.8度のモーターに、50回信号を送ったとしても、必ず90度になるとは限らないのです。
例えば、

  • ステップを高速で送ると、反応できず回転が追いつかない。
  • 重い力がかかりすぎて物理的に回転できない。
  • 高速で回っている時、急停止命令しても止まれない。

という状況で起こります。
 これらの現象を脱調と言います。脱調とは、送ったステップ分の回転を行えなかったことを言います。
 サーボの場合、うまく回転できなくても、現在の回転角度を記憶しているので、指定角度までたどり着こうと努力します。しかし、ステッピングモーターはサーボと違い自分の回転角度を認識できません。そのため、送られた信号分の回転ができたかどうか分からないのです。
 ステッピングモーターを制御するには、脱調を防止するために工夫が必要で、ロータリーエンコーダーなどと合わせて使い脱調を検知する必要があります。

まとめ

  • 送ったステップ分回転する。
  • 連続回転が可能。
  • 回転角度が取得できないため、本当にその角度にたどり着いたかが分からない。
  • 相対角度でしか指定できないため、絶対的な制御が必要な場合、スイッチなどを用いてキャリブレーションなどをする必要あり。もしくはロータリーエンコーダを合わせて使うなど。

 どうでしょう。少々難しいと思いますが、なんとなく違いが分かったでしょうか。そんなステッピングモーターを脱調しないように制御するライブラリを、明日から書いていきたいと思います。

その2はこちらです。

Raspberry PiとArduinoでアクアリウム(その4)「実際にスマホでコントロール編」

その1はこちらです。

 前回まではちょっと詳しく解説しすぎたり、内容が定まっていなかったので今回から調整します。書き直しても良いのですが、教訓として残しておきます。応援よろしくお願いします。
 実際にスマホでコントロールしてみました動画です。Arduinoは基板が上に載っていて、分かりにくいですがRaspberry Piの隣に写ってます。スマホからは専用のページでコントロールしています。 www.youtube.com

仕組み

f:id:takumus:20160908235429p:plain  動画内のiPod TouchとAndroidはどちらもブラウザで特定のページを開いていますが、このページはPiではなく、さくらのVPSで用意したウェブサーバーで立てています。ページを開くとwebsocket.io(以降ws)でさくらVPS(以降親サーバー)と繋がります。ライト点灯命令はすべてwsを使って送信されます。(動画内でもわかる通り、2台の端末でライトの点灯状態が同期しています。)そして、親サーバーはブラウザから受信した命令をPiへ流すのです。Piとは親サーバーが立てたSocketサーバーで繋がっています。PiとArduinoはSerial接続しています。
 なぜこうなったかと言うと、

  1. ポート開放をしたくなかったのと、
  2. 家は固定IPではないのと、
  3. 将来的に大人数がこの監視システムにアクセス出来たらよいと思っているので、Piはサーバーにせず極力休んでいてほしいのと、
  4. 命令ログやその他のデータの保管や処理はPiではなく、スペックの十分な親サーバーで行いたい、

など。その他理由はいくつかありますが、とにかく直接Piに外から繋ぎたくはなかったのです。
 自分にある知識を絞り出して考えた設計なので変な所ありましたら意見いただけると嬉しいです。

設定もリアルタイム

www.youtube.com  今回全ての情報はwsでリアルタイム共有されることになっているので、一応こういう仕様になっています。IoT系のもので多いのが、IからTまで非常にラグがあることです。自分的にそれは嫌だったので今回贅沢にもwsリアルタイム重視で設計しています。

ソース達

 このブログはすでに大体完成してから書いているので、ソースにはまだ紹介していない機能などが載っていて分かりにくいと思います。
 arduinoディレクトリにはarduinoのソース、piにはpiのソース。clientはスマホで表示するページのソースです。serverは、clientとpiを繋ぐ親サーバー部分です。 github.com

Raspberry PiとArduinoでアクアリウム(その3)

その1はこちらです。

実際にリレーをArduinoに繋ぐ

リレーをつなぐ

 前回紹介したリレーモジュールです。これをArduinoで使用した場合は以下のようになります。端子はこの向きで左から となっており、はArduinoのGND5Vにそれぞれ繋ぎ、Sは仮に13番ピンに接続します。

f:id:takumus:20160907224938p:plain  これで、13番をHIGHにすれば、電気は点き、LOWにすれば電気が消えます。リレーは便利ですね。ArduinoでHIGHかLOWするだけで家電がコントロールできます。

リレーを繋ぐ回路を組む時の注意

 上記の回路のように制御したい家電のコードを切断して、リレーを挟めば制御は可能です。しかし、家電のコードは切断するのは安全とは言えませんし、他の電化製品への応用も出来なくなります。なので延長コード制作キット等を使って作りましょう。
 ただし、リレーも多くの種類があり、それぞれ電力の制限もあります。使用する電化製品の消費電力と相談しながらリレー選びをしましょう。

反省

 ブログを書くのを慣れていないせいか、説明が具体的な部分があったり、簡単すぎる部分があったり、バランスが取れてないですね。ターゲットも絞れてない感じもあります。過去の記事は編集しないので今後改善していこうと思います。

その4はこちらです。

Raspberry PiとArduinoでアクアリウム(その2)

その1はこちらです。

照明をスマホでコントロール

 まず、簡単そうな照明コントロールから作っていきます。照明はアクアリウム用のものを使い、その電源をスマホから制御できるようにします。スマホからRaspberry Pi(以下Pi)へ、PiからArduinoへと経由し、Arduinoがリレーを使って電源のオンオフを切り替えます。

リレーとは

 操作にはリレーを使います。リレーは簡潔に説明すると他の回路のスイッチをコントロールできるもの。になります。
 家庭用の電球を点けるとき、皆さんはスイッチを押します。それにより回路に電気が通り電気が点きます。 f:id:takumus:20160906195609p:plain
 そのスイッチを代わりに押してくれるのがリレーです。スイッチで乾電池の電気が電磁石に流れ、電磁石はハンマーのようなものをを動かし、コンセント側の回路のスイッチを押すので電気が点きます。指を離せば電磁石は力を失い、コンセント側のスイッチも元に戻るため電気が消えます。 f:id:takumus:20160906195628p:plain
 この仕組みをそのままArduinoで使うとこうなります。Arduinoで、OUTPUTにしたピンをHIGHLOWにすることでコンセントの電球をON, OFFできます。 f:id:takumus:20160906200801p:plain

リレーモジュールを使うべき

 先ほどの図はあくまでリレーの仕組みの例なので、本物のリレーはもっとちゃんとしています。そんなリレーですが、実際Arduinoでリレーを扱うときはモジュールを使った方が安全です。今回は、Amazonで売っていた安いリレーモジュールを使いました。

(↑はてなのAmazon商品紹介という機能で貼り付けたリンクですが、アフィリエイトになっているのかどうかは分かりません笑)
 なぜリレーモジュールを使うべきかというと、電磁石式のリレーを単体で買う場合、逆起電力防止用のダイオードを挟んだりしなければなりませんし、またArduinoだとoutピンからの出力では電力が足りず、リレー用の電磁石をコントロールできない事があるからです。
 モジュールの場合はGNDと5Vをつなぎ、ピンからの出力をトランジスタに流してリレーを動かしていたり、工夫があるので、モジュールの方が良いのかなと思います(どちらかというと入門者向けのアドバイスです)
次回以降このリレーモジュールを使って作っていきます。

その3はこちらです。

Raspberry PiとArduinoでアクアリウム(その1)

海水魚飼育について

 最近のマイブームは海水魚を飼う事です。2年前ほどから磯で捕まえてきた魚達を飼っています。海水魚飼育において、特に頻繁に行わなければならないこと、それは、水足し、餌やり、照明管理です。これらを疎かにすると海水魚を長生きさせることは難しいのです。
 私は大学生のため、平日はほぼ大学にいますし、泊まってくることも多く、数日家に帰らないこともあります。それらが原因で何度か魚を犠牲にしてしまいました。

 どうにか、私でも魚を飼えないかと考えていて、ひらめいたのです。IoTの力で数日家を空けても水槽の環境を管理出来る仕組みを作れないかと!!
 最近Raspberry Pi(以下Pi)やArduinoに手を出しはじめたので、どうにか作ってみることにしました。
 主にやらせたいことは、水足し、餌やり、照明管理です。水足しは、水槽内の海水の蒸発によって上がった塩分濃度を真水を足すことで下げる行為です。餌やりは餌やりです。一週間ほど与えなくても大丈夫な種もいますが、食欲がなくなると仲間を攻撃し始める種もいるので毎日一定量与えることは必要(だと思うの)です。照明管理は、朝点けて夜消す。これを行わなければ魚の体内時計が狂ってしまったり、点けっぱなしによる苔の発生等が起こります。どれも欠かせません。

Arduino + Piでやる

 今回はPiで直接機械やセンサーを使うことはしません。それらはArduinoで行い、シリアル接続でPiとやり取りします。ではなぜArduino + Piなのか!それは、

  1. Arduinoはアナログ入出力が簡単にできますし、
  2. 変な配線をしてPi(6千円)が壊れるより、Arduino(3千円)が壊れる方がマシですし、
  3. Arduinoが好きだから!

です。

その2こちら