×

らずらいと姫の挑戦日記(第50回)~ネオピクセルを無線で制御~

2018-12-20

こんにちは、らずらいと姫です。
今年も残るところ半月をきりましたね。あっという間で毎年びっくりです!

さて、今回もLEDライトを光らせていくのですが、
今回はLEDライトの動きの指示を無線で送ってみたいと思います!

 

タイトル ピンク

 

前回までは、LEDとLazurite Sub GHzを繋いで
光り方を変えてみました。

今回は2回に渡って作ってきたLEDの光り方を、
ゲートウェイから無線で光り方をコントロールしてみたいと思います!

 

サンプルプログラムを入れる

 

サンプルプログラムはこちらからダウンロードできるようにしました。
非常に長くなりましたので、主な部分だけ抜き出しました✿

 

setup()関数

setup()の中を見てみると、無線の初期化部分が追加になってます。

void setup(void)
{
  SUBGHZ_MSG msg;
  uint8_t myAddr[8];

  Serial.begin(115200);

  memset(led_ram, 0, sizeof(led_ram));
  led.init(8, LED_LENGTH);
  led.write(led_ram);

  msg = SubGHz.init();
  if (msg != SUBGHZ_OK)
  {
    SubGHz.msgOut(msg);
    while (1) { }
  }
  SubGHz.setBroadcastEnb(false);
}

 

loop()関数

loop()関数の中は大幅に変更しました!

前回までは、光り方を決めているのがloop()関数の中に書かれていましたが、
無線で切り替える部分がひとつの関数の中にいると長くなってしまうので、ledFunc1(),ledFunc2(),ledFunc3()に移動しました。

そして、loop()関数の中では無線で受け取ったメッセージに従って
ledFuncを切り替える部分だけにしました。

無線で1を受信したらledFunc1を、2を受信したらledFunc2, 3はledFunc3、
それ以外は無視をするようなプログラムになっています。

ポイントは、無線で受信をしたら無線を無効化してLEDを光らせているのがポイントだそうです。

無線とLEDのお仕事をまとめて行うようにするのは難しいそうです(>_<)

void loop(void)
{
  int cmd;
  SUBGHZ_MAC_PARAM mac;
  SUBGHZ_MSG msg;
  short rx_len;
  short index = 0;
  uint16_t data16;

  msg = SubGHz.begin(SUBGHZ_CH, SUBGHZ_PANID,  SUBGHZ_100KBPS, SUBGHZ_PWR_20MW);
  SubGHz.rxEnable(NULL);
  do {
    rx_len = SubGHz.readData(rx_data, sizeof(rx_data));
  } while (rx_len == 0);
  SubGHz.rxDisable();
  SubGHz.close();
  SubGHz.decMac(&amp;amp;mac,rx_data,rx_len);
  rx_data[rx_len] = 0;		// add null at end of message
  Serial.println(mac.payload);

  cmd = atoi(mac.payload);	// convert ascii to integer
  switch(cmd) {
  	case 1:
  	ledFunc1();
  	break;
  	case 2:
  	ledFunc2();
  	break;
  	case 3:
  	ledFunc3();
  	break;
  }
}

 

Node-REDによるプログラミング

 

さて、続いて無線を送信する側のプログラムです。

今回は、Raspberry Pi + Lazurite Pi Gatewayを使って、Node-REDから制御してみたいと思います。

今回は、無線で送信するためのフロー(プログラムのことです)を作成するところから始めていきます!

Node-REDのインストール方法やLazuriteの環境設定方法は、
こちらをご覧ください(^-^)

ボタンを押して何か指示をするときには、injectノードを使用します。
そしてデータを確認するのはdebugノードを使用します。
injectノードとdebugノードを組み合わせて、それぞれ「文字列」として1, 2, 3を出すようにしてみました。

injectに数字を入れる

 

そして1,2,3と順番にボタンを押してみると、デバック画面に1,2,3と表示されました。

デバックに表示される

 

とても簡単ですね(^-^)

この値を920MHzの無線で送信したいと思いますので、
injectノードとdebugノードの間にLazurite TXノードを置きました。

 

このままでは使えないので、Lazurite TXノードの設定をしていきます。

サンプルプログラムを見ると、
チャンネルとPANIDが記載されている箇所があります。

 

IDの場所

 

また、無線モジュールの個体識別番号はこのようになっているので、
最後の4桁をdst addrに入力しました。

 

IDの位置

 

それでは実際に動かしてみましょう!

 

 

無線で光らせることが
できました~~!

 

今回はカメラの関係で少しライトが遠めですが、
ばっちりキラキラしてますね!

 

次回は
クラウドサービスと繋いでみたいと思います(^-^)