PICマイコンを使って測定ツールを作ってみよう(4) ―― ネットワークでセンサ・データを集めて省電力生活を目指す

中西 紫朗

tag: 組み込み 電子回路

エレキ系DIY 2011年6月10日

●VBでプログラムを作成

 前回,説明したオブジェクトは「ラベル・オブジェクト」でしたが,今回は「テキストボックス・オブジェクト」の使い方を説明します.

 オブジェクトには,メソッドという制御用のコマンド群が提供されています.また,プロパティという状態や設定を保持している変数もあります.両方とも,プログラムの中では,オブジェクト名に . (ピリオド)を付けると,自動的にプルダウン・メニューがでてきて,メソッドやプロパティを選択できます.例えばText1というオブジェクトでは,プロパティの一つにTextがあります(図2).これは表示されるテキストを設定するものです.例えば Text1.text="開始" と書くと,「開始」という文字がテキストボックスに貼り付けられます.プログラムを実行すると,「開始」と書かれたテキストボックスが現れます.

 

図2 テキストボックス・オブジェクトを作成する  ※ クリックすると拡大できます

 

 ラベル・オブジェクトでは表示内容はCaptionというプロパティに保存されます.テキストボックスではTextですが,ラベルではCaptionです.ここが,あまり統一されていない感じを受けます(最近のVB.NETでは統一されている).

 テキスト・オブジェクトでは,実行時もテキストを入力できます.ラベル・オブジェクトでは,実行時は変更できません.またテキスト・オブジェクトでは,入力が変更されるとそれによりイベントが発生します.つまり,いちいち前の値を覚えておき,それと比較しながら,変更があった場合はその対応としてなんらかの処理を行う,というプログラムが,ただ一つのイベントで実現できるのです.

 コード入力画面の一番上の右のコンボボックスに,そのイベントの一覧が入っています.プルダウン・リストを出すと,いろいろなイベントがでてきます.テキスト内容を変更したときはchangeというイベントになります.クリック・イベントやダブルクリック・イベントもあります.プルダウン・リストでイベントをクリックすると,その関数ヘッダが自動的に作成されます.そこに処理を書けば,プログラムが出来上がります.

 テキストボックスについては,プログラム実行時に入力できます.通常は1行だけですが,複数行入力したいこともあります.プロパティにマルチラインという項目があり,これをTrue(真)にすると複数行を入力できます.逆にプログラムから複数行を表示したいときは,SelTextメソッドを使います.これを使うと,表示が増えるたびに文字を連結しなくても表示を増やせます.

 今回作成したVBのフォームについて説明します.前回は,マスタから送ったメッセージを各スレーブの液晶ディスプレイに表示させるだけの処理でした.センサ・ネットワークとして使うときは,逆に各スレーブが取得したデータをマスタに集めます.これを行うには,ネットワークのコマンドを使います.コマンドとして,RESET,PING,READ,WRITEがあります.マスタからスレーブに対してコマンドが発行され,スレーブはそれに対して応答を返します.これとは別に,ホスト・パソコンとマスタの間のコマンドもあります.通常,ネットワークで使うコマンド体系とホスト・パソコンとの間で使うコマンド体系は役割が違うので,別々のものになります.しかし,今回は同種のコマンド体系をとります(図3).

 

図3 ホスト・コマンドとネットワーク・コマンド

 

 センサ・ネットワークが完成すると,ホスト・パソコンのコマンドについては,ネットワークで使われる一連の処理のコマンドを一つにまとめたものが必要になります.例えば,各スレーブから集められたデータをまとめて読み出すコマンドなどが必要です.ネットワークのコマンドを組み合わせて処理することも可能ですが,何回も実行する定形の処理は一つのコマンドにしておくほうが便利です.

 トランジスタ技術 2006年9月号の特集で取り上げられた「5自由度をもつ自走式ロボット」のネットワークと互換性を持たせるため,ネットワーク・コマンドは同じものを使っています.しかし,READ,WRITEにおけるアドレス・マップなどは,システムによって変わってきます.例えばPIC16F877を使ったシステムでは,GPIOアドレスは1バイトだけのアドレスでしたが,今回のシステムでは複数のアドレスを持つこともできます.うまくプログラムを組めば,こういうI/Oアドレスを動的に変更できます.

 スレーブが3台あると,300ms間隔でデータを収集するので,その間のデータを保持するI/Oバッファが必要になります.すなわち,カウンタ,UART,I2C,SPI,A-Dコンバータなど,機能ごとのバッファが必要です(図4).実際の送信では,300ms分のデータを一気にマスタに送ることになります.RS-485が115,200bpsの速度なら,100msの間に約1,100バイトのデータを送れます.もちろん,スレーブにおけるデータ取得間隔が長ければ,そんなに多くのバッファは必要ありません.

 

図4 各I/Oに対応するバッファ

 

●送受信における処理の流れ

 今回もマスタとスレーブそれぞれのプログラム・ソースを後ほど掲載しますが,その前に処理の内容を説明します.PICマイコンのUSB処理はポーリング方式で,定期的に状態を調べて処理を実行します.例えば,USBではデータ送受がなくても1msごとに交信が必要です.そしてホストへの応答を行わないとリンクが切れて,その後の通信ができなくなります.つまり,1ms以上の長い単独処理は実行できません.そのため,UART関連の送信では連続送信は行わず,1バイト送信が終わるたびに次のバイトの送信を準備します.送信するパケットはバッファに書き込んでおき,1バイトづつループの中で送信していきます.受信も割り込みで行いますが,受信バッファに書き込んでいきます.

 これを分かりやすく図示したのが図5です.USBの安否確認と,UARTの1バイト送信が交代で行われることになります.UARTの速度を上げるには,複数バイト送信を1ms以内に終了すればいいのですが,パケットから複数バイトへの分割をスムーズに行うのが面倒なので,速度を上げずに1バイト送信で行っています.

 

図5 USBの安否確認とUARTの送信

 

 つまり,送信では一度に複数のパケットは処理せず,順番に送信することになります.ホスト・パソコンからマスタにコマンドが送られても,それをスレーブに送信している間は,ホスト・パソコンからのコマンドは受け付けないことになります.スレーブからの受信も,順番にしか処理できないようにします.スレーブはマスタからコマンドを送らない限り,応答は戻してこないので,こういう処理ができるわけです.スレーブでなにか緊急にマスタに連絡したい状況になっても,300ms待たないと次の応答は返せません.こういう処理を"Serialization"といいます.これにより,速度の速いUSBの通信と速度の遅いUARTの通信を同時に処理しているわけです.

 また,割り込みで受信を行うと,ときどきパケットの先頭を見失うことがあります.これを防ぐため,スタート・フラグとして0xFFFFを使い,スタート・フラグとパケット長(LEN)によってパケットの長さの検証を行っています.スタート・フラグを受信した時点では,まだ全体の長さは分かりません.パケット長を受信して初めて,全体の長さが分かるわけです.パケット長で指定されたバイト数を受信すると,受信完了フラグ(uart_rcv_complete)をONします.メイン・ループでは,この受信完了フラグをループが回るたびにチェックしているので,受信が完了したときに受信データを受信バッファから取り込み,対応した処理を行います.

 マスタのソース・リストをリスト1に,スレーブのソース・リストをリスト2に示します(本連載の第3回に掲載したものと同じソース).

 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日