2013年4月29日月曜日

GWの工作(1) androidとarduino(ややこしい)を無線でシリアル通信

~GWは東京観光でもしようかと思っていたが気がついたらまた電子工作に入れ込んでいたでござる の巻~

最近流行りのタブレットでArduino Microをとりあえず動かしてみました。今回はそのあたりのメモ

~材料~

nexus7 : android 3.0以上くらいなら大体okだと思う
USB ホストケーブル: 片方はスマホに挿すやつ(usb-miniB)、もう片方が普通のUSB(メス)になってるやつ
arduino micro : 別にunoでもなんでもok シリアル通信するだけなので
xbee 2個 : ZBの普通のやつ(あとUSBドングルとブレッドボード変換基板)。使い方は過去記事参照のこと

 ~使ったソフト~
 Arduino1.0.4 :これじゃないとボードにmicroが入ってない?
神が作ってくださったandroid usbシリアル通信ライブラリ「FTDriver」と「Android USB Serial Monitor Lite(google playで入手可)
参考 : http://ksksue.com/wiki/doku.php?id=wiki:android:hardware:usb:ftdriver

~参考資料~
「xbeeで作るワイヤレスセンサーネットワーク」:オライリーの本。一家に一冊は欲しいね。

nexus7のUSBドライバーのインストールについて。
・今回の内容ではいらんけど、これがないとPCで書いたeclipseがnexus7認識しないので注意。あと「タブレット情報」ボタンを7回連打するのも忘れずに。他にも入れ方は色々あるようだがとりあえず公式からのインストールのやり方。
http://blogs.yahoo.co.jp/momo_poem/67257950.html


やり方
0、Xbeeの設定をする(親機をUSBドングル、子機をarduino)やり方は参考資料とか過去記事を

1、nexsus7でAndroid USB Serial Monitor Liteを入手

2、nexsus7にUSBホストケーブルとxbeeドングル(親機)を接続・・・できるようにしておく

3、 arduinoとXbeeの配線 
※注意:arduinoのTX出力が5VなのでXbeeのRXとの間で3.3Vに降圧すべき。でないとxbeeぶっ壊れる こんな便利なものがあるみたいです→http://www.switch-science.com/products/detail.php?product_id=1216
  ・arduino の3.3VとxbeeのVin
  ・arduinoのTXとxbeeのRX
  ・arduinoのRXとxbeeのTX
  ・arduinoのPIN2とGNDにLED(抵抗入り)
・・・筆者のXbee(子機)はもうだめかもわからんね

4、arduinoのプログラムを書く。シリアルで’a’を受信したらLED ON’b’を受信したらOFFするプログラムを書いただけ。
要点:
Arduino microでシリアル通信するときはSerial1クラスを使うこと(3時間くらい詰まった) 例:Serial1.begin(9600)
なんか普通のSerialのほうはPCとの接続に使ってるみたい。Arduino Leonardも同様

5、nexus7にホストケーブルを挿してAndroid USB Serial Monitor Liteを起動

6、プログラムアップロード。この時点でもnexus7からLチカできるがarduinoとPCがつながっててちょっとアレだったので線を引っこ抜いて外部電源に切り替え

7、nexus7から「a」を送ったり「b」を送ったりして遊ぶ。なんとなく感度が良くない気がする。

結果↓



arduinoのコード(抜粋) : ほぼarduino IDE に入っているサンプルのまんま、serial部分を足しただけ。

int led = 2;

void setup() {               

  pinMode(led, OUTPUT); 
  Serial1.begin(9600); 
}

void loop() {

  if(Serial1.available()>0){
   
    char data1=Serial1.read();
  if(data1=='a'){
    digitalWrite(led, HIGH);
    Serial1.print("a received led on\n");   // turn the LED on (HIGH is the voltage level)
  delay(1000);   

  else if(data1=='b'){ 
  digitalWrite(led, LOW);  
  Serial1.print("b received led off\n");
  delay(1000);    
  }else
{
    Serial1.read();
  }

}
Serial1.println("serial from arduino");
delay(2000);
}

今後の展開(2日後予定) : android側で出来合いのソフトじゃなくてFTDriverライブラリを使ってラジコンとか操縦できるといいね(android傾けたりして)

おわり





0 件のコメント:

コメントを投稿