微弱無線モジュール
昨年度に買ったこれ↓ 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 |