PICマイコンを使って測定ツールを作ってみよう(3) ―― Visual BasicでPICマイコンを制御する
制御の中心部分は、ソース・リスト内のCOMM_USB関数です.3種の処理部から構成されています.図10に構成図を示します.
図10 USB_COMM関数の構成図
最初の処理部は,基板のタクト・スイッチの処理です.左のS1スイッチ(黄色)が「メニュー番号増加」,右のS3スイッチ(青色)が「メニュー番号減少」,真ん中のS2スイッチ(緑色)が「メニューの決定」となっています.黄色のスイッチと青色のスイッチを操作して目的のメニューが液晶ディスプレイの一番上にくるようにします.そして,選択の青色スイッチを押すと,そのメニューが選択されます.
次の処理部は,選択されたメニュー番号により,その処理を実行します.前回はカウンタしか機能しませんでした.今回は,RS-485,UART,VDC(電圧測定),ADC(電流測定)を追加しました.
最後の処理がUSBです.ホストとなるパソコン(HOST PC)からは,PICマイコンはシリアル・ポートとして見えています.筆者のパソコンではCOM9として登録されています.設定されているボーレートは38400bpsですが,115200bpsに変更しても動作します.実際のUSBの速度は12Mbpsなので,CDCにおける変化処理を考慮しても十分な能力があります.
トランジスタ技術 2006年9月号の特集記事ではPIC16F877が使われており,メモリも少ないので小規模なデータでしたが,今回のPIC基板が搭載するPIC16F2550ではメモリが約2.5Kバイトもあるので,かなりのデータをやりとりできます.コマンドとしては,PING,リセット,リード,ライトがあります.PINGはネットワークではおなじみのコマンドです.もともとのソース・リストはアセンブラで書かれていて,初心者には読みづらいものでしたが,今回はC言語で書きました.少しは読みやすくなったと思います.メモリは,LCD,SPI,I2C,USBのバッファが割り付けてあり,今後の記事で使い方の拡張方法を紹介していきます.
●VBでホスト制御を行う
パソコンからは,マスタと各スレーブに接続されているI/Oを自由に制御できます.今回の例題では,1個のマスタと3個のスレーブ,計4個のPICマイコンを制御します(図11,写真1).100ms周期で各スレーブをマスタが巡回するので,各スレーブの状態は300msごとに更新されます.最初の電源投入時には,どのようなスレーブが接続されているかは不明です.前述のトランジスタ技術 2006年9月号の特集ではこれは決定済みで,システム構築時にプログラムに書き込まれています.
図11 ネットワーク構成図
写真1 実際の構成
互換性をとる場合は同じようにしますが,参考として自動構築のフローも説明します.
まず一度,全ノードにPING要求を出します.一度に全ノードへ要求を送出する場合,特別なID「0xFE」を使います.各ノードが自分のIDを返すには,通常のパケット・フォーマットと違い,1バイト応答をIDに指定されているタイミング・スロットで返します.スレーブのIDが4,6,10なら,マスタからのPING要求のあと,4番目,6番目,10番目のタイム・スロットで自分のIDを返信します.マスタは,254個分のタイム・スロット(38400bpsの場合,約4800バイト/sなので約50ms)の間,返信を待ちます.この特別なプロトコルの実施以降は,今までと同じプロトコルで通信できます(図12).
図12 RS-485ネットワークの自動構成
もう少し普通のネットワークに近い形にするのであれば,スレーブが追加されたときにスレーブからマスタへ接続要求を出すことを許可する必要があります.マスタから通信を始めるという前提が崩れ,制御は複雑になります.
今回は事前決定方式にします.すべてのIDとスレーブ数はプログラムの中に含まれます.
VB6では,マスタとスレーブの状態を表示します.また,マスタから要求するコマンドを発行できます.リスト3にVBのコードを示します.なお,リスト1~リスト3のコードはこちらからダウンロードできます.