今回はセンサモジュールの詳細仕様を説明します。前回の記事で、センサモジュール内にはメモリがあり、SPI通信を利用してそのメモリを読み書きすることにより動作設定をしたり測定データを読み出したりすることを説明しました。この記事では、そのメモリの構成や読み書き方法などについて、詳細を説明します。メモリ構成センサモジュール内のメモリは、通常のメモリと同様にアドレスが振られています。「メモリにアドレスが振られている」と説明されても「アドレス???」という方もいらっしゃるかもしれません。このPICマイコン電子工作入門シリーズでは、メモリについて具体的な説明をしていませんので、ここで簡単にメモリについて説明します(メモリをすでにご存知の方は次のセクションに進んでいただいて問題ありません)。普段使っているPCやスマホの内部、今回使用するマイコンやセンサモジュール内部には、計算結果やデータを保存しておくための「メモリ」があります。このメモリは、8ビット=1バイトを基本単位としています。PIC16F18857では、内部に4096バイトのメモリを持っています。上のように1バイトのデータを保存しておく箱のようなものが4096個用意されているわけです。今回使用する温湿度・気圧センサは56バイトのメモリを持っています。一般的なPCやスマホは、最近ではギガバイト単位のメモリが搭載されていますよね。メモリにデータを保存する場合、メモリの「どこに」保存するか指定する必要があります。メモリからデータを読み出す場合も同様に、「どこの」メモリからデータを読み出すのか指定する必要があります。このように「どこ」を指定するために、メモリには特定するための番号が振られています。この番号は、「アドレス」(住所)と呼ばれています。実世界を見てみると、家やビルなどの場所を特定する場合、住所を使いますよね。メモリの場合もこれに見立てて「アドレス」と呼んでいます。「アドレス」は日本語で「住所」の意味ですが、日本語でも「アドレス」と呼んでいます。この「アドレス」は、通常16進数で表記します。アドレスが例えば0xFFFのメモリのことを「0xFFF番地のアドレス」というように〇〇番地、という呼び方をします。メモリの構成を示したものを「メモリマップ」(メモリの地図)と呼びます。このようにメモリを実世界に見立てて「マップ(地図)」「アドレス(住所)」「番地」という言葉を使用しています。前回の記事で、センサモジュール内のメモリに、いろいろなデータが格納されていることを説明しました。測定データを読み出す場合は、何番地のアドレスから読み出すのか、読み出し時にアドレスを指定する必要があります。センサモジュールのデータシートには、何番地にどのようなデータが格納されているか説明されています。次のセクションでは、センサ本体BME280のメモリマップの詳細を説明します。BME280のメモリマップ詳細BME280のメモリマップは以下のように構成されています。湿度は16ビットデータとしてメモリに格納されていて、上位8ビット(=1バイト)は0xFD番地、下位8ビットは0xFE番地に格納されています。湿度データを取得する場合は、0xFD番地と0xFE番地のデータを読み出すことになります。この湿度データは校正されていませんので、別途校正用データで難しい計算をする必要があります。動作設定を行うには、表の中央付近にある0xF5番地に設定値を書き込みます。前回の記事で説明しました、測定データの取得の流れをメモリマップを見ながら確認しましょう。以下は測定データの取得の流れです。1番目の動作設定では、以下のメモリにセンサの動作設定の値を書き込みます。次に2番目、3番目で以下の校正用データを取得します。4番目の測定指示では、再度1番目と同じメモリに測定指示をするための値を書き込みます。測定指示をすると、センサは温室度と気圧のデータを測定し、測定データメモリに測定値を保存しますので、5番目と6番目で以下の測定データを取得します。次に、読み出し方法と書き込み方法について説明します。特定アドレスからデータを読む場合、SPI通信で最初にマスターからMOSI信号線でアドレスを送信します。アドレスを送信後、マスターからクロック信号を送り続けると、センサはそのアドレスのデータをMISO信号線でマスターに送ってきます。1バイトを読み取る場合は、クロック信号を8回発生すれば読むことができます。マスターから続いてクロック信号を発生し続けると、センサはMOSI信号線で次のアドレスのデータをMISO信号線で送ってきます。先ほどのメモリマップを確認いただければわかると思いますが、校正用データや測定データのメモリはアドレスが連続しています。そのため、このうなデータを読む場合は、「アドレス送信→1バイト読み込み、次のアドレス送信→1バイト読み込み」ということはせずに「アドレス送信→1バイト読み込み→次のアドレスの1バイト読み込み...」と続けて読むことになります。SPI通信手順にまとめると以下のようになります。以下は1バイト読み取りの例ですが、連続して読み込む場合はクロック信号を必要バイト数分繰り返せばOKです。タイミングチャートが十分理解できないようでしたら、もう一度SPI通信手順の説明を確認してみてください。書き込み方法は、以下のようにマスター(PICマイコン)からスレーブ(センサ)に書き込みアドレスを指定した後、書き込みデータを送信するだけです。アドレス指定は読み出し方法とは一点だけ異なります。書き込む際のアドレス指定は、アドレスの最上位1ビットを0にします。動作設定のアドレスは0xF5(=11110101)ですが、書き込む場合のアドレスは0x75(=01110101)になります。動作設定を行う場合は以下のようなアドレス指定となります。SPI通信手順をまとめると以下のようになります。最後に取得したデータの計算方法の概要を説明します。取得した測定データは、校正用データで校正する必要があります。計算方法の意味はよくわからないんです。なんと無責任な、という説明ですが、校正はセンサの特性に合わせて計算する必要があり、その計算方法はセンサのメーカーから指定されていますので、その計算方法に従う必要があります。データシートには計算式ではなく、C言語のプログラムで説明されていますので、測定データの校正はそのプログラムをコピペして作成します。以下はその校正プログラムですが、、、何をしているのかわからないですよね。以下のプログラムで、dig_T、dig_P、dig_Hはそれぞれ温度、気圧、湿度の校正用データで、adc_T、adc_P、adc_Hはそれぞれ測定データ(校正前の生データ)になります。何をしているのかはあまり深入りしないほうがいいと思います。