環境
Raspberry pi zero
エディターはラズパイに初めから付いている、Thonnyを使ってます。
今回は
以前、モータを回した時はモータをただ回す、止める、回す、止めるだけの制御だったので、
今回はPWM制御を使って、回転数を変えてみたいと思います。
部品
- ピンソケット2種類
- 基板
- モータドライバ
- Raspberry Pi Zero
- ジャンプワイヤー
- モバイルバッテリ
PWM制御とは
PWM制御とは、Pulse Width Modulationの略で、日本語だと「パルス幅変調」と訳します。
これは、電力を制御する方法の1つで、ONとOFFを高速に繰り返すことによって、出力される電力を制御する方法です。
意味わかりませんね。
これができるとモータの速度が変えられるということです。
準備
モータドライバーの番号とラズパイGPIOと繋ぐ場所
なんとなくPWM制御のことがわかったところで、早速繋げましょう。
モータドライバ | 端子名と機能 | 繋ぐ先 |
1番 | GND | ラズパイGPIO39番 |
2番 | OUT1 出力端子 | モータの端子 |
3番 | NC | 何も繋げません。 |
4番 | Vref 制御電源端子 | モータドライバ8番と10kΩと繋いでます。 |
5番 | IN1 入力端子 | ラズパイGPIOピン13番 |
6番 | IN2 入力端子 | ラズパイGPIOピン15番 |
7番 | VCC ロジック側電源端子 | ラズパイGPIOピン1番(3.3V) |
8番 | VS 出力側電源端子 | ラズパイGPIOピン2番(5V) |
9番 | NC | 何も繋げません。 |
10番 | OUT2 出力端子 | モータの端子 |
*ラズパイGPIOピン番号です。GPIOポート番号ではありませんのでご注意ください。
PWM制御でモータを回すプログラミングコード
続いて実際のコードを書きます。「”a” + enter 」で進む、「”s” + enter 」で止まる、「”d” + enter 」でバックするというプログラムです。”motor_pwm.py”という名前で保存しました。
import RPi.GPIO as GPIO
import sys
duty = 50 #ここの数値を変えると、モータの速さが変わります。
#GPIO初期設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(27, GPIO.OUT) #ラズパイGPIOピン13番
GPIO.setup(22, GPIO.OUT) #ラズパイGPIOピン15番
p1 = GPIO.PWM(27, 50) #ラズパイポート番号27, 50Hz
p2 = GPIO.PWM(22, 50) #ラズパイポート番号22, 50Hz
p1.start(0)
p2.start(0)
try:
while True:
#「a」キーが押されたら前進
c = sys.stdin.read(1)
if c == 'a':
p1.ChangeDutyCycle(duty)
p2.ChangeDutyCycle(0)
#「d」キーが押されたら後退
if c == 'd':
p1.ChangeDutyCycle(0)
p2.ChangeDutyCycle(duty)
#「s」キーが押されたら止まる
if c == 's':
p1.ChangeDutyCycle(0)
p2.ChangeDutyCycle(0)
except KeyboardInterrupt:
pass
GPIO.cleanup()
4行目の”Duty”の値を変えると速度が変わります。
「a」を入力すると進みます。アクセルの「a」です。
「s」を入力すると止まります。ストップの「s」です。
「d」を入力するとバックします。キーボードの配列的に押しやすいので「d」にしました。
動作確認
(ラズパイ側)
上のプログラミングファイル(motor_pwm.py)をダブルクリック。
エディタ”Thonny”が開くので、”Run”をクリック。
すると、下の動画のような動きをします。
“Duty = 80″の時です。
“Duty = 20″の時です。
わかりづらいですが、音を聞くとわかりやすいかと思います。
できました。これで車の速さを制御できるようになりました。
今後は。
これでモータに関しては終わりです。
次はサーボモータの制御をもっとやっていこうと思います。
苦労したこと
プログラムを”Run”させたら、”RuntimeWaring”とかアラームが出て、”This channel is already in use,・・・”とか言ってる。
色々調べると、「無限ループしてる」とか「最後に”GPIO.cleanup()”と書いててもエラーは出る」とか書いてました。
めんどくさいので、エディターの”Thonny”の下側に”Shell”があるのでそこに直接。
GPIO .cleanup()
と入力して、enterキーを押して、解決しました。
enterを押した瞬間、モータが回り出したので、私と同じやり方で行う際は気をつけて。
もっといい方法があるかも知れませんが、
私はそれで、解決しました。