モータとロボット
モータとロボット
モータの基礎
この講義では、DCモータとサーボモータという2種類のモータを使います。
DCモータ
家庭にある電源コンセントを、AC100Vと呼ぶことは知っていると思います。このACとは Alternating Current の略で、1秒間に50回などの短い周期で電流の向きが変わることを意味しています。日本語では、交流あるいは交流電流と言います。
一方、乾電池やUSB電源などは、直流あるいは直流電流と呼ばれます。DCというのは、 Direct Current の略で、直流電流を意味します。直流の場合、マイコンや部品で変えない限りは電流の向きは一定です。
DCモータは、直流電流で動くモータです。模型でよく使用するマブチモータは、皆さんも一度は見たことがあると思います。
乾電池でDCモータを動かすのは簡単です。DCモータの端子に、乾電池の+極と-極をつなげばOKです。
しかしモータを、マイコンに繋いで制御するとなると、ちょっと難しいです。まず、DCモータに限らずモータというものは、少なくとも数百mA、多ければ数Aの電流を必要とします。マイコンのピンから供給できる電流は5mAくらいなので、マイコンのデジタル出力を使い直接DCモータを駆動することはできません。使用するモータによって、別途、適した外部電源を用意する必要があります。また、正転、逆転、停止、回転速度などの制御を行う必要もあります。
そこで、それらのことを簡単に解決するための、モータドライバというデバイスが存在します。この講義では、TA7291Pというモータドライバを使います。
TA7291Pは、最大2AまでのDCモータが制御できます。マブチモータFA-130は、通常の回し方だと数百mAですので、TA7291Pで制御することは可能です。
モータドライバ
それでは、TA7291Pを使ってDCモータを回してみましょう。TA7291Pの各ピンは、以下のように番号が振られています。
それぞれのピンの役割は以下の通りです。
1: GND→グランドへ
2: 出力1(モータ)→モータの片側へ
4: PWM→ Raspberry Pi のデジタルピンへ
5: 入力1→ Raspberry Pi のデジタルピンへ
6: 入力2→ Raspberry Pi のデジタルピンへ
7: ロジック側電源→ Raspberry Pi の3.3Vピンへ
8: モータ側電源→外部電源のプラスへ
10: 出力2(モータ)→モータの片側へ
書いていないピンには何も接続しなくてよいです。8番のモータ側電源というのは、モータを駆動するために必要な電源です。TA7291Pは4.5Vから20Vまで対応しています。今回の実験では単3電池4本の6Vを使います。
4番のPWMでモータに実際にかける電圧をコントロールします。TA7291Pではモータ側電源の電圧がそのままモータにかかるわけではなく、4番に入力されたPWMのデューティ比を乗じた電圧がかかります。したがって、デューティ比を変化させると、モータにかける電圧も変わり、モータの回転速度が変わります。間違ってはいけないのは、4番ピンからモータにそのまま電圧がかかるわけではなく、4番ピンにかける電圧は、単なる電圧の指示であるということです。モータにかかる電圧は、外部電源から供給されます。
5番ピンと6番ピンは、モータの正転や逆転、停止を指示するピンです。以下のように設定します。
ただし、ブレーキとストップは、あまり違いがないと思ってください。通常は、ストップを使います。
マブチモーター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()
ロボット
(編集中)