TA7291P モータードライブを Netduino でリモート制御する

HC-05 Bluetooth のインターフェースはシリアル通信なので Netduino からシリアル通信すれば良いだろう、ってことで試してみました。配線は TA7291P モータードライバと HC-05 を使ってモーターを無線制御 | Moonmile Solutions Blog とほぼ同じ。HC-05 との通信線が、D2, D3 に割り当てられていて COM2 で接続するところが違います。たぶん、COM1 は D1, D2 の組み合わせでないかと。Joe’s Blog: Using a Cheap Bluetooth Shield on the Netduino を参考にして作っています。

埋め込み画像への固定リンク

ブレッドボード

TA7291P は外部電源からモーターを動かすことができるので、単三2個の電池はモーターを動かすために接続します。
TA7291P_モーター1個_Netduino_ブレッドボード

回路図

電池のほうにもパスコンがあったほうがいいのか?一応、回路図を。
TA7291P_モーター1個_Netduino_回路図

C# のコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class Program
{
    public static void Main()
    {
        // write your code here
        new Program().main();
    }
    public void main()
    {
        OutputPort pin8 = new OutputPort(Pins.GPIO_PIN_D8, false);
        OutputPort pin9 = new OutputPort(Pins.GPIO_PIN_D9, false);
 
        // D2,D3 に接続すると COM2 がつながる
        SerialPort serial = new SerialPort(SerialPorts.COM2, 9600, Parity.None, 8, StopBits.One);
        serial.DataReceived += (s, e) =>
        {
            byte[] data;
            // 2バイト連続で送られてこないことがあるので、
            // 1バイトずつ読み込む
            // たぶん, writer.WriteString("MF") な感じで送っているから?
            byte data1 = (byte)serial.ReadByte();
            if (data1 == (byte)'M')
            {
                byte data2 = (byte)serial.ReadByte();
                switch (data2)
                {
                    case (byte)'F': // 前進
                        Debug.Print("motor forward");
                        data = System.Text.Encoding.UTF8.GetBytes("forward-");
                        serial.Write( data, 0, 8);
                        pin8.Write(true);
                        pin9.Write(false);
                        break;
                    case (byte)'B': // 後進
                        Debug.Print("motor back");
                        data = System.Text.Encoding.UTF8.GetBytes("back----");
                        serial.Write( data, 0, 8);
                        pin8.Write(false);
                        pin9.Write(true);
                        break;
                    case (byte)'0': // 停止
                        Debug.Print("motor stop");
                        data = System.Text.Encoding.UTF8.GetBytes("stop----");
                        serial.Write( data, 0, 8);
                        pin8.Write(false);
                        pin9.Write(false);
                        break;
                }
            }
        };
        /// シリアル受信開始
        serial.Open();
        /// 無限待ち
        Thread.Sleep(Timeout.Infinite);
    }
}

new SerialPort でシリアルポートを初期化して、Read/Write します。Read は複数バイト取れるのですが、送信する(ストアアプリ)方で、writer.WriteString(“MF”) な感じで送信しているせいか、1バイトずつ送られてくることがあります。仕方がないので ReadByte を使って1バイトずつ読み込みます。まあ、これでもスピードは十分かと。

Write のほうもバイナリで送るので、Arduino のように println がないのでデバッグにはちょっと使いづらいのですが、Netduino の場合は Debug.Print することで、Visual Studio に出力することができます。ブレークポイントも置いてプログラムを止めることもできるので、実はデバッグは非常にやりやすいです。Android 実機を Xamarin Studio で操作している感覚で使えます。このあたりは、Netduino 自体の要求スペックが高いことと、.NET Framework であることが効果をあげていますね。プロトタイプ的に Netduino で探っていって、Arduino にコードを移すことも考えられるでしょう。…が、壊してしまうと Netduiono のほうが高いので、そのあたりは安い Arduino(びんぼうでいいのとか)をつかってバンバン試すってのもありですね。

カテゴリー: C#, Netduino パーマリンク