記事

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 単位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)

<神崎康宏>

連載メニュー Raspberry Pi 3 model Bが入手できました

(1) 性能の向上したモデルPi 3 でIoT

(2) オンボードのWi-Fiによる通信

(3) Visual Studio 2015 Update 2での不具合

(4) プレビュー版は頻繁に更新されている

(5) Powershellのコマンドでディスプレイの解像度を設定

(6) SPIインターフェースのA-Dコンバータでアナログ入力

(7) 温度を測るサンプル・プログラムtempsensor

(8) 温度センサLM35DZはアナログ出力

(9) ビルド・バージョンよってSPIが動かないことへの対応

(10) まとめ