伝説のSpice特別企画 いまさらIOT
Serial bypassモードプログラムをprogrammable-xbeeにプログラムする
CodeWarriorを使ってprogrammable xbeeをトランスペアレントにする
お伝えしてきたとおりprogrammable-xbeeは通信インターセプトCPUを搭載しています。 そのためにそのままでは従来のxbeeと同じようにパワーオンで期待したモードで動作しません。
ここでは単純にパワーオンでトランスペアレントになるように期待してましたが、デフォルトではそれは期待できません。 改行キーを送信して、bootLoaderのメニューからbypssモードを選択することが必要です。
以下の処理は raspberryに接続するxbeeも同様にprogrammable-xbeeの場合、パワーオントランスペアレントにするプログラムの作り方です。 従来のxbeeを使用される場合は設定フラッシュにトランスペアレントの設定をするだけでOKです。 良くわからず、2台ともprogrammable-xbeeを買ってしまった人(私みたいに)トランスペアレントにするためにはそのようなプログラムを書く必要があります。
別の手段としては起動後[0x0d][B]を送信してローダーメニューを操作することです。 しかしこれは途中でリセットボタンを押したとき同期しなくなります。 たしかに私の実験では何かあると無線ユニットのリセットボタンを無造作に押してしまいます。
パワーオンバイパスモードを期待していたのに....
CodeWarriorのxbee環境をセットするとサンプルコードが沢山付いています。 CodeWarriorをインストールする前のページで環境が出来ているとします。 その状態でサンプル Serial Bypass があります。 名称から見てバイパスモードになると喜んで、早速コンパイルして見ました。
プログラムのダウンロード
プログラムのダウンロードは古いタイプのX-CTUが必要です。この中のX-modemプロトコルがファイルをxbeeにダウンロード(書き込み)するとときに必要です。
xbeeをリセットして改行コードを送るとローダーメニューを出してきます。 そのローダメニューに[F]のコマンドがあります(F-Update App)。 事前にX-CTUでX-modemの画面を出しておいてコンパイルしたファイルを選択しておきます。 選択するファイルはReleaseフォルダのserial_bypass.abs.binです。 拡張子は.binです。 準備が出来たら[F]キーを押します。 ローダーがコード待ちの(C)のキャラクタを連即して送信してきますのでその間にX-modemのダイアログの「send」ボタンを押します。 画面にバイナリを直接プリントしたような意味不明のキャラクタを出しならダウンロードが進みます。 終わると少し待って自動的にプログラムが起動します。 以降はリセット後ダウンロードしたプログラムが自動起動するようになります。
パワーオンバイパスモードを期待していたのに....
しかし、確かにBypassにはなっていますが、トランスペアレントにはなっていません。 xbeeのフラッシュを設定してもアプリがそれを書き戻しているようです。
しかたないので、トランスペアレントにするATコマンドAP0を自動発行するプログラムをコードに追加します。
hwinit.c のファイルの最後尾に
/* My Add */
uint32_t radio_switch_to_Transparent_mode(void)
{
int ret = 0;
//すでに無線から何か応答があるんです。
//それを待ってから出ないと設定できないので2秒まち
delay_ticks(2*HZ); /* guard time */
/* Switch to command mode, assuming we are in transparent mode */
/* A modem status may arrive in between !! */
xbee_ser_rx_flush(&EMBER_SERIAL_PORT);
xbee_ser_write(&EMBER_SERIAL_PORT, "+++", 3);
ret = xbee_check_answer("OK\r", 3, 3 * HZ);
if (ret == 1) {
/* A modem status may arrive in between !! */
xbee_ser_rx_flush(&EMBER_SERIAL_PORT);
xbee_ser_write(&EMBER_SERIAL_PORT, "ATAP0\r", 6); //AT mode
ret = xbee_check_answer("OK\r", 3, HZ);
//printf("radio_switch_to_at_mode 2 \n");
if (ret == 1) {
xbee_ser_write(&EMBER_SERIAL_PORT, "ATCN\r", 5);
/* Change baudrate and wait for the modem status ? */
delay_ticks(HZ / 4);
// printf("radio_switch_to_at_mode 3 \n");
return rates[RADIO_RATE_IDX];
}
}
return 0;
}
/* end My Add */
main.cのファイルの先頭の部分に
void DoPassThroughMode(void);
uint32_t radio_switch_to_Transparent_mode(void); //add
void main(void){
sys_hw_init();
sys_xbee_init();
sys_app_banner();
// add
if(radio_switch_to_Transparent_mode() != 0)
printf("Entering AT Transparent mode\n"); //to AT mode
else printf("Entering NO! Transparent mode\n");
// end add
ブートローダーを再起動する
再コンパイルして新しいバイナリを書き込みたいのですが。 その方法が...
パワーオンのときブートローダーはユーザプログラムが書き込まれていないと、改行コードを待っています。 そしてその後メニューを出して動作を決定できます。 プログラムの書き込みもその中にあります。 しかし、一旦ユーザプログラムが書き込まれると、パワーオンでユーザプログラムを実行してブートメニューを出しません。 プログラムを改定するにはどうすればいいのでしょうか?
X-CTUで画面の上の方にあるRTS.BRKのチェックボックスを使います。 通常はRTS=チェック BRK=Nonチェックになっています。
この状態を逆転します。
RTS=Nonチェック BRK=チェック
その状態でxbeeのリセットを押します。
書き込んでいるユーザプログラムは起動画面を出さないので起動されていません。
チェックを元の状態に戻して
RTS=チェック BRK=Nonチェック
改行キーを入力します。
ブートローダーがメニューを出してきます。
このようにしてローダーモードに入れば、再プログラムは前と同じ手順です。