AVR USI-TWI Master使用例:温度・湿度・気圧センサーBME280との接続
2017年7月
I2C接続のセンサーから値を読み込み、ディスプレイに表示するのに必要な線はSCL/SDAの2本。
Arduinoに使用されているATmega328PなどATmegaシリーズはI2C準拠のTWI機能を内蔵しており、I2Cデバイスと容易に接続できます。
ですがTWI機能のためだけに28ピンものAVRを使うのはもったいない気がします。8ピンAVRでできないでしょうか。
USI機能をTWI化する
AVRのATmegaシリーズはTWI(Two Wire Interface)機能を内蔵していますが、少ピンの品種はありません。
一方、ATtinyシリーズは8~20ピンの品種が豊富ですが、惜しいことにTWI機能が内蔵されていません。
しかしUSI(Universal Serial Interface)機能は内蔵されており、これを利用してSPIやTWI動作を実現することができます。
具体的な方法はアプリケーションノートで公開されています。今回の目的で利用するのはマスター側です。
AVR310のソース(C言語)は2013年に作成されたようですが、2017年時点の開発環境AtmelStudio7ではコンパイルが通りません。
また、プログラムの構造が整理されておらず(と筆者は感じた)、使いにくかったので全面的に改造しました。
ソフトウェア
開発環境: Windows10/64bit, AtmelStudio7
上記ソフトウェアには、USI-TWI Masterプログラムの他、センサーモジュールBME280の自作APIも含みます
(リファレンスAPIがBosch社から提供されています)。
キャラクタLCDは「AVR USI-TWI Slave使用例:キャラクタLCD-I2C化アダプタ Ver.2」で使用しているものです。
センサーモジュールBME280について
回路図
LCD表示内容
作例では10分間隔で測定、表示しています。 '008A'は測定回数(138回)を表しています。
BME280モジュール
Bosch社の温度・湿度・気圧センサーBME280のモジュールを使用しています。
下記シリーズがあります。
BMP180: 温度・気圧センサー(旧型)
BMP280: 温度・気圧センサー(改良型、高精度)
BME280: 温度・湿度・気圧センサー(高精度)
BME280のSDO端子でスレーブアドレスのLSBを決めることができます。
GND とショートなら'0' → スレーブアドレス: 0x76 (初期状態)
VDDIOとショートなら'1' → スレーブアドレス: 0x77
モジュール表面、3つのパッドは左から GND,SDO,VDDIO で、初期状態ではGND-SDOがつながっています。
ここをパターンカットし、SDO-VDDIOをハンダショートしてスレーブアドレスを0x77にしたり、
再度GND-SDOをハンダショートして0x76に戻したりできます。
また、このモジュールではI2Cのプルアップ抵抗として10kΩが実装済みです(モジュール背面)。
◆ ◆ ◆
ATtiny85(TWI機能がない8ピンAVR)にUSI-TWI Master機能を実装しました。I2Cでセンサー、LCDと接続できました。
ディスプレイをOLEDに変更したり、方位センサーや照度センサーを追加したり、
RTCモジュールとEEPROMを追加してログを記録したり、リチウムイオン電池駆動にしたり、
…I2C接続なら何でもつないでお好みのロガーが作れそうです。
(C) 『昼夜逆転』工作室