ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

ラズパイでPWM制御

ラズパイを使ってハードウェアを制御するシリーズ、第5回目はPWM通信です。
今回はPWM制御でモーターの回転速度を制御してみました。

 

PWMとは?

PWMはPulse Width Modulationの略で、パルス波のデューティー比を変化させて変調する変調方式のことです。デューティー比とはパルス1周期のHigh期間とLow期間の比のことで、モーターの制御においてはデューティー比を変えることで回転速度を制御することができます。

詳細はこちらの記事を参照ください。
https://monoist.atmarkit.co.jp/mn/articles/0706/06/news132.html

 

モーター制御に使用したパーツ

モーターを動かすにはそれなりの電流が必要ですので、ラズパイで直接は駆動できません。このため、モーター駆動用のモータードライバキットと電源として乾電池を使うために電池ボックスを準備しました。
http://akizukidenshi.com/catalog/g/gK-11219/
http://akizukidenshi.com/catalog/g/gP-11523/

モーターはこちらのDCモーターを使用しました。
http://akizukidenshi.com/catalog/g/gP-09169/

実は、モーターの駆動電圧が1.5V-3.0Vということを知らずに単三x4の電池ボックスを購入してしまいました。パーツを購入するときは仕様をよく調べて購入しましょう(笑)

これらのパーツを使って以下のように回路図を組みました。

f:id:masashi_k:20200524230405p:plain

後で述べますが、ラズパイはどのGPIO端子からでもPWM信号を出力できるので、使用する上記の通りにする必要はなく、GPIO端子はどれでもOKです。
配線のしやすさやIIC, SPIなど他機能との兼ね合いでお選びください。

また、モーターが回転していることが分かるように、モーターに100均扇風機のファンを取り付けました。無理やり引っ張って外しました。

ラズパイでPWM信号を出力する方法

ラズパイでPWMを使用するにはI2C制御の時に使用したwiringpiというライブラリを使用します。
http://wiringpi.com/reference/software-pwm-library/

サンプルコードを以下に示します。

import wiringpi

pin=1 #GPIO番号を指定

#初期設定
wiringpi.wiringPiSetupGpio() #GPIO番号で設定
wiringpi.pinMode(pin, wiringpi.OUTPUT)  #GPIO出力設定
softPwmCreate(pin, initialValue, pwmRange)   #PWM設定  Duty比の初期値と最大値を指定

#PWM制御
softPwmWrite(pin, value)                     #Duty何%で動かすかを設定


使用している関数について補足します。

int softPwmCreate (int pin, int initialValue, int pwmRange) ;

どのGPIOピンをPWMとして制御するかを設定します。initialValueとpwmRangeはデューティーの初期値と最大値を意味し、0-100の値を設定します。

void softPwmWrite (int pin, int value) ;

指定したGPIOから出力するデューティー比(value)を設定します。

モーターの回転数を制御するプログラム

今回作成したラズパイを使ってモーターを駆動するpythonプログラムはこちらです。
扇風機の風の強さを弱→中→強と変えた後、停止するようにしています。

import wiringpi as pi
import time

# GPIOピンの定義
AIN1 = 26
AIN2 = 16
PWMA = 19
STBY = 20

# GPIOピンの設定
pi.wiringPiSetupGpio()
pi.pinMode( AIN1, pi.OUTPUT )
pi.pinMode( AIN2, pi.OUTPUT )
pi.pinMode( PWMA, pi.OUTPUT )
pi.pinMode( STBY, pi.OUTPUT )

# PWM端子に接続したGPIOをPWM出力できるようにする
pi.softPwmCreate( PWMA, 0, 100 )

# スタンバイ状態にする
print("StandBy")
pi.digitalWrite( STBY, 0 )
pi.digitalWrite( AIN1, 0 )
pi.digitalWrite( AIN2, 1 )
pi.softPwmWrite( PWMA, 0 )

#SW on
pi.digitalWrite( STBY, 1 )

#Level1
print("Level weak")
pi.softPwmWrite( PWMA, 50 )
time.sleep(3)

#Level2
print("Level middle")
pi.softPwmWrite( PWMA, 75 )
time.sleep(3)

#Level3
print("Level strong")
pi.softPwmWrite( PWMA, 100 )
time.sleep(3)

#終了処理
print("Stop!!")
pi.digitalWrite( STBY, 0 )
pi.digitalWrite( AIN2, 0 )
pi.softPwmWrite( PWMA, 0 )

実際に動かしたときの動画です。

まとめ

ラズパイからPWM信号を出力し、モーターの回転数を制御する回路とプログラムを作成しました。モーターはこれまでの仕事でもあまり扱ってこなかったので、モータードライバーの使い方などいろいろと勉強になりました。

今回はDCモーターを使いましたが、モーターの種類は他にもいろいろあるので、今後は別のモーターも使ってみたいと思っています。次はステッピングモーターを使ってカメラのパン制御をしてみたいですね。

最後まで読んでいただきありがとうございました。