Raspberry Pi 3 model Bが入手できました (8) センサをつないで温度を測る
■温度センサLM35DZはアナログ出力
Raspberry Pi 3 model Bに、MPC3208のSPIインターフェース経由のA-Dコンバータを接続しました。前回までは、サンプル・プログラムTempSensorで、電源電圧をボリュームで分圧した電圧をA-Dコンバータで受けて読み取った値をモニタに表示しました。
●半導体センサLM35DZをA-Dコンバータに接続する
次に示すセンサLM35DZを、MPC3208のチャネル1に接続し、温度を測定します。サンプル・プログラムTempSensorに、A-Dコンバータからの入力データから温度を求める計算を追加します。
LM35DZは、次に示すように3本足の半導体で、
- V+の端子を3.3V
- GND端子は電源のGND
- VoutをA-Dコンバータの入力
に接続します。
●LM35DZの出力はアナログ
LM35DZの出力は、100℃のとき1000mVの出力電圧となり、10℃で100mVの出力電圧が得られます。1℃変化すると10mV出力電圧が変化します。プラス電源だけで測定すると2℃から150℃の範囲の温度を測定できます。マイナス電源があると-50℃から150℃までが測定範囲です。
ここでは プラス電源だけですのでマイナスの温度測定はあきらめます。このLM35DZの出力電圧から温度を求める式は、次のようになります。
t = v(100℃/V) |
または、
t = V (℃/10mV) (tは℃単位の温度、VはmV単位の出力電圧) |
A-Dコンバータの出力は、整数変数resultにセットされます。この値から出力電圧は、
出力電圧 =(result / 4094.0)×3.3V |
この出力電圧を100倍することで10mV単位の値になり、そのまま℃の単位の値になります。
●プログラムの修正
測定結果の変数は整数型ですので、実数の処理ができるdouble型の変数fresultを定義します。この変数に計算結果をセットして出力とします。
double型の変数fresultとfrsを次のように定義します。プログラムのMainPage.xaml.csの後のほうの変数などの定義部に、次の2行を追加します。
private double fresult; private double frs; |
SPIインターフェースからのデータをリード・バッファに読み取り、バッファから受信したデータを取り出し、12ビットのA-D変換した整数値をテキストに変換し、モニタに表示します。
public void DisplayTextBoxContents() { SpiDisplay.TransferFullDuplex(writeBuffer, readBuffer); res = convertToInt(readBuffer); textPlaceHolder.Text = res.ToString(); } |
この関数の最初1行で、readBufferに測定データを読み込みます。
次のconvertToInt(readBuffer);関数で、バッファのデータを整数に変換しresにセットします。resはToStringメソッドで文字列のテキストに変換し、textPlaceHolder.Textのモニタの表示領域にセットします。
●convertToInt関数
convertToInt関数はデバイスに応じた処理が用意されていて、mcp3208では、次の処理で12ビットのA-D変換値が得られます。
case ADCChip.mcp3208: { /* mcp3208 is 12 bits output */ result = data[1] & 0x0F; result <<= 8; result += data[2]; } break; } |
この整数値から電圧値を求めます。
fresult = (result / 4094.0) * 3.3 * 100; } break; } return fresult; |
関数値として温度の値を戻すために、returnの次に fresult;を書き加えます。
また、convertToInt関数も整数からdouble型に変更します。そのため関数の定義部を次のように変更します。
public double convertToInt(byte[] data) |
表示データをdouble型のfrsに変更し、表示形式を少数以下2桁表示にするため文字列変換のメソッドに書式“0.00”を追加し、次のように記述しました。
frs = convertToInt(readBuffer); textPlaceHolder.Text = frs.ToString("0.00"); |
}
以上で測定した温度を少数以下2桁の実数表示する準備を終えました。
テストは、Raspberry Pi 3 model BとRaspberry Pi 2 model Bの両方で行いました。
- Raspberry Pi 2 model Bは、ディプレイにHDMIケーブル接続し温度を表示
- Raspberry Pi 3 model Bは、Windows IoT Remote Clientで次に示すようにPCウィンドウにモニタ画面を表示
デバッグを開始すると、モニタに次の画面が表示されます。Raspberry Pi 2の場合はデバッグのスタート・ボタンをクリックして、デバッグを実行できる次の画面が表示できるまでの時間が50秒から60秒くらいかかりますが、Raspberry Pi 3の場合20秒くらいで次の画面が表示されます。やはり、Raspberry Pi 3の高性能化がうかがえます。
InitSPI()関数の処理を行うと、「Waiting for GPIO to be initialized」の表示が始まり温度の表示を行うDisplayTextBoxContents()関数を実行すると、次に示すように少数以下2桁表示で温度が表示されます。
●配線間違えのミス
今回、Raspberry Pi 3 model BとMCP3208を接続する配線を間違え、MCP3208の入力のDinに電源を接続しMCP3208を壊してしまいました。
今後、Raspberryの端子から引き出した配線を間違えないように、ペンテル・ホワイトで白いマークを付けました。次に示すように9、10のピンと25、26のピンの列に白いマークを付けました。9、25はGNDの端子になっています。白いマークから前後4ピンくらいまでは一目でわかりますので、マークを付けた後は配線にあまり苦労しなくなりました。
新しいMCP3208を入手しましたので、再度Raspberry Pi 3にMCP3208を接続してテストをしましたが、データを読み取っても0.00しか読み取ることができなくなりました。Raspberry Pi 2のマイコン・ボードを接続すると問題なく温度を読み取ることができます。Raspberry Pi 3のマイコン・ボードの不具合かとも考え、新しいRaspberry Pi 3 model Bを注文しました。
●OSのアップデート
次に示すように、前回テストを行った後2016/6/24に、OSのバージョンアップがありました。
OS Version: 10.0.14366.0 |
プレビュー版は新しいOSバージョンが発表されると自動的に更新されます。
次に示すように、前回のテストの直後バージョンアップが実施されました。
あまり可能性は高くはありませんが、バージョンアップのためも考えられます。新しいRaspberry Pi 3が到着したら確認できます。
(2016/7/7 V1.0)
<神崎康宏>