微弱無線モジュール
昨年度に買ったこれ↓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); } } }
ESP32 Wifi Bluetooth開発ボード |
Arduino Nano Every |
Raspberry Pi pico |
FPGA XILINX Artix-7 |