写真

IM920sからの電波を弱くするため、データの発生部分と無線機、電源(電池)を全て金属の缶に入れました。回路はユニバーサルボード上に作成し、発泡スチロールを使って絶縁と各部品の位置固定を行っています。
マイコンボードはSTマイクロ社のNUCLEO-F303K8を使っています。
回路図

ソフト仕様
・PCからのデータ(USB経由の仮想COMポート)は土管でIM920sに流す。
・IM920sからのデータも土管でPCに流す。(PA_9,PA_10)(TX,RX)
(上記二つの仕様はPCからMbed経由でIM920sの設定を行うために必用)
・MbedにはACT/PAUSEのスイッチを付け、ACT側にすると自動で(INTERVAL)秒間隔で送信データを流す。(PA_4 L:ACT)
・ACTは内部プルアップ抵抗を有効とする。
・ACT中はMbedオンボードのLEDを点灯する。(LED1)
・IM920sにデータを流す前にBUSY端子をモニターし、BUSYの場合は送信をスキップする。(PA_5 H:BUSY)
・流した送信データはIM920sだけでなく、PC側にも流す。(モニター機能)
・生成するデータは相手方指定のユニキャスト送信とする(TXDUコマンド)。データは送信ごとに00~99までカウントアップ
・ユニキャスト送信では最大で再送が10回入るので送信間隔は10秒~とする。経路を覚えている間は送信回数が10回だが、
・前回送信から時間が経つと経路が破棄され、再度経路調査が入るので送信回数が11回になる。(一回は経路探査)
・通信速度は19.2kbps(両方)
プログラム(参考)
実験用に作成したプログラムです。最低限の動作をさせるためのもので保証はありません。
#include "mbed.h"
#define INTERVAL 10 //送信間隔
/*
IM920s用データ発生器
本プログラムはIM920sを用いてネットワークの実験用に作るものである。(キャラクターバージョン->ECIOモードで使用)
*/
Serial pc(USBTX, USBRX); //PC側UART設定USBTX:送信, USBRX:受信
Serial im(PA_9,PA_10); //IM920s側UART設定 PA_9:送信 PA_10:受信
Ticker flipper; //送信間隔割込み
DigitalIn busy(PA_5);
DigitalIn act(PA_4);
DigitalOut led(LED1);
bool TX=0; //送信タイミングフラグ宣言・初期化
void flag_set() //タイマ割込み処理ルーチン
{
TX=1; //送信タイミングフラグセット
}
void im_rx() //IM920sからの受信割込み
{
char get_imdata; //temp data buffer
get_imdata=im.getc(); //受信バッファからtempに移動
pc.putc(get_imdata); //PCに転送
}
void pc_rx() //PCからの受信割込み
{
char get_pcdata; //temp data buffer
get_pcdata=pc.getc(); //受信バッファからtempに移動
im.putc(get_pcdata); //IM920sに転送
}
int main()
{
act.mode(PullUp); //ACTスイッチのラインにプルアップ抵抗を設定
pc.baud(19200); //PC側ボーレートを19.2kbpsに設定
im.baud(19200); //IM920s側ボーレートを19.2kbpsに設定
led=0; //LEDの初期値を非点灯に設定
int count=0; //送信番号カウンター変数宣言・初期化
pc.attach(&pc_rx, Serial::RxIrq); //PC側UART 受信割込みイネーブル
im.attach(&im_rx, Serial::RxIrq); //IM920s側UART 受信割込みイネーブル
flipper.attach(&flag_set,INTERVAL); //送信間隔タイマ割込みイネーブル(INTERVAL秒間隔)
while(1){
if(act==0){
led=1; //ACT状態ならLED点灯
}
else{
led=0; //違うならLED消灯
flipper.detach(); //送信間隔タイマ割込み解除
while(act==1){ //ACTスイッチが有効になるまでループ
}
TX=0; //念のため送信フラグクリア
flipper.attach(&flag_set,INTERVAL); //ACTスイッチが有効になったら再度送信間隔タイマ割込みイネーブル(INTERVAL秒間隔)
}
if(TX==1){ //送信タイミングなら...
TX=0; //送信フラグクリア
if(act==0){ //ACT状態なら送信するが...
if(busy==0){ //busy状態でなければ送信
if(count>99) count=0; //countが99より大きかったら0にリセット
pc.printf("TXDU0010,Tx No.= %02d\r\n",count); //PCにデータ送出(先にIM920sに送ると返り値の「OK」又は「NG」が先に送出されてきそうなのでPC側に先に送る
im.printf("TXDU0010,Tx No.= %02d\r\n",count); //IM920sにデータ送出
count++; //送信カウンタインクリメント
}
else pc.printf("Skip!\r\n"); //BUSYが立っていたらデータ送出はスキップ
}
}
}
}