Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
.NET対応組み込みデバイス「Netduino」入門(10)

.NET対応組み込みデバイス「Netduino」入門(10)

NetduinoでDCモーターをコントロールしよう

2015年9月11日

ミニ四駆やプラレールに使われるなど、電池やバッテリーを動力源にできる「DCモーター」を、Netduinoから制御する方法を解説する。

Microsoft MVP for Windows Platform Development 初音 玲
  • このエントリーをはてなブックマークに追加

 前回はPWM出力によるパルス制御で動くサーボモーターを紹介した。今回はより一般的なDCモーター制御について紹介する。

 ミニ四駆やプラレールに使われているモーターはDCモーターと呼ばれている。DCとは直流のことで、電池やバッテリーを動力源としたモーターになる。今回は、サーボモーターよりもおなじみのDCモーターを、Netduinoから制御してみよう。

DCモーターについて

 DCモーターは直流を流すとモーターが回転する。回転方向はプラスとマイナスを反転させることで変えられるし、回転速度も電圧を変えると制御できる。

 今回利用するDCモーターは、FA130またはGP.484トルクチューン2モーターを想定している。

 この2つのモーターのスペックは次の通りである。

DCモーターのスペック

項目 FA130 GP.484
使用電圧範囲 1.5~3.0V 2.4~3.0V
適正電圧 1.5V 2.4~3.0V
適正電圧時回転数 6500rpm 12300~14700rpm
適正電圧時消費電流 500mA 1700~2000mA
表1 モータースペック表

DCモーターの制御

 DCモーターを制御するには、電圧値と電流方向の制御が必要になる。

 単純に回すのであれば、一定の電圧と一定の電流方向でよい。しかし、だからといってNetduinoのデジタル出力ピンにとGNDに接続してもDCモーターは回ってくれない。

 なぜならば、Netduinoのデジタル出力ピンは3.3V出力なのでDCモーターを回すのに十分な電圧を出力しているが、出力電流が足りていない。

ピン 出力電流
デジタル2番ピン 16mA
デジタル3番ピン 16mA
デジタル7番ピン 16mA
上記以外のデジタル出力ピン 8mA
5V ピン 給電電流に依存
3.3V ピン 給電電流に依存
表2 Netduinoの出力電流

 表2に示す通り、デジタル出力ピンに流れる電流は最大でも16mAであり、複数ピンが使われていればトータルで200mAの電流しか流せない。つまり電圧は足りていても、流せる電流が小さいため、直結ではモーターが回らないのだ。

 もちろん、5Vピンや3.3VピンであればNetduinoへの給電方式によっては十分な出力電流も得られるため、DCモーターを回すことができる。しかしそれでは、DCモーターの回転速度を制御することはできない。

 このような場合に必要になってくるのは、Netduinoのデジタル出力で制御ができるDCモーター用電源だ。さすがにそんな都合のよい電源はないが、乾電池などの定電圧電源からの給電に対して電圧変更や電流方向変更ができるような部品が存在する。それがモータードライバーだ。

モータードライバーについて

 モータードライバーとして入手がしやすいTA7291Pを使って回路を組んでみよう。

TA7291Pのピンについて

 TA7291Pの各ピンの意味をデータシートで確認し、接続先を検討してみる。

 今回の回路例では、制御用にNetduinoの5V出力、モーター駆動用には単三電池x2本の3V電源を使った回路を想定している。その電源用の電池ボックスには、例えばこのリンク先のものなどを使えばよい。

ピン 用途 接続先
1 GND GND
2 出力ピンOUT1 モーター
3 -
4 制御用ピンVref PIN9(PWM)
5 入力ピンIN1 PIN7
6 入力ピンIN2 PIN6
7 ロジック用電源ピンVcc 5V
8 出力用電源ピンVs 3V電源(+)
9 -
10 出力ピンOUT2 モーター
表3 TA7291Pのピン接続

 TA7291Pは、入力ピンIN1に電圧をかけると、出力用電源ピンから給電して出力ピンOUT1に出力する。このとき出力される電圧は、制御用ピンにかかっている電圧になる。同様に入力ピンIN2出力ピンOUT2も対になっている。よって、IN1をプラスにするのであればIN2はGNDにし、IN1をGNDにするのであればIN2はプラスとなるように制御する。

 各ピンにかけられる電圧は次のようになっている。

項目
ロジック用電源電圧Vcc 4.5~20V
出力用電源電圧Vs 0~20V
制御用電圧Vref 0~20V
入力電圧 3.5~5.5
表4 TA7291Pへの供給電圧

 今回、制御用ピンはNetduinoの9番ピンと直結するので、制御用電圧は最大でも3.3Vということになる。なお、制御用電圧を3.3Vとしても、モーターへの出力は出力用電源から供給される。従って、出力用電源に3Vしか供給していなければモーターに出力される電圧は3Vが最大となる。

 なお、TA7291P自体を駆動するロジック用電源電圧は4.5V以上が推奨されている。実際は3Vでも稼働するのだが、可能ならばロジック用電源ピンはNetduinoの5Vに接続するのがいいだろう。

TA7291Pを使った回路例

 TA7291Pのピンに合わせてブレッドボード上で配線を行うと次のようになる。

図1 TA7291P配線例

モーターからのケーブルの導体がより線になっている場合も、そのまま挿し込めばよい。より線ではなく単線のピンにしたい場合は、こちらのブログ「ブレッドボードで電子回路の実験をするために乾電池ホルダーのリード線をジャンパワイヤのように端子化する | ホチキス先生の『プログラマーと呼ばれたい』」を参考にするとよい。

 FA130モーターは単体で接続しても回転しているのが分かりづらいので、接続例としてはプラレール車両に搭載されているFA130モーターに対して、ブレッドボートを経由してTA7291Pの出力ピンを接続する。

図2 TA7291P接続例

TA7291P制御用ソースコード

 プロジェクトの作成方法は、これまでと同様なので割愛する(第3回などを参考にされたい。本稿の例では、プロジェクト名はVB.NET用は「DRV7291VB」、C#用は「DRV7291CS」とした)。

 前回と同様、PWM出力用クラスライブラリはSecretLabs.NETMF.Hardware.PWMライブラリを使用するので、参照設定で「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を削除し、「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を追加する。

 本サンプルのコードは次のとおりだ。

Visual Basic
Imports Microsoft.SPOT.Hardware
Imports SecretLabs.NETMF.Hardware
Imports SecretLabs.NETMF.Hardware.Netduino

Module Module1
  Sub Main()
    Dim power = New PWM(Pins.GPIO_PIN_D9)
    Dim motorIn6 = New OutputPort(Pins.GPIO_PIN_D6, False)
    Dim motorIn7 = New OutputPort(Pins.GPIO_PIN_D7, False)
    Dim IsForword = True

    motorIn6.Write(Not IsForword)
    motorIn7.Write(IsForword)
    Do While (True)
      For value As UInteger = 0 To 20000 Step 4000
        power.SetPulse(20000, value)
        Thread.Sleep(1000)
      Next
    Loop
  End Sub
End Module

Namespace Global.System
  <AttributeUsageAttribute(AttributeTargets.Method)>
  Public NotInheritable Class STAThreadAttribute
    Inherits Attribute

  End Class
End Namespace
C#
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using System.Threading;

namespace DRV7291CS
{
  public class Program
  {
    public static void Main()
    {
      var Power = new PWM(Pins.GPIO_PIN_D9);
      var motorIn6 = new OutputPort(Pins.GPIO_PIN_D6, false);
      var motorIn7 = new OutputPort(Pins.GPIO_PIN_D7, false);
      var IsForword = true;

      motorIn6.Write(! IsForword);
      motorIn7.Write(IsForword);
      while (true)
      {
        for (uint value = 0; value <= 20000; value += 4000)
        {
          Power.SetPulse(20000, value);
          Thread.Sleep(1000);
        }
      }
    }
  }
}
リスト1 TA7291P制御コード(上:Module.vb、下:Program.cs)より抜粋

 このサンプルでは6番ピンは0V、7番ピン3.3Vが出力されるように設定している。これを反転すればモーターの回転も反転する。

TA7291P制御アプリ実行

【動画】TA7291Pモーター制御

MP4207モータードライバーについて

 TA7291Pは入手しやすいが、熱を帯びやすかったりモーターへの出力効率が悪かったりする。

 そこでもう一例として、入手性は多少劣るが出力効率がよいモータードライバーの例としてMP4207を使った例を紹介する。

MP4207スペック

 MP4207の各ピンの意味をデータシートで確認するが、非常に分かりづらい。そこでTA7291Pの表記に合わせて、ピン用途をまとめ直してみた。

ピン 用途 接続先
1 GND GND
2 入力ピンIN1 GND
3 出力ピンOUT1 モーター(+)
4 入力ピンIN2 PIN9(PWM)
5 出力ピンOUT2 モーター(-)
6 入力ピンIN3 GND
7 出力ピンOUT1 モーター(+)
8 入力ピンIN4 PIN8
9 出力ピンOUT2 モーター(-)
10 出力用電源ピンVs 3V電源(+)
表2 MP4207のピン接続

 MP4207では、入力ピンIN1入力ピンIN3入力ピンIN2入力ピンIN4は必ずペアにして制御する。今回はモーターの回転を反転させない回路例としているので、IN1IN3はGND接続固定にしているが、この2つのNetduinoの出力ピンに接続してモーターの回転方向も制御できるようにしてもいいだろう。このとき、IN1IN3をプラスにするときには、必ずIN2IN4はGNDにしなければならない点を注意する。よってモーターの反転は一度IN1IN4全てをGND=出力電圧0Vにしてから必要なペア側をプラスにする。

 各ピンにかけられる電圧は次のようになっている。

項目
出力用電源電圧Vs 0~60V
入力電圧 0~20V
表5 MP4207への供給電圧

MP4207を使った回路例

 MP4207のピンに合わせてブレッドボード上で配線を行うと次のようになる。

図5 MP4207配線例

抵抗は100Ωを使えばよい。

 FA130モーターは、単体で接続しても回転しているのが分かりづらいので、実際にはプラレール車両に搭載されているものに対して、ブレッドボートを経由してMP4207の出力ピンを接続する。

図4 MP4207接続例

MP4207制御用ソースコード

 本稿の例では、プロジェクト名はVB.NET用は「MP4207VB」、C#用は「MP4207CS」とした。

 TA7207Pと同様、PWM出力用クラスライブラリはSecretLabs.NETMF.Hardware.PWMライブラリを使用するので、参照設定で「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を削除し、「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を追加する。

Visual Basic
Imports Microsoft.SPOT.Hardware
Imports SecretLabs.NETMF.Hardware
Imports SecretLabs.NETMF.Hardware.Netduino

Module Module1
  Sub Main()
    Dim power = New PWM(Pins.GPIO_PIN_D9)
    Dim motorIn8 = New OutputPort(Pins.GPIO_PIN_D8, False)

    motorIn8.Write(True)
    Do While (True)
      For value As UInteger = 0 To 20000 Step 4000
        power.SetPulse(20000, value)
        Thread.Sleep(1000)
      Next
    Loop
  End Sub

End Module

Namespace Global.System
  <AttributeUsageAttribute(AttributeTargets.Method)>
  Public NotInheritable Class STAThreadAttribute
    Inherits Attribute

  End Class
End Namespace
C#
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using System.Threading;

namespace DRV4207CS
{
  public class Program
  {
    public static void Main()
    {
      var Power = new PWM(Pins.GPIO_PIN_D9);
      var motorIn8 = new OutputPort(Pins.GPIO_PIN_D8, false);

      motorIn8.Write(true);
      while (true)
      {
        for (uint value = 0; value <= 20000; value += 4000)
        {
          Power.SetPulse(20000, value);
          Thread.Sleep(1000);
        }
      }
    }
  }
}
リスト1 MP4207制御コード(上:Module.vb、下:Program.cs)より抜粋

MP4207制御アプリ実行

【動画】MP4207モーター制御

2つのモータードライバーの性能差

 TA7291PとMP4207の動画を見比べてみると、MP4207の方が車輪の回転が速い。実際に走行させてみても、MP4207の方が走行スピードは速い。どちらも新品状態の単三電池×2本を直列に接続し、3.2Vの電圧をかけている。

 この性能差は、3.2Vの入力電圧に対して、TA7291Pが出力端子からの出力電力が2.6Vまで下がってしまうのに比較して、MP4207では測定精度以下のロスしかないため、一般的なテスターではロスが測れないという違いに起因する。TA7291Pは動かしているとかなり熱を持つことからも、TA7291Pの回路内でロス率が高いのだろう。多少入手は困難だし、抵抗を入れるなど回路作成の手間が多いが、可能であるならばMP4207を使う方がよいだろう。

まとめ

 もし、NetduinoをPCからのUSB給電以外の方法で給電したいのであれば、一番簡単なのはモバイルバッテリーを使ってUSBに5Vを給電することだ。モバイルバッテリーは1Aや2Aの出力を持った製品も多いので、電圧も電流も十分な量を確保できる。この方式であれば、今回の配線例のように単三電池×2本で3V電源を別途用意しなくても、Netduinoの3.3Vピンから出力用電源ピンVsに給電してあげればよいだろう。

 次回はSBDBTBT Micro 4(Bluetooth USBアダプター)を使ってPCとBluetooth連携を行う予定だ。

※以下では、本稿の前後を合わせて5回分(第9回~第13回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

.NET対応組み込みデバイス「Netduino」入門(10)
9. サーボモーターをコントロールしよう

Netduinoはセンサー入力系だけでなく豊富な出力系も活用できる。今回は、ラジコン経験者にはなじみがあるサーボモーターをNetduinoから制御してみよう。

.NET対応組み込みデバイス「Netduino」入門(10)
10. Windows 10+Visual Studio 2015でNetduinoアプリを動かすには?

本シリーズのNetduinoサンプルをWindows 10+Visual Studio 2015で動かす方法と注意点を番外編のコラムとしてまとめた。

.NET対応組み込みデバイス「Netduino」入門(10)
11. 【現在、表示中】≫ NetduinoでDCモーターをコントロールしよう

ミニ四駆やプラレールに使われるなど、電池やバッテリーを動力源にできる「DCモーター」を、Netduinoから制御する方法を解説する。

.NET対応組み込みデバイス「Netduino」入門(10)
12. Bluetoothで遠隔操作しよう

BluetoothでPCと連携し、電源もバッテリー給電とすることで、移動体などへの搭載も可能なコードレス仕様のDCモーター制御を実現してみよう。

.NET対応組み込みデバイス「Netduino」入門(10)
13. littleBitsではんだ付けなしの電子工作を実現

磁石で電子回路をつないで電子工作が行えるlittleBits。Netduinoと組み合わせると、どのような電子工作が実現できるのか? その可能性を探る。

サイトからのお知らせ

Twitterでつぶやこう!