この講義では、DCモータとサーボモータという2種類のモータを使います。
DCモータ
家庭にある電源コンセントを、AC100Vと呼ぶことは知っていると思います。このACとは Alternating Current の略で、1秒間に50回などの短い周期で電流の向きが変わることを意味しています。日本語では、交流あるいは交流電流と言います。
一方、乾電池やUSB電源などは、直流あるいは直流電流と呼ばれます。DCというのは、 Direct Current の略で、直流電流を意味します。直流の場合、マイコンや部品で変えない限りは電流の向きは一定です。
DCモータは、直流電流で動くモータです。模型でよく使用するマブチモータは、皆さんも一度は見たことがあると思います。
乾電池でDCモータを動かすのは簡単です。DCモータの端子に、乾電池の+極と-極をつなげばOKです。
しかしモータを、マイコンに繋いで制御するとなると、ちょっと難しいです。まず、DCモータに限らずモータというものは、少なくとも数百mA、多ければ数Aの電流を必要とします。マイコンのピンから供給できる電流は5mAくらいなので、マイコンのデジタル出力を使い直接DCモータを駆動することはできません。使用するモータによって、別途、適した外部電源を用意する必要があります。また、正転、逆転、停止、回転速度などの制御を行う必要もあります。
そこで、それらのことを簡単に解決するための、モータドライバというデバイスが存在します。この講義では、TB6643KQというモータドライバを使います。
TB6643KQは、最大4.5AまでのDCモータが制御できます。マブチモータFA-130は、通常の回し方だと数百mAですので、TB6643KQで制御することは可能です。
モータドライバ
それでは、TB6643KQを使ってDCモータを回してみましょう。TB6643KQの各ピンは、以下のように番号が振られています。
それぞれのピンの役割は以下の通りです。
1: 入力1→ Raspberry Pi のPWMピンへ
2: 入力2→ Raspberry Pi のPWMピンへ
3: 出力1(モータ)→モータの片側へ
4: GND→ Raspberry Pi のGNDピンへ
5: 出力2(モータ)→モータの片側へ
6: N.C.→接続しなくてよい
7: モータ側電源→外部電源のプラスへ
7番のモータ側電源というのは、モータを駆動するために必要な電源です。TB6643KQは0Vから50Vまで対応しています。今回の実験では単3電池4本の6Vを使います。
1番と2番のPWMでモータに実際にかける電圧をコントロールします。TB6643KQではモータ側電源の電圧がそのままモータにかかる訳ではなく、1番か2番に入力されたPWMのデューティ比を乗じた電圧がかかります。したがって、デューティ比を変化させると、モータにかける電圧も変わり、モータの回転速度が変わります。また、1番と2番のどちらにPWMをかけるかによって、モータの正転か逆転かが変わります。
ただし、ブレーキとストップは、あまり違いがないと思ってください。通常は、ストップを使います。
マブチモーターFA-130は0Vから3.0Vまでで動きます。3.0V以上の電圧をかけてはいけません。外部電源の電圧に応じてPWMでデューティ比をコントロールする必要があります。今回のように外部電源6Vの場合には、デューティ比は50%までにする必要があります。
単3電池4本を使うときには、下の写真のような電池ボックスを使います。
電池ボックスのマイナス側は、 Raspberry Pi のGNDにつなぎます。このように、外部電源を併用する際には必ずGNDを共通にします。これは、とても大切なことですから、忘れないようにしてください。
サーボモータ
サーボモータは、モータとコントローラを一体化したモータで、回転角度を指定できます。多くの場合、DCモータと角度を計測できるセンサ(エンコーダ)、およびセンサーからの値によってDCモータの動きを制御するコントローラから構成されています。つまり、モータの中にマイコンがあるようなものです。
サーボモータのインターフェイスは、Vcc、GND、信号線の3つです。VCCには、外部電源を使うのが無難です。 Raspberry Pi の5V端子からでも供給できる可能性はありますが、電力不足になる可能性があります。製品によって異なりますが、多くの場合、4.8Vから6Vの間の電圧を必要とします。外部電源のGNDは、マイコンのGNDと接続します。信号線に、PWMOutputDeviceを使ってパルス波を与えると、デューティ比に応じて角度が変わります。可動域は、180°のものが多いようです。
サーボモータはピンキリで、物によってはあまり正確に指定した角度になりません。0度から180度まで指定できるとは言っても、実際にはそれよりも狭い範囲しか動かないものもあります。実際に使用する際には、そのことも考慮に入れてプログラムを調整してください。
それでは、早速使ってみましょう。以下のような回路を作ります。
ポイントは、外部電源(6V)のGNDを Raspberry Pi のGNDと接続すること、外部電源のプラスは Rasbperry Pi の5Vや3.3Vとつながないことです。外部電源を使う時には、常にこの2つを守ります。
プログラムは以下のようになります。
from gpiozero import PWMOutputDevice
from time import sleep
motor_pin = 17
motor_pwm = PWMOutputDevice(motor_pin)
def main_loop():
while True:
led_pwm.value = 0.8 # デューティ比80%
sleep(2)
led_pwm.value = 0.1 # デューティ比10%
sleep(2)
if __name__ == '__main__':
main_loop()
(編集中)