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

list このエントリーをはてなブックマークに追加

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# のコード

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 パーマリンク