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# のコード
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(びんぼうでいいのとか)をつかってバンバン試すってのもありですね。