Contents
- ロータリーエンコーダによるステッピングモーターの遠隔制御
- 1. ロータリーエンコーダとステッピングモータの直結制御
- 1.1. システム構成
- 1.2. ロータリエンコーダとドライバの出力波形
- 1.3. 直結動作確認
- 2. mqtt通信を使ったステッピングモーターの制御(近距離)
- 2.1.システム構成
- 2.2. mqtt通信のNode-REDのフロー
- 2.3. 近距離mqtt通信を挟んだロータリーエンコーダによるステッピングモータの制御
- 3. mqtt通信を使ったステッピングモーターの制御(遠距離)
- 3.1.システム構成
- 3.2. 遠距離mqtt通信の動作確認
- 4. mqtt通信を使ったステッピングモーターの制御(遠距離:コマンド送信版)
- 4.1. 送信側のフロー実装
- 4.2. 受信側のフロー実装
- 4.3. 遠距離mqtt通信(コマンド送信版)の動作確認
- Appendix. ロータリーエンコーダ
- ◆ロータリーエンコーダの基本的な役割
ロータリーエンコーダによるステッピングモーターの遠隔制御
ロータリーエンコーダを使って、ステッピングモーターを回転させます。初めはロータリーエンコーダとステッピングモータを直結して動かします。次のステップとして、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になります。

