XBeeで遠隔操作っぽいことをしてみる

そんなに難しいことはできないので簡単な事からstep by stepでやってみる。

 

arduino unoを使ってLEDを点灯させる。

 

XBee一台につきarduino unoを一台つけて実験している。

 

 

実験とはいうが、毎度他人の作例をそのままなぞるだけ。それも新しい事でもない。

こちらの記事を参考にした。

 

 

 

  使用するもの

arduino uno × 2台。

手前がイタリア本家製品、奥側がコピー品。

オープンソースハードなのでパチモンとは言えない。

値段が倍ほど違うが、仕上がりの美しさ他が大違い。

XBee用のシールド × 2台

シールドを2個も買うなんて贅沢だが、これを始めて見たときにすごいと感じた。

これが有れば仕事の足しになるモノが作れる、と思ったが仕事が忙しくてこれっぽっちもモノにできずに7・8年は経った気がする。

その気になればジャンパー線で接続できる。

 

最後に前回使用したXbee× 2台

 

  シリアル通信で垂れ流しのテキストを利用する

久しぶりにarduino ideをダウンロードしに行く。

最新のver.2.0.3を使ってみようと思ったが、ページに無料ダウンロードのボタンが見当たらない。あれ?寄付しなきゃか?と思った。

 

ひとしきり探して隠しダウンロードボタンを見つけてインストール。

 

スケッチは参考サイトそのままです。

 

送信側

  1. int LED = 13;
  2. int count = 0;
  3.  
  4. void setup(){
  5.   Serial.begin(9600);
  6.   pinMode(LED, OUTPUT);
  7. }
  8.  
  9. void loop(){
  10.   count++;
  11.   Serial.write(count);
  12.   if((count % 2) == 1){
  13.     digitalWrite(LED, HIGH);
  14.   }else{
  15.     digitalWrite(LED, LOW);
  16.   }
  17.   delay(1000);
  18. }

 

受信側

  1. int LED = 13;
  2.  
  3. void setup(){
  4.   Serial.begin(9600);
  5.   pinMode(LED, OUTPUT);
  6. }
  7.  
  8. void loop(){
  9.   while(Serial.available()){
  10.     byte inChar = (byte)Serial.read();
  11.     if((inChar % 2) == 1){
  12.       digitalWrite(LED, HIGH);
  13.     }else{
  14.       digitalWrite(LED, LOW);
  15.     }
  16.     delay(10);
  17.   }
  18. }

 

簡単に説明する。

 

送信側で1ずつ増えるカンターを回し、その数字を2で割った余りの数を条件に使う。

それが1なら送信側のarduino unoの13番ピンに電圧をのっけて、ボード本体に実装しているLEDを1秒点灯させる。そしてシリアル通信で相方のXBeeにカウンターの数字を送る。

 

受信側のarduino unoは送られてきた数字を2で割って、1なら受信側arduino unoの13番を出力してLEDを点灯させて消灯する。

 

 

  スケッチをボードに書き込んで実行

arduino unoにはそれぞれシールドを被せているので、まずシールドを被せていない状態で送信側を撮影。

本体の「L」と記されている所のLEDが一秒おきに点滅している。

 

 

次に通信している時の様子を2台並べて撮影。隙間から除くように撮影してある。

動画の途中で送信側のarduino unoの電源を外すと、受信側のLEDが点滅を止めている。

電源を戻すとまた点滅が始まる様子がわかる。

 

 

  通信が検証できたので押しボタンをつけてみる。

まずXBeeを外してボタンを押して自前のArduino UNOのLEDを点灯させてみる。

スケッチは下記で良いと思います。

  1. void setup() {
  2.     pinMode(3, INPUT); //3を押しボタン入力ピンにする
  3.     pinMode(8, OUTPUT); //LED点灯用の出力ピン
  4.     Serial.begin( 9600 ); //PCとArduino UNO間でシリアル通信スタート
  5. }
  6.  
  7. void loop() {
  8.     int value;
  9.     value = digitalRead(3);
  10.     if(digitalRead(3)== HIGH){ //もし3ピンに電圧の入力がある場合
  11.       digitalWrite(8,1); //8ピンに電圧出力
  12.     }
  13.     else { //もし3ピンが電圧無しなら
  14.       digitalWrite(8,0); //8ピンの出力停止
  15.     }
  16.     Serial.println(value); //シリアルモニタに出力
  17.     delay(500); //0.5秒待機
  18. }

 

配線は写真の通り。

XBeeが刺さっているが配線がなされていません。

LEDをボタンで点灯させるだけ。

Arduino UNO 3番ピン → タクトスイッチ奥側

                 → プルダウン抵抗をかましてGND

Arduino UNO 5Vピン   → タクトスイッチ手前側

Arduino UNO 8番ピン  →  LEDアノード(正極)

LEDカソード(負極)  →  GND       

*LEDを焼損させたくない人は直列に制限抵抗を入れてください。

タクトスイッチのプルダウン抵抗の値は適当です。

 

事情があって居間の炬燵の上手作業している。

理由は判らないが静電気か何かの影響で勝手にスイッチが入ってしまうのでプルダウン抵抗を入れた。

 

 

  スイッチをつけて状態を送信

外観をスッキリさせるためにXBee用のピッチ変換基盤を使用する。

電圧レギュレターが乗っていて最大20Vから3.3ボVに降圧してくれる。

LEDもついている。ただしPCからの設定変更は直接できない。

 

XBeeの設定はそのまま。

 

 

送信側と受信側は同じ動作をさせるので同じ配線にする。

LED出力とボタン入力は上記のLED点灯のモノから少し変更と追加。

*arduino UNOは0番からスタート

*XBeeは1番からスタート

LED出力(正極)はArduino UNO 13番ピンに変更

3番ピンから出るタクトスイッチは8番ピンへ

 

Xbee1番ピンはArduino UNO 5V

XBee2番ピンはArduino UNO2番ピン

XBee3番ピンはArduino UNO3番ピン

XBee10番ピンはArduino UNO GND

 

Arduino UNOのシリアル通信は0・1ピンで行うがPCとUSBで使用する場合はXBeeで使用できない。

そのためソフト的にシリアル通信するピンを設定してArduino UNOとXBeeを通信させる。

XBee同士は無線で通信し、通信結果をそれぞれのArduino UNOに渡す。

 

スケッチ内容はAruduino UNOのタクトスイッチを押すと「1」をXBee経由で合入れ側のArduino UNOに渡す。ボタンから指を離すと「0」を送信。

 

スケッチは送信側も受信側も同じで良い。

  1. void setup() {
  2.     pinMode(3, INPUT); //3を押しボタン入力ピンにする
  3.     pinMode(8, OUTPUT); //LED点灯用の出力ピン
  4.     Serial.begin( 9600 ); //PCとArduino UNO間でシリアル通信スタート
  5. }
  6.  
  7.  
  8. #include <SoftwareSerial.h>
  9. SoftwareSerial mySerial(2, 3); //XBeeとArduino UNOとのシリアル通信ピンを設定
  10.  
  11. const int LED_PIN = 13; //LED点灯用の出力ピン
  12. const int SW_PIN = 8; //8を押しボタン入力ピンにする
  13.  
  14. void setup() {
  15.   Serial.begin(9600); //通信速度
  16.   mySerial.begin(9600);
  17.   pinMode( LED_PIN, OUTPUT);
  18.   digitalWrite(LED_PIN, LOW);  //LEDを消灯しておく
  19.    
  20. }
  21.  
  22. void loop() {
  23.    int val;
  24.    while(mySerial.available()>0){
  25.      int val = mySerial.read();    // シリアルデータを読み込む
  26.      
  27.      if(val == '1'){ // "0"ならLEDを消灯、"1"ならLEDを点灯
  28.        digitalWrite(LED_PIN, HIGH);
  29.      } else if(val == '0'){
  30.        digitalWrite(LED_PIN, LOW);
  31.      }
  32.    }
  33.  
  34.    int SW = digitalRead(SW_PIN); // スイッチの状態を判定
  35.    if(SW == HIGH){ // 押下なら”1”を送信
  36.      mySerial.write('1');
  37.    } else if(SW == LOW){ // 離しているなら"0"を送信
  38.      mySerial.write('0');
  39.    }
  40.    //int value = digitalRead(SW_PIN);
  41.    //Serial.println(value);
  42.    //Serial.println(val);
  43.    delay(500); //0.5秒待機
  44. }

動画を撮ってみた。

手前のXBeeとArduinonUNOのセットのタクトスイッチを押すと、奥側の黄色いLEDが点灯。指を離すと消灯。

奥側のスイッチを押すと手前側の赤のLEDが点灯、離すと消灯する。

ボタンの操作とLEDの点灯にタイムラグがあるが、スケッチ内に待機時間を0.5秒設定しているから。

 

一応当初考えていた、ボタンを押して相手側に何かアクションさせるモノのひな型はできた。

 

 

  なんだかもっさり

思っていることはできたが、ちょっと違う。

これでは両方にArduino UNOが必要になってしまう。

 

arduino UNOは評価用ボードなのでいろんなものがついている。

 

だがそれに準ずるものはバリエーションがあり、MiniやらNanoやらコンパクトなモノもある。

 

一番左はキットになっているaitendoさんの「あちゃんでいいの」で200円しない。

しかも最低限の部品構成だ。

しかしAtmel社のチップ(写真左から2番目)は別売りである。今見たら秋月さんで380円する。

 

真ん中も「あちゃんでいいの」だが、表面実装のパーツがあるバージョンだ。

当然どっちも書き込み装置はついていない。

 

目が弱くなってきたので、できるだけ半田付けは少ない方が良い。

 

希望は送信側はできるだけコンパクトに。

 

  宿題

ラジコンを作るつもりではないので、もうすこしスッキリさせられないか調べてみる。

 

 

  ついでの告知

抗がん剤治療をしているが、ちょっと体調を崩すとすぐ寝込んで一瞬で数日経過してしまう。このままずっと休職かもしれないので、ものづくりしようと3Dプリンターを購入する。しかし疲れると思考もできないので延々昼寝をしている昨今。

癌治療の様子はこちらで記録。