ラズベリーパイ3 温度センサ BMP085(2) プログラミング

ラズパイでgpioを制御するプログラムを書く場合はもちろん、

パイソンで記述するのが好ましい。

それはそうだ、ラズパイはそういう風に提供されているんだから。

 

とはいえ、「ややこしいところは隠蔽されているから簡単」は、「原理はよくわからないけど動いた」と同じなので、c言語でやってみたい。

--------------------------------------------------------------------------------------------------------------------

さて、一つ忘れていたが、AD変換+可変抵抗で、spiインタフェースを使って一生懸命マスタ・スレーブがどうだか言って、可変抵抗値をデジタルサンプリングしていたが、この温度センサはA/D変換を内部で行っているので、その苦労はない。

A/D変換機能を内蔵し、

シンプルなi2cプロトコル方式で外部にデータ参照させる

これがセンサ系ICの定番なんだろうか。

こういった話も「RaspberryPiで学ぶ電子工作」からは読み取れる。

----------------------------------------------------------------------------------------------------------------

 

【重要】

ここからは以下のサイトを参考にしている。

http://nopnop2002.webcrow.jp/AirCon/AIRCON-3.html

 

wiringPiは確か前にインストールした。

libi2c-devは消すように、とある。大丈夫か。

sudo apt-get --purge remove libi2c-dev

今まで試した、ほかの何かが動作しなくなるかも。

あれっと思ったら戻すこと(自分向け)

> sudo apt-get install libi2c-dev

ちなみにうちのラズパイ3は、libi2c-devを削除したら再起動した。

うーーーむ・・(汗

 

webopiだったか何だったかが依存していたのか?

それにしても再起動するなんて・・

不安だ・・

上記サイトでDLしたプログラムは libi2c-devを削除してもエラーとなる。

NULLがわからない、と言ってくる。

該当ファイルに、#include <stdio.h>を足したら出なくなった。

うーむ・・

回路接続したら、ラズパイ3が再起動した。

うーむ・・・

前に煙が出た時に、ラズパイ3本体もどっか焼けたんだろうか・・

 

とにかくできたプログラムを実行した。

>sudo ./readBMP085 

Temperature 85.3 *F
Temperature 29.6 *C
Pressure 1012.16 hPa
Altitude 157.5 Feet
Altitude 48.0 M

 

室温取れた!!!!!

 

つーか、エアコン26度設定なのに、30°近くある???!!

どうゆう事???!!

温度センサの目の前に扇風機を置いてみる。

 

おぉ、みるみる下がってくwww

Temperature 83.1 *F
Temperature 28.4 *C
Pressure 1012.11 hPa
Altitude 157.5 Feet
Altitude 48.0 M

 

面白い。ちゅーか、ラズパイ本体の隣で計測してたから

ラズパイ本体の発熱が対流しているのかしら。

とにかく、温度センサが壊れてるわけでも、

プログラムが異常動作しているわけでもない事は

わかった。

 

次はプログラムの内部動作を見てみる。

 

 

 

 

 

 

 

 

 

ラズベリーパイ3 温度センサ BMP085(1) 回路接続

前回はA/Dコンバータの値をspiインタフェースで読み込んだ。

ブレッドボードの裏側がおかしくなったせいか、A/Dコンバータから煙が出て

使えなくなったので、注意しないと(汗

テストに使った可変抵抗はテスタあててみると無事だった。

というか、ICではないので、壊れるものでもないか。

A/Dコンバータは内部に回路を持っているので、そこに過電流が流れるかなにかで

熱エネルギーで溶けて壊れたんだろうか・・・

 

可変抵抗の両足は3v、可変する脚は0~3vだかに変動する事はテスタで確認した。

 

今回は温度センサ(BMP085)を動作させてみる。

インタフェースはI2C。

spiは、シリアルペリフェラルインタフェース、素朴なマスタ・スレーブ通信プロトコルだった。マスタ側のR/W、スレーブ側のR/Wで構成され、クロックで同期。マスタのインプットはこの場合、スレーブへのデータ読み込みコマンドだった。それをクロック信号(LOW->HIGH)で送信通知していた。データ読み込みはクロック信号で受信通知してから実際のデータ受信していた。

I/C間の通信をどちらがマスタ、どちらがスレーブと見立てて、通信していた。

I2Cはどう違うのか。

おそらく、マスタ・スレーブという概念は存在しないのではなかろうか。

使用するのは、

SCL : シリアルクロック

SDA: シリアルデータ

確かに、spiにあったような、もしも (Master Output Slabe In)がない。

 

始めてみよう。

ラズパイ3のgpioをみてみると、

ピン3番:SDA1  (I2C)

ピン5番:SCL1 (I2C)

とある。これを温度センサの SDA, SCLに接続すれば良い。

ちなみに、SDA2とか、SCL2は見当たらない。gpioを拡張する場合のために、

識別番号つけてるだけなのか。

 

3.3v : pin1
gnd : pin6
scl : pin5
sda:pin3

接続ピンはこの4つだけ。

ラズパイ3と回路接続したら、まず、ラズパイ3がi2cデバイスとして認識しているか

確認してみる。

ラズパイ3では、bruetooth通信のために、UARTが安定しない、といった話があり、接続デバイスにはハードウェア設計上の制約が生まれるものらしい。

そういった話もあるからか、sudo raspi-configで i2cを有効にしなければならない。

i2cをラズパイ3で使えるようにする話は詳細には触れないが、このハードウェア事情的なコンフィグだけで良い。

 

ように見えるが、もちろんi2c制御ライブラリが必要になる。ラズベリーパイのパイは、「パイソン」のパイであり、パイソンライブラリとしてミドルウェア積み込みされているので、通常は意識しない。

(ちなみにspiの時はraspi-configとか、あまり考えなかった気がするけど、なぜだろう。忘れているだけ?)

 

話がそれたが、i2cデバイス認識しているか確認してみる。

もちろん回路接続しないと、ラスパイ3からはi2cデバイスは存在しない事になるので注意。

> sudo i2cdetect -y 1

ずらずらっと出力されるが、以下が BMP085を認識した、という証拠らしい。

70: -- -- -- -- -- -- -- 77 

 

次は実際にgpioを読むための プログラムを動作させてみる。

 

 

 

 

 

 

今日はspi

ラズパイ3を購入したので、いろいろ試してる。

参考書籍は「RasberryPiで学ぶ電子工作」

 

ブルーバックのこういう実践本にはあまり良いイメージがなかったけど、

この本は結構いいかも。

 

試すICは MCP3208。

spiは連続する1/0の塊(=数値)をI/Oするための4つの端子(信号線)がある。

SCLK:シリアルクロック。同期用。

MISO: Master In Slave Out

MOSI:Master Out Slabe In

CEO:

 

ちなみに、spiは シリアル・ペリフェラル・インタフェース。

IC同士の直接通信をダイレクトに表しているだけの言葉。

spiは、二つの素子 マスタ⇔スレーブ間の通信規格。

 

ここでは ラズパイがマスタ、MCP3208がスレーブ。

 

従って、ラズパイ側のspi端子は以下のように設定する。

 

SCLK...出力に設定。ラズパイ側から通信の同期を指示する。

MOSI...出力に設定。ラズパイ側はマスタなので、Master Out=信号出力。

             ここではMCP3208に、チャンネル0のアナログ値の取得を依頼するための

             コマンドを送信する。

MISO...入力に設定。MCP3208からのAD変換されたデータを受信 Master Inputする。

CEO...出力ポートに設定。マスタ側の独り言を処理するためのポート。

 

・クロックは信号の出力の都度、HIGH→LOWする。

 

・スレーブ(MCP3208)に対して毎回、以下のループ。

   1. CEOをHigh (spi送受信無効)

   2.クロックをリセット(Low)

   3.CEOをLOW (spi送受信開始)

   4. xチャンネルのデータ読みたいコマンド送信

      5ビットデータのループ

        - ビットデータをMOSIに出力(High or Low)

        - クロック HIGH->LOW で送信同期

   5. xチャンネルのデータ受信

      13ビットデータのループ

        - クロック HIGH->LOWで受信同期

        - MISOピンからビットデータ入力(High or Low)

   6. CEOをHIGH (spi送受信無効)

 

さて、まずはサンプルのパイソンプログラムを動作させてみよう。