品切れになる前に!防災用品を備えよう!
\ 防災用品の準備はできていますか? /
この記事内には、プロモーションが含まれます。
こんにちは、せでぃあ(@cediablog)です。
ArduinoプログラミングLESSON15は「モータードライバーIC(L293D)を使ったDCモーター制御」です。
PWM制御による、DCモーターの回転方向(時計回り・反時計回り)、回転速度を制御するプログラミングの作り方を紹介します。
本LESSON記事は、プログラミングの学習と電子パーツの知識が習得できるプログラムになっています。
小学生、中学生も安心してプログラミングができるように、スクラッチでのプログラミング方法についても動画付きで紹介しています。
写真右上のプロペラが付いた機器がDCモーターです
本記事では、スクラッチベースのビジュアルプログラミングツールmBlockとArduinoIDEプログラムどちらも紹介しています
本記事ではmBlockのアップロードモード「オン」でのプログラム例を紹介しています
無料のブロックプログラミングツールmBlockのインストール方法については、こちらの記事を参照してください。
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
モータードライバーIC(L293D)とは、DCモーターに対して回転動作・回転方向を制御することができる電子機器です。
回転方向・動作速度を制御する場合は、最大2つのモーターを接続して個別に制御することができます。
片側8本、計16本のピンが付いており、今回はブレッドボードに直接差し込んで使用します。
L293には4つのモーター制御回路があります。(上記説明図の△1~4)
2つのCHを使用することで、モーターの回転速度と回転方向を制御することができます。
まずはDCモーター制御のイメージだけつかんでください
Arduinoでは0Vと5VのON時間の割合を調節することで、疑似的なアナログ出力ができる機能を持っています。
疑似的なアナログ出力方式をパルス変調といい、PWM(Pulse Width Modulation)出力といいます
アナログ出力値(PWM)は、プログラム上にて0~255の範囲で指定することができます。
最大値255で出力したときに、出力電圧が最大値(5V)の出力となります。
アナログ出力の5Vは制御用電圧であり、モーター駆動用の電源ではないので注意してください
アナログ出力に関して学習したい方は、こちらの記事がおすすめです。
左右に各8本ずつ配線用のピンが搭載されており、上記のようになっています。
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
DCモーターとは、直流電源を流すことで回転させることができるモーターです。
流す電源電圧の+-極性切り替えにより、回転方向(時計回り・反時計回り)制御させることは可能ですが、サーボモーターのような、指定角度への移動制御(位置決め制御)はできません。
サーボモーターについて知りたい方は、こちらの記事がおすすめです。
今回の説明する「モータードライバーICのL293Dを使って、DCモーターを制御する」は、以下になります。
まずは動画を見て、今回のLESSON15で実行させたい動作内容を確認してください。
また、mBlockを使ったスクラッチプログラミングや動作確認方法についても解説しています。
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEのインストールは不要です
パソコンにスクラッチベースのビジュアルプログラミングツール「mBlock」のインストールを行います。
以下の記事にて詳しく説明しています。
ArduinoIDEでプログラミングする場合は、mBlockのインストールは不要です
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
Arduino IDEプログラミングの基本操作については、こちらの記事にて詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEプログラミングは不要です
スクラッチベースのビジュアルプログラミングツールmBlockを使ってプログラムを作成します
プログラム内容については、後述するプログラミング例を参考にしてください。
ArduinoIDEでプログラミングする場合は、mBlockプログラミングは不要です
プログラムが完成したら動作確認を行います。
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
モーター固定用のLEGOブロックはキットに含まれませんので、ご注意ください
モーターは動画撮影用に自前のLEGOブロックで固定しましたが、LEGOブロックを使わなくても配線・動作確認は可能です。
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能面は同じです
ArduinoUnoのデジタル入出力ピンから供給できる電流は40mAとなっており、それほど大きくはありません。
今回使用するDCモーターは負荷回転時に最大250mA流れるため、電流値不足となってしまいます。
この対策として、今回のような外部電源モジュールを接続して駆動させる必要があります。
電源モジュールについては、こちらの記事にて詳しく説明しています。
赤色・黄色・緑色のLED(発行ダイオード)を1本ずつ使用します。
LED素子にはプラスマイナスの極性があるため配線時には注意が必要です。
極性を間違えて配線すると、LEDは点灯しません
220Ωの抵抗を使用し、各LEDに1本ずつ接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
LEDを点灯させるために接続する抵抗の選び方については、こちらの記事で詳しく説明しています。
今回のLESSONでは、押しボタンスイッチを使用します。
押しボタンは押されている間のみ、上記写真での2点が内部でつながります。
このようなボタンをモーメンタリボタンといいます。
今回は扱いませんが、ボタンから手を離してもONしたままになるボタンをオルタネイトボタンといいます。
モーメンタリ・オルタネイトボタンについては以下記事にて詳しく説明しています。
1kΩの抵抗を1本使用し、押しボタンスイッチに接続します。
抵抗を接続するのは、押しボタンがOFFのときにArduino本体がノイズによる誤検出することを避けるためです。
この記事では詳しく説明しませんが、ボタンを押していないのに押されたと誤認識されることを避ける目的であるということだけ覚えておいてください。
9V電池とDCジャックがついたスナップケーブルです。
電源モジュールに接続します。
Arduinoのデジタル出力ソケットからの信号入力により、DCモーターの回転速度や正転・逆転制御をすることができます。
DCモーターは直流電圧をかけるだけで回転させることができます。
パルス変調(PWM:Pulse Width Modulation)という出力方式を利用して、モーターの回転速度を制御することができます。
ジャンパー線を15本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
配線数が多いので、1本ずつ落ち着いて配線してください
機器が故障するおそれがあるので、接続するプラスマイナス極性には十分注意して配線してください。
電源モジュールの電圧設定ジャンパーは2か所とも「5V」設定にしてください。
抵抗は極性がありませんのでどちら側のピンを挿入してもOKです。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
本記事では、以下に示す「Arduino IDEプログラミング」と「mBlockプログラミング」の2通りのプログラミング方法について解説しています。
いずれか1つのプログラミング方法を用いることで、LESSON15の制御動作を行うことが可能です。
ArduinoIDE:文字列による命令語形式
mBlock:スクラッチベースのビジュアル形式
文字列を使わないmBlockの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
mBlockを使ってプログラミングをする方は、mBlockの説明まで読み飛ばしてください。
今回6つのモーター動作モードを用意して、それぞれの動作ごとにプログラムを作ります。
モード0とモード3はどちらも「モーター停止」ですが、次に押しボタンを押したときの回転方向が赤色LEDの点灯・点滅でわかるように区別しています。
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
日本語版のArduino公式リファレンスが巻末に収録されているので関数を調べるときに重宝します!(私も所有しています)
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
/* 作品名:LESSON15 */
/* 作成者:せでぃあ https://cediablog.com */
/* L293Dを使ったDCモーター制御 */
int BTN_SOCKET = 2; //押しボタン入力ソケット番号
int MT1A_SOCKET = 3; //L293Dの1A入力ソケット番号
int MT2A_SOCKET = 5; //L293Dの2A入力ソケット番号
int MTEN_SOCKET = 7; //L293DのEN入力ソケット番号
int LED_G_SOCKET = 8; //緑色LED点灯出力ソケット番号
int LED_Y_SOCKET = 9; //黄色LED点灯出力ソケット番号
int LED_R_SOCKET = 10; //赤色LED点灯出力ソケット番号
int MODE = 0; //モーター回転モード
void setup() {
// put your setup code here, to run once: プログラム起動時1回だけ処理される回路
//入出力の割り当て
pinMode(BTN_SOCKET, INPUT); //2番ピンは入力として使用
pinMode(MT1A_SOCKET, OUTPUT); //3番ピンは出力として使用
pinMode(MT2A_SOCKET, OUTPUT); //5番ピンは出力として使用
pinMode(MTEN_SOCKET, OUTPUT); //7番ピンは出力として使用
pinMode(LED_G_SOCKET, OUTPUT); //8番ピンは出力として使用
pinMode(LED_Y_SOCKET, OUTPUT); //9番ピンは出力として使用
pinMode(LED_R_SOCKET, OUTPUT); //10番ピンは出力として使用
}
void loop() {
// put your main code here, to run repeatedly: プログラム起動後ループ処理される回路
if(digitalRead(BTN_SOCKET) == HIGH){ //押しボタンがONのとき
if(MODE > 4){ //モーター回転モードが5以上のとき
MODE = 0 ; //モーター回転モードを0にする
}else{ //モーター回転モードが4以下のとき
MODE = MODE + 1 ; //モーター回転モードを+1の値にする
}
while(digitalRead(BTN_SOCKET) == HIGH){ //押しボタンが押されたままのときに待機させる
}
}
if(MODE == 0){ //モーター回転モード「0:正転停止」
analogWrite(MT1A_SOCKET , 0); //L293Dの1A出力「0」
analogWrite(MT2A_SOCKET , 0); //L293Dの2A出力「0」
digitalWrite(MTEN_SOCKET , LOW); //L293Dのイネーブル出力をOFF
digitalWrite(LED_G_SOCKET , LOW); //緑色LED点灯出力をOFF
digitalWrite(LED_R_SOCKET , HIGH); //赤色LED点灯出力をON
}
else if(MODE == 1){ //モーター回転モード「1:正転高速」
analogWrite(MT1A_SOCKET , 255); //L293Dの1A出力「255」
analogWrite(MT2A_SOCKET , 0); //L293Dの2A出力「0」
digitalWrite(MTEN_SOCKET , HIGH); //L293Dのイネーブル出力をON
digitalWrite(LED_G_SOCKET , HIGH); //緑色LED点灯出力をON
digitalWrite(LED_R_SOCKET , LOW); //赤色LED点灯出力をOFF
}
else if(MODE == 2){ //モーター回転モード「2:正転低速」
analogWrite(MT1A_SOCKET , 125); //L293Dの1A出力「125」
analogWrite(MT2A_SOCKET , 0); //L293Dの2A出力「0」
digitalWrite(MTEN_SOCKET , HIGH); //L293Dのイネーブル出力をON
digitalWrite(LED_Y_SOCKET , HIGH); //黄色LED点灯出力をON
digitalWrite(LED_G_SOCKET , LOW); //緑色LED点灯出力をOFF
}
else if(MODE == 3){ //モーター回転モード「3:逆転停止」
analogWrite(MT1A_SOCKET , 0); //L293Dの1A出力「0」
analogWrite(MT2A_SOCKET , 0); //L293Dの2A出力「0」
digitalWrite(MTEN_SOCKET , LOW); //L293Dのイネーブル出力をOFF
digitalWrite(LED_Y_SOCKET , LOW); //黄色LED点灯出力をOFF
}
else if(MODE == 4){ //モーター回転モード「4:逆転高速」
analogWrite(MT1A_SOCKET , 0); //L293Dの1A出力「0」
analogWrite(MT2A_SOCKET , 255); //L293Dの2A出力「255」
digitalWrite(MTEN_SOCKET , HIGH); //L293Dのイネーブル出力をON
digitalWrite(LED_R_SOCKET , LOW); //赤色LED点灯出力をOFF
}
else if(MODE == 5){ //モーター回転モード「5:逆転低速」
analogWrite(MT1A_SOCKET , 0); //L293Dの1A出力「0」
analogWrite(MT2A_SOCKET , 125); //L293Dの2A出力「125」
digitalWrite(MTEN_SOCKET , HIGH); //L293Dのイネーブル出力をON
digitalWrite(LED_G_SOCKET , LOW); //緑色LED点灯出力をOFF
}
//モーター逆転モード時のランプ点滅回路//
if(MODE == 3){ //モーター回転モード「3:逆転停止」
digitalWrite(LED_R_SOCKET , HIGH); //赤色LED点灯出力をOFF
delay(200); //0.2秒ウェイト
digitalWrite(LED_R_SOCKET , LOW); //赤色LED点灯出力をON
delay(200); //0.2秒ウェイト
}
else if(MODE == 4){ //モーター回転モード「4:逆転高速」
digitalWrite(LED_G_SOCKET , HIGH); //緑色LED点灯出力をOFF
delay(200); //0.2秒ウェイト
digitalWrite(LED_G_SOCKET , LOW); //緑色LED点灯出力をON
delay(200); //0.2秒ウェイト
}
else if(MODE == 5){ //モーター回転モード「5:逆転低速」
digitalWrite(LED_Y_SOCKET , HIGH); //黄色LED点灯出力をOFF
delay(200); //0.2秒ウェイト
digitalWrite(LED_Y_SOCKET , LOW); //黄色LED点灯出力をON
delay(200); //0.2秒ウェイト
}
delay(100); //0.1秒ウェイト
}
上記がモータードライバーL293Dを使った、DCモーター制御動作回路のプログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
6つのモードに対する動作を理解しておこう
今回のプログラムで使用した命令文について、解説します。
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
またアナログ出力値は「0~255」の整数を扱いますので、同じく「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
指定したデジタル入出力ソケット番号の状態がON、またはOFFであるか確認します。
ONのときは「HIGH」、OFFのときは「LOW」の値が返ってきます。
指定したデジタル入出力ソケット番号の電圧をON、またはOFFします。
ONさせたいときは「HIGH」、OFFさせたいときは「LOW」を指定します。
指定したデジタル入出力ソケット番号の電圧を255階調での値で出力します。
5V出力の場合、0のとき0V、255の時5Vの出力となります。
0Vと5Vの状態を時間の割合で調整して作る、疑似的なアナログ電圧になります。
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
マイクロ秒単位で指定したい場合は、delayMcroseconds(時間)を使います。
条件が成立しているときのみ、{ }内の文が実行されます。
条件が成立しなければ、{ }内の文は処理されず、次の処理に移ります。
if( 条件 ){
条件成立時に実行する文 ;
}
条件式が成立しているか否かで、どちらの命令文を実行するか振り分けます。
if( 条件 ){
条件成立時に実行する文 ;
} else {
条件不成立時に実行する文 ;
}
比較演算子 | 説明 |
---|---|
A == B | AとBが等しい場合に成立 |
A != B | AとBが等しくない場合に成立 |
A < B | AがBより小さい場合に成立 |
A <= B | AがB以下の場合に成立 |
A > B | AがBより大きい場合に成立 |
A >= B | AがB以上の場合に成立 |
プログラミング初心者の方に、おすすめなArduinoの参考書を紹介しています!
ここからは、mBlockを使ったプログラムの作り方を解説します。
これらの基本操作方法については、こちらの記事を参照してください。
プログラミング、動作確認方法については、本記事の説明動画でも紹介しています
動画を参考にプログラミングしてみよう
今回演算処理した値を代入するための変数が必要になります。
mBlockでの変数作成方法について紹介します。
①カテゴリエリアの「変数」をクリックします。
②ブロックエリアの「変数を作る」をクリックします。
③変数名をキーボード入力します。
④「このスプライトのみ」を選択します。
⑤「はい」をクリックしてウインドウを閉じます。
作った変数がブロックとして表示されたら、作成完了です。
今回作成する変数は「回転モード」になります
今回は「アップロードモード オン」でのプログラム作成例を紹介しています。
プログラム開始条件が「Arduino Unoが起動したとき」になっている点に注意してください。
以下のプログラムが動作プログラムになります。
mBlockのArduino専用ブロックについては、こちらの記事にて詳しく説明しています。
上記項目について確認していきましょう。
モード0~2の動作になります。
プログラム転送後にモーター停止状態であることを確認してください。
次に押しボタンを押して、指が離れたときにモーターが高速回転することを確認してください。
もう一度押しボタンを押したときにモーター回転速度が低速になり、さらにボタンを押すと停止することが確認できれば動作OKです。
モード3~5の動作になります。
上記、モーター正転動作完了後のモーター回転停止状態からの動作確認になります。
先ほどの正転動作とモーター回転方向が逆になっていることを確認してください。
その他の動作は、正転動作時と同じになります。
停止動作後さらに押しボタンを押すと、再び正転動作からの繰り返し動作になります
各回転動作モードに合わせて、該当する色のLEDが1つだけ点灯・点滅することを確認してください。
モード0~2:正転動作のときは「点灯」、モード3~5:逆転動作のときは「点滅」となります。
小学生のお子様には断然、ビジュアルプログラミングがおすすめです!
モーターはプログラム学習ロボットmBotにも使われています!
最後まで読んでいただき、ありがとうございました。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
この記事が気に入ったら
フォローしてね!
コメント