ロータリーエンコーダによるステッピングモーターの遠隔制御

ロータリーエンコーダを使って、ステッピングモーターを回転させます。初めはロータリーエンコーダとステッピングモータを直結して動かします。次のステップとして、Node-REDのmqttノードを使った通信による制御を行い、最後にGCP(Google Cloud Platform)上のVMに置いたmqttブローカーへの通信を介して制御してみます。

1. ロータリーエンコーダとステッピングモータの直結制御

まず、ロータリーエンコーダとステッピングモータを直結して動かしてみます。

1.1. システム構成

ロータリーエンコーダは、IKUSEiキットに同梱のロータリーエンコーダを使用します。このロータリーエンコーダは空き付け電子で購入可能な24クリックタイプのロータリーエンコーダ(EC12E2420801)を使用しています。回路図を次に示します。

図1. IKUSEIキットのロータリーエンコーダの回路図

また、ステッピングモータ(バイポーラー ステッピングモーター SM-42BYG011)とモータードライバ(DRV8835使用ステッピング&DCモータードライバーモジュール)も秋月電子で購入可能です。

これらのロータリーエンコーダとモータドライバとステッピングモータの接続回路図を次に示します。

ステッピングモータEC12E2420801は、24クリックタイプですので、1回転(360°)でA・Bそれぞれ24パルスが出力されます。すなわち15°回転させると1クリックで1パルスが出力されます。
一方、ステッピングモータは、A・B 1パルスで、1.8°×4=7.2°回転します。従って、ステッピングモータを1回転させようとすると、50パルスが必要になります。
すなわち、ステッピングモータを1回転させるためには50パルスが必要で、そのためには、ロータリーエンコーダを50クリック分(2回転と2クリック)回す必要があるということになります。

図2. ロータリーエンコーダとステッピングモータの接続図

モータドライバは、ブレッドボード上で構成しました。直結状態で接続した写真を次に示します。3.3Vと11Vの電源を2台使用して動かしています。回しやすいようにロータリーエンコーダにはつまみを3Dプリンタで作成して付けています。

図3. ロータリーエンコーダとステッピングモータの直結制御実験風景

1.2. ロータリエンコーダとドライバの出力波形

ロータリーエンコーダの出力(AIN1,AIN2,BIN1,BIN2)とモータドライバの出力(AOUT1,AOUT2,BOUT1,BOUT2)の波形を図4-1~図4-4に示します。
図2の回路図から、AIN2=AENBL=1、BIN2=BENBL=1であり動作許可状態にあることが分かります。
図4-1 AENBL=1で、AIN1の1/0に合わせてAOUT1とAOUT2が出力されます。AOUT2は、AOUT1の反転です。


図4-2 同様にBENBL=1でBIN1の1/0に合わせてBOUT1とBOUT2が出力されます。BOUT2は、BOUT1の反転です。


図4-3 CCW(左廻り=反時計回り)の波形を示します。BPHASEの立ち上がり時にAPHASEがHの場合がCCWになります。


図4-4 CW(右回り=時計廻り)の波形を示します。BPHASEの立ち上がり時にAPHASEがLの場合がCWになります。

1.3. 直結動作確認

直結制御の動画を載せます。ロータリーエンコーダを時計回りに回すとステッピングモータが時計回りに、また、ロータリーエンコーダを反時計回りに回すと反時計回りに回ることが分かります。

2. mqtt通信を使ったステッピングモーターの制御(近距離)

次に、ロータリーエンコーダとステッピングモータの間にmqtt通信を入れて制御してみます。mqtt通信はNode-REDのノードを使って行います。Node-REDは、Raspberry Pi 5上で動かします。ここでは、IKUSEiキットのRaspberry Pi 5+HAT(以下、HATと称します)を使います。
ロータリーエンコーダの出力(AIN1,BIN1)をHATで読取り、同一波形をHATの端子から出力して、ステッピングモータを制御します。

2.1.システム構成

図5に、HATをロータリーエンコーダとドライバの間に挟んだ回路図を示します。
ロータリーエンコーダは、HATのコネクタJ10に接続します。J10は、デジタル入力を読み取るための端子です。ロータリーエンコーダのA端子をGPIO20にB端子をGPIO17に接続しています。A端子、B端子が”H”レベルになるとHAT上のLEDがそれぞれ点灯します。
また、HATのGPIO11をドライバのAIN1に、GPIO10をドライバのBIN1に接続します。

図5. ロータリーエンコーダとHATとステッピングモータの接続図

HATをロータリーエンコーダとステッピングモータの間にいれた実験風景を図6に示します。図3と比べて、HATが間に入っているのが分かります。また、HAT上のLEDが点灯している様子も分かります。

図6. HATを挟んだ実験

2.2. mqtt通信のNode-REDのフロー

図7にHATのRaspberry Pi 5にインストールされているNode-REDを使って、フローエディタでmqtt通信を行うフローを描いた図を示します。mqttのブローカーは、同じ実験室のDHCPサーバーであるUbuntu OSのPC上の設定しています。従って、近距離のmqtt通信を挟んだステッピングモータの制御になります。

図7. mqtt通信を行うNode-REDフロー

2.3. 近距離mqtt通信を挟んだロータリーエンコーダによるステッピングモータの制御

近距離mqt通信を間に挟んだロータリーエンコーダによるステッピングモータ制御の実験を行いました。ロータリーエンコーダの出力とモータードライバの波形を図8に示します。近距離であれば、遅延の影響も小さく問題なく動作することが分かりました。

図8. 近距離mqtt通信を挟んだ信号波形

近距離mqtt通信を挟んだ際の動作の様子を次に示します。

3. mqtt通信を使ったステッピングモーターの制御(遠距離)

次に、GCP(Google Cloud Platform)上に配置したVM(Virtual Machine)に設置したmqttのブローカーを間に介してロータリーエンコーダからステッピングモータを制御してみます。

3.1.システム構成

システム構成は、図5と図7で変わりません。ただし、mqttの送信先がのIPアドレスがGCPのVMの外部アドレスに設定します。
GCPのVMはアメリカのオレゴン州に設置していますので、ロータリーエンコーダの信号が、一旦アメリカまで送られて戻ってきて、ステッピングモータを回転させることになります。

3.2. 遠距離mqtt通信の動作確認

次に、遠距離mqtt通信の動画を示します。結果として、うまく動作しません。足踏みをしたような動作になりました。

信号の波形を確認しました。図9に信号波形を示します。青矢印のところでは、BIN1の立ち上がり時に、AIN1が”H”の状態です。しかし、白矢印のところでBIN1の立ち上がりでAIN1の立ち上がりと同じタイミングになっています。どちらに回転すべきかが分からなくなってしまっています。これが足踏みの原因と考えられます。mqtt通信が、アメリカまで往復してくる間に、遅延値がバラバラにばらつくことで、AINとBINの関係が正しくなくなってしまい、それにより、CWかCCWかがうまく判定できなくなってしまっています。なんとかCW方向に進むのですが、近距離のようにスムーズに進みません。

図9 遠距離mqtt時の信号波形

図10-1にA相とB相の送信時の波形を、図10-2に受信時の波形を示します。遅延によりH期間とL期間の幅が変わってしまっており、A相とB相の位相関係が保存されていないのが分かります。これが足踏み動作の原因です。

図10-1 送信時のA相とB相の波形

図10-2 受信時のA層とB相の波形

4. mqtt通信を使ったステッピングモーターの制御(遠距離:コマンド送信版)

ここまでのmqtt通信では、A相とB相の信号のパラレル送信により、動作タイミング(ON/OFF)と回転方向(CW・CCW)の4つの情報を送信していた(2bit通信)。しかし、遠距離操作の場合にはパラレル送信は、遅延のばらつきにより、うまく動作しなくなることが分かった。

対策案の一つとして、mqttで送信するデータをAIN1とBIN1の信号をパラレルに送るのではなく、BIN1の立ち上がりでAIN1の極性を確認し、回転方向を送るようにします。

具体的には、
1)送信側では、R.E.の出力のB相の立ち上がりでA相の極性を読み、CW/CCWを判定し、CWの場合には’R’を、CCWの場合には’L’を送ります。
2)受信側では、コマンド’R’/’L’が送られて来た時点で、AIN1、BIN1を生成します。

4.1. 送信側のフロー実装

上記の送信側のNode-REDのフローの実装を行いました。Node-REDのフローを図11-1に示します。
①: A端子が変化したら、flow.levelAに1/0を保存します。
②: B端子が変化して1だったら、flow.levelAをチェックして、’1’ならCWに、‘0’ならCCWに進みます。
③:CWなら、msg.payload = ‘R’に設定、CCWなら、msg.payload=‘L’に設定してmqttで送信します。

図11-1 送信側のNode-REDのフロー

4.2. 受信側のフロー実装

受信側のNode-REDのフローを図11-2に示します。
①: 受信したmsg.payloadのL/Rをチェックする。
②: Rなら、以下の信号をGPIOから生成

③: Lなら、以下の信号をGPIOから生成

図11-2 受信側のNode-REDのフロー

4.3. 遠距離mqtt通信(コマンド送信版)の動作確認

動作確認の動画を次に示す。足踏み動作が無くなり、スムーズに動くようになりました。しかし、遅延がありますので、遅延している分だけコマンドが遅くなります。そのため、ロータリーエンコーダを止めた後もステッピングモータの動きが残るのが分かります。

Appendix. ロータリーエンコーダ

ロータリーエンコーダは、一言でいえば 「回転の量・角度・方向を電気信号として読み取るためのセンサ」 です。モータ制御、ロボット、CNC、3Dプリンタなど、あらゆる“回転を正確に知りたい”場面で使われています。

◆ロータリーエンコーダの基本的な役割

  • 回転角度を測る
  • 回転速度を測る
  • 回転方向を判別する

回転軸に取り付けることで、軸の動きをパルスやコードとして出力します。

◆ロータリーエンコーダの出力

ここでは、秋月電子で購入可能な24クリックタイプのロータリーエンコーダの出力を紹介します。
・1回転で24個のパルスが発生します。1個のパルスが15°(=360°÷24)に相当します。
・端子は上面から見て左からA端子、C端子、B端子です。

・接続は抵抗R=10kΩを付けて以下のような回路構成になります。

・出力波形は、CW(時計廻り=clockwise)の場合以下のようになります。B端子の立ち上がり(クリック点)で、A端子がHであれば、時計廻りに回転しているということが分かります。また、B端子の立ち上がり周期で、回転スピードを知ることができます。

・反時計廻り(=counterclockwise)の場合には、B端子の立ち上がりでA端子がLになります。