ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

arduinoコミュのXBeeを使用し、センサーの情報をワイヤレスで可視化する方法

  • mixiチェック
  • このエントリーをはてなブックマークに追加
タイトルの通り、arduinoに接続したセンサーのデータを、XBeeを使用してワイヤレスで可視化したいと考えています。
具体的には、arduinoに接続した複数の圧力センサーのデータをXBee(またはtwe-lite dip)を無線機器を経由して、もう一つのXBeeにデータを無線送信し、各センサーに対応したLEDを点灯させるという機器を製作したいと考えています。
何か参考になる書物や、回路図、スケッチなどがありましたら教えて頂きたいです。
よろしくお願いします。

コメント(30)

一度に全部を、ではなく個別にひとつづつ問題を解決してみてください。

1)LEDを点灯させるプログラムは単純にdigitalWriteでいいと思われます。

2)圧力センサーについては google でキーワードを入力するだけで
  回路図もプログラムもわんさと出てきます。

3)XBee そのもののコントロールについてはちょっと勉強が必要かも
  しれません。まずは1:1の XBee が通信できるようにする事が
  必要です。arduino から見た XBee はただのシリアル通信なので
  Serial 系の命令で動かせます。

1)〜3)それぞれを個別にクリアできたら、それを結合します。

大抵の電子工作は、複雑そうに見えても個別の機能単位で考えれば
それほど難しくなく、単純な機能の組み合わせであると考えるとうまく
いきます。
なるほど。一気に作成しようとしていたため、何から手をつけていいか、わからず苦戦していました。回答ありがとうございます。
やはり、XBeeはすこし勉強が必要なんですねT_T
まず、無線ではなく、有線でセンサが反応すると、LEDが点灯する電子回路、スケッチを完成させようと思います。
1)LEDを点灯させるプログラム
2)圧力センサーについての回路やプログラミング
は一通り把握しました。

続いて、圧力センサーのアナログ値をXBeeの無線通信を利用し、無線でLEDを点灯させようと考えています。ネットで、XBeeに関するデータを探したのですが、いまいち近いチケッチや作品を見つけることができず困っています。

また、XBeeにこだわっているわけではないので、もっと簡易に上記の無線通信を実現できる機器がありましたら、そちらのほうも教えて頂きたいです。


下記二つの書籍購入は考えています。
ZigBee/Wi-Fi/Bluetooth無線用Arduinoプログラム全集
XBeeで作るワイヤレスセンサーネットワーク

回答よろしくお願いします。
技適を通ってないかもしれないのであまりおすすめはできませんが、
安さと arduino での動作実績の多さという意味で nRF24L01 という
ものを挙げておきます。

http://ehbtj.com/electronics/188/

長距離とか壁越しなどでは通信できない事も多いですが、値段を
考えればそんなものかと。

先にも書きましたが、技適を通っていないものを使う場合、最悪電波法
違反でしょっぴかれても文句は言えないので自己責任で。
技適が通っていないのは、少し怖いのでやはりXBeeを使う方向で考えます。細かい情報まで、提案してくださりありがとうございます。

https://tecshar.com/r/mbHZA#
arduinoとXBeeを使用し、ledを点灯させているサイトを複数見つけました。
問題に感じたのが、どのサイトでも、arduinoを2個使用している点です。arduino1つとXBee2つを使用し、前述した内容を実現するのは不可能なんでしょうか?
XBEE はシリアル通信以外にもI/O入出力端子があるので受信側はマイコン無しでもできるはずです。
以前仕事で使ったことがあるのですが大昔の事でほとんど何も覚えてません。ただUSB接続用のげたをつないでPCから専用ソフトで設定を書き換えた覚えがあります。

とりあえずその辺の事を試してる人のHPがあったので中身今時間がなくて細かく読んでませんが参考になりそうなので張っておきます。

http://gataro-avr-ken.cocolog-nifty.com/blog/xbee/
記載して頂いたサイト、非常にためになりました。ありがとうございます。
少し値段が高いので、もう少し情報を収集してから、購入を検討しようとおもいます。

本日、電気屋を徘徊していると、TWE-LITE DIPという、比較的安価な無線機器を発見しました。マイコンが内臓されていて、簡単なものなら、プログラミングなしで制作できると知りました。このスレッドで書いた、圧力センサーのアナログデータをTWE-LITE DIPを介して無線通信し、LEDを点灯させることは可能でしょうか?
TWE-LITE DIP、技適も通ってるし、多分やりたい事もできるでしょう。
値段も2000円しない程度なら XBee より安くて手軽ですね。
ただ arduino の話ではなくなりますので、自分はアドバイスできません。

プログラミング無しでもできる、というのは通信に関する部分だけで、
結局圧力センサーの値を読んだりLEDを着けたりの部分はプログラム
しないとダメな気がしますがどうなんでしょうね。
>>[5]
[6]のねこ蔵さんの方法でもできますし、XBeeは(つかったことはない)アナログ入力もできるのでセンサと直結して、もうひとつのXbeeからリモートコマンドでサンプリングしてLEDを動かすという方法もできそうです。
これだとArduinoは受信側のみになります。

たくさんの回答ありがとうございました。
XBeeで作るワイヤレスセンサネットワークの書籍でarduino2つ、XBee2つで無線通信をしている例が二つ乗っていたのでこちらをベースに作業を進めています。

スイッチをONにすると、ブザーが鳴るという無線通信をベースに考えています。
回路図は写真にアプロードした2枚のものです。
スケッチは、スイッチ(送信側)が
int BUTTON = 2;

void setup() {
pinMode(BUTTON,INPUT);
Serial.begin(9600);
}

void loop() {
if (digitalRead(BUTTON) == HIGH) {
Serial.print('D');
delay(10);
}
}

ブザー(受信側)が
int BELL = 5;

void setup() {
pinMode(BELL,OUTPUT);
Serial.begin(9600);
}

viod loop() {
if (Serial.available() > 0) {
if (Serial.read() == 'D') {
digitalWrite(BELL,HIGH);
delay(10)
digitalWrite(BELL,LOW);
}
}
}

このスケッチを参考に圧力センサを押せば、LEDが点灯する無線通信のスケッチを考えました。
送信側(センサ)スケッチ
int SW0 = 9;


void setup() {
pinMode(SW0,INPUT);
Serial.begin(9600);
}

void loop() {
if (digitalRead(SW0) == HIGH) {
Serial.print('D');
delay(10);
}
}

void loop()の部分で、もし圧力センサの抵抗値が変化すれば、何らかの信号(D)が送られる。というスケッチが分かりません。HIGH、LOWなどのスイッチなどのデジタルデータの例などはたくさん見つかったのですが。。。センサなどの抵抗値が変化した場合なんらかの信号を送るというスケッチはどのように書けば良いのでしょうか?


受信側(LED)スケッチ
int ledPin = 13;

void setup() {
pinMode(ledPin,OUTPUT);
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
if (Serial.read() == 'D') {

digitalWrite(13,HIGH);

回路図のスイッチの部分に圧力センサ、ブザーの部分にLEDを繋いでいます。
長々とすいません。


追記です。
XBeeはシリーズ1のアンテナ型を使用しています。
XBeeの設定はX-CTUを使用して行っているのですが、上記装置を作成する場合
設定を変更する部分は、PAN IN(共通の数値にする)、addressingの項目にあるDH、DLに相手側のアドレスを入力する。writeで設定を書き込む。だけでよろしいのでしょうか。
シリーズ1の場合、2と違って、Function setをいじり、COODINATARとROOTERを割り振る項目が存在しません。
よろしくお願いします。
>>[10] どのようなセンサなのかわからないですが、抵抗が変化するならば分圧してアナログリードするのが普通と思います。
書籍『XBeeで作るワイヤレスセンサネットワーク』をお持ちでしたら97ページのようなやつです。
この回路のデータ出力をArduinoのアナログ入力につないでAnalogReadして読み取り値で判定するとよさそうです。
回答ありがとうございます
センサは円形圧力センサ0.5inch(SEN-09375)となります。
XBeeにAPIモードの設定を行い(送信側)、受信側のマイコンとXBeeでanalogReadするということでしょうか?(XBee2つ、マイコン1つ)
>>[13]
マイコンを両方に使うのと片方だけにするのと二通りやり方があります。
マイコンを二つ使うのであればセンサはXBeeでなくArduinoに接続します。このときスイッチとちがうのはデジタルではなくてアナログ入力につなぐところです。そしてスケッチのスイッチ入力のところをアナログ入力と判定に変えればいいと思います。
マイコン一つならば受信と送信のどちらに使うかがまず決めなければなりません。
例えば受信側のみマイコンとすれば送信側のXbeeのアナログ入力にセンサをつないでおきます。受信側のXbeeはAPIのアナログ入力コマンドを送り出すようにして送られた値をみてLEDをつけるかどうか決めるようになります。

マイコン二つの方が当面簡単にいくと思います。サイズが問題ならばArduinoFIOという手もあります。
ぐっちさん 回答ありがとうございます。
arduino2つ、XBee2つで作業を進めています。
試行錯誤しながらスケッチを書き直したのですが、どうもうまくいきません。
シリアル系の命令で動作すると思ったんですが。。。
なにかご指摘などありましたらよろしくお願いします。

受信側arduinoスケッチ
int ledPin = 13;

void setup() {
pinMode(ledPin,OUTPUT);
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
if (Serial.read() == 'H') {

digitalWrite(13,HIGH);
delay(10);
digitalWrite(13,LOW);

}
}
}

送信側から送られてきたHという信号がくれば、LEDが点灯するというスケッチを書きました。



送信側arduinoスケッチ

int SW0 = 0;


void setup() {
pinMode(SW0,INPUT);
Serial.begin(9600);
}
void loop() {
SW0 = analogRead(0);
if (SW0 >= 500 {
Serial.print(‘H’);
delay(10)
}
}

SW0がセンサです。
センサの抵抗値が変化すれば、シリアル系の命令で、受信側にHという信号を送るスケッチを書いてみました。
>>[15]

受信側スケッチで

delay(10)

がありますが、これだと
Led光っても目で見えないのでは?
delay(500)
位でもいいように思います。

>>[15]
まずはArduinoをひとつだけ使って、センサーからの出力電圧を正しく読み出せているか確認してみてはどうでしょうか?(例えばSerial.print() を使って表示させるとか)

一気に完成形のスケッチを書くのではなく、ひとつひとつの部分についてそれぞれの動作を確認しながら組み立てていくのが近道です。
>>[16]
細かいところまで、ご指摘ありがとうございます。
すぐに修正します。
>>[17]
回答ありがとうございます。
早速実施し、電圧を確認します。その電圧を元に

if (sw0 >= 500)
の500の部分の数値を調整すれば良いということですよね(^ ^)

そもそもな疑問なんですが、serial系の命令はpcとの接続時に利用するというイメージがあるんですが、マイコン+xbee〜マイコン+xbeeという場合でも代用可能なんでしょうか?
>>[20]
>マイコン+xbee〜マイコン+xbeeという場合でも代用可能なんでしょうか?
それを考える前に、まずは仕組みを把握したほうがいいです。
○UNOの場合、D0,D1端子はUART(いわゆるシリアル入出力)の機能を兼ねている。
○UNOの場合、Serialというインスタンスは、その端子を用いてシリアル入出力をするためのものである。
○UNOの場合、その端子にはUSB-Serial変換用のチップが接続されている。このため、USB端子をPCに接続すれば、PCとの間をSerialインスタンスを用いて通信することができる。
○もし他のデバイスとSerialインスタンスを用いて通信したいのであれば、そのデバイスのシリアル入出力の端子をD0,D1端子に接続すれば通信できる。

という具合に。

jtakaoさん
大きなヒントありがとうございました。
arduino同士のD0 D1端子を用いたシリアル通信に成功しました。

スケッチについての質問です。
arduino+XBee+円型感圧センサからarduino+XBee+LED

送信側(センサ側)スケッチ
int SW0 = 9;


void setup() {
pinMode(SW0,INPUT);
Serial.begin(9600);
}
void loop() {
SW0 = analogRead(0);
if (SW0 >= 500); {
Serial.print(‘H’);
delay(10);
}
}


受信側(led)スケッチ
int ledPin = 3;

void setup() {
pinMode(ledPin,OUTPUT);
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
if (Serial.read() == 'H') {

analogWrite(3,HIGH);
}
else {
analogWrite(3,LOW);
delay(100);

}
}
}

このようなスケッチを書いたんですが、LEDが光りっぱなしになってしまいます。
また、有線で実験したときに、このスケッチだとLEDが高速で点灯したような形になってしまいました。(おそらく、文字Hを送信しているので点滅しているということはなんとなくわかります。)
webを探しまわりましたが、スイッチなどのデジタルデータからLEDのパターンはあったんですが、アナログデータからLEDのパターンは見つかりませんでした。
シリアル通信で、センサの抵抗値が変化すれば光り続ける、センサの抵抗値に変化がないと消えたまま、というようにするにはどのようにスケッチを書けばいいでしょうか。アドバイスよろしくお願いします。

>>[23]
>センサの抵抗値が変化すれば光り続ける、センサの抵抗値に変化がないと消えたまま、というようにするにはどのようにスケッチを書けばいいでしょうか。

それはあたらしさんが組んだ回路と、あたらしさんが決める仕様次第です。
あたらしさんのセンサの抵抗値によって、analogReadはどのような値が返るのでしょうか。まずはそれを確認して、その値がどのようになったら光るようにしたいのか、どのような値なら消えたままにしたいのか、まずはその条件を自分で決めなければなりません。
一番最初に「たく」さんも書かれているとおり、個別にひとつずつ解決すべきです。
jtakaoさん
何度も回答ありがとうございます。

質問内容がまとまっていなく申し訳ありません。
一番困っているところは、analogRead()した値を、シリアル通信ではどのように送信すれば良いのかということです。analogRead()で読み込んだ値に同期して、LEDを光らせることを目標にしています。
上記、スケッチでは、serial.print('H')で文字を送信しています。文字で送信した場合どうしてもLEDが高速で点滅してしまいます。

マイコン一つでセンサの値を読み取りLEDを光らせるというところは完成しています。
センサの読み取り値をPCに表示させることもできました!
int SW0 = A0;


void setup() {
pinMode(SW0,INPUT);
Serial.begin(9600);
}
void loop() {
SW0 = analogRead(0);
if (SW0 >= 500); {
Serial.print(‘H’);
delay(1000);
}
}

arduinoのシリアルモニターを表示させ、Hという信号が送られているか調べてみました。すると、センサの抵抗値の変化に関係せず、Hという文字を送信し続けていることがわかりました。(arduinoからセンサなどを全て取り外した場合も)
なぜ、条件ifをつけたにも関わらず、Hが送信され続けてしまうのでしょうか?
>>[26]
こんにちは。
それはif (SW0 >= 500); { の
;の文字がそこにあるためにif文が終わってしまうからで、
;を抜けば良いと思いますよ。

それとSW0変数にアナログピンの番号A0という意味と、抵抗値入力のデータという意味の2つの意味を持たせずに、別にするか、pinMode(A0. INPUT)とかint SW0 = analogRead(0);とすると良いと思います。私も素人なので間違っているかもしれませんが。
nnishiさん 回答ありがとうございました。その部分の不具合解消することができました。

センサ一つとLED一つの無線化は実現することができました。
センサの数を増やして実験したところ新しい不具合が発生してしまいました。
受信側のスケッチで、
else{
analogWrite(3,LOW)

else{
analogWrite(5,LOW)
という部分があるのですが、センサを二つにし、二文字送信できるようにしたため、LEDが点灯しなくなってしまいました。
センサ1を押し続けていると文字Hが送られ続ける、その間はLED1が点灯する、センサから指を話すと文字Hが送られなくなり、LEDが消灯させたい場合どのようにスケッチを変更すれば良いでしょうか。センサ2の文字Lの時も同様です。アドバイスよろしくお願いします。
else{の部分を
delay()に変更して実験を行いましたが、大きなラグがでてしまい使えそうにありません。

下記がスケッチです。

送信側
int SW0 = 0;
int SW1 = 1;


void setup() {
Serial.begin(9600);
pinMode(SW0,INPUT);
pinMode(SW1,INPUT);
}
void loop() {
SW0=analogRead(0);{

if(SW0 >= 200) Serial.print('H');
delay(100);}

SW1=analogRead(1);{
if(SW1 >= 200) Serial.print('L');
delay(100);}
}

受信側
int ledPin = 3;
int ledPin1 = 5;

void setup() {
pinMode(ledPin,OUTPUT);
pinMode(ledPin1,OUTPUT);
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
if (Serial.read() == 'H'){

analogWrite(3,HIGH);
}
else {
analogWrite(3,LOW);
}
}

if(Serial.available() > 0) {
if(Serial.read() == 'L')
analogWrite(5,HIGH);
}
else{
analogWrite(5,LOW);

}
}

analogWriteでHIGHにしているので、LOWとの差を視認できるとは思えません。

LEDを消灯させるには、
・センサが押されていないなら「押されていないよ」と送信する
・状態に変化があったら「変わったよ」と送信する
・一定時間何も受信しなかったら押されていないとみなす
等、方法はいろいろ考えられます。
たぶん、問題はここかな
analogWrite(3,HIGH);

デジタル出力はHIGH, LOWで指定しますが、
digitalWrite(pin, [HIGH|LOW])
アナログ出力は数値で出力します。
analogWrite(pin, x) x は 0 ~ 255
だからanalogWrite(3, 255); とすれば良いと思います。

こういうのはArduino早見表という便利な一覧表に書いてあります。
http://www.musashinodenpa.com/arduino/ref/arduinoHH12.pdf
ここに関数の解説もあります。
http://www.musashinodenpa.com/arduino/ref/

この他にArduinoのサイトやこのサイトに詳しい情報もあります。
http://garretlab.web.fc2.com/index.html
色々作例を参考にしたり、C言語の初歩の本を読むと理解が深まると思いますよ。

それと、Serial.read() == ‘H'を条件式にしていますが、
シリアル関係の情報は読み出すだけでリセットされてしまうことが多いので、
いったん
buf = Serial.read() ; として変数に代入した後で、その変数を用いて
‘H’なのか’L’なのか等と、判定に使う方が良いと思います。

変数に代入したときに文字コードになっているか数値になっているかなど、関数によってややこしいので、本当は受信側のArduinoにもLED以外の表示機能を持たせて、プログラムのどこで想定外の動作をしているか、確認できるようにすると良いですね。そうじゃないと、複雑なプログラムが誤動作したときに途方に暮れることになると思います。


送信側のこれもおかしいです。

void setup() {
Serial.begin(9600);
pinMode(SW0,INPUT);
pinMode(SW1,INPUT);
}
void loop() {
SW0=analogRead(0);{  //ここでif文の前になぜか{があって、

if(SW0 >= 200) Serial.print('H');  //ここに{がなく
delay(100);} //ここで}で閉じられています。

SW1=analogRead(1);{  //ここも同じ
if(SW1 >= 200) Serial.print('L');
delay(100);}
}

どうしてこうなるかというと、せっかくキー1つの時に組んだプログラムを2つの時に全く別のプログラムに変えてしまったからです。慎重に、動作するプログラム同士を組み合わせないと、最終的に動かなくなります。

私だったら、送信側ArduinoにもLEDを、受信側Arduinoにもスイッチを設けて、それぞれ単独で動作確認できるようにしておきます。可能なら受信側にはキャラクター液晶を乗せて、随時状況を表示できるようにしておきます。そうしないと、運用中にトラブルになった時に無線通信が原因なのか、センサーの不良なのか、電源の故障なのかさっぱりわからなくなるからです。

「急がば回れ」ですよ。

ログインすると、残り2件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

arduino 更新情報

arduinoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング