2023.04.04本記事はプロモーションが含まれています。こんにちは、ENGかぴです。情報が取得できるBME280センサーからSPIを使用してデータを取得し無線通信してデータを確認しました。BME280はI2C通信とSPI通信に対応したモジュールです。下記記事で紹介しているようにBME280用に提供されているAPIをMWSTAGEのアクトに組み込んでSPI通信を行います。トワイライト(TWELITE)のI2C通信を実装し無線通信する共通する部分については全体のソースコードには示しますが、考え方は上記記事を参考にしてください。SPIについては下記リンクが参考になります。SPIの基本を学ぶーアナログ・デバイセズトワイライトを太陽光パネルで動作させたことやMWSTAGEの環境でソフト開発して無線通信したことなどについてまとめています。トワイライト(TWELITE)のソフト開発と無線通信でできることトワイライトの開発ツールであるMWSTAGEのバージョン(MWSTAGE2020_10)がリリースがされたことでBME280のセンサー情報が取得できるBMx280-環境センサSNSが実装されました。本記事では、追加されたBMx280-環境センサSNSを使用せずに外部のAPIを組み込む方法や考え方についてまとめていますので参考にしていただければと思います。今回使用するのはストロベリーリナックスが販売しているBME280温湿度・気圧センサモジュール(I2C/SPIタイプ)を使ってSPI通信を実装していきます。センサーはBOSCH社が製作しておりストロベリーリナックス社がモジュール化して販売しているものを使用しています。MWSTAGEに組み込むため以下の手順に従って実装していきます。BME280のAPIをBOSCH社のHPからダウンロードBME280のAPIソフトをMWSTAGEに組み込むBME280のAPIに合わせてSPIのREAD/WRITEを実装モード設定に関する関数を追加するトワイライトのシリアルで温度・湿度・気圧の情報を表示する手順1.2.については「トワイライト(TWELITE)のI2C通信を実装する」にダウンロードの手順をまとめています。以降ではBME280のドライバーをBME280APIと表記します。MWSTAGEのアクトのフォルダー名やファイル名は任意ですがフォルダー名を「bme280-spi」とし、ファイル名を「bme280-spi.cpp」とし準備するとよいと思います。BME280APIに合わせてSPIのread/writeを実装BME280APIにはSPIのreadとwriteの機能は実装されていません。ユーザー側で準備する必要があり、API側がコールしている型に合わせて関数を実装する必要があります。actフォルダー内のbme280のAPIをコールするためにbme280.hを最初にインクルードします。"bme280.h"また計算結果をFloatを使わずにuint32_t形式で表示するために「bme280_defs.h」の以下をコメントアウトします。Floatで表示したい場合はコメントアウトの必要はありません。BME280_32BIT_ENABLEを追加します。BME280_FLOAT_ENABLE#endif#endif#endifスポンサーリンクSPIのAPIを使用する(トワイライト)SPIのAPIを実装しやすいようにモノワイヤレス社がMWSTAGE開発環境においてAPIを準備しており使用することで簡単にSPIが実装できます。モノワイヤレス社ーSPI関係のAPIについてSPI.begin()を最初の初期化時とスリープ復帰後にコールする必要があります。begin()の引数を指定するとSPIのバススピードやスレーブセレクトピンやSPIモードを指定できます。初期化時のsetup()内やwakeup()内でコールします。最低でも2か所で使用することになるためSPI.begin()の変更が一か所で済むようにspi_init_set()の関数を作りコールするようにしています。SPI_CONF::SPI_MODE3));}BME280のデータシートによると最大クロックは10MHzまで対応できます。トワイライトは16MHzを偶数で分周したクロックが指定できるので2MHz、4MHz、8MHzの周波数が設定できます。例では2MHzにしています。SPIの読み書きはヘルパークラス版(stream機能が使用可能)を使用します。オブジェクトを生成を行いオブジェクトを破棄した段階で利用終了の手続きが行えるためbeginTransmisson()、endTransmission()などを呼びだしを気にする必要がないためです。}}Readの場合スレーブに供給するためのクロックを出力するために0x00をダミーとしてセットしてクロックを出力してスレーブのデータを取得しています。このソースコードのようにif文の中でオブジェクトを作成しif文でwrite/readすることで読み書きができます。if文から抜けたときオブジェクトは破棄されるためソースコードの記述漏れなどが防げます。広告BME280APIに使用する変数とユーザーが準備する関数の実装BME280APIを使用するためには2つの変数を準備する必要があります。sensor_data;bme280_devはAPIを使用するための情報を格納する変数です。この変数に必要な情報を記述することでAPIとリンクすることができます。bme280_dataはAPIが計算した温度、湿度、気圧に関するデータを格納する変数です。ユーザーが準備する関数についてはダウンロードしたファイルの中になる「README.md」をテキストもしくはVsCodeで開くと内容が確認できます。ポイントとなる関数は以下の通りになります。len)1はAPIとしてコールすると使用できますが、コールする前にユーザー側でread/writeに使用する関数のアドレスや遅延用の関数を登録しておく必要があります。Bme280Init()という関数を自作して変数の登録とbme280_init()をコールしています。}}2.3.についてはI2Cのと同様であるため割愛します。「トワイライト(TWELITE)のI2C通信を実装し無線通信する」を参考にしてください。5の関数についてはセンサーのデータを通信する際に使用するものですが、引数が指定されているの引数を利用しながら組み込みAPIのステータスがリターンするように組み込む必要があります。rslt;}最初にSPIオブジェクトを生成します。生成できなければBME280_E_DEV_NOT_FOUNDを戻り値として返すようにします。スレーブのアドレスを選択して送信して後にリードしたいデータ長分(Len)分だけスレーブデータを読み出します。トワイライト(マスター)が出力するクロックに同期してBME280(スレーブ)がデータを返信するため読み取る際もマスターからクロックを出力させるためにダミーとして0x00をセットしています。rslt;}Writeの場合スレーブアドレスをセットした後書き込みたいデータをサイズ分送信することで書き込みができます。BME280のSPIは1バイト毎しかライトできない仕様になっているのでLenは常に1になるようです。引数はポインター指定になっていますが、引数を指定している箇所をソースを見た時配列のアドレスが指定されているので配列のようにreg_data[]としてデータをセットしてもアドレスが更新されるので同じ結果になります。スポンサーリンク無線通信を実装するスリープで消費電流を抑えながら無線通信の実装方法については下記記事にまとめています。BME280の計測とスリープの関係やBME280の読み込みデータの扱い方について説明しています。トワイライト(TWELITE)のI2C通信を実装し無線通信するポイントだけ整理するとショートスリープでBME280の計測をスタートさせスリープすることで消費電流を抑えます。BME280のデータは4バイトデータですが無線通信のため1バイトに分割して無線通信を行う必要があります。「書けるが先で、理解が後」を体験しよう!動作確認トワイライトのSPI通信を使用してBME280から温湿度と気圧のデータを取得してMONOSTICKにデータを送信します。MONOSTICKはParent-MONOSTICKアクトをそのまま使用しています。電源はTWE-EH-Sを使用します。TWELITEが動作開始したらTWE_GNDとGNDが切り離されないようにBOOTをLOWにします。5秒間隔のスリープと100msのスリープを使い分けながらBME280から取得したデータをMONOSTICKに送信します。TWELITEとBME280の両方がスリープ時に電流を測定すると消費電流(約1.5uA)となっていました。ウェイクアップしたときに瞬時に電流が増加しますがテスターで確認できないほど短い周期で正確ではありませんが、約200uA程度でした。I2C使用時と同じでした。動作確認(TeraTermでMONOSTICKのシリアルデータを確認)通信データの確認MONOSTICKのシリアルデータをTeraTermで表示し子機からの通信データを確認しました。PACKETで子機からのデータを確認しました。PACKETでも子機からデータは同じです)子機から送信されたデータは緑(気温)・青(気圧)・赤(湿度)です。デデータを見ると気温は0x000009A6(2,470)となっており100倍値なので換算して24.70°Cとなります。気圧も同様に0x009A4C6E(10,112,110)となり100倍値なので換算して101,121.10Pa=1,011.21hPaになります。湿度は100倍値でなく1,024倍値となっているので注意が必要です。0x0001101E(69,662)となり換算すると68.03%になります。室温が25°C程度であることは温度計で分かりました。気圧に関しては約1,011hPaとなっておりスマホのデータの1,009mBar(hPa)となっていました。湿度に関しては確認する方法がありませんが雨の環境下の室内だったので妥当かなと感じています。無線通信するまでをモード管理しています。送信セットした後にthe_twelite.tx_status.is_complete()で送信が完了したのを確認してスリープします。Loop()から抜けながら送信管理していますが、アクトのSlp_Wk_and_Txのようにwhileで一気に送信した方が消費電流が抑えられるかもしれません。}PAL_AMB-usenapのアクトの例のように送信したIDを保存して管理する方法でソースを組んでいましたがthe_twelite.tx_status.is_complete()を満たしても無線通信データを送信しないままスリープに遷移することがありました。Slp_Wk_and_TxのようにMWX_APIRETの型で定義した変数に送信時の戻り値を保存するようにして送信IDをチェックしながら無線通信の送信完了を確認するように無線通信が終了したタイミングでスリープするようになりました。マイコンはスタートアップ時に消費電流が増えるため無線通信がうまくいかなかった場合はスリープするようにし3回連続で失敗したときシステムリセットするようにしています。以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。rslt;}センサーのオーバーサンプリングやフィルタについてはサンプルのままにしています。エナジーハーベスト電源など消費電流が気になる場合はオーバーサンプリングやフィルタをOFFにしておくとよいかもしれません。関連リンクトワイライトを太陽光パネルで動作させたことやMWSTAGEの環境でソフト開発して無線通信したことなどについてまとめています。最後まで、読んでいただきありがとうございました。組み込みエンジニアPICマイコン(PIC16F1827)のTMR1割り込みの設定マイコンのソフト開発では割り込みを多く使用します。PIC16F1827において割り込みを使用すると発生時に関数がコールされますが割り込み要因を判別して処理する必要があります。TMR1のオーバーフローを割り込みを使って動作確認します。組み込みエンジニアPICマイコン(PIC16F1827)でキャプチャーを使用するPIC16F1827はキャプチャー機能を持っているため外部機器からの取得したパルス信号の周波数を測定することができます。IDEのプラグインであるMCCでCCP(Capture)を実装して動作確認を行いました。XIAO用の拡張ボードはSDカードスロットやOLEDによる液晶画面での表示ができます。Grove端子対応のセンサーモジュールを挿入して計測等ができます。OLEDにボタンの情報を表示して動作確認を行いました。組み込みエンジニアESP32-WROOM-32EのタイマでDIフィルタを実装するArduino環境でDIの信号レベルを判定しているとスイッチの切り替えなどで発生するチャタリングのため誤動作の原因になることがあります。タイマライブラリを使用してDIのチャタリングの防止を行う方法をまとめました。XIAO31ESP32-WROOM-32E37TWELITE(トワイライト)26PIC16F182731PIC12F67522ノウハウ(体験談)36趣味と生活29その他6タグオペアンププロフィールENGかぴ当ブログの運営者のENGカピです。組み込みエンジニアとして10年以上の経験を活かしてセンサーモジュール等の動作確認したことをまとめています。広告、アフィリエイト収益で当ブログを運営させていただいております。defined.")}))})()タイトルとURLをコピーしました。