微弱無線モジュール
昨年度に買ったこれ↓ http://strawberry-linux.com/catalog/items?code=82003 http://strawberry-linux.com/catalog/items?code=82004 使ってみました。 まずは、Arduinoから、デジタル信号を周期的にON-OFFさせて無線で送信、 同じArduinoで受信してLEDを点滅させてみました。 目視だと問題なく点滅してる。 ただ、微妙にノイズが乗ってる感じがするかも。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 昨日の続き。 素直に動かないのでオシロで信号を確認。 信号なしの場合、ミリ秒オーダーのノイズがひっきりなしに出てる。 これにシリアル信号乗せても判別できるはずがない。 おもいっきり速度を下げて300bpsで大文字の”U"、コードはバイナリで01010101を連続して送ってみると認識されたのがこちら↓ 1200bpsだと、信号の最初がなまって読み取れない。 つまり、300bpsまたは600bpsでソフト的に送り方を工夫してエラー処理を行えば送信できそうではある。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− プログラム作って送受信してみました。 アドレスとコマンドとして2バイトのデータを送るとして、アドレスとコマンドの和をチェックサムとし、ヘッダとデリミタをつけて送ります。 受信側ではデリミタを監視して、受信したらそこまでのデータのヘッダを探してその後の2バイト抜き取ってチェックサムが正しければOKとしました。 ノイズの影響で1度で確実に送れませんが、数回送れば受信できるので、これにて終了。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 参考URL http://www.sparkfun.com/products/8945 http://strawberry-linux.com/images/tx-ask315.jpg http://winavr.scienceprog.com/example-avr-projects/running-tx433-and-rx433-rf-modules-with-avr-microcontrollers.html −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Arduinoのスケッチ 送信側 byte hder, delim; byte adr, cmd; void setup() { Serial.begin(600); // hder=0xff; delim=0x00; } void loop() { adr=0x01; cmd=0x02; Serial.write(hder); Serial.write(adr); // adr,cmd ともdelimと異なること! Serial.write(cmd); Serial.write(adr+cmd); // adrとcmdの和が255を越えないこと! Serial.write(delim); delay(1000); } −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Arduinoのスケッチ 受信側 byte str[90]; // string buffer int adr, cmd, sum; byte hder, delim; void recvStr(byte *buf) { int i = 0; byte c; while (1) { if (Serial.available()) { c=Serial.read(); buf[i] = c; if (c ==delim ) break; i++; } } } void setup() { Serial.begin(600); hder=0xff; delim=0x00; } void loop() { int cnt, i; if (Serial.available() > 0){ recvStr(str); i=0; cnt=0; while(str[i]!= hder) i++; // char strに0xffを入れて比較に使うと-1になるので adr=(int)str[i+1]; cmd=(int)str[i+2]; sum=(int)str[i+3]; if ((adr+cmd)==sum && sum!=0) { // adrもcmdも0の時があるので除外 Serial.print("adr:"); Serial.println(adr); Serial.print("cmd:"); Serial.println(cmd); } } }