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個の電池はモーターを動かすために接続します。
回路図
電池のほうにもパスコンがあったほうがいいのか?一応、回路図を。
C# のコード
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(びんぼうでいいのとか)をつかってバンバン試すってのもありですね。