\ AmazonにてArduino UNO R4 発売中!! /

Arduino 入門 Lesson 26 【DCモータ編】

arduino-lesson26-00 Arduino入門編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 26
【DCモーター編】

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

※1 一部誤記修正しました。
※2 回路図とブレッドボード図を修正しました。

 

本記事はLesson 26 【DCモーター編】です。

DCモーターはミニ4駆やラジコンなど、子供の時に遊んだおもちゃに使われています。

子供の頃はモーターと言えばTAMIYAとう記憶があります。

 

DCモータはモーターそのものですので制御回路などは組み込まれていません。

電圧を制御することで回転速度を変えることはできます。

本記事では、DCモーターとトランジスタの組み合わせによるDCモーターの制御を学習します。

また、DCモーターはシリアルモニタからテンキーによって制御します。

そうすることで、ミニ扇風機を作ります。

 

そう、ミニ扇風機です!

考えるだけで楽しくなってきました。

 

ちなみに、制御回路が組み込まれているのがサーボモータ-です。

Lesson 9で学習したサーボモーターは内部にモーターの制御回路などが組み込まれています。

そのため、回転角度をArduinoで簡単に制御できるようになっています。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

DCモーターをArduinoで制御する場合、DCモーターの電流に注意する必要があります。

使用するDCモーターのデーターシートを必ず確認してください。

 

ArduinoのDC Current per I/O Pinの仕様を公式HPで再確認。

下記に示すように20mAとなっています。
※以前は40mAと記載されていたのですが・・・

arduino-lesson26-01

 

下記ページの「Tech specs」の項目にて確認できます。

 

DCモータの電流値は使用するモーターによって様々です。

ものによっては、数百mA程度必要とします。

20mAの出力電流であるArduinoのIOピンに数百mAの負荷を接続すると・・・

はい、壊れる可能性大です。

DCモーターをArduinoに直接つなぐのはやめましょう!

 

本Lessonでは、それを回避するためにドライバICを間にはさみます。

また、DCモーターはArduinoで直接扱うには電流値が大きい。

そのためDCモーターに別に電源を供給するための電源モジュールも使用します。

 

Lesson 26 目標

本Lessonの目標は以下です。

1.モータードライバIC(L293D)を理解する。
2.L293Dを使用したDCモータの制御を理解する。
3.ミニ扇風機のような動作をするスケッチ(コード)を作る。

今回も遊ぶことを最大の目標に楽しみましょう!

 

準備

ではLessonの準備に取り掛かりましょう。

Lesson 25 4桁7セグメントLEDに比べれば接続は簡単です。

頑張って組み上げていきましょう。

 

必要なもの

 

DCモーターはホームセンターなどで購入されても良いかと考えます。

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!

という方は、「電子工作基本部品セット」が使い勝手が良い。

 

使用部品説明

新たに登場した部品について説明していきます。

本Lessonで新しく登場する部品は以下となります。

 

DCモーター 実物写真

下の写真が、DCモーターです。

一緒に写っているのはファンです。

モータに取り付けて扇風機のようにします。
※なくてもLessonには困りません。

arduino-lesson26-02

 

ちなみに、ELEGOO UNO キットには合わせて梱包されています。

 

Amazonで売られているものを紹介しておきます。

ただし、DCモーターに関してはホームセンターなどで購入されても良いかと考えます。

 

DCモーター 仕様

DCモーター。

梱包されていたDCモーターですが型番など記載ありません。

そのため、仕様がまったくわかりません。

 

しょうがありませんのでテスタを使って自分で調べます。

電圧の使用範囲は3V~6Vと記載がありました。

消費電流はテスタで測定。

電圧[V] 電流[mA]
4.8
※乾電池3個分の直列電圧
57

 

測定した結果、電圧4.8Vで電流は約57mAとなりました。

約60mA程度と考えておけば問題ないでしょう。

※4.8Vは乾電池3個分を直列接続したときの電圧です。

 

DCモーターの原理を詳しく知りたい方は下記サイトなど参照ください。

 

電源モジュール 実物写真

下の写真が、電源モジュールです。

arduino-lesson26-03

 

使用しているELEGOO UNO キットには合わせて梱包されています。

手持ちのない方は以下などが入手可能です。

 

電源モジュール 仕様

電源モジュールの仕様を紹介しておきます。

本Lessonで使用する電源モジュールの仕様は以下となります。

  • ON/OFFスイッチ
  • ON/OFF確認用のLED付き
  • 接続:5.5mm × 2.1mmプラグ
  • 入力電圧:6.5V~9V(DC)
  • 出力電圧:3.3V/5.0V
  • 最大出力電流:700mA
  • サイズ:約53mm × 35mm

本Lessonでは、5.5mm × 2.1mmプラグから9Vの電池で電源を供給します。

 

Arduinoと電子部品の電源を分けることで、Arduinoの損傷を防ぐことに繋がります。
また、大電流を必要とする電子負品を使う場合も重宝します。
ぜひ、何個かは確保しておきたい電子部品です。

下記、Amazonにある別メーカー品もほぼ同じような仕様のため問題なく使用可能です。

 

電源モジュールの使い方に関しては下記にて詳細を解説しています。

 

モータードライバIC(L293D) 実物写真

こちらが、L293Dの実物となります。

arduino-lesson26-04

 

お手持ちがない方は以下などから入手ください。

モータードライバIC(L293D)

 

モータードライバIC(L293D) 仕様

ドライバICのL293D外観

arduino-lesson26-05

 

ピン仕様

PIN 入出力 内容
ピン名 ピンNO.
1,2EN 1 I Enable(ドライバ ch1、ch2) Active:High
ch1:1A/1Y ch2:2A/2Y
A<1:4> 2,7,10,15 I 入力ピン
Y<1:4> 3,6,11,14 O 出力ピン
3,4EN 9 I Enable(ドライバ ch3、ch4) Active:High
ch3:3A/3Y ch4:4A/4Y
GND 4,5,12,13 GNDピン
VCC1 16 5V(内部ロジック用)
VCC2 8 4.5V~36V(ドライバ用)

 

絶対定格

Min Max 単位
VCC1 36 V
VCC2 36 V
入力電圧 Vi 7 V
出力電圧 Vo -3 VCC2+3 V
ピーク出力電流 -1.2 1.2 A
出力電流 Io -600 600 mA
最大接合温度 150

 

推奨動作条件

Min Max 単位
電源電圧1 VCC1 4.5 7 V
電源電圧2 VCC2 VCC1 36 V
VIH VCC1 ≦ 7V 2.3 VCC1 V
VIH VCC1 ≧ 7V 2.3 7 V
VIL -0.3 1.5 V
動作温度 0 70

 

ブロックダイアグラム

図中のMはモーター、IC内の△マークはバッファとなります。

図中△内の数字1、2、3、4をch1、ch2、ch3、ch4のバッファと管理人は呼んでいます。

arduino-lesson26-06

 

詳細なデータシートを確認したい方は以下を参照ください。

 

上記仕様から、L293Dは4.5V~36Vの電圧範囲において、最大±600mAの出力電流で負荷を駆動できるということがわかります。

本Lessonで仕様する「DCモーター」は約60mA程度の消費電流となっています。

L293Dには十分な負荷駆動能力の性能があることがわかります。

 

また、本Lessonではch1とch2を使用します。

モータを正回転、逆回転させるためです。

そのため、ブロックダイアグラムにある左側の結線図を参考にします。

1つのモーターをch1、ch2のバッファを使用して制御するということになります。

 

回転を正回転のみ、逆回転のみとする場合は使用するchは1つでかまいません。

その場合、モーター負極をGNDに接続するなどしてください。

 

ブロックダイアグラム中の保護ダイオードについて

電流を流していたコイルの電流を切ると、逆方向に電流が流れます。
これは逆起電力と呼ばれるもので、インダクタの特性の一つです。
この逆起電力ですが、場合によっては供給した電圧の数十倍の電圧が発生することもあり電子部品を破壊する原因となります。
この逆起電力からトランジスタを守るのが保護ダイオードとなります。
L293DはIC内に内蔵されており外付けで考慮する必要はありません。

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、DCモーターを動かしていきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

DCモーターの+をドライバーIC(L293D)のch1の出力(3番ピン)、-をch2の出力ピン(6番ピン)に接続します。

Arduinoはデジタルピンの7,5,3番ピンを使用します。

  • 7:L293Dの1番ピン(Enableピン)
  • 5:L293Dの2番ピン(CH1バッファ入力)
  • 3:L293Dの7番ピン(CH2バッファ入力)

回路図がこちら。

追記:回路図修正
1.ArduinoとブレッドボードのGNDを接続(GNDレベルの統一)
2.L293DのVCC1(16番ピン)は5Vに接続

arduino-lesson26-07b

 

こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。

電源モジュールにはDCプラグから9Vの電池でつなぎます。
ブレッドボードへの電源供給は、電源モジュールの左上、左下にある+、-端子をブレッドボードの上下のVCCとGNDに挿入することで供給されます。
電源モジュールの出力は5Vとする。
ジャンパーは5Vと記載された黄色枠側につけてください。
追記:ブレッドボード図修正
1.ArduinoとブレッドボードのGNDを接続(GNDレベルの統一)
2.L293DのVCC1(16番ピン)は5Vに接続

arduino-lesson26-08a

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品は電源モジュールドライバーIC(L293D)となります。

M-M jumper wireを使用してUNOと接続しましょう。

 

使用するポートは、デジタルピンの「3,5,7」です。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

追記:情報を追記
1.ArduinoとブレッドボードのGNDを接続(GNDレベルの統一)
2.L293DのVCC1(16番ピン)は5Vに接続

arduino-lesson26-09a

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

 

コマンド説明

特に新しくでてきたコマンドはありませんが、重要コマンドを復習しておきましょう。

コマンド 説明
analogWrite(pin, value) 指定したピンからアナログ値(PWM波)を出力します。
Unoのボードでは、デジタルピン3、5、6、9、10、11でこの機能が使えます。

 

analogWrite()思い出しましたか?

ぜひ、本Lessonで思い出して理解しておくことをお勧めします。

詳しく思い出したい方は下記を参照してください。

 

サンプルコード

サンプルコードを下記に示します。

シリアルモニタからテンキーの数字を押すことによってDCモーターの回転を制御するコードを作成してみました。

低速、中速、高速はanalogWrite()関数を利用しています。

パルス変調を利用することにより、疑似的に0V~5Vの中間値を作り出す制御です。

 

低速で回転させるためのコツ
パルス変調を利用する場合、
DCモーターを低速で動かすためにちょっとしたコツがいります。
それは、回転させるためのきっかけが必要です。
コードのコメントに記載していますので確認してみてください。

 

//Lesson 26 DCモータ編
//https://omoroya.com/

// 電子部品は電源モジュールとドライバIC(L293D)を使用

// 変数の設定
const int ENABLE = 7;
const int CH1 = 5;
const int CH2 = 3;
 
void setup() {
  //Pinの方向を定義
  pinMode(ENABLE,OUTPUT); // 7番ピンをOUTPUT指定
  pinMode(CH1,OUTPUT);    // 5番ピンをOUTPUT指定
  pinMode(CH2,OUTPUT);    // 3版ピンをOUTPUT指定
  Serial.begin(9600);

  //シリアルモニタに説明を表示
  Serial.println("1:Normal rotaion");
  Serial.println("2:Reverse rotation");
  Serial.println("4:PWM Low speed");
  Serial.println("5:PWM Middle speed");
  Serial.println("6:PWM High speed");
  Serial.println("0:STOP");

  // 初期化 DCモータが突然動きださないように
  digitalWrite(ENABLE,LOW); // disable
  delay(500);
}

void loop() {
  if (Serial.available() > 0 )     // 受信したデータが存在した場合以下を実行
  {
    char val = Serial.read();      // char文字として受信データの読み込み
    

    // 1の場合 正回転 CH1:High CH2:LOW
    if (val == '1')
    {
      Serial.println("1:Normal rotaion");
      digitalWrite(ENABLE,HIGH); // enable on
      digitalWrite(CH1,HIGH);    
      digitalWrite(CH2,LOW);
      //delay(500);                // 回転している時間を指定
      //digitalWrite(ENABLE,LOW);  // disable
    }
    
    // 2の場合 逆回転
    else if (val == '2')
    {
      Serial.println("2:Reverse rotation");
      digitalWrite(ENABLE,HIGH); // enable on
      digitalWrite(CH1,LOW);
      digitalWrite(CH2,HIGH);
      //delay(500);                // 回転している時間を指定
      //digitalWrite(ENABLE,LOW);  // disable
    }

    // CH1をPWM制御するこで回転スピードを調整
    // 4の場合 低速回転
    else if (val == '4')
    {
      Serial.println("4:PWM Low speed");
      digitalWrite(ENABLE,HIGH); // enable on
      analogWrite(CH1,255);      // 低速で回転させるためのきっかけ
      delay(100);                // 低速で回転させるための調整時間
      analogWrite(CH1,127);      // CH1をパルス変調 約50%
      digitalWrite(CH2,LOW);     // CH2はLow固定
    }

    // 5の場合 中速回転
    else if (val == '5')
    {
      Serial.println("5:PWM Middle speed");
      digitalWrite(ENABLE,HIGH);  // enable on
      analogWrite(CH1,255);       // 低速で回転させるためのきっかけ
      delay(100);                 // 低速で回転させるための調整時間
      analogWrite(CH1,181);       // CH1をパルス変調 約75%
      digitalWrite(CH2,LOW);      // CH2をLow固定
    }
    
    // 6の場合 高速回転
    else if (val == '6')
    {
      Serial.println("6:PWM High speed");
      digitalWrite(ENABLE,HIGH);  // enable on
      analogWrite(CH1,255);       // パルス変調 100%(High固定と同じ)
      digitalWrite(CH2,LOW);      // CH2はLow固定
    }

    // 0の場合 停止
    else if (val == '0')
    {
      Serial.println("0:STOP");
      digitalWrite(ENABLE,LOW); // disable
    }
  }
}

 

動作確認

では、さっそく動作を確認していきます。

シリアルモニタを開いてテンキーの数字を押してみてください。

1:正回転
2:逆回転
4:低速回転
5:中速回転
6:高速回転
0:停止

となるはずです。

​今回もgifで動作を掲載してみました。
※サイズを絞るために、画像サイズを小さくしています。

正回転、逆回転

arduino-lesson26-10

 

低速、中速、高速

arduino-lesson26-11

 

まとめ

今回は以下の内容について理解してもらいました。

1.モータードライバIC(L293D)を理解する。
2.L293Dを使用したDCモータの制御を理解する。
3.ミニ扇風機のような動作をするスケッチ(コード)を作る。
4.楽しんで遊ぶ。

 

いかがだったでしょうか。

ミニ扇風機、作れましたでしょうか?

スケッチ(コード)を考えながら、作るっておもしろいな~と改めて実感。

 

Lesson 26 【DCモーター編】 はここまで。

DCモーターの制御、扇風機だけでなく色んな事ができそうですね。

 

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson 27は【リレー編】 です。

DCモーターをリレーを使って制御していきます。

Arduino 入門 Lesson 27 【リレー編】
本記事はLesson 27 【リレー編】です。リレー(relay)とは、単純に言えばスイッチのこと。継電器とも呼ばれることもあります。ただのスイッチではなく電気的に制御するスイッチ。本Lessonではリレー(relay)を使って電気的にDC…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分) 一般 プライム会員
5,000円~19,999円 0.5% 1.0%
2,0000円~39,999円 1.0% 1.5%
40,000円~89,999円 1.5% 2.0%
90,000円~ 2.0% 2.5%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

\Amazonギフト券 1000ポイントキャンペーン/
Amazonチャージ 初回購入で1000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

  1. ジャンキーボーイ より:

    こんばんは。
    昨日の夜に質問させて頂いた者です。
    ご回答いただきありがとうございます。
    回路図の通りに配線しているので、間違いないと思います。
    また、4番、5番は反応がありますが6番は反応がありません。
    電源モジュールのジャンパーについては確かに2つとも5Vに設定しています。
    (先程私のTwitterにおもろやさんからいいね!が付いたのでDMにて画像を送りたかったのですが送れませんでした。。。)

    • omoroya omoroya より:

      コメントありがとうございます。
      ん~なぜでしょうね。
      このLessonですが書籍に掲載したLessonでして、
      https://omoroya.com/arduino-books/
      そのときに2度ほど動作確認しておりスケッチは問題ないはずです。
      可能性として考えられるのはドライバICが壊れているか・・・。
      ちなみに、DCモーターは、単純に乾電池につないで動きますか?
      動くのであれば、DCモーターは正常ですので
      ドライバIC単体の確認として
      ドライバICに電源を供給、Enableと入力ピンに5Vを与えて、
      テスタなどで出力ピンに5Vがでているか確認するのが良いかと思います。

  2. ジャンキーボーイ より:

    こんばんは。
    最近、Arduinoで電子工作を始めた者です。
    ELEGOO製のスターターキットを購入し、知識は全く言っていいほどないですが見よう見まねで色々動かしています。
    今回、DCモーターを動かしてみようと思い、参考記事を探していた所、この記事にたどり着きました。
    説明も大変わかりやすく、初学者の私にでも理解できる内容でした。
    ありがとうございます。
    しかし、いざ動かそうとすると、動作しません。
    4番(低速回転)と5番(中速回転)は反応しモーターの音はわずかに聞こえるのですが、他の番号は音も無く全く反応しませんでした。
    電圧不足でしょうか?もしそうであれば、プログラムの書き換えなどが必要かと思うのですが、何か対策等ありますでしょうか?

    • omoroya omoroya より:

      コメントありがとうございます。
      どちらかというと、4番、5番が特殊な操作方法となっています。
      1番、2番はDCモーターに5V直接与えて動かしている動作と同じと思ってもらってOKです。
      また、4番、5番が動くのであれば6番は確実に動くスケッチです。
      結線をどのようにされているかわかりませんが、記事内容通りと仮定した場合
      電源モジュールのジャンパーは2つとも5Vに設定していますか?

  3. 大木 より:

    分かり易い解説ありがとうございます。
    始めたばかりのド素人です。

    質問があります。

    1:正回転
    2:逆回転
    4:低速回転
    5:中速回転
    6:高速回転
    0:停止

    「3」を使わなかった事になにか理由でもあるのでしょうか?

    • omoroya omoroya より:

      コメントありがとうございます。
      テンキーに合わせて作りました。
      テンキーの下:1,2
      テンキーの中:4,5,6
      そのため、あまり深い意味はありません。

  4. omoroya omoroya より:

    回路図、ブレッドボード図を修正しました。
    GNDの接続。
    VCC1への5V供給。

  5. teshi より:

    同じくELEGOOのキットを買いましたが、説明が雑で動かせても理解できない状態でした。こちらで詳しい解説をされており非常に助かりました。ありがとうございます。
    もし分かれば以下について、お教え願いたいです。
    L293Dの1(1,2EN)へHIGH(5V)を、2(1A)へHIGH(5V)、7(2A)へLOW(0V)を入力しても3(1Y)からは4V程度しか出力されず、さらに6(2Y)からはなぜか1Vが出力されており、結果的にモータ端子間の電圧が3V程度しか掛かっておりませんでした(テスターで確認)。本来は5Vで動作して欲しいのですが。。。知識がなくL293Dのデータシートもさっぱり理解できず、理由が分からず気になっております。もしわかりましたら教えて下さい!よろしくお願いします!

    • omoroya omoroya より:

      こんにちは。
      L293DのデータシートのVOH、VOLの仕様となります。
      TYP条件の値で考えると、(TYP条件とは通常の使用条件でのおおよその値と考えてください)
      負荷電流が1.0A、0.6Aの場合の値がデータシートに記載されていて
      VOHはVCC2-1.4Vとなっていることから、VCC2に5V供給している場合は出力電圧は5-1.4=3.6V程度になるということになります。
      VOLは1.2Vと記載されていますので、LOW出力の電圧は1.2程度になるということです。
      これはIC内のバッファの特性です。
      モータに5V与えたいのであれば、VCC2に与える電圧を高くする必要があります。
      別件の補足
      Lesson26の回路図をよくよく見るとVCC1を接続していないですね。
      内部ロジック用の電源なので、こちらも5Vにつないでおく必要がありますね・・・。
      良く動いてたなと、今気づきました。
      つないでいなくても、回路内の回り込みで電圧がでて動いていたようです。
      回路図は、直しておきたいと思います。

    • teshi より:

      ご返信ありがとうございます。そこを見れば良かったのか。。。バッファの特性なんですね〜。ちなみに詳しい方からすれば当たり前なのかもしれませんが、素人からするとバッファとは何かというご説明もあればより理解が深まるなと感じました。なんとなくトランジスタのスイッチ機能を使ってそうなイメージは、分からないなりに回路図を見て思っていたのですが、詳しくは何をしているのかイマイチ分かってません…汗
      なにはともあれ、ありがとうございました。

  6. 木村 より:

    Lesson26の実体図でArduinoのGNDとブレッドボードのGNDをつないだらモーターは回転しました。原因は何だったのでしょうか。

    • omoroya omoroya より:

      電源モジュールの-ピンがブレッドボードにきちんと挿されていますか?
      ICのGNDピンはGNDに接続されていますか?
      電源モジュールに供給している電源は電池?ですか。その場合電池残量はありますか?
      上記に問題がなければ、ArduinoとブレッドボードのGNDの同期をとることでGNDの電位が同じになりArduinoが認識できるようになったのかもしれません。

  7. omoroya omoroya より:

    DCモーターを制御してミニ扇風機を作ってみよう!

タイトルとURLをコピーしました