らずらいと姫の挑戦日記(第14回)~コントローラーのプログラムを作るぞ!③~
2016-07-05

無線で結果をまとめて送信するプログラムは出来ました。今回は無線の細かい設定を考えていきます!
今回は、ORIZURUを飛行させるのに最適な無線プログラムにチャレンジしてみます。
無線シリーズで勉強したときは、他の無線機が電波を出力しているときにCCAエラーが発生するという事を学びました。また、相手方にデータが正しく届いたらACK(返事)が返ってくるという事も学びました。さて、今回のORIZURUの場合、この通信方法はあまり適切ではないそうです。
ORIZURUのようなラジコンはリアルタイムに制御したいからです。
1回1回の通信が成功/失敗したという事を正確に把握するより、見たままの状態をリアルタイムに制御する方が重要だからです。
そこで、ORIZURUを制御するために2つの工夫をしました。
1)CCAエラーの対策
この対策は、第14回で勉強しましたね。他の無線機が電波を使っていたら、それが終わったらすぐにORIZURUの制御信号を届けてあげる必要がります。そこで、送信完了時にCCAエラーが発生したら、送信ができるまで送り続けるプログラムにしました。
2)ACKの受信待ちをしないプログラム
無線シリーズで勉強した時は、1回送信したら受信機からACKの返事を待っていると言いうお話をしました。Lazuriteでは待ち時間が約0.5秒に設定されているのですが、この間何も出来なかったら飛行体の状態が変わってしまいます。最悪の場合は壁に激突!!なんてことになってしまった困るので、「ACKなし」のプログラムを考えていきます!
それがこちらです↓↓↓
[c]
setup() {
SUBGHZ_PARAM param;
SubGHz.init();
SubGHz.getSendMode(¶m);
param.addrType = 4;
SubGHz.setSendMode(¶m);
}
[/c]
ここでは、address_typeの4を使用しています。これは、送信機のアドレスを省略するというモードのため、受信機とACKのやり取りを行わなくなります。
SUBGHZ_PARAM param
『SUBGHZ_PARAM』という言葉が出てきました。これは、LazuriteIDE¥hardware¥lazurite_subghz¥sub_ghz¥subghz_api.hのこの部分に宣言があり、構造体の書式を宣言しています。『param』はメモリのようなイメージです。
↓↓↓
*uint8_t→unsigned charと同じ
構造体の書式とは??
typedef (タイプデフ)=書式、struct(ストラクト)=構造体、で構造体の書式です。ここでは無線の細かい設定の書式のみを宣言しています。addrTypeはuint8_tサイズ、senseTimeはuint8_t・・・・となっていてデータは何もありません。
この後、『param』というメモリにデータを書き込んでいきます。
SubGHz.getSendMode(¶m)
宣言した書式に、下記のデータをとってきて初期設定の値を『param』書き込みます。
データはここから呼びだしてきます。→https://www.appliot.co.jp/lazurite-jp/contents/reference/subghz_getSendMode.html
param.addrType = 4
ここには、初期設定から変更したい項目を書き出します。変更できる項目は、addrTypeとxRetryのみですね。
今回は、ACKなしの設定にしたいのでaddrType を初期設定の6から4に変更します。
また、送信に失敗したとき、3回再送する場合は、param.txRetry = 3とします。
データはここから呼びだしてきます。→https://www.appliot.co.jp/lazurite-jp/contents/IEEE802154/ieee802154e_format.html
SubGHz.setSendMode(¶m)
初期設定から変更したものなど、全て正しいデータに書き直してセットします。これで、ACKなしの設定完了です!
実験してみよう!
addrType6とaddrType4(ACKなし)の違いを実験し、LEDの点滅する速度の違いを見たいと思います。
サンプルプログラムの『Welcome_SubGHz』を使用して実験します。最後の行の「return」を「delay(50)」に変えて、1/20秒に1回送信したらLEDが点滅するプログラムにしました。
- addrType6
[c]
#define LED 26 // pin number of Blue LED
#define SUBGHZ_CH 33 // channel number (frequency)
#define SUBGHZ_PANID 0xabcd // panid
#define HOST_ADDRESS 0x6670 // distination address
unsigned char send_data[] = {"Welcome to Lazurite Sub-GHz\r\n"};
void setup(void)
{
SubGHz.init(); // initializing Sub-GHz
Serial.begin(115200);
pinMode(LED,OUTPUT); // setting of LED
digitalWrite(LED,HIGH); // setting of LED
}
void loop(void)
{
SUBGHZ_MSG msg;
// Initializing
SubGHz.begin(SUBGHZ_CH, SUBGHZ_PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW); // start Sub-GHz
// preparing data
digitalWrite(LED,LOW); // LED ON
msg=SubGHz.send(SUBGHZ_PANID, HOST_ADDRESS, &send_data, sizeof(send_data),NULL);// send data
digitalWrite(LED,HIGH); // LED off
SubGHz.msgOut(msg);
// close
SubGHz.close(); // Sub-GHz module sets into power down mode.
delay(50);
}
[/c]
- addrType4(ACKなし)
10・13~15行目に「addrType4」にするプログラムを入れています。
[c]
#define LED 26 // pin number of Blue LED
#define SUBGHZ_CH 33 // channel number (frequency)
#define SUBGHZ_PANID 0xabcd // panid
#define HOST_ADDRESS 0x6670 // distination address
unsigned char send_data[] = {"Welcome to Lazurite Sub-GHz\r\n"};
void setup(void)
{
SUBGHZ_PARAM param;
SubGHz.init();
// initializing Sub-GHz
SubGHz.getSendMode(¶m);
param.addrType = 4;
SubGHz.setSendMode(¶m);
Serial.begin(115200);
pinMode(LED,OUTPUT); // setting of LED
digitalWrite(LED,HIGH); // setting of LED
}
void loop(void)
{
SUBGHZ_MSG msg;
// Initializing
SubGHz.begin(SUBGHZ_CH, SUBGHZ_PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW); // start Sub-GHz
// preparing data
digitalWrite(LED,LOW); // LED ON
msg=SubGHz.send(SUBGHZ_PANID, HOST_ADDRESS, &send_data, sizeof(send_data),NULL);// send data
digitalWrite(LED,HIGH); // LED off
SubGHz.msgOut(msg);
// close
SubGHz.close(); // Sub-GHz module sets into power down mode.
delay(50);
}
[/c]
2つを動画を見比べてみると、addrType4(ACKなし)の点滅の方が早い事がよくわかります。ACKを待たないので、1/20秒に近い速度で点滅します。addrType6はACKを待ってから送信しているので、点滅速度が遅くなってしましますね・・・。
無線を使って何をしたいか、で設定を変えられる仕様になっているのですね。また1つ勉強になりました♪
次回も、コントローラーのプログラムの続きをお届けする予定です