×

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

2016-07-05

Laz-princess_header

無線で結果をまとめて送信するプログラムは出来ました。今回は無線の細かい設定を考えていきます!

6

今回は、ORIZURUを飛行させるのに最適な無線プログラムにチャレンジしてみます。

無線シリーズで勉強したときは、他の無線機が電波を出力しているときにCCAエラーが発生するという事を学びました。また、相手方にデータが正しく届いたらACK(返事)が返ってくるという事も学びました。さて、今回のORIZURUの場合、この通信方法はあまり適切ではないそうです。

ORIZURUのようなラジコンはリアルタイムに制御したいからです。

1回1回の通信が成功/失敗したという事を正確に把握するより、見たままの状態をリアルタイムに制御する方が重要だからです。

そこで、ORIZURUを制御するために2つの工夫をしました。

1)CCAエラーの対策

この対策は、第14回で勉強しましたね。他の無線機が電波を使っていたら、それが終わったらすぐにORIZURUの制御信号を届けてあげる必要がります。そこで、送信完了時にCCAエラーが発生したら、送信ができるまで送り続けるプログラムにしました。

2)ACKの受信待ちをしないプログラム

無線シリーズで勉強した時は、1回送信したら受信機からACKの返事を待っていると言いうお話をしました。Lazuriteでは待ち時間が約0.5秒に設定されているのですが、この間何も出来なかったら飛行体の状態が変わってしまいます。最悪の場合は壁に激突!!なんてことになってしまった困るので、「ACKなし」のプログラムを考えていきます!

それがこちらです↓↓↓

setup() {
 SUBGHZ_PARAM param;

 SubGHz.init();
 SubGHz.getSendMode(&param);
 param.addrType = 4;
 SubGHz.setSendMode(&param);
}

ここでは、address_typeの4を使用しています。これは、送信機のアドレスを省略するというモードのため、受信機とACKのやり取りを行わなくなります。

SUBGHZ_PARAM param

『SUBGHZ_PARAM』という言葉が出てきました。これは、LazuriteIDE¥hardware¥lazurite_subghz¥sub_ghz¥subghz_api.hのこの部分に宣言があり、構造体の書式を宣言しています。『param』はメモリのようなイメージです。

↓↓↓

1

*uint8_t→unsigned charと同じ

構造体の書式とは??stamp6

typedef (タイプデフ)=書式、struct(ストラクト)=構造体、で構造体の書式です。ここでは無線の細かい設定の書式のみを宣言しています。addrTypeはuint8_tサイズ、senseTimeはuint8_t・・・・となっていてデータは何もありません。

この後、『param』というメモリにデータを書き込んでいきます。

SubGHz.getSendMode(&param)

宣言した書式に、下記のデータをとってきて初期設定の値を『param』書き込みます。

3

データはここから呼びだしてきます。→http://www.lapis-semi.com/lazurite-jp/contents/reference/subghz_getSendMode.html

param.addrType = 4

ここには、初期設定から変更したい項目を書き出します。変更できる項目は、addrTypeとxRetryのみですね。

今回は、ACKなしの設定にしたいのでaddrType を初期設定の6から4に変更します。

また、送信に失敗したとき、3回再送する場合は、param.txRetry = 3とします。

アドレスタイプの詳細です。↓↓↓ 0~7まで選択できます。4

データはここから呼びだしてきます。→http://www.lapis-semi.com/lazurite-jp/contents/IEEE802154/ieee802154e_format.html

SubGHz.setSendMode(&param)

初期設定から変更したものなど、全て正しいデータに書き直してセットします。これで、ACKなしの設定完了です!

実験してみよう!stamp10

addrType6とaddrType4(ACKなし)の違いを実験し、LEDの点滅する速度の違いを見たいと思います。

サンプルプログラムの『Welcome_SubGHz』を使用して実験します。最後の行の「return」を「delay(50)」に変えて、1/20秒に1回送信したらLEDが点滅するプログラムにしました。

  • addrType6

#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);
}

 

  • addrType4(ACKなし)

10・13~15行目に「addrType4」にするプログラムを入れています。


#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(&param);
param.addrType = 4;
SubGHz.setSendMode(&param);
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);
}

2つを動画を見比べてみると、addrType4(ACKなし)の点滅の方が早い事がよくわかります。ACKを待たないので、1/20秒に近い速度で点滅します。addrType6はACKを待ってから送信しているので、点滅速度が遅くなってしましますね・・・。

無線を使って何をしたいか、で設定を変えられる仕様になっているのですね。また1つ勉強になりました♪

次回も、コントローラーのプログラムの続きをお届けする予定ですstamp11