第7回 モーターを回してみよう

    モーターを回してみよう


    DCモーター

    モーターを使って、正転、反転を制御していきます。 今回、モーターを制御するために、モータードライバーという部品を使います。 以下の流れで学習していきます。 1) モーターの仕組み 2) fritzingを使用して、配線図を作成 3) 配線図を見て、Arduinoとブレッドボードを配線 4) プログラムの作成 5) コンパイルと書き込みの実行

    準備するもの


    第7回で事前準備するものを紹介します。

    項目名 個数
    Arduino本体 1個 Arduino本体
    ブレッドボード 1個 ブレッドボード
    DCモーター 1個 DCモーター
    モータードライバー(TA7291P) 1個 モータードライバー(TA7291P)
    単三電池ボックス 1個 単三電池ボックス
    単三電池 4本 単三電池
    ジャンパーワイヤー10cm(オス-オス) 5本 ジャンパーワイヤー10cm(オス-オス)
    ジャンパーワイヤー15cm(オス-オス) 2本 ジャンパーワイヤー15cm(オス-オス)

    モーターの仕組み


    モーターの仕組み

    DCモーターと呼ばれるモーターを使用します。 DCモーターとは、一般的に呼ばれる直流モーターで、上記のように接続することで、直流電源で回すことができます。 モーターの電圧を高くすることで、回転速度が上がり、逆に電圧を低くすることで回転速度が下がります。 上記の図の接続では、正転で同じ速度で動きます。 逆転で動かせたい場合、プラスマイナスを逆にしないと、モーターを逆転させることはできません。 また、速度を調節することもできません。 今回は、モーターの回転方向や速度を調整するために、モータードライバやPWMといった仕組みを利用していきます。

    モータードライバ


    TA7291P説明

    制御 ⑤番ピン ⑥番ピン
    正転 HIGH LOW
    逆転 LOW HIGH
    ストップ LOW LOW
    ブレーキ HIGH HIGH

    モータードライバを使用することにより、モーターの制御をすることができます。 1) 回転方向の制御 上記のモータドライバの、⑤、⑥の電圧を操作することにより回転方向の制御ができます。 制御としては、正転、逆転、ストップ、ブレーキが可能です。 正転は、⑤番ピンをHIGH(5V)、⑥番ピンをLOW(0V)に設定する 逆転は、⑤番ピンをLOW(0V)、⑥番ピンをHIGH(5V)に設定する ストップは、⑤番ピンをLOW(0V)、⑥番ピンをLOW(0V)に設定する ブレーキは、⑤番ピンをHIGH(5V)、⑥番ピンをHIGH(5V)に設定する 2) 回転速度制御 回転速度を設定する場合は、モータドライバの④にanalogWrite関数を使用して、0~255までの値を指定します。 0V~5Vの間の電圧を制御し、コントロールします。

    PWMについて


    PWMについて

    Arduinoには、PWMという仕組みが用意されています。 Arduinoのピンの出力電圧は、0Vか5Vのどちらかの電圧値しか出力できませんが、PWMの仕組みを利用することによって、アナログ的に電圧を出力したことと同じような効果が得られます。 PWM(アナログ出力)を利用できるピンは、ボード上に"~"と書かれている、3, 5, 6, 9, 10, 11番ピンになります。 プログラム上では、以下のanalogWrite関数を使用します。

    analogWrite 関数

    書式) void analogWrite(byte pin, int value) 説明) pinで指定した番号のピンの電圧を、valueに0から255までの値を設定することで0Vから5Vまでの電圧を出力します。

    fritzingを使用して、配線図を作成


     fritzingを使用して、配線図を作成

    fritzingを使用し、配線図を作成してみましょう。 Arduino、ブレッドボード、モーター、モータドライバ、単三電池ボックスのパーツを使用して配線します。 モータードライバのパーツについては、fritzingの標準部品にはない為、サイトからダウンロードし、インポートする必要があります。 または、fritzingパーツを自作することもできるので、興味のある方は試してみて下さい。 モータドライバのパーツのダウンロード 上記のサイトでダウンロードされた場合、TA7291P.lzhという形式でダウンロードされるので、解凍します。 解凍すると、TA7291P.fzpzというfritzingで使用ができる形式で展開されます。 インポート方法は、fritzingを起動し、ファイル → 開くでTA7291P.fzpzを選択します。 そうすると、fritzingツールの右上のパーツのMINEタブに、My PartsとしてTA7291Pが表示されます。

    下記のボタンをクリックすると、fritzingを使ったモーターの配線図の作成動画を確認できます。

    モーターの配線図の作成

    配線図を見て、Arduinoとブレッドボードを配線


    Arduinoとブレッドボードを配線

    作成した配線図を見ながら、実際に配線します。

    プログラムの作成


    プログラム作成

    モーターを正転、逆転させるプログラムを作成していきます。 1) Arduino IDEを起動します。 2) ファイル → 名前を付けて保存をクリックして、今回は、motorと入力しファイルを保存します。 下記のボタンをクリックして、プログラムの作成動画を見ながら作成してみましょう。

    プログラムの作成

    プログラムの解説


    プログラム解説

    1行目~3行目では、モータの回転方向と速度調整に使用するピンの変数定義を行っています。 4行目~5行目では、モーターのスピードの値を格納する変数を定義しています。 今回は、正転と逆転で回すスピードを変えたい為、speed_A変数には100を、speed_B変数には20を設定しています。 8行目~9行目では、1行目~3行目で変数定義した、使用するピンの出力設定をしています。 14行目~16行目では、まずモーターを停止状態にさせる為、motorAとmotorBの出力を両方ともオフ(0V)にしています。 16行目のdelay関数は、次の処理への移る前に1秒間待機させています。 17行目~18行目では、モーターを正転させる為、motorAの出力をオン(5V)にして、motorBの出力をオフ(0V)しています。 19行目では、4行目で設定したspeed_A(スピードの値)をmotorPWM(スピード調整のピン)に設定しています。 ここではdigitalWrite関数ではなく、analogWrite関数を使用しています。 digitalWrite関数では、オン(5V)かオフ(0V)しかできない、つまり最大で出力するか停止するしかできないので、 モーターの速度調整をすることはできません。 この場合に、analogWrite関数を使用します。 analogWrite関数では、0~255までの値を設定することで、0Vから5Vまでの電圧を出力できる為、 範囲内でモーターの速度調整をすることができます。 21行目~23行目では、14行目~16行目の処理と同様で、モーターを停止状態にしています。 24行目~25行目では、モーターを逆転させる為、motorAの出力をオフ(0V)にして、motorBの出力をオン(5V)しています。 26行目では、5行目で設定したspeed_B(スピードの値)をmotorPWM(スピード調整のピン)に設定しています。 speed_Bの値は20と設定されているため、逆転は正転よりも遅いスピードで回ります。

    プログラムのコンパイルと書き込み


    プログラム解説

    プログラムの作成ができたら、コンパイルを行い、Arduinoへの書き込み処理を行います。 1) コンパイルを実行 → コンパイルアイコン をクリックします 2) アップロードを実行 → アップロードアイコン をクリックします 下記のボタンをクリックすると、プログラムのコンパイルと書き込み動画を見て確認できます。 プログラムのコンパイルと書き込み

    動作確認


    実際に動かして、モーターの回転を見てみましょう。 今回、モーターを正転させた時はスピードの値を100、モーターを逆転させた時はスピードの値を20と設定していたので、正転させた時と逆転させた時の回転速度が違うはずです。 逆転速度の動きが正転速度よりも遅いことに注目してみてください。 モータードライバやPWMの仕組みを利用することにより、モーターの速度調整ができるので、この仕組みを利用してラジコンなどを作成することができます。 モーターのプログラムを確認しておきましょう。

    #define motor_A 10 #define motor_B 9 #define motor_PWM 11 int speed_A = 100; int speed_B = 20; void setup() { pinMode(motor_A, OUTPUT); pinMode(motor_B, OUTPUT); pinMode(motor_PWM, OUTPUT); } void loop() { digitalWrite(motor_A, LOW); digitalWrite(motor_B, LOW); delay(1000); digitalWrite(motor_A, HIGH); digitalWrite(motor_B, LOW); analogWrite(motor_PWM, speed_A); delay(2000); digitalWrite(motor_A, LOW); digitalWrite(motor_B, LOW); delay(1000); digitalWrite(motor_A, LOW); digitalWrite(motor_B, HIGH); analogWrite(motor_PWM, speed_B); delay(2000); }

    ここまでの第7回までを通して、fritzingや、Arduinoとブレッドボードの配線にもだいぶ慣れてきたでしょうか。 次は温度センサーを使用して、室内の温度を測ってみましょう。

    >> 第8回 温度センサーで室内の温度を測ってみよう