写真

回路を缶に収めた状態

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

回路図

IM920s実験用送信機回路図
実験用送信機回路図

ソフト仕様

・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が立っていたらデータ送出はスキップ
            }
        }
    }
}