【ウェザーボードのシステムの概要】
ウェザーボードというPICマイコンにWi-Fiモジュールを接続したボードを製作し、
無線LANでパソコンと接続して温湿度や気圧などの情報をUDP通信により
送受信するシステムを製作します。
製作するシステムの構成は下図のようにするものとします。
ウェザーボードにWi-Fiモジュールを実装し、PICマイコンで制御してUDP通信で
動作させます。
パソコン側はアクセスポイントとLANケーブルの有線かWi-Fiで接続します。
パソコンのアプリケーションプログラムはVisual Basic 2010で製作します。
このとき、「UDPクライアントクラス」を使ってUDP通信で製作します。
システムの機能は次のようにするものとします。
@ウェザーボードは常時計測を繰り返していて、パソコン側からの接続要求を待つ
Aパソコンのアプリから接続要求することで、無線LAN経由でウェザーボードと接続し、
UDP通信により次の機能を実行する
・デジタル状態の表示 ―― 4点のデジタル入出力点のオンオフ状態を表示
・デジタルのオンオフ制御を行う ―― 2点のデジタル出力のオンオフ制御を行う
・計測値の表示 ―― 温度、湿度、気圧、照度、汎用計測4点の計測値を表示する
B計測表示は3秒周期で繰り返し表示を更新する
Cパソコンのアプリケーションからの終了要求で通信を終了する
完成したウェザーボードの外観は下図のようになります。
製作するウェザーボードのハードウェアの構成は下図とするものとします。
全体制御はPICマイコンで行いますが、使用するPICマイコンはUARTとA/Dコンバータが
内蔵されている28ピンであればどれでも使えます。
手持ちの関係でPIC24FJ64GB002という16ビットのPICマイコンを使いました。
ピン割付機能があってピン配置がやり易くなります。
これにセンサとして次のものを接続します。
@ 温湿度センサ :Sensirion社のSHT11
A 気圧センサ :VTI Technology社のSC1000という素子を基板に実装したもの
B 照度センサ :浜松ホトニクス社のS9648-100
Wi-Fiモジュールには、マイクロチップ社のRN134という基板実装された開発キットを使います。
Wi-Fiモジュール本体は表面実装でちょっと手付けでは実装困難ですので、この基板実装済み
モジュールの方が扱いやすくなります。
電源は、5VのACアダプタを使い、3端子レギュレータで3.3Vを生成して全体に供給します。
Wi-Fiモジュールに最大150mA程度が必要ですから、250mA供給可能なレギュレータを使いました。
温湿度センサはI2Cインターフェース、気圧センサはSPIインターフェースとなっていますが、
いずれも手順が特殊な部分があるため、結局プログラムI/Oとして擬似的なI2CとSPI通信を
実装しています。
このウェザーボードの仕様は下表のようにするものとします。
項目 機能・仕様 備考 電源 ACアダプタよりDC5V供給
3端子レギュレータで3.3Vを生成消費電流 最大約150mA Wi-Fiモジュール RN134 WiFiモジュール開発キット
IEEE 802.11b/g対応
TCP/IPスタック内蔵
外部接続はUARTインターフェースマイクロチップ社製 温度測定 -40℃〜124℃ 精度±2℃
0℃〜75℃ 精度±1℃
測定分解能0.01℃(14ビット)
(ただし表示は0.1℃ステップとする)
応答速度:5秒〜30秒
変換時間:320msec(14bit)SENSIRION社製
SHT11湿度測定 0%〜100%RH 精度±5%
20%〜 80%RH 精度±3%
測定分解能 0.05%(12ビット)
(ただし表示は0.1%ステップとする)
応答速度:8秒
変換時間:80msec(12bit)気圧測定 300hPa〜1200hPa 精度±2hPa
600hPa〜1200hPa 精度±0.5hPa
測定分解能 0.015hPa(19ビット)
(ただし表示は0.1hPaステップとする)
変換時間:556msecVTI Technology社製
SCP1000-D01
(単位hPa=ヘクトパスカル)照度測定 1lx〜1000lx
製作例では相対的な明るさを示すのみ浜松ホトニクス社製
S9648-100
(単位 lx=ルクス)デジタル出力 2点のオンオフ出力
3.3V CMOS出力 Max20mA駆動LEDモニタ内蔵 デジタル入力 2点のオンオフ入力と2点のデジタル出力の状態
3.3V CMOS入力LEDモニタ内蔵
【UDP通信の概要】
無線LANを使ったUDP通信手順を簡単に表すと、下図のようになります。
左端がパソコン側のアプリケーションで、有線LANでアクセスポイントと接続されます。
アクセスポイントとWi-Fiモジュール間が無線、Wi-FiモジュールとPICマイコンの間は
UART接続ということになります。
UDPプロトコルでは、相手を特定していきなりデータ転送を開始することができます。
例えばパソコンのアプリケーションで計測要求ボタンを押した場合を考えてみます。
まず計測要求を送信しようとしますが、始めて接続する相手のときは、IPアドレスだけ
しかわかっておらず、物理的に相手を特定するMACアドレスがわからないので、
ARP(Address Resolution Protocol)プロトコルを使ってアドレスを解決する手順が
自動的に実行されます。
このARP手順は簡単で、送信元からIPアドレスだけ指定してARPコマンドとして
ブロードキャストでネットワーク全体に問い合わせをします。
受信した全ホストの中で、このIPアドレスと一致したホストだけが、ARP応答として
自分のMACアドレスを追加して送信元に返信します。
これで送信元はMACアドレスを知ることができますから、今度はMACアドレスで
相手を特定して送受信をすることができるようになります。
いったんMACアドレスが判ればIPアドレスとMACアドレスの対応表を作成して保存
しますので、2回目以降は直接MACアドレスを指定して送信できます。
このARP手順はWiFiモジュール内で自動的に行われますのでPICマイコン側は
何もする必要がありません。
UDP送信では、相手のポート番号を直接指定して送信しますので、受信側は、
指定されたポート番号を持つアプリケーションが受信し、要求された処理を実行します。
例えば計測の場合、計測要求を受信したPICマイコン側は、計測データを取得して
編集したあと返信データとしてやはり返信先のポート番号を指定して送信します。
図の例の場合はパソコン側で、ポート番号でアプリケーションが区別され、要求を
出したアプリケーションに返信データとして受信されることになります。
こうしてパソコン側で受信したデータを編集して表示することになります。
ポート番号は、代表的なアプリケーションについてはあらかじめポート番号が決めら
れており、下図のようになっています。
このように0から1023のポート番号を「Well-Known Ports」とよび特定のアプリケーション
ごとに専用に決められています。
通常1024以降は自由に使えることになっていますので、今回の製作例では、
図のようにポート番号を2000、3000、4000に設定しています。
このようにUDP通信はIPアドレスとポート番号だけで相手を指定していきなり送受信を実行し、
毎回送信ごとに手順は終了します。手順としては簡単であるため使い方はやさしいものとなります。
ただし、万一相手に届かなかった場合もその結果を知ることはできません。
このため、アプリケーションのレベルで送受信エラーの処理を組み込む必要があります。
ウェザーボードの通信で使用するデータのフォーマットは、できるだけ簡単な通信とすることにして、
下表のフォーマットで送受信することにします。
計測データ以外はASCII文字コードを使います。
機能 パソコン → PICマイコン パソコン ← PICマイコン デジタル出力 ボタンクリック時に送信する
「SCncE」 (ASCII文字)
n:アドレス 1か2 (ASCII文字)
c:制御 On=1 Off=0(ASCII文字)
《例》
SC11E :出力1をオンとする制御実行後応答
「MCnc」 (ASCII文字)
n:送信データと同じ値
c:状態 On=1 Off=0 (ASCII文字)
《例》
MC11 :出力1がオンデジタル状態 「SBE」 (ASCII文字) 出力ピンと入力ピン一括で送信する
「MBabcd」
a:DO1の状態 b:DI1の状態
c:DI2の状態 d:DO2の状態
On=1 Off=0 (ASCII文字)計測応答 「SAE」 (ASCII文字)
いったん計測要求すると停止されるまで3秒間隔で繰り返し送信する全計測データを一括返信する
「MAtthhbbllaabbccdd」
tt:温度 hh:湿度 bb:気圧 ll:照度
aa:CH0 bb:CH1 cc:CH2 dd:CH3
値は16ビットバイナリで上位、下位の順切り離し アプリ終了時に送信
「SNE」応答なし
【温湿度センサの使い方】
このウェザーボードに使った温湿度センサには、ちょっと高価ですが温度と湿度両方を
デジタル情報として出力する高精度なものを使いました。
Sensirion社製のSHT11という製品で、外観と仕様は下図のようになっています。
非常に小型で反応も高速となっています。温度は14ビット、湿度は12ビットという
高分解能なデジタル出力で、本体内部で較正された値で出力されますので高精度な
測定ができます。
このセンサの外部インターフェースのデータ転送シーケンスはI2Cと似ていますが、
ちょっと特殊な部分もあります。それは転送の開始をマスタとなるPICマイコン側から
Transmission Startという特別なシーケンスを送信出力することで行うようになっていることです。
この詳細はデータシートを参照してください。
計測開始コマンドを送ってから、実際のデータが生成されるまで320msec(14ビットの場合)
という時間がかかりますので、使い方に注意が必要です。
これで得られる温度と湿度のデータは、次のような条件で補正して実際の値とする必要が
あります。電源電圧は3.3Vの条件とします。
温度で14ビットのデータの場合
温度 = 0.01×データ−39.7
湿度で12ビットデータの場合
仮湿度 = 0.0367×データ−2.0468+0.0000016×(データ)2
湿度 = (温度−25)×(0.01+0.00008×データ)+仮湿度
【気圧センサの使い方】
今回使用した気圧センサはセンサ本体を変換基板に実装した形となっています。
センサ本体は円盤状の表面実装部品となっていて、そのままでは扱いにくいので
この実装されたものの方が使いやすい製品です。
裏面のピンは8ピンのDIP ICと同じになっています。この気圧センサの外観とピン配置は
下図のようになっています。この外観はセンサを変換基板に実装済みのモジュールのものです。
気圧センサの仕様は下表のようになっています。表からわかるように、このセンサは
気圧と温度が測定できるようになっています。気圧は300〜1200ヘクトパスカル、
温度は-20〜70℃が測定できるようになっています。今回は気圧のみ使っています。
この気圧センサの外部インターフェースはSPIというシリアル通信となっていますが、
こちらもPIC内蔵のSPIモジュールは使えず、プログラムI/Oで擬似的なSPI通信としています。
通信は2バイトまたは3バイトで行われます。
計測開始コマンドから実際の計測データが生成されるまで約1/1.8秒(=560msec)
かかりますから使い方に注意が必要です。詳細はデータシートを参照してください。
【回路設計と製作】
これらのセンサを接続したウェザーボードの回路図は、ハードウェア全体構成を元にして
下図のようにしました。PICマイコンには28ピンのPIC24FJ64GB002を使っています。
これに各センサを接続します。温湿度センサは簡単ですが、Dataラインのプルアップ抵抗を
忘れないようにする必要があります。
気圧センサはSPIインターフェースなのですが、データラインのSOにはプルアップ抵抗が
必要ですのでこちらも注意が必要です。
デジタル入出力は、PICマイコンのピンを直接端子に取り出しています。
ここに発光ダイオードを接続してオンオフ状態がモニタできるようにします。
組み立てが完了した基板の部品面とはんだ面が下記となります。
【ファームウェアの製作】
ファームウェアの全体構成をフロー図で示すと、下図のようになります。
大きくメインルーチンと、UART1の受信割り込み処理とタイマ1の割り込み処理の
3つで構成しています。
メインルーチンは、リセットでスタートし各モジュールの初期設定をしたあと、SW2が押されて
いればWi-Fiモジュールの初期設定を行います。
これで、Wi-FiモジュールがUDP通信で動作するようにします。この設定は一度実行すれば
記憶されますので、SW2がオフである通常の場合は実行しないで直ぐ先の処理の進める
ようにしています。
メインループに入ったら、UARTの受信データがあるかどうかをチェックし、あれば受信データの
処理を実行します。この処理では、循環バッファから受信したコマンドを取り出し、コマンド種別
ごとに応答データを作成して送信を実行します。
その際、温湿度と気圧と照度については、タイマ1の割り込みにより一定周期で計測され
バッファに格納されているデータを使います。
送信データはUARTでPICマイコンからWi-Fiモジュールに送信しますが、無線LANによる
送信開始は、Wi-Fiモジュールでデフォルトとなっているタイマ制御で行われます。
つまり10msec以内に次の送信データがUARTで送られてこなければ自動的にその時点までに
送られてきたデータを送信します。
0.35秒周期のタイマ1割り込みでは、温湿度と気圧センサの計測には時間がかかるため、
ステート関数形式として順番に計測を実行しバッファに格納します。
汎用計測についてはA/Dコンバータによる計測ですので短時間で計測できますから、
送信データ編集時に計測を実行しています。
UART1の受信割り込みは、WiFiモジュールからの受信データですので、1回の受信データを
まとめて循環バッファに格納してバッファポインタを更新しています。
循環バッファは16バイトごとのバッファを10個まとめた2次元配列として用意しています。
実際に受信されるコマンドは5バイト以下で、一度にひとつのコマンドしか送信されて来ません
ので16バイトのバッファで十分です。
WiFiモジュールの設定は、ここでの製作は次の条件とします。
・アクセスポイントのSSIDは 000A79E7Fxxx で ネットワークキーは ******** とする
(実際に使用するアクセスポイントに付与されている値を設定する)
・プロトコルはUDP
・相手ホストのIPアドレスは 192.168.1.27 でポート番号は 3000、自分のポート番号は 2000 とする
(IPアドレスは実際に使用するパソコンのIPアドレスを設定する)
・ブロードキャストは送信しない
・ネットワーク接続時、オープン時にはメッセージを送信しない
(この設定は相手に対し余計なデータを送信しないようにするためです)
・送信開始はバッファへのデータ格納が一定時間以上途切れたら自動的に開始するものとする
(これがデフォルトの設定で、時間は10msecとなっている)
以上の条件を設定するための手順は下記リストのようにします。
これをPICマイコンのUARTで送信します。\r\nは復帰改行の文字です。
それぞれのコマンド送信ごとに、WiFiモジュールからの応答メッセージが出力されますので、
その受信を待つためコマンドの送信を1秒間隔で行っています。
この間にWi-Fiモジュールから出力されるメッセージデータは無条件で破棄しています。
最後のreboot後に長いメッセージが出力されてきますので、最後だけ2秒の待ち時間を
追加しています。
【ファームウェアダウンロード】
ウェザーボードのPICマイコンのファームウェアは下記からダウンロードできます。
MPLAB X IDEのプロジェクトファイル1式です、
★★★ ウェザーボードのファームウェア ダウンロード ★★★