ラズベリーパイ2以降のモデルにはLEDの制御やサーボモーターの制御に適した「PWM制御」がハードウェア的に可能なピンが4つあります
チャンネル0:GPIO12、18
チャンネル1:GPIO13、19
それぞれのチャンネルの周波数は別でコントロールできるようですが、いかんせん情報が少なくライブラリ使ったりと面倒くさいのです。
<参考>
Raspberry PiのハードウェアPWMをpigpioで出力する - Qiita
ソフトウェアPWMであればGPIOポートも選びません。
赤外線リモコンならともかく、(赤外線リモコンは38kHzという高周波でピッタリ変調しないと認識しないからソフトウェアPWMは不向き)
<過去記事>
「ステッピングモーターのPWM程度なら低周波だしソフトウェア制御で充分じゃない?」
ということでとりあえず個別に周波数を制御できるのか実験してみることにしました。
制御はドライバICのSTEPにPWMを放り込むだけです。
<ドライバIC>
今回の実験は、自作のクローラーの利帯を左右自由に動かすための回路動作テストも込めています。
<過去記事>
前回の試走ではArduinoを使ってボリューム値からPWMを作っていました。
有線で左右制御出来るプログラムにしていましたが、「どうせならワイヤレスでコントロールしたいぞ!」という欲が出て来て制御をラズパイに変更することにしました。
<実験結果>
ラズパイ2でのソフトウェアPWMを使ったステッピングモーター制御
充分に制御出来ているようです。
サーボモーターの場合は一定の周波数(Hz)を保ったまま、HIGH-LOWの比率(DUTY比)を制御するのですが、ステッピングモーターはDUTY比は50%のまま、周波数(Hz)を制御します。
<今回のテストプログラム>
import RPi.GPIO as GPIO #GPIO制御ライブラリ
import time
import atexitR = 20 #GPIO20が右モーター
L = 21 #GPIO21が左モーター
DUTY = 50.0 #Duty比は50%
ENABLE = 16 #モータードライバーのEnableピン制御top = 1000 #最高1000Hz
bottom = 50 #最低50Hz
def init():
GPIO.setmode(GPIO.BCM)
GPIO.setup(R, GPIO.OUT)
GPIO.setup(L, GPIO.OUT)
GPIO.setup(ENABLE, GPIO.OUT)atexit.register(end)
def end():
GPIO.output(ENABLE, GPIO.HIGH)GPIO.cleanup()
def main():
GPIO.output(ENABLE, GPIO.LOW)#ドライバーを立ち上げる
p_r = GPIO.PWM(R,bottom) #初期周波数を設定
p_l = GPIO.PWM(L,bottom)
p_r.start(50)#Duty比を指定してPWMスタート
p_l.start(50)
for i in range( top -bottom ):
p_r.ChangeFrequency(top - i)#周波数の変更
p_l.ChangeFrequency(bottom + i)
print(i)
time.sleep(0.05)for i in range( top -bottom ):
p_r.ChangeFrequency(bottom + i)
p_l.ChangeFrequency(top - i)
print(i)
time.sleep(0.05)
p_r.stop()#PWM制御終了
p_l.stop()end()
if __name__=='__main__': # if scriptinit()
main()
ということで、このままソフトウェアPWMを使ってクローラーの開発を続けることにします。
次回↓