微弱無線モジュール
昨年度に買ったこれ↓
http://strawberry-linux.com/catalog/items?code=82003
http://strawberry-linux.com/catalog/items?code=82004
使ってみました。
まずは、Arduinoから、デジタル信号を周期的にON-OFFさせて無線で送信、
同じArduinoで受信してLEDを点滅させてみました。
目視だと問題なく点滅してる。
ただ、微妙にノイズが乗ってる感じがするかも。

次に、USB-シリアルポートを使ってシリアル信号を無線で送信、
Arduino側で受信うまくいかない、(削除)
何も送らなくても不規則な値のら列を受信し続けています。やっぱりノイズを適当に解釈して受信し続けているようです。
やはり、シリアルポートを直接使って送受信することはできないようです。
プログラムでノイズを判別して、誤り検出を含めてデータ送受信する必要がありそうで、ちょっと面倒ですね。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
昨日の続き。
素直に動かないのでオシロで信号を確認。
信号なしの場合、ミリ秒オーダーのノイズがひっきりなしに出てる。
これにシリアル信号乗せても判別できるはずがない。
おもいっきり速度を下げて300bpsで大文字の”U"、コードはバイナリで01010101を連続して送ってみると認識されたのがこちら↓

速度を倍の600bps以上に上げると、信号にこんな風に隙間が開く。(この間にノイズが入ったらダメになるかもしれない?)

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);
}
}
}