Arduino Nano と L293D で Arduino 戦車を作る

回路図はまた後で書くとして、Arduino Nano を使った Arduino 戦車です。正確には Arduino Nano の互換機なのですが、さっくりと動きました。

Arduino 戦車3号機

モータードライバに L293D を使って、無線化は HC-05 で 2号機と同じ構成です。5×7 cm のユニバーサル基板に、Arduino Pro Mini ごと乗っかっています。モーターへの給電を別系統にしようとおもったけど、面倒になって Arduino の 5V から取り出し。それのコネクタがないので、Vin/GND に AAAx4 を繋げてしまいます。

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

前?に乗っけているのは、超音波の距離センサ(HC-SR04)です。壁にぶつからないとか、そういうのに使う訳ですが、スケッチのほうはまだできていないので乗っけているだけ。

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

ユニバーサル基板自体が、Arduino Uno とそう変わらない大きさなので、モーターシールドを自作ても大きさはあまり変わりません。まあ、一体型になっているので、取扱い?が楽なのと、戦車のプラモデルに乗っけるのに小型化してみたかったというところです。ユニバーサル基板だと配線の関係で、かなりしんどいので、これから先はプリント基板を作ることになるかなと、KiCad を勉強中。

ただ、ここまでするんだったら、Mini を使わずに Arduino Uno のマイコン部分だけを使って適当なモータードライブと乗せて作るといいんだろうなと。それはまた別途作ってみよう。

最終的には、この構成に

  • サーボモーター制御 x4 or x6
  • 加速度センサ、ジャイロセンサ

も乗せていく予定です。

ひとまず、1,2,3号機を同時に動かしたいので、板とギアボックスで、あと2台さっさと作ります。BL モジュールは、HC-06 が x5 あるので、それを使っていきましょう。

カテゴリー: Arduino, Bluetooth | Arduino Nano と L293D で Arduino 戦車を作る はコメントを受け付けていません

L293D 利用して Arduino 戦車を作る

もうちょっと、中途を書こうと思ったのですが、ここ2週間あまりで一気に進みました。モーターの電源をマイコンから給電すると、モーターが動く瞬間にパルスが走って Arduino が落ちます。なので、別系統で電源を入れるようにするために、TA7291P を使ってみました。が、両方の車輪を回すのに2枚必要ならば、面倒だからもともとある L293D を使ってみようかな、と中国から10個ほど輸入しました。輸入って言ったって、ebay.com から買っているだけで、国際郵便で2,3週間で届きます。

Arduino 戦車1号機

回路図とか配線とかは後で出すとして、部品はこんな感じ。

  • L293D フルブリッジのモータードライブ(モーターが2個動きます)
  • LED 2個(動作確認用)
  • HC-05 Bluetooth モジュール
  • タミヤのギアーボックス
  • タミヤのキャタピラ
  • Arduino Uno 互換機
  • Arduino 用シールド基板
  • 100μF 電解コンデンサ、電源用のコネクタなどなど

ってことで、値段的には、3,000円掛かっていないと思います。まあ、その裏側で Bluetooth モジュールをつぶしたり、配線はしたものの動かないシールドが3枚あったりと、試作つぶれがあるわけですが、そのあたりは電子回路初心者なので仕方がない。でも、まあ、半田をひと巻き使い切るぐらいには、半田付けをしたのでそれなりには上手くなってきたかなと。いや、上手いかどうかは別として、半田付け自体に抵抗が無くなってきたのは確かです。

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

これは、先日の JXUG のライトニングトークスで発表したように Bluetooth 経由で PC や Android から動かせます。Bluetooth 2.0 のシリアル通信(SPP)を使っているために、iPhone では動きません。このあたりは、BLE 対応にして別途設計する予定です(手元に HM-10 のモジュールがあります)。

Arduino 戦車2号機用シールド

1台だけ作るのでは面白くないので、2台目も作りました。この度は、Bluetooth モジュールだけでなく何かのセンサーを付けれるように SCL/SDA のラインをあらかじめ入れてい有ります。右上のコネクタがそれです。LED は信号機っぽく、赤/黄/青 の 3つを付けています。

右下のジャンパーピンは、Arduino からの 5V 給電と、別給電を分ける仕組みです。保護回路は入れていないので注意が必要ですが。なんか、Arduino の 5V を並列で入れればモーターのほうも動くのでこうしています…が、ちょっとモーターの操作を厳しくやると(前進、後進を繰り返すとか)Arduino がリセットするので、やっぱりパルス対策は必要みたいですね。パスコンを適当に入れただけではダメなようです。

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

最初は、ユニバーサル基板に沿って、ずずメッキの線を引いていたのですが、だんだん面倒くさくなって空中配線しています。なんか、危なそうな配線なので、もうちょっとチップ回りの配線は考えたほうがいいようです。プリント基板を外注するのでもいいのですが、試作段階だし、ブレッドボードにちょっと毛が生えたぐらいのことしかやっていないので、このあたりは手配線でスピードを稼ぎたいところです。この配線自体は、Vcc と GND を逆にしてしまったので、途中でやり直しています(表裏を見るのを間違えたという)。結果、3時間以上掛かってしまっているという体たらく。

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

↓な感じで、モーターシールドを自作されている方もいるので、自分も頑張りたいところなんですよね。

Festina lente. – Arduino用モーターシールド自作の記録
http://mikilabo.tumblr.com/post/111652585283/arduino

勿論、モーターシールド自体を買ってしまって、そのうえにセンサーの類を乗っけてというのもいいんですが、最初のステップは実地で体得しておきたいところなので、手間暇かけてやっています。

Bluetooth 接続する

Bluetooth 2.0 を使ったシリアル通信なので、結構汎用的に使えます。Android から制御するのが、手軽なのですが、他にも色々できます。

Lumia 1520 に Windows 10 TP を入れて動かしてみたり、

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

デスクトップ PC に Bluetooth ドングルを差して、WPF から動かしてみたりすることができます。

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

スマートフォンや PC 絡みは結構簡単に拡張ができます。

お次は DualShock3 のコントローラーと Wii コントローラーで動かしたいところですね。Raspberry Pi の場合はそれなりに動かせるのですが、まだ Arduino では試していません。このあたりは、RasPi + Arduino のハイブリッドでもいいかもしれません。

ちなみに、Bluetooth 絡みは今週末の .NET ラボ勉強会で解説します。Bluetooth Low Energy の方も含めて(たぶん、BLE の実演のほうは無理かもしれんけど)、色々買い集めた Bluetooth モジュールなどの実物を見せながら、という感じでやっていきます。

カテゴリー: Arduino, Bluetooth | L293D 利用して Arduino 戦車を作る はコメントを受け付けていません

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

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 | TA7291P モータードライブを Netduino でリモート制御する はコメントを受け付けていません

TA7291P モータードライバと HC-05 を使ってモーターを無線制御

昔から定番らしい、TA7291P を使ってモーターを駆動させます。DRV8830 の I2C 制御とは違って、GPIO ピンを2本使ってモータの正反転を制御します。ピンから送る信号を analogWrite を使ってパルスにすれば PWM 制御できるらしいので(本来の使い方ではないけど)モーターを可変でも動かせます。秋月電子で2個セットで買えます。

ただし、2個動かすならば L293D というモータードライバが、Arduino のモーターシールドには乗っています。2個のモーターを同時に自作しようかなと思ったのですが、L293D は日本では売ってません。でもって、この L239D の後継?っぽいのが、TB6612FNG ってやつで、これはスイッチサイエンスさんとかで売ってます。TA7291P もそうなのですが、制御線とモーターへの電力線が別に取れるので、結構な大電流をモーターに流すことができます。たぶん、モーターの回転によるパルスとがが制御線に与える影響も少ないかなと思うのですが、これは調べてみないとわかりません。DRV8830 を2個使ってモーターを動かしたときに、たまに I2C の信号が暴走してしまうらし、モーターが回りっぱなしになるんですよね。適切な抵抗とコンデンサを入れてやれば低減できるような気もするのですが、これはちょっと初心者には厳しい。センサーの類とかを同時につなげると良く分からない状態になりそうです。これは実地で調べていく予定。

ブレッドボードで組み立て

 

TA7291P_モーター1個_ブレッドボード

例によって、ブレッドボードの組み立てはこんな感じです。Frizing で TA7291P の部品を作って配置してみたのはいいけど、回路図のところが大きすぎて不細工なので…回路図のほうが後から。

image

端子はデータシートから。回路は モータドライバの使い方について -byうしこlog を参考にして作っています。Arduino の 8,9 ピンにつなげて正反転を制御しています。ここのピン番号がお好みで。Arduino から 5V 給電しているところに 100μF 程度のコンデンサを入れると Bluetooth から制御したときにモーターの動作が安定します。パスコンは、もっと計算しないと駄目かと思ったけど、意外とフィーリングで大丈夫そうなので、パスコンって何? を参照にして適当に(苦笑)。

例によって HC-05 を使って Bluetooth 制御するので、TX/RX をつなげておきます。

Arduino のスケッチ

#include <Wire.h>

const int OUTR1 = 8 ;
const int OUTR2 = 9 ;
const int OUTL1 = 10 ;
const int OUTL2 = 11 ;

void setup() {
  // put your setup code here, to run once:
  pinMode( OUTR1, OUTPUT );
  pinMode( OUTR2, OUTPUT );
  pinMode( OUTL1, OUTPUT );
  pinMode( OUTL2, OUTPUT );
  digitalWrite( OUTR1, LOW );
  digitalWrite( OUTR2, LOW );
  digitalWrite( OUTL1, LOW );
  digitalWrite( OUTL2, LOW );

  Serial.begin(9600);
  Serial.println( "Motor Standby" );
  delay( 2000 );
}

void loop() {
  int len = Serial.available();
  if ( len < 2 ) return ;
  int type = Serial.read();   // M/N or L
  int num  = Serial.read();   // MF/MB/M0, L0/L1

  if ( type == 'M' || type == 'N') {
    int mode = 0;
    switch ( num ) {
      case '0': mode = 0; break;
      case 'F': mode = 1; break;
      case 'B': mode = 2; break;
      default: mode = 0; break;
    }
    switch ( mode ) {
      case 0: 
        Serial.println("stop----" );
        if ( type == 'M' ) {
          digitalWrite( OUTR1, LOW );
          digitalWrite( OUTR2, LOW );
        } else {
          digitalWrite( OUTL1, LOW );
          digitalWrite( OUTL2, LOW );
        }
        break;
      case 1:
        Serial.println("forward-" );
        if ( type == 'M' ) {
          digitalWrite( OUTR1, HIGH );
          digitalWrite( OUTR2, LOW );
        } else {
          digitalWrite( OUTL1, HIGH );
          digitalWrite( OUTL2, LOW );
        }
        break;
      case 2:
        Serial.println("back----" );
        if ( type == 'M' ) {
          digitalWrite( OUTR1, LOW );
          digitalWrite( OUTR2, HIGH );
        } else {
          digitalWrite( OUTL1, LOW );
          digitalWrite( OUTL2, HIGH );
        }
        break;
    }
  }
}

このスケッチは、モーターを2個使ったものですが、8,9 ピンを交互に LOW/HIGH してやれば反転します。両方 HIGH にするとブレーキがかかる状態ですが、ここでは制御していません。ここの digitalWrite 関数のところを、analogWrite 関数を使ってやれば、モーターの回転数を制御できます。ただし、マブチモーターぐらいだと、高速/中速/低速ぐらいしかできないだろうから(回転数が分からんし、あとはギアで変えてしまうし)Nゲージを動かすとか、プラレールを動かすとかぐらいならば、前後進だけでいいような気がします。これは、実際に Trinket mini を使って試す予定。

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

でもって netduino で試してみよう

Netduino、知ってますか? – Build Insider で連載が開始したようなので、Netduino でもやってみます。コードは、こんな感じ。Bluetooth にはつなげずに、単純に 8,9 ピンを使って正反転を繰り返しているだけです。

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);
		Thread.Sleep(1000);
		new Thread(() =>
		{
			while (true)
			{
				// 正転
				Debug.Print("motor forward");
				pin8.Write(true);
				pin9.Write(false);
				Thread.Sleep(3000);
				// 停止
				Debug.Print("motor stop");
				pin8.Write(false);
				pin9.Write(false);
				Thread.Sleep(1000);
				// 反転
				Debug.Print("motor back");
				pin8.Write(false);
				pin9.Write(true);
				Thread.Sleep(3000);
				// 停止
				Debug.Print("motor stop");
				pin8.Write(false);
				pin9.Write(false);
				Thread.Sleep(1000);
			}

		}).Start();
		Thread.Sleep(Timeout.Infinite);
	}
}

このくらいの制御だと、Arduino も Netduino も変わらないのですが、結構複雑な処理をするときには、Netduino のほうがやり易いかなと思ってます。が、Netduino の認知度が低いので、Arduino のほうがハック的なライブラリがたくさんあって、そういう点では Netduino で進めるのは結構大変なんですよね。ただし、ライブラリは結構揃っているようなので(I2C制御を苦戦している感じなので、それぐらいの習熟度ですが)それなりに組みやすいはずです。ちなみに、2年前に fez spider を知った頃にデバイスドライバーズさんに聞いたのですが、Netduino 系のは結構クロック数が早いので、他の組み込みのようにリアルタイムによるセンサー受信も可能だそうです。.NET だとガベージコレクションだとか、アセンブリで書くより遅いのでは?とおもわれるかもしれませんが(私もそう思っていました)センサーのデータ受信をできる程度にはうまく動くてくれるそうです。このあたりも、Arduino, Netduino で試してみたいところです。

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

カテゴリー: Arduino, Netduino | TA7291P モータードライバと HC-05 を使ってモーターを無線制御 はコメントを受け付けていません

8pino を無線化してモータを動かす

手元の Arduino Uno の SCL/SDA の調子が悪いので(先日、モータードライバーを焼き切ったときに一緒にやられた?)、代わりに 8pino を使って動作検証していました。

image

ブレッドボードの左にあるのが 8pino のつもり(ATTiny85互換なので、そのまま利用)。

モータードライバの DRV8830 の SCL と SDA は、8pino の #2 と #0 に差せば ok。シリアル通信は、8pino の #3 と #4 を使って HC-05 と通信させる。8pino に 5V を給電させれば、ひとまず HC-05 は動くようになりました。通信がうまく動かなかったのは電源のところに 10μF 程度のコンデンサを置くことで解消した模様。モーターへの給電は、1.5V を送ってしまうと、通信が止まってしまうので、0.6 V ぐらいに抑える。そうすると、Bluetooth から制御して、モーターが動いた状態でも止まらなくなる。

ただ、これだとモーターの動力源的には足りないので(ちょっと動かすぐらいらば大丈夫だけど)、別電源を用意したほうがよさそう。

https://pbs.twimg.com/media/CAv9gOtUIAATNpi.jpg:large

スケッチはこんな感じ。

 
#include <SoftwareSerial.h>
#include <TinyWireM.h>
const int DRV8830 = 0xC8 >> 1 ; // 0x64;
SoftwareSerial mySerial = SoftwareSerial(3, 4);  // RX, TX
void writeRegister( int drv, byte vset, byte data ) 
{
  int vdata = vset << 2 | data ;
  TinyWireM.beginTransmission( drv );
  TinyWireM.send( 0x00 );
  TinyWireM.send( (vset<<2) + data );
  TinyWireM.endTransmission();
}
void setup() {
  // put your setup code here, to run once:
  TinyWireM.begin();
  writeRegister( DRV8830, 0x00, 0x00 );
  mySerial.begin(9600);  
  delay( 2000 );
  
}
void loop() {
  int len = mySerial.available();
  if ( len < 2 ) return ;
  int type = mySerial.read();   // M or L
  int num  = mySerial.read();   // MF/MB/M0, L0/L1
  if ( type == 'M' || type == 'N') {
    int mode = 0;
    switch ( num ) {
      case '0': mode = 0; break;
      case 'F': mode = 1; break;
      case 'B': mode = 2; break;
      default: mode = 0; break;
    }
    switch ( mode ) {
      case 0: 
         writeRegister( DRV8830,  0x00, 0x00 );
        mySerial.print("stop----");
        break;
      case 1:
        writeRegister( DRV8830,  0x0A, 0x02 );
        mySerial.print("forward-");
        break;
      case 2:
        writeRegister( DRV8830,  0x0A, 0x01 );
        mySerial.print("back----");
        break;
    }
  }
}

 

ATTiny85 は Wire をそのままは使えないので、TinyWireM.h を使う。Bluetooth モジュールへのシリアル通信もポート番号が異なるので、SoftwareSerial を使う。

Bluetooth はシリアル通信を使っているので、コントロールしているストアアプリのほうへ、mySerial.print すると応答を返せる。通常 8pino のような小さい arduino はデバッグ用のシリアルポートがつなげなくて困るのだけど、こんな風に Bluetooth 経由で情報を取り出せるのはいいかなと思う。

これを netduino で動かしたいんだが、まだ I2Cがうまく動いてない。

カテゴリー: Arduino, Bluetooth | 8pino を無線化してモータを動かす はコメントを受け付けていません

Arduino を無線化(Blutooth)して戦車を作る(ユニバーサル基板編)

AE-DRV8830 と HC-05を連携させてモーターを制御する(ブレッドボード編) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6964

の続きで、これをユニバーサル基板で作ります。本来ならば、プリント基板を作ってとか、回路図を作ってってことになるのでしょうが、初手なので手作りで半田付け、ってのと最終的には Arduino 用のチップも載せてしまって小型化したかったってのがあります。まあ、やってみた感じでは、ユニバーサル基板で作るのは手作業が大変です…が、感光基盤だと子供がいる家ではできないし、ちょっと考えないと。

材料

  • DRV8830 x2 @170円
  • HC-05 x1 @1,000 円ぐらい
  • オス・メスピン @100円ぐらい?
  • ユニバーサル基板 x1 @270円(昔買った)
  • 抵抗 10kΩ x2
  • コンデンサ 10nF x2

な感じです。まあ、完成品を Amazon.co.jp: Arduino MEGA UNO Duemilanove 最高品質 用の L293D モーター シールド ボード: DIY・工具 あたりで買うのが手っ取り早いのですが(これは、ひどく安いけど、1,000円から2,000円ぐらいです。秋月電子で DRV8830 のキット 650円 を2つ買うってのもありです。本来ならばターミナルブロックを使って給電したり、モーターを回したりすればいいのですが、手元になかったのでピンヘッダで代用。どうせ、Arduino からジャンパーピンを差してテストするので、このほうがやりやすいです。

DRV8830 を使うといいのは、I2C で通信ができるので、通信回線が SCL/SDA の 2本だけで済むことです。L293D を使ったモータードライバだと、モーター2個でGPIO 経由で 4本の線が必要になります。2個くらいだったらそれでもいいけど、4個とか8個とかにふえても SCL/SDA の 2本だけになるから便利ですよね…となっていますが、本当に 4個いけるかどうかは分かりません。モーター駆動のと、信号線の電源が同じになっているので、ノイズが多くてモーターの挙動が信号線に乗ってしまうのは結構問題なんですよね。モーターによってはノイズが乗って、暴走状態になります。もともと、プリンタの駆動系とかを動かすものなので、ミニ四駆とか車輪とかを動かすには向いていないようです。でも、まあ、タミヤのギアボックス付属のモーター FA-130 レベルならば大丈夫でした。

配線

回路図はよくわからないので、ブレッドボードで作ったものを

20150310_02

そのままユニバーサル基板に配置して、

image

配線します(苦笑)

image

配線の美意識のかけらもないものですが、まあ、腐ったコードでも動くコードを乗せておくこともあるし、ひとまず動けば ok 的なものなので、これでいいです。ひとまず動きますから。

これを、Arduino とつなげます。

image

更に、ギアーボックスとつなげます。

image

ブレッドボードじゃなくてわざわざ基板を使っているのにジャンパーピンが錯綜しているのは、Arduino のシールドになっていないからです。これだと、あまりにも壊れやすいので、もうちょっと頑丈につくらないと駄目なので、昨晩 Arduino 用のシールド基板を注文しました。他にも色々と。

どうやって通信するのか?

HC-05 は Bluetooth 2.0 なので、今流行りの BLE ではありません。なので、iPhone から操作することはできないのですが、単純な SPP 通信(シリアル通信)を使って手軽にパソコンとやり取りができます(最終的には、PS3 Dualshock3 のような既存のコントローラーと通信したいところなのですが、これは Raspberry Pi のほうが非常に簡単なのです。たしか、USB ポートがあってロボットを操作する SBDBT とか)。

Arduino + USBホストシールドの実験。 – robo8080のブログ
http://blog.goo.ne.jp/roboz80/e/9d2fc6e1266932f7ace682b43393217b

でもって、手元の HC-05 は Bluetooth シリアル変換モジュールなので、そのまま Serial を使うことができます。

Arduino のスケッチ

#include <Wire.h>

const int DRV8830a = 0xC8 >> 1 ; // 0x64;
const int DRV8830b = 0xC6 >> 1 ; // 0x63;
const int FAULTn = 13 ;
const int LED  = 12 ;

int writeRegister( byte drv, byte vset, byte data ) {
  int vdata = vset << 2 | data ;
  Wire.beginTransmission( drv );
  Wire.write( 0x00 );
  Wire.write( (vset<<2) + data );
  return Wire.endTransmission();
}

void clearError() {
  Wire.beginTransmission( DRV8830a );
  Wire.write(0x01);
  Wire.write(0x80);
}

void checkError() {
  if ( digitalRead(FAULTn) == HIGH ) {
    return ;
  }
  Wire.beginTransmission( DRV8830a );
  Wire.write(0x01);
  Wire.endTransmission();
  
  Wire.requestFrom( DRV8830a, 1 );
  byte error = Wire.read();
  Serial.println( error, BIN);
  if ( error & 0b00000011 ) {
    Serial.println("over current" );
  } else if ( error & 0b00000101 ) {
    Serial.println("under voltage" );
  } else if ( error & 0b00001001 ) {
    Serial.println("over heat" );
  } else if ( error & 0b00010001 ) {
    Serial.println("limit current" );
  }
  clearError();
}

int mode = 0;
void setup() {
  // put your setup code here, to run once:
  pinMode( FAULTn, INPUT );
  pinMode( LED,  OUTPUT );
  Wire.begin();
  Serial.begin(9600);
  Serial.println( "Motor Standby" );
  Serial.println( DRV8830a, HEX);
  Serial.println( DRV8830b, HEX);
  writeRegister( DRV8830a, 0x00, 0x00 );
  writeRegister( DRV8830b, 0x00, 0x00 );
  delay( 2000 );
}

void loop() {
  // put your main code here, to run repeatedly:
  
  int len = Serial.available();
  if ( len < 2 ) return ;
  int type = Serial.read();   // M or L
  int num  = Serial.read();   // MF/MB/M0, L0/L1

  if ( type == 'M' || type == 'N') {
    int mode = 0;
    switch ( num ) {
      case '0': mode = 0; break;
      case 'F': mode = 1; break;
      case 'B': mode = 2; break;
      default: mode = 0; break;
    }
    switch ( mode ) {
      case 0: 
        Serial.println("motor standby" );
        writeRegister( type == 'M'? DRV8830a: DRV8830b,  0x00, 0x00 );
        break;
      case 1:
        Serial.println("motor forward" );
         writeRegister( type == 'M'? DRV8830a: DRV8830b,  0x15, 0x02 );
        checkError();
        // delay( 2000 );
        break;
      case 2:
        Serial.println("motor back" );
         writeRegister( type == 'M'? DRV8830a: DRV8830b,  0x15, 0x01 );
        checkError();
        // delay( 2000 );
        break;
    }
  }
  if ( type == 'L' ) {
    Serial.println("LED on/off" );
    int mode = 0;
    switch ( num ) {
      case '0': mode = 0; break;
      case '1': mode = 1; break;
      default: break;
    }
    if ( mode == 0 ) {
        digitalWrite(LED, LOW );
    } else {
        digitalWrite(LED, HIGH );
    }
  }
}

ブレッドボード用に作ったものなので、エラーチェックの FAULTn と LED のコードが入っていますが、”MF” とか “MB” とかいう自作のコマンドを使ってモーターをコントロールします。

Windows ストアアプリから操作する

Android からやるのが見栄えがいいのですが、まずは Windows ストアアプリからやります。

Arduino で Bluetooth シリアル変換モジュール(HC-05)を使う | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6819

と同じように Package.appxmanifest を設定したあとに、接続とコマンド送信部分を書きます。

private async void btn_findDevice_Click(object sender, RoutedEventArgs e)
{
    string selector = RfcommDeviceService.GetDeviceSelector(RfcommServiceId.FromUuid(serviceGuid));
    DeviceInformationCollection collection = await DeviceInformation.FindAllAsync(selector);
    if (collection.Count > 0)
    {
        DeviceInformation info = collection.First();
        rfcommService = await RfcommDeviceService.FromIdAsync(info.Id);

        socket = new StreamSocket();
        await socket.ConnectAsync(rfcommService.ConnectionHostName, rfcommService.ConnectionServiceName);

        writer = new DataWriter(socket.OutputStream);
        reader = new DataReader(socket.InputStream);
        textOut.Text = "接続しました";
    }
    else
    {
        MessageDialog dialog = new MessageDialog("デバイスが見つかりませんでした");
        await dialog.ShowAsync();
    }
}

private async void clickMF(object sender, RoutedEventArgs e)
{
    writer.WriteString("MF");
    await writer.StoreAsync();
}
private async void clickMB(object sender, RoutedEventArgs e)
{
    writer.WriteString("MB");
    await writer.StoreAsync();
}
private async void clickM0(object sender, RoutedEventArgs e)
{
    writer.WriteString("M0");
    await writer.StoreAsync();
}

private async void clickNF(object sender, RoutedEventArgs e)
{
    writer.WriteString("NF");
    await writer.StoreAsync();
}
private async void clickNB(object sender, RoutedEventArgs e)
{
    writer.WriteString("NB");
    await writer.StoreAsync();
}
private async void clickN0(object sender, RoutedEventArgs e)
{
    writer.WriteString("N0");
    await writer.StoreAsync();
}

画面はボタンを並べただけ。

image

これだと、Arduino 側からフィードバックがないので、様子がわからないのですが、それなりに動きます。あと、DRV8830 はモーターに流れる電圧を変えることができるので前進後進だけではなく、スピードを変えることができます。このあたりを入れて Arduino のスケッチとストアアプリのコードを変えると結構いけるかなと。ああ、あとバーンと鳴るとか、LED を光らせるとかギミック用のコマンドもいれないと。

で、これは Windows ストアアプリで作ったけど、デスクトップアプリ(WinフォームとかWPFとか)でも作れます。次は、Windows のコンソールアプリで RFCOMM を利用する | Moonmile Solutions Blog を使って WPF アプリに書き直してみます。

カテゴリー: Arduino, Bluetooth, WinRT | 2件のコメント

AE-DRV8830 と HC-05を連携させてモーターを制御する(ブレッドボード編)

昨晩、AE-DRV8830 を使ってモーターが動いたので、そのまま HC-05(Bluetooth)と連携させてテスト、そのまま、もうひとつ AE-DRV8830 をつなげて、2個のモーターを動かすことができました。

20150310_02

これで、先に作った RasPi 戦車を自作のモータードライバ版に置き換えられます。AE-DRV8830 は、秋月電子で買えば 170円なので、2個買っても 340円と非常に安いです。一般的な Raspberry Pi のモーターシールドが 3000円強するので、これを使えばかなりモーターが制御できるようになります。ただし、Arduino に限って言えば Amazon.co.jp: Arduino MEGA UNO Duemilanove 最高品質 用の L293D モーター シールド ボード: DIY・工具 なんてのが出ていて、なんかひどく安いです。IC に L293D というのを使っていて、一時期大量生産したのか中国でコピーものが広まったのかよくわかりませんが、えらく安く手に入ります。ただし、レビューを見ると品質的に問題があって、動いたり動かなかったりする外れもあるみたいなんですが。

実は、L293D の IC って、日本向けには売っていないんですよね。

L293D | ペリフェラル・ドライバ/アクチュエータ | 他のインターフェイス | 概要と機能一覧
http://www.tij.co.jp/product/jp/L293D?keyMatch=L293D&tisearch=Search-JP-Everything

まあ、eBuy 経由か、どこか適当なところから買えば安く手にはいるので問題はなさそうです。海外の作例を見ると L293D を使っている例があって、手元の Raspberry Pi のモーターシールドにも L293D を使っているので回路を組んではみたいと思ってます。1つのICで、2つのモーターが制御できるので、AE-DRV8830 を 2つ使わなくてもよい、という利点があります。他にも色々違いはあると思うのですが。

それはさておき、

  • Arudino で、DRV8830 に Wire 送信する。
  • Arduino で、HC-05/Bluetooth シリアル受信する。
  • Windows ストアアプリから HC-05 へシリアル送信する。

のプログラムを組んで、無事無線でモーター制御が完了。コードは後日まとめます。Arduino のチップを抜き出して小型すれば、そのままプラレールの電車に乗せられそうです(電池は2両目から供給ってことになりそうですが)。

実際に配線したところはこちら。えらいごちゃごちゃしているのは、ジャンパーピンでやっているからですね。LED がついているのは、Bluetooth でのシリアル通信の確認用です。

image

タイマ IC 555 を 2つ使ってモーターを制御できる

DRV8830 は I2C を使っているので、たくさんの IC を使っても一組の SDA/SCL で済みます。まあ、それでもチップが小さすぎるので本格的に小型化するとき(基板に乗せるとき?)はいいんでしょうが、1,2 個のモーター制御だけだとちょっと大げさな感じがします。

で、Frizing のページを Bluetooth で検索していたら、タイマ IC を 2個使ってモーターを制御している例がありました。

Fritzing Project – Arduino Android Bluetooth Panzer
http://fritzing.org/projects/arduino-android-bluetooth-panzer
New Project: Projects in Motion: Control Three Types of Motors with 555 Timers – Make: | Make:
http://makezine.com/projects/projects-in-motion-control-three-types-of-motors-with-555-timers/

555 のタイマー IC は、ひどく安くて 30円とか50円ぐらいのものからあります。Arduino からのピン制御の数は増えてしまいますが、モーターだけを制御したい場合にはこれで十分かもしれません。これはまた別途購入したら試してみましょう。

カテゴリー: Arduino | AE-DRV8830 と HC-05を連携させてモーターを制御する(ブレッドボード編) はコメントを受け付けていません

mbed LPC1114FN28 で Lチカする

mbed LPC1114FN28 – スイッチサイエンス
https://www.switch-science.com/catalog/1714/
mbed LPC1114FN28

勢い(調子に)乗って、mbed も買ってみました。評価キットになっているものはそれなりに値段が高いので、ほとんど素の状態の LPC1114FN28 を使います。ついでに、LPC1114FN28 本体も安い(200円ちょっと)ので 2個ほど手に入れました。これでマイコンを倍増できるぞと思っていたわけですが、手元に届くと結構でかいですね、これ。20x40mm 位あって小さなブレッドボードの半分を占有してしまいます。今あらためてみたんですが、LPC1114FN28 って 32ビットマイコンなんですね。

ブラウザ上でコーディングする

http://developer.mbed.org/ でサインアップして、ブラウザ上でコーディングします。このアドレスは、mbed を USB に接続したときに出てくる、mbed.htm に書いてあります。この中には、デバイスの ID が書いてあるので、サイトでの登録も自動的に行われます。

image

インテリセンスはあまり効きませんが、ダブルクリックをするとヘルプがでます。あまりマニュアルを見なくても、なんとなくコーディングができるのが便利です。あと、色々なサンプルとライブラリがあるそうなので、そのあたり使うと一気に楽になるかも。

コンパイルして mbed にインストールする

メニューにある「Compile」ボタンを押すと、コンパイルが始まって、成功すると出来上がったバイナリファイル(*.bin)をダウンロードできるようになります。このファイルを、mbed がつながっているドライブにドラッグ&ドロップすれば ok です。

あとは、mbed ボードのスイッチを押してリセットすれば完了です。非常に簡単ですね。ブレッドボードを使って Lチカするだけならば、あっという間です。センサーを読み込んだり、サーボを動かしたりするのはそれなりに組まないとだめなんでしょうが、そのあたりは cookbook にありそうです。

image

ひとまず、

  • Raspberry Pi
  • Arduino
  • Netduino
  • PIC
  • mebed

と開発環境を触ってきたので、これで一区切りです。それぞれ得手不得手があるので、Raspi 戦車とか meArm をベースにして書き換えていこうという心づもり。あと Bluetooth LE との組み合わせとか、かなり自分の手が広がった感じ。

そうそう、ターゲットは、Raspberry Pi 2  + Windows 10 + 戦車/ロボットアーム ですからッ!!! これが一気にできると、相当広がるはず、と思ってます。

カテゴリー: mbed | mbed LPC1114FN28 で Lチカする はコメントを受け付けていません

PICでLチカするための環境を整える

やっとこさ PIC までたどり着いた…と思ったら、LPC という ARM のチップがあることを知ったので(mbed って ARM ですね、確かに)、小さくするのならば LPC でもいいかなと思い始めてはいるのですが…ともあれ、どちらもやったことがないので、まずは PIC から。

image

秋月電子で、PICkit3PIC18F14K50使用USB対応超小型マイコンボード を一緒に買いました。PIC のチップだけを買えば、100円もしないのですが、書き込み方がよくわからないのと、USB 書き込み(たぶんシリアル経由ですよね)と ICSP直結(こっちが PICKit3 で書き込む方)自体がよくわからなかったので、まあひとまず、初期投資ということで。それでも RPi を買うよりも随分安いわけですが。

開発環境をインストールする

MPLAB®X IDE | Microchip Technology Inc.
http://www.microchip.com/pagehandler/en-us/family/mplabx/home.html

上記から MPLAB X IDE をダウンロードします。現時点で、v3 のベータ版が出ているのですが、Available Downloads のほうの v2.35 を入れました。

これをインストールすると、コンパイラが自動でダウンロードして…となるハズなのですが、なんか、どうやってもコンパイラは自動ではインストールされていないみたいなので(アセンブラのほうは入った模様なんですが)、自前でダウンロードしてインストールします。これをやらないと、ビルドするときに「対応するコンパイラーがない」というエラーがでます。

| Microchip Technology Inc.
http://www.microchip.com/pagehandler/en-us/devtools/mplabxc/home.html

この中の MPLABR XC8 Compiler v1.34 をダウンロードすれば ok です。Free 版は最適化が弱いのですが、どうせ実験なのでこれで十分です。ビルドサイズに制限があるのかどうかは分かりません。32kb の制限がありそうな気がします。いくつかのブログでは HI-TECH PICC Lite の手順が書いてあったりしますが、Hi-TECH という会社が、Microchip社に買収されて、名前が、XC8 みたいになったようです。MPLAB X IDE の対象のコンパイラに Hi-TECH の名前が残っていますが、それは無視していいようです。

プロジェクトを作る

Visual Studio のようにいくつかのテンプレートが用意されています。PIC18F14K50 の場合は、Samples > Microchip Embedded > PIC18 C Template を選択すればよいでしょう。

image

そうすると、こんな風にいくつかのファイルを自動的に作ってくれます。使うところは main.c だけなんですが、

image

プログラミングする

Arduino とか Netduino のように、なんとなく勘で(苦笑)と思ったのですが、あえなく挫折しました。LED を光らせるにしてもポートの指定の仕方が分からないし、ポートの指定にしても PIC の種類によって違うらしく、目的のものを見つけないと難しい。

PIC18F14K80 の特徴 入門と応用
http://sky.geocities.jp/home_iwamoto/page/P14K50/P14_00.htm

そんな訳で、PIC18F14K80 でひたすら検索して、ずばりそのものを引き当ててコードを丸写しして動かしました。こりゃ大変だわ、と思って先人の感謝です。どうやら USB 内蔵の高性能 PIC らしいんですが、そこまで使い込めるかどうか自信がありませんw。まあ、練習用なので。

以下のコードでLチカができています。たぶん、#pragma のあたりはいらないのでしょうが…と思ったけど無いと動きません。そのままコピペです。

/******************************************************************************/
/* Files to Include                                                           */
/******************************************************************************/

#if defined(__XC)
    #include <xc.h>        /* XC8 General Include File */
#elif defined(HI_TECH_C)
    #include <htc.h>       /* HiTech General Include File */
#elif defined(__18CXX)
    #include <p18cxxx.h>   /* C18 General Include File */
#endif

#if defined(__XC) || defined(HI_TECH_C)

#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */

#endif

#include "system.h"        /* System funct/params, like osc/peripheral config */
#include "user.h"          /* User funct/params, such as InitApp */

/******************************************************************************/
/* User Global Variable Declaration                                           */
/******************************************************************************/

/* i.e. uint8_t <variable_name>; */
#define LED LATCbits.LATC0

#pragma config FOSC = IRC    
#pragma config USBDIV = OFF, CPUDIV = NOCLKDIV
#pragma config IESO  = OFF, FCMEN = OFF, PLLEN  = ON
#pragma config BORV  = 30,  BOREN = OFF, PWRTEN = OFF
#pragma config WDTPS = 32768, WDTEN = OFF
#pragma config MCLRE = OFF, HFOFST = OFF, XINST  = OFF
#pragma config BBSIZ = OFF, LVP    = OFF, STVREN = ON
#pragma config CP1  = OFF, CP0  = OFF, CPD  = OFF, CPB  = OFF
#pragma config WRT1 = OFF, WRT0 = OFF, WRTB = OFF, WRTC = OFF
#pragma config EBTR1 = OFF, EBTR0 = OFF, EBTRB  = OFF

#define _XTAL_FREQ 12000000

/******************************************************************************/
/* Main Program                                                               */
/******************************************************************************/

void main(void)
{
    /* Configure the oscillator for the device */
    ConfigureOscillator();

    /* Initialize I/O and Peripherals for application */
    InitApp();

    /* TODO <INSERT USER APPLICATION CODE HERE> */
    OSCCON = 0x40; // 4MHz
    TRISC  = 0x00; // Degital mode

    while(1) {
        Delay1KTCYx(500);
        LED = 1;
        Delay1KTCYx(500);
        LED = 0;
    }
}

トラブルシューティング

最初はなかなか動かなくて苦労しました。で、もう一度動かそうと思って苦労してたりするので、ハマりどころが多いのかもしれません。

コンパイルができない

最初に嵌った穴で、MPLAB X IDE をインストールしただけではダメです。コンパイラ MPLABR XC8 Compiler v1.34  も手動でダウンロードしてインストールします。たぶん、以前から使っている場合は、HI-TECH PICC Lite が入っているので大丈夫っぽいのですが、新規にインストールするときはコンパイラを忘れずに

PICKit3 から書き込めない

Connect できないパターンは、私の場合は3つの落とし穴でした。

  • PICkit3 は USB 2.0 に差すこと(USB 3.0のコネクタでは動かない)
  • PICkit3 の電源のため、USB ハブではなくて、PC の元に差すこと(これはマニュアルにも書いてありました。電力が結構必要なようです)
  • PIC 自身に電源供給をしないと駄目。PICkit3 から PIC のチップへ給電するモードもあるのですが、安定せずに何回か失敗します。

PIC への書き込みも、種類によって 3V から 9V まで必要な電圧が違うそうなので、USB の 5V だけでは足りない場合もあります。そのときは、外部電源として電池を使うのがいいんでしょう。

何かを壊して、書き込めないときがある

よくわからないのですが、The programmer could not be started: Could not acquire hardware tool communications resources: PICkit3PlatformTool SN# のようになって、何度やっても書き込めないときがあります。どうやら、ブートローダーか何かを壊したらしく、そのままでは書き込みができません。同じようなプロジェクトを作って、焼き込みをすると直るという不思議な現象なのですが、そういうものみたいです。ドライバーを再書き込みすればいいみたいです。

そんな訳でやっとこさ Lチカまで。

image

この後、mbed を試したのですが、これはすんなりといきました。ああ、セッティングをしなくていいいってのは mbed の素晴らしところですね。

カテゴリー: PIC | PICでLチカするための環境を整える はコメントを受け付けていません

Raspberry Pi で Wii コントローラを認識させる準備

Wiimote という python スクリプトがあって、これを使うとさっくりと Wii コントローラーを試せます。となるハズです。「ハズです」というのは、どうやら Wii コントローラ自体の個体差があって、すんなり繋がったり繋がらなかったりするらしいんですね。ちなみに、私の手元の Wii コントローラは「Wii MotionPlus INSIDE」というやつなのですが、すんなり繋がらないほうです。

Raspberry Pi – How to use a Wiimote! – YouTube
https://www.youtube.com/watch?v=bO5-FjLe5xE&list=UUfY8sl5Q6VKndz0nLaGygPw

にある通り、

– Bluetooth ドングルを RasPi に差しておく
– git clone https://github.com/the-raspberry-pi-guy/Wiimote でサンプルコードを取得
– sh setup.sh で bluetooth 関連を apt-get する
– python wiimote.py を起動したら、Wii コントローラの 1,2 ボタンを同時押ししてペアリングを行う。

そうすると、うまく接続できればペアリングが実行されて、各種のボタンを認識します。

ペアリングできない

しかし、私の手元にあるもので試すと、何度やってもペアリングができません。lsusb で確認したりしたのですが、No wiimotes found となって、認識しません。

Wii コントローラ自体が壊れているのかと思ったのですが、hcitool scan をすると MAC ID が取得できます。

ちなみに、実は Wii MotionPlus の場合は 1+2 ボタンの同時押しではペアリングできなくて、後ろの Sync ボタンを押さないとペアリングできないそうです。youtube の画像は 1+2 ボタンの同時押しでうまくいっているので、北米版と日本版との違いとか販売時期で違いがあるのかもしれません。手元にあるのは去年の夏に買ったものです。

CWiiDを直接調べる

最終的に使うのは、python ではなくて、C# から使いたいので、先の setup.sh でインストールしたライブラリを直接使う必要があります。

sudo apt-get update
sudo apt-get install --no-install-recommends bluetooth -y
sudo apt-get install python-cwiid

wiimote は、ライブラリに python-cwiid を使っていて、これが cwiid を使っています。

CWiiD – Community Help Wiki
https://help.ubuntu.com/community/CWiiD
abstrakraft/cwiid
https://github.com/abstrakraft/cwiid

github にコードが公開されているので、ビルドし直すかデバッグを入れればなんとかわかるだろうと思ったわけです。
cwiid 自体のビルドにちょっと苦労しましたが、以下のようにパッケージをインストールしておけば ok です。現在の RasPi は Gtk3 が入っているのですが、cwiid は Gtk2 を要求するので、パッケージを改めていれておきます。

apt-get install flex bison libgtk2.0-dev

で、結論から言えば、libcwiid/process.c にある process_write 関数での wiimote->rw_status の判別をコメントアウトしてしまいます。

cwiid/process.c at master ・ abstrakraft/cwiid
https://github.com/abstrakraft/cwiid/blob/master/libcwiid/process.c#L284-L287

int process_write(struct wiimote *wiimote, unsigned char *data)
{
        struct rw_mesg rw_mesg;
/*
        if (wiimote->rw_status != RW_WRITE) {
                cwiid_err(wiimote, "XXX Received unexpected write report");
                return -1;
        }
*/
        rw_mesg.type = RW_WRITE;
        rw_mesg.error = data[0];

        if (write(wiimote->rw_pipe[1], &rw_mesg, sizeof rw_mesg) !=
          sizeof rw_mesg) {
                cwiid_err(wiimote, "RW pipe write error");
                return -1;
        }

        return 0;
}

どうやら、手元にある wii コントローラだと wiimote->rw_status の値が RW_WRITE にならないみたいなのです。すんなり動くパターンもあるので、どこかのコードの判別だと思うのですが、ひとまず、ここをコメントアウトしてしまうと普通に通るようになります。

wmdemo で試してみる

これも 1+2 同時押しが効かない関連なのかもしれませんが、手元のものだと自動検索が効かないらしく Wii コントローラーの MAC アドレスを直接指定します。先に hcitool scan で探し出しておいた MAC ID を引数にして起動します。

wmdemo 8C:CD:E8:6B:B4:3A

そして、Wii コントローラの裏にある Sync ボタンを押すと、無事ペアリングが行われます。LED が常にちかちかした状態になってしまうのは、このあたりの不具合のせいなのかもしれませんが、一応ボタンなどのデータが取れます。

受信データは、以下のコメントアウトを戻せば表示されます。

cwiid/thread.c at master ・ abstrakraft/cwiid
https://github.com/abstrakraft/cwiid/blob/master/libcwiid/thread.c#L59-L62

データ長さは、4バイトか6バイトのようです。-/+ ボタンや方向ボタンを押すとビットが変わるので、これを取れば他のプログラムと連携することができます。

Windows で動く wiimote がある

あれこれと探していたら、以下に C# での実装がありました。

Managed Library for Nintendo’s Wiimote | Coding4Fun Articles | Channel 9
http://channel9.msdn.com/coding4fun/articles/Managed-Library-for-Nintendos-Wiimote
Managed Library for Nintendo’s Wiimote – Home
http://wiimotelib.codeplex.com/

試してみると、私の wii コントローラでは動かない(コード自体は wii remote 対応らしく微妙に違うみたい)のですが、コードがあるのでなんとかなりそうです。

ちなみに、Windows 8.1 では wii コントローラは認識されます。

Bluetooth でのペアリングで、PIN コードは何のか?と悩んだのですが、「何もいれない」まま次へボタンを押せば ok です。PIN コードが設定されていないので、そのままペアリングが成功します(むしろ、入れるとエラーになります)。

Bluetooth での認識では、Nintendo RVL-CNT-01-TR となっていて、サービスは、HID になっていますね。いくつか調べていくと、HID と SPP と両方が対応しているようなので、RasPi の cwiid では SPP を使っているような感じがします。このあたりは、PS3 の Dualshock3 のコードと後から見比べてみます。

デバイス – Windows app development
https://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#one

にストアアプリから HID を扱う方法があるのですが、これがそのまま wii コントローラで使えるかどうかは謎です。

Dolphinで実機のWiiリモコン(周辺機器)を使う – GC+Wiiエミュレータ Wiki*
http://wikiwiki.jp/gcwiiemu/?Tips_Connect_RealWiimote

Wii エミュレータをインストールして、ドライバー部分だけ使うっていう方法もあるみたいなんですが、動作確認はしていません。
Windows 10 だと Bluetooth 周りが楽になっているハズなので、そっちのほうは後で確認。

追記 Wii リモートで接続

気になったので、中古で Wii Remote を買ってきました。そうすると、あっさりつながりますね。managed 版の wiimote もあっさり認識するので、使うならばこっちのほうが良さそうです。これの話は後日。

カテゴリー: RaspberryPi | 5件のコメント