らずらいと姫の挑戦日記(第13回)~コントローラーのプログラムを作るぞ!②~
2016-06-29

前回、スイッチの結果をまとめられたので、ジョイスティック、スライドボリュームの結果もまとめて無線で送信するプログラム作成にとりかかりたいと思います!
スイッチ6個の結果と、ジョイスティックの上下と左右、スライドボリュームの結果をまとめて、無線で送信したいと思います。無線シリーズで勉強したように、他の機器が電波を出していたらCCAエラーとなってしまいます。エラーになったら、送信できるまでずっと送り続けないと鶴は飛んでくれません。なので、まとめたデータの結果を1回必ず送信できるプログラムを考えてみました。
[c]
short data_packet[4];
SUBGHZ_MSG msg;
SubGHz.begin(SUBGHZ_CH, PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW);
digitalWrite(LED,LOW); // LED ON
while(1)
{
msg = SubGHz.send(PANID, HOST_ADDRESS, (unsigned char*)&data_packet, sizeof(data_packet),NULL); // send data
if(msg == SUBGHZ_TX_CCA_FAIL)
{
digitalWrite(ORANGE_LED,LOW);
}
else
{
digitalWrite(ORANGE_LED,HIGH);
break;
}
}
[/c]
short data_packet[4]
1行目
shortは16bitの型名で、date_packetはデータをいれる箱、メモリのようなものです。
ジョイステックの左右を[0]と前後[1]、スライドボリューム[2]、まとめたスイッチの結果を[3]とし、それぞれを収納するために4個用意します。short型なので、2byte×4個で8byteですね。
ジョイスティックとボリュームスライダーのプログラムはこんな感じです。↓↓↓
ジョイスティックは-512~511までで、0が中心になるように変更しました。
- data_packet[0]=analogRead(A0) – 512;
- data_packet[1]=analogRead(A1) – 512;
- data_packet[2]=analogRead(A2);
SUBGHZ_MSG msg;
2行目
『SUBGHZ_MSG』という名前が出てきました。
これは、LazuriteIDE¥hardware¥lazurite_subghz¥sub_ghz¥subghz_api.hのこの部分に宣言があり、enum(列挙型)というものを使用しています。
↓↓↓
enum(イーナム)=列挙型??
コンピューターは数字で処理を進めていくのですが、列挙型は数字に名前を付けて見やすくする宣言だそうです。
一番最初のデータを0としたら、下のデータに向かって1ずつ足されていきます。SUBGHZ_OKは0と記載しているので、その下のSUBGHZ_RESET_FAILは1、SUBGHZ_SETUP_FAILは2…..という事になります。
ここでは、SubGHz.send関数の戻り値に列挙型をつかっています。SubGHz.sendという関数を実行すると、SUBGHZ_MSGの中から結果を返すように設計されているからです。実際のコンピューターの中は数字で処理をしているので、数字で書いても問題なく動作するのですが、両方見比べてみるとどうでしょうか….
数値で記述:
if(msg == 9)
列挙型で記述:
if(msg == SUBGHZ_TX_CCA_FAIL)
確かに、「9」と「SUBGHZ_TX_CCA_FAIL」を見比べると、列挙型の文字を見る方が、何をしているのか解りますよね!!
SUBGHZ_MSGの内容はこちらです。
↓↓↓↓↓↓↓↓
https://www.appliot.co.jp/lazurite-jp/contents/reference/subghz_msg.html
SubGHz.begin(SUBGHZ_CH, PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW)
3行目
無線を使用する時に使います。無線通信の初期設定を行っています。無線シリーズで学んだ、CH、PANID、ビットレート、送信パワーの設定します。設定の詳細はこちらにあります。↓↓↓
https://www.appliot.co.jp/lazurite-jp/contents/reference/subghz_begin.html
while( A ) { B } break
5行目
(A)の条件の間、{B}の処理を繰り返すものが『while』です。『break』で『While』の繰り返しを終了します。以前に勉強した『for』と似ていますね。
(A)の条件は、(a>10)のような書き方をするのですが、その条件を満たすときはBを繰り返す、という意味です。
SubGHz.send(PANID, HOST_ADDRESS, (unsigned char*)&data_packet, sizeof(data_packet),NULL
7行目
無線を使用する時に使います。データを送信するためのものです。詳細はこちら。↓↓↓
https://www.appliot.co.jp/lazurite-jp/contents/reference/subghz_send.html
whileの中はこんな感じ
データを送信して、CCAエラーであればledを点灯させ、また送信し、エラーではなくなるまで送信し続け、確実に1回送信できるようにしています。送信できたら、終了(break)します。
次回は、7月5日(火)に無線の部分の続きをお届けする予定です☆