Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

315MHz帯通信モジュールIM315をArduinoで試す その2:送受信スクリプト編

shuzo-kino.hateblo.jp
の続きです。
今回は送受信用のスクリプトを書いてみます。

実際のところ

送信側

#include <SoftwareSerial.h>

SoftwareSerial IM315Serial(8, 9); // ソフトウエアシリアル
int busy;
unsigned char cnt = 0;
String inputstr = "";
char sendPacket[24] = "";


void setup() {
 IM315Serial.begin(19200); // ソフトウエアシリアル 初期化
 Serial.begin(19200);
 pinMode(10, INPUT);// Busy 信号 Pin10 入力
  while (!IM315Serial & !Serial ) { ; }
 delay(1000);
 Serial.print("ID:");

 IM315Serial.println("RDID");
  while (IM315Serial.available()) {
    readPacket();
  };
 delay(1000);

}

void loop() {
  do {
    busy = digitalRead(10); // Busy 信号 読み取り
  } while (busy != 0); // Busy なら Loop
  
 IM315Serial.print("TXDT "); // 送信コマンド
 cnt = (0x00ff & (cnt + 1));  //カウンター。0xffで0x00に戻る
 sprintf(sendPacket, "%02x%s", cnt, "0203");
 IM315Serial.println(sendPacket); // アナログ値を HEX フォーマットで送信
 // Serial.println(sendPacket); //デバッグ用

 // 受信成功時にでる"OK"を拾いたい場合、以下を有効に
 //while (IM315Serial.available()) { 
 // Serial.write(IM315Serial.read());
 //}
 
 delay(5000);
}

void readPacket() {
  inputstr += (char)IM315Serial.read();;
}

受信側

先程わかった固有IDを設定します。
今回は"9E46"だったので、これを直接。
公式によると以下の仕様とのことなので、あまり書き込みしすぎない方がいいでしょう。
私は力技のコメントアウトで対処してますが……場合によっては、初期設定用の別ルーチンを用意したほうがいいかも。

電源投入直後は、不揮発メモリへの書込みは禁止状態です。
不揮発メモリへの書込み回数は最大1万回ですので、頻繁にパラメータ変更をする場合は書込み禁止状
態にしてください。
通信対象となる送信モジュールの固有 ID は、最大 64 個まで登録することができます。

#include <SoftwareSerial.h>

SoftwareSerial IM315Serial(8, 9); // ソフトウエアシリアル
int busy = 0;
String inputstr = "";

void setup() {
 Serial.begin(19200);
 IM315Serial.begin(19200); // ソフトウエアシリアル 初期化
 pinMode(10, INPUT);       // Busy 信号 Pin10 入力

 while (!IM315Serial & !Serial ) { ; }
 delay(500);

 //デバイス登録機能。不揮発領域に書き込むので、あまり使わない
 //device_reg_process();
}

void loop() {
 do {
    busy = digitalRead(10); // Busy 信号 読み取り
 } while (busy != 0); // Busy なら Loop
 
  while (IM315Serial.available()) {
    readPacket();
  };

  if (inputstr[-1] = '\n' && inputstr != "") {
    //sample:AB,0001,7C:13,57,9B,DF,02,46,8A,CE
    Serial.println(inputstr);
    inputstr = "";
  }
  
  delay(100);
 }

void readPacket() {
  inputstr += (char)IM315Serial.read();;
}

void sendPacket(String packet) {
  Serial.println("Send" + packet);
  IM315Serial.println(packet);
  delay(3000);
  while (IM315Serial.available() > 0) {
    readPacket();
  };
  delay(3000);
}

void device_reg_process(){
  sendPacket("ENWR");      //不揮発領域に書き込みを可能に
  sendPacket("SRID 9E46"); //受信対象の固有ID(この例では9E46)を設定
  sendPacket("DSWR");      //書き込みを再度禁止
}