.NET対応組み込みデバイス「Netduino」入門(10)
NetduinoでDCモーターをコントロールしよう
ミニ四駆やプラレールに使われるなど、電池やバッテリーを動力源にできる「DCモーター」を、Netduinoから制御する方法を解説する。
前回は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 |
DCモーターの制御
DCモーターを制御するには、電圧値と電流方向の制御が必要になる。
単純に回すのであれば、一定の電圧と一定の電流方向でよい。しかし、だからといってNetduinoのデジタル出力ピンにとGNDに接続してもDCモーターは回ってくれない。
なぜならば、Netduinoのデジタル出力ピンは3.3V出力なのでDCモーターを回すのに十分な電圧を出力しているが、出力電流が足りていない。
ピン | 出力電流 |
---|---|
デジタル2番ピン | 16mA |
デジタル3番ピン | 16mA |
デジタル7番ピン | 16mA |
上記以外のデジタル出力ピン | 8mA |
5V ピン | 給電電流に依存 |
3.3V ピン | 給電電流に依存 |
表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 | モーター |
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 |
今回、制御用ピンはNetduinoの9番
ピンと直結するので、制御用電圧は最大でも3.3Vということになる。なお、制御用電圧を3.3Vとしても、モーターへの出力は出力用電源から供給される。従って、出力用電源に3Vしか供給していなければモーターに出力される電圧は3Vが最大となる。
なお、TA7291P自体を駆動するロジック用電源電圧は4.5V以上が推奨されている。実際は3Vでも稼働するのだが、可能ならばロジック用電源ピンはNetduinoの5V
に接続するのがいいだろう。
TA7291Pを使った回路例
TA7291Pのピンに合わせてブレッドボード上で配線を行うと次のようになる。
モーターからのケーブルの導体がより線になっている場合も、そのまま挿し込めばよい。より線ではなく単線のピンにしたい場合は、こちらのブログ「ブレッドボードで電子回路の実験をするために乾電池ホルダーのリード線をジャンパワイヤのように端子化する | ホチキス先生の『プログラマーと呼ばれたい』」を参考にするとよい。
FA130モーターは単体で接続しても回転しているのが分かりづらいので、接続例としてはプラレール車両に搭載されているFA130モーターに対して、ブレッドボートを経由してTA7291Pの出力ピンを接続する。
TA7291P制御用ソースコード
プロジェクトの作成方法は、これまでと同様なので割愛する(第3回などを参考にされたい。本稿の例では、プロジェクト名はVB.NET用は「DRV7291VB」、C#用は「DRV7291CS」とした)。
前回と同様、PWM出力用クラスライブラリはSecretLabs.NETMF.Hardware.PWMライブラリを使用するので、参照設定で「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を削除し、「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を追加する。
本サンプルのコードは次のとおりだ。
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
|
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);
}
}
}
}
}
|
このサンプルでは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電源(+) |
MP4207では、入力ピンIN1
と入力ピンIN3
、入力ピンIN2
と入力ピンIN4
は必ずペアにして制御する。今回はモーターの回転を反転させない回路例としているので、IN1
とIN3
はGND接続固定にしているが、この2つのNetduinoの出力ピンに接続してモーターの回転方向も制御できるようにしてもいいだろう。このとき、IN1
とIN3
をプラスにするときには、必ずIN2
とIN4
はGNDにしなければならない点を注意する。よってモーターの反転は一度IN1
~IN4
全てをGND=出力電圧0Vにしてから必要なペア側をプラスにする。
各ピンにかけられる電圧は次のようになっている。
項目 | 値 |
---|---|
出力用電源電圧Vs | 0~60V |
入力電圧 | 0~20V |
MP4207を使った回路例
MP4207のピンに合わせてブレッドボード上で配線を行うと次のようになる。
FA130モーターは、単体で接続しても回転しているのが分かりづらいので、実際にはプラレール車両に搭載されているものに対して、ブレッドボートを経由してMP4207の出力ピンを接続する。
MP4207制御用ソースコード
本稿の例では、プロジェクト名はVB.NET用は「MP4207VB」、C#用は「MP4207CS」とした。
TA7207Pと同様、PWM出力用クラスライブラリはSecretLabs.NETMF.Hardware.PWMライブラリを使用するので、参照設定で「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を削除し、「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を追加する。
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
|
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);
}
}
}
}
}
|
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
に給電してあげればよいだろう。
次回はSBDBTとBT Micro 4(Bluetooth USBアダプター)を使ってPCとBluetooth連携を行う予定だ。
※以下では、本稿の前後を合わせて5回分(第9回~第13回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
9. サーボモーターをコントロールしよう
Netduinoはセンサー入力系だけでなく豊富な出力系も活用できる。今回は、ラジコン経験者にはなじみがあるサーボモーターをNetduinoから制御してみよう。
10. Windows 10+Visual Studio 2015でNetduinoアプリを動かすには?
本シリーズのNetduinoサンプルをWindows 10+Visual Studio 2015で動かす方法と注意点を番外編のコラムとしてまとめた。
11. 【現在、表示中】≫ NetduinoでDCモーターをコントロールしよう
ミニ四駆やプラレールに使われるなど、電池やバッテリーを動力源にできる「DCモーター」を、Netduinoから制御する方法を解説する。
13. littleBitsではんだ付けなしの電子工作を実現
磁石で電子回路をつないで電子工作が行えるlittleBits。Netduinoと組み合わせると、どのような電子工作が実現できるのか? その可能性を探る。