PSOC4でBMP180を使った気圧計作成

画像













amazonなどで、安価なBMP180を使った気圧計モジュールが安価に出ています。
せっかくなので、PSOC4のCY8CKIT-049-42XX KITをつかってそのまま付属のUSBシリアル経由で気圧を取得するようにしました。www.cypress.com にBLUETOOTHモジュール用のサンプルソースコードが公開されていましたので、この中のI2CのBMP180の処理部のみ利用させてもらいました。このソースでは、温度、気圧、高度を整数に変換していますが、温度は10倍して0.1度、気圧は100倍、高度は1倍で整数部分のみだったので、10倍にして0.1m単位で表示できるように修正しています。

元のソースはcypressのページでBMP180を検索するとでてきますが、リンク記載しておきます。
http://www.cypress.com/file/357081/download

CY8CKIT-049-42XX KITに気圧計モジュールのI2Cと電源の4本の内、2本は直接ヘッダーで接続して、I2Cの2本は配線しました。写真はその全体の写真となっています。

以下にPSOC4のプロジェクトの回路部分を示します。I2CとUARTとタイマーの3つを置いています。今回はモジュールだけなので回路接続は無しです。I2CとUARTの接続は以下のピンの設定となっています。I2Cは配線が楽ですね。
●プロジェクトファイルの回路部分
画像


















●プロジェクトのピン割り付け
画像




















■プログラムの仕様について
ソースコードを末尾に添付しましたので、詳細はそちらをみてください。
USBシリアルを115.2Kbps設定にしています。PCに接続してTERMツールでデータ表示してください。
問題なければ10秒に1回気圧、温度、高度が表示されます。
高度はデフォルトの気圧に対する高度がデフォルトて表示されていますので、天気によって高度が変化すると思います。そのため、PCのTERMからAキーを入力すると現在の高度指定になりますので、整数で現在の高度を入れてENTERキーを押すと高度表示が変更入力されます。
また、表示フォーマットはデフォルトのCSVモード(MODE0)とテキストモード(MODE1)の2種類あります。
TERMから数字の0か1を押すとモードが変化します。また、Hキーで簡単な説明を表示します。
表示上はR(RESET)も用意しましたが、まだ実装していません。
あと、I2CのLCDのモジュールも組み込んでありますので、LCD表示したい人はI2CLCDを接続してください。なお、対応しているLCDはここブロブで記載している”PSOC5で安価な20文字x4行 I2C LCD”か、同じI2C変換アダプタを接続した1604のLCDに対応していますが、現時点ではコメントにして未使用にしています。

※注意事項
cypressのサンプルソースを追加してMAINから呼ぶことで使うことはできますが、次の2点の問題がでて、対応が必要です。添付のソースは対応済みなのでそのままビルドするだけで良いのですが、他の自作プログラムに流用する場合に、参考になるので注意点を記載しておきます。

※注意1 sprintfのfloat出力対応設定について
テキスト処理が面倒なので、sprintfを組み込んでFLOAT形式で使っています。
小数点以下の表示処理がこれ使わないと面倒なので・・・・。また処理時間も遅くても問題ないので。
そのままヘッダにstdlib.hを組み込んでビルドしてもビルドエラーは無いけど見事に出力されません。
どうやらライブラリリンクに手抜きがあって、必要なライブラリが組み込まれないようなので手動で組み込みます。
Psoc Creator3.3のProjectのBuild Settingを開きます。
Linkerのcommand lineに " -u _printf_float " (""をのぞいたテキストのみ)を追加します。
さらに、sprintf内部でfloatを使うにはバッファがデフォルトでは足りないので、増やします。
左のプロジェクトツリーの*.cydwrを開き、画面中央下側のsystemタブをクリックします。
Heap Size(Byte)を0x200以上に変更します。
そうするとsprintfの内部でfloat指定が正しく出力できるようになります。
マイコンによって増減が必要かもしれませんので、動かない場合は増やしてみてください。
(PSOC4はSRAM4KBしかないのでこの範囲内でですが)

※注意2 pow関数のビルドエラーについて
そのままcypressのサンプルソースI2CMaster.cとI2CMaster.hを組み込んでビルドするとpow関数(doubleのペキ乗)がエラーになって動きません。これも調べるとsprintfのfloat ようにライブラリに組み込まれないのが原因のようです。同様にPsoc Creator3.3のProjectのBuild Settingを開きます。
Linkerのcommand lineに "-lm " (中のテキストのみ)を追加します。
しかし、Psoc Creator3.3標準関数つかうのにいろいろバグ(手抜き)があるようですね。
まあ、非力なマイコンでdouble系の標準関数は重いのであまり使うなと言っているのでしょうか。

■シリアル出力例
以下はMODE1のTEXTモードでの表示例です。
USBケーブルで1m程度の範囲で変化させると誤差はでますが、55.7m→55.3m→56.4mで大体正確に高度変化が表示されるので、使えそうですね。もっとも、数時間で天気の変化で気圧変化してすぐに数m変化するので、小数点以下をだしても意味がないのかもしれません。それなのでcypressのサンプルソースは小数点以下を表示しないようにしているのかも。

10SEC COUNT,Temperature('C),Air Pressure(hPa),Altitude(m)
13,TEMP 22.7'C,AIR PRESS 1015.10hPa,ALT 55.7m
14,TEMP 22.7'C,AIR PRESS 1015.10hPa,ALT 55.6m
15,TEMP 22.7'C,AIR PRESS 1015.09hPa,ALT 55.7m
16,TEMP 22.7'C,AIR PRESS 1015.09hPa,ALT 55.8m
17,TEMP 22.7'C,AIR PRESS 1015.08hPa,ALT 55.9m
18,TEMP 22.6'C,AIR PRESS 1015.07hPa,ALT 55.9m
19,TEMP 22.9'C,AIR PRESS 1015.05hPa,ALT 56.1m
20,TEMP 23.0'C,AIR PRESS 1015.01hPa,ALT 56.4m
21,TEMP 23.2'C,AIR PRESS 1015.02hPa,ALT 56.3m
22,TEMP 23.2'C,AIR PRESS 1015.13hPa,ALT 55.5m
23,TEMP 22.8'C,AIR PRESS 1015.15hPa,ALT 55.2m
24,TEMP 22.5'C,AIR PRESS 1015.15hPa,ALT 55.3m
25,TEMP 22.3'C,AIR PRESS 1015.15hPa,ALT 55.3m

■まとめ
ケース(筐体)に入れてLCDを付けて、USBバッテリ接続すれば車などで高度確認ができそうです。
元のソースはPSOCのBluetooth版でしたが、Bluetooth版結構便利かもしれません。
車などに添えつけてBluetoothでスマホなどから気圧表示や高度表示ができるので、今度購入
してみようかな。
使った感じで、高度は±0.3mほど変動している感じで、1m程度の単位では計測できそうですね。
気圧も地域の気象データの1時間ごとの値と比較して見ると1017.00に対して1015なので値も正確ですね。

PSOC4のKITは$5ドルボード(CY8CKIT-049-42XX)ですが、USBシリアルも付属しているので、お得です。国内では秋月か、mouser(海外発送)経由で購入できます。(ただし、書き込みはPSOC5 KIT CY8CKIT-059 1500円 秋月 のUSBデバック部miniprog相当で使える を切り離して書き込みに使っています)
本ブロブでPSOC関係はマイコンの中でも比較的安価で小規模なCPLDのような使い方もできるのでいろいろ作ってきましたが、気に入っています。

■ソースコードダウンロード先
あまり、きれいなソースではありませんが、今回作ったプログラムです。
よろしければ無保証ですが、参考にしてください。

PSOC4ソースコードダウンロード  


この記事へのコメント

この記事へのトラックバック