🤖

【Raspberry Pi】 モーターを回そう。「ステッピングモーター編」

2022/08/28に公開

砲塔旋回を考える

前回はサーボモーターを動かしました。
サーボモータの稼働範囲は、180度です。
砲塔旋回というからには、360度動かせるものが理想です。
(ローテーションサーボもありましたが、軸に不安を覚えます。)

そこで目を付けたのが、ステッピングモータです。

サーボモータに比べると随分ごついです。これなら軸の心配は不要ですね。
ステッピングモーター

「ユニポーラ」と「バイポーラ」という種類があり、
さらに「ユニファイラ巻き」と「バイファイラ巻き」があるらしいです。

今回購入したものは、 バイポーラのユニファイラ巻きの物です。
秋月商店 バイポーラ ステッピングモーターSM-42BYG011

ステッピングモータをコントロールするのに便利そうなアイテム
秋月商店 L6470使用 ステッピングモータードライブキット

が便利そうだと思い、それに合わせて購入しました。
・・・が、このキットはラズパイとSPI通信(シリアル通信)を行うタイプのもので、
今の私には意味不明の代物でした・・・。1800円・・・。
SPI通信については、教本でA/Dコンバータ(mcp3208)を利用した際に触れましたが、
応用できる程ではありませんでした・・・。

代わりに購入したのが、モータドライバ「TB6674PG」です。
ステッピングモータードライバー(バイポーラ) TB6674PG

DCモータを制御した時のように、このドライバでステッピングモータを制御してみます。

ステッピングモータードライバ

こんなやつ。

写真でいう左上から左下にかけて、1~8
右下から右上にかけて、9-16となります。

Pin Pin
1. Vs2 A 16. Vs1 A
2. Vcc 15. φA
3. IN A 14. !φA
4. GND 13. GND
5. GND 12. GND
6. IN B 11. !φB
7. PS 10. φB
8. Vs2 B 9. Vs1 B

11は、10の逆、14は15の逆となります。NOT φ です。(記号がない・・・)
DCモータよりも複雑そうに見えますが、制御するための入力は IN A と IN B の二つです。
右側の4つはモータに繋ぐためのもので、見た目ほど複雑ではありません。

PIN1、PIN2はラズパイ5V、PIN3、PIN6はラズパイのGPIOピンは、
PIN7はGNDへ、PIN8は(とりあえず)ラズパイ5Vへ繋ぎます。
PIN9、PIN16は電池側の+へ、PIN10、PIN11、PIN14、PIN15はステッピングモーターへ繋ぎます。

ステッピングモーター

ちなみに、PIN7はパワーセーブ機能、PIN8はスタンバイ機能です。
PIN8をGNDに接続すると動かなくなります。PIN8を5Vに接続していると、
モーターが静止していても通電しているため暖かくなります。
気になる方は、PIN8をGPIOに接続し、モータ稼働中はHIGHに、
稼働していないときはLOWに、制御するとよさそうです。

ソースコードは下記のようになります。

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

pinA = 23
pinB = 22

# IN_A
GPIO.setup(pinA, GPIO.OUT)
# IN_B
GPIO.setup(pinB, GPIO.OUT)

BASESTEPANGLE = 1.8;

speed = 0.02

angle = 180
ran = int(angle / BASESTEPANGLE / 4)

try:
    for num in range(0,ran):
        GPIO.output(pinA, GPIO_HIGH)
        GPIO.output(pinB, GPIO_HIGH)
        sleep(speed)

        GPIO.output(pinA, GPIO_LOW)
        GPIO.output(pinB, GPIO_HIGH)
        sleep(speed)

        GPIO.output(pinA, GPIO_LOW)
        GPIO.output(pinB, GPIO_LOW)
        sleep(speed)

        GPIO.output(pinA, GPIO_HIGH)
        GPIO.output(pinB, GPIO_LOW)
        sleep(speed)

except KeyboardInterrupt:
    pass

GPIO.cleanup()

ラズパイからの入力は2つですが、 ステッピングモータへの出力は4つあります。
IN AがHIGHの時PIN15はHIGH、PIN14はLOW
IN AがLOWの時PIN15はLOW、PIN14はHIGH
IN BがHIGHの時PIN10はHIGH、PIN11はLOW
IN BがLOWの時PIN10はLOW、 PIN11はHIGH
のように、2つの入力で4つの出力を制御しています。

今回は下図の 赤がPIN15 緑がPIN14 黄がPIN11 青がPIN10 に繋がっています。

ステッピングモーター

バイポーラステッピングモーターは、
4つの出力のON,OFFをコントロールすることでコイルを回します。

ONとOFFのサイクルは下の動画のようになっています。
分かりやすく? LEDで表現しました。

ステッピングモーターには、ステップ角というものがあり、
コイル一回転で何度回るかを表しています。
このステッピングモーターは、ステップ角1.8度となっており、
コイル1回転で、1.8度回転します。
ソースコードのループ文、4つの制御が1サイクルで1回転です。

つまりループさせる回数は、回したい角度÷1.8÷4 となります。

また、回転の速さはサイクルの速さで変化します。
変数speedがそれに当たります。
極端に早いと脱調するため回転しません。
また遅すぎても回転しません。

こんな感じで回すことができました。

HIGHとLOWを逆にすることで、逆回転させることも可能です。

ブレッドボードが複雑になってきましたが、砲塔旋回もできるようになりそうです。
ステッピングモータードライバ

ブレッドボード右の真ん中にあるものは、ターミナルブロックと呼ばれているものです。
ステッピングモータの導線の先がフサフサだったため、 ブレッドボードに刺せず、このような物を介して繋いでいます。

まとめ

SPI通信は難しい・・・。

GitHubで編集を提案

Discussion