前回の記事でモーター駆動回路を作成し、ラズパイのGPIOでモーターの回転をON/OFFすることができました。しかし、このままでは「0回転」or「フル回転」という極端な使い方しかできません。
というわけで次はモーターの回転数を制御したいわけですが、そんなときに活躍するのがPWM制御です。ここではラズパイでPWM制御を行い、それによってモーターの回転数を制御してみようと思います。
- 【第1回】Raspberry Piでモーターを制御してみよう
- 【第2回】Raspberry PiでPWM制御して、モーター回転数を制御しよう ← 今ココ
- 【第3回】Raspberry Piでモータードライバーを制御して、モーターの回転方向を変えてみよう
- 【第4回】Raspberry Piでモーターを制御するサーバープログラム
- 【第5回】Raspberry Piでモーターを制御するクライアントアプリ(iOS)
PWMってなに?
そもそも「PWMってなに?」、「なんで必要なの?」という話を簡単にしておきます。
現代の制御回路は基本的にデジタル信号で制御されています(厳密にいえば最終的にはアナログなわけですが)。つまり、ONかOFFしか出力できないので、アナログのように中間の状態を作り出すことができません。
しかし、モーター制御のようにどうしても中間の状態を作り出したい状況があります。「0回転」or「フル回転」しか出力できないモーターなんて使いどころがないですもんね。
そんなときに活躍するのがPWMです。PWMはPulse Width Modulationの頭文字を取った名称で直訳するとパルス幅変調ですね。
PWMというのは簡単にいうと、高速でON/OFFを繰り返すことで中間的な状態を作り出そうという制御方式になります。イメージ的には下記のような感じ。
https://deviceplus.jp/glossary/qa_005/
ONとOFFの時間の比をデューティ比と言い、この比を変えることで流れる電流量を調整します。また、繰返し周期を短くすると、その分だけ滑らかな電流波形を作り出すことができます。
このようにしてデジタルな信号でありながら中間的な電流量を生み出すことで、モーターなどの中間的な駆動を作り出すことができるのがPWMとなります。
ラズパイでPWM制御する方法
ラズパイZeroにはPWM出力を担当するペリフェラルが搭載されています。下記ハードウェアマニュアルの9章がそれにあたります。
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf
したがって、このペリフェラルを操作したら良いわけですが、簡単に操作したいのであれば「gpio」コマンドを使えば良いです。
以降では「gpio」コマンドを使ってPWMを操作し、モーター回転数を制御します。
「gpio」コマンドでPWM操作
GPIOをPWMモードに設定
「gpio」コマンドを使ったPWM制御はとても簡単です。まず、PWMに対応しているGPIOは下記4つのポートになります。
- PWM Channel0:GPIO 12、GPIO 18
- PWM Channel1:GPIO 13、GPIO 19
今回はGPIO 18のポートを使って、PWM制御を行いました。まず、GPIO 18をPWMモードにするために下記コマンドをラズパイのターミナルで入力します。
gpio -g mode 18 pwm
正しく設定ができたら、gpio readallコマンドで見ると、下記のようにGPIO 18のモードが変わります。
PWMの動作モード設定
ラズパイのPWM動作モードには「Balanceモード」と「Mark Spaceモード」があります。
BalanceモードはPWMの1周期内のON/OFFする部分をバランス良くバラすことで、より滑らかな出力特性を得ることができます。
一方、Mark Spaceモードは1周期内のON/OFFする部分を、それぞれまとめて出力するようにします。サーボモーターなどはON時間が連続していないと意図通りに動かせないので、Mark Spaceモードにしないといけません。
言葉だと分かりづらいかもしれないので、イメージの図を載せておきます。
この図はPWMは10クロックで1周期、ON時間を5クロック(デューティ比50%)としたものです。
BalanceモードではON時間の5クロックをバラしています。一方、Mark Spaceモードでは前半にONを、後半にOFFをまとめています。
380モーターは比較的鈍感な部品なので、BalanceモードだとON/OFFの動きが細かすぎて意図通りモーターが動きません。したがって、今回はMark Spaceモードとします。
Mark Spaceモードに変えるために、下記コマンドを入力します。
gpio -g pwm-ms
PWMのクロック分周(divider)とクロックレンジ(range)の設定
ここからはPWMで使うクロックとPWMのレンジを設定します。
まずはクロック分周(divider)を設定するために、下記コマンドを入力します。
gpio -g pwmc 2
PWMのクロック源はデフォルトではオシレーターのクロックを使います。Raspberry Pi Zeroのオシレーターの周波数は19.2MHzとなります。
もちろんクロック源は変えることができるのですが、「gpio」コマンドはクロック源の変更に対応していないっぽいので、とりあえずオシレーターのクロックをそのまま使います。
というわけで、上記コマンドによって分周を2に設定したため、PWMで使うクロックは9.6MHzとなりました。
次に下記コマンドを入力して、クロックレンジ(range)を設定します。
gpio -g pwmr 1000
クロックレンジはPWMの1周期あたりのクロック数を設定します。つまり、上記コマンドによって1000クロックで1周期という設定になります。
この辺りもイマイチ文章だけだと分かりづらいので、図を載せておきます。
PWM出力の開始
ここまででPWMの設定は完了したので、あとはPWMの出力を開始するだけです。PWM出力を始めるコマンドは下記通り。
gpio -g pwm 18 500
「500」の部分はONを出力するクロック数になります。rangeを「1000」に設定しているので、0〜1000の間の値を設定することで、デューティ比が決まります。「500」だとデューティ比50%(ON50%:OFF50%)ということですね。
実際に出力してみる
実際にモーターをPWM制御で動かしてみると、こんな感じです。
rangeが1000なので、250だと25%、500だと50%、750だと75%、1000だと100%の回転数で駆動します。(実際のところは綺麗な線形にはなりませんが)
まとめ
ラズパイのPWMを使ってモーターの回転数を制御しましたが、思ったより簡単に制御できることが分かったと思います。ここまで出来たら、いろいろなことが出来そうな感じがしますよね。
次回はモーターを正転/逆転といった感じに、回転方向を切り替えられるようにしていきます。これまた簡単に実現できるので、モーター制御をしてみたい方は参考にしてみてください。
コメント