2011年11月18日

RFM12Bで双方向通信

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

とりあえず、RFM12B libraryのサンプルプログラムPingPongを参考にして双方向通信できました。
例のサンプルプログラムは "Hello" と送り受信成功で "OK" → "Hello" を送信というループ。
シリアルモニターで見ていても通信している感がなくて面白くないので少し弄りました。

nodeIDが1のArduinoにint num=0、IDが2のArduinoにint num=1をセット。
受信した数字を自分が持つ数値と足して送信するというもの。
0,1,1,2,3,5,8,13,21,34... という感じで通信を繰り返します。ただそれだけです。
#include <rf12.h>
#include <ports.h>

#define NODE_ID   1
#define GROUP   212
#define LED_PIN   6

#define LED_OUTPUT() pinMode(LED_PIN,OUTPUT) 
#define LED_ON()  digitalWrite(LED_PIN, HIGH) 
#define LED_OFF() digitalWrite(LED_PIN, LOW) 

MilliTimer sendTimer;
byte sendFlag;
int num = 0;
void setup () {
    Serial.begin(9600);
    rf12_initialize(NODE_ID, RF12_433MHZ, GROUP);
}

void loop () {
  
    if (rf12_recvDone() && rf12_crc == 0) {
        LED_ON();
        Serial.println(num);
        num += *(int*) rf12_data;
        delay(200);
        LED_OFF();
    }
    
    if (sendTimer.poll(3000))
        sendFlag = 1;

    if (needToSend && rf12_canSend()) {
        LED_ON();
        rf12_sendStart(0, &num, sizeof num);
        rf12_sendWait(2);
        delay(200);
        sendFlag = 0;
        LED_OFF(); 
    }
}
割りとシンプル。
送受信データはunsigned charの配列で扱っているので1要素の最大値は8bit(0〜255)。
1回のrf12_sendStartで送れるのはリファレンスでは65byteまで。
接続は前々回の通り。これを2つ用意する。


次回はノードが複数存在する場合のプログラミング。ここからネットワーク化していきます。
特定のノードに対してのデータ通信は受信側にてNODE_IDで条件分けするだけ。
受信側が正常にデータを受信できたら、送信側に受信完了の合図を送って通信終了。
来週は試験期間なので続きは再来週です。

0 件のコメント:

コメントを投稿

記事へのコメントはいつも確認している訳ではないので、お返事が遅れる場合があります。
ご質問やご意見は twitter@9SQ へお送り頂けると早くお返事できると思います。