Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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");      //書き込みを再度禁止
}