Raspberry Pi Zeroでブラシレスモーターを制御する
概要
ちょっと思うところがあって、市販のブラシレスモーターをRPi Zeroを使って制御してみました。
構成
- Raspberry Pi Zero W
(https://www.amazon.co.jp/gp/product/B0799FCCWS/) - 適当なブラシレスモーターとESC(スピードコントローラー)セット
(参考: https://www.amazon.co.jp/gp/product/B01MTCBO7D/) - 適当なバッテリー
接続
- モーターとESCを繋ぐ。3本線があるが、適当に繋いでも回転が逆になるだけなので大丈夫。
- ESCとRPiを繋ぐ。コネクターに3本入っているが、真ん中の線は使わない。黒い線と反対側の何色かのもう一本を使う。黒い方を適当なGNDに、色がついている方を適当なGPIOに繋ぐ。GPIOは後でプログラムで指定するので、何番かをメモっておく。
ピンアサイン参考: https://www.raspberrypi.org/documentation/usage/gpio/ - いざ動作確認する段階でバッテリーを繋ぐ。何が起こるかわからないので、安全なバッテリーを推奨。例ではそのへんに転がっていたウナギ型のLiFeを利用。普通はウナギリフェなんて転がってはいないので注意。
プログラミング
とりあえずパルス幅を指定してやり、少しずつ回すのを繰り返す。
サンプルソースコード
import pigpio
import time
motor_pin = 27 #メモしたGPIO番号
pi = pigpio.pi()
for i in range(3):
pi.set_servo_pulsewidth(motor_pin, 1500)
time.sleep(1)
pi.set_servo_pulsewidth(motor_pin, 1600)
time.sleep(1)
pi.set_servo_pulsewidth(motor_pin, 1700)
time.sleep(1)
pi.set_servo_pulsewidth(motor_pin, 1800)
time.sleep(1)
pi.set_servo_pulsewidth(motor_pin, 1900)
time.sleep(1)
pi.set_servo_pulsewidth(motor_pin, 2000)
time.sleep(1)
pi.set_servo_pulsewidth(motor_pin, 0)
pi.stop()
解説
pi.set_servo_pulsewidth(motor_pin, 1500)
time.sleep(1)
motor_pinでGPIO番号を指定し、パルス幅を数値で指定する。
指定できる値範囲がどこからどこまでかは、ESCの仕様による。
ESCの仕様がわからない場合は手探りで探すしかない。
このESCでは、1500ぐらいから2000ぐらいまで指定できた。
sleepで、次の状態までの持続時間を指定する。
pi.set_servo_pulsewidth(motor_pin, 0)
止める場合は、こんな記述をしないとうまくいかなかった気がする。
いらなかったかも。まあおまじない的な。
ESCによっては、動かす前におまじないが必要なものもあるらしい。
それはESCの仕様を調べるしかない。
まとめ
という感じで、めちゃくちゃ簡単にブラシレスモーターを制御できた。
ただし、既存のESCを使ってのパルスと時間の制御になるので、厳密なブラシレスモーターの制御とは言えないかも。本来は、ESCの機能をそのものをRPiで制御したい。
ちなみにこのブラシレスモーターは、中身が回るのではなく、外側のガワが回るので、固定しないとめっちゃ暴れる(笑)中央のローターが回るモーターを使ったほうが安全だと思う。
RPiを使ってモーターを制御すると、目に見えて制御できてる!!という達成感が得られるので、プログラミングの勉強にもおススメ。このブラシレスモーターとESCのセットは1000円ぐらいで買えるので、下手な電子工作キットなどを買うより安価に楽しめると思う。