MAKER UNO + で始めるSTEM (7) WireライブラリでBoschのセンサ①ライブラリを利用
ディジタル出力のセンサの多くは、大別してI2CとSPIのどちらかのインターフェースをもちます。Boschの気圧センサは両方サポートしています。複数のセンサを同時に使うとき、配線の量が少ないI2Cのほうが使いやすいです。ArduinoではI2Cの通信を行うとき、Wireライブラリを利用します。
●利用するセンサ
ボッシュの気圧などを測るセンサは歴史があるようです。2012年3月に発行された「Arduinoで計る、測る、量る」ではBMP085が登場しています。そのあとBMP180が出て、現在はBMP280になっているようです。
現行のラインナップは、BMP388、BME680、BME280、BMP380、BMP280などのようです。BMP380は2017年に発表された24ビットの気圧計ですが、入手性はよくありません。BMP388も24ビットです。Adafruitがブレークアウト・ボードを出しています。
BME280、BMP280、BME680は多くのブレークアウト・ボードが市場にあり、入手性がよいです。デバイスの電源電圧は3.3Vもしくは1.8Vなので、Arduino UNOもしくはMAKER UNO +で使うのに、5->3.3Vのレギュレータと、信号のレベル変換回路が必要です。今回入手したBME680ボードは、それらの回路が入っていました。
BMP280 | BME280 | BME680 | |
---|---|---|---|
気圧 300~1100 hPa |
〇 | 〇 | 〇 |
温度 -40~85℃ |
〇 | 〇 | 〇 |
湿度 0~100% |
〇 | 〇 | |
大気の汚れ | 〇 |
これらのセンサは、I2CとSPIの両方が使えるのですが、I2Cはスレーブ・アドレスが0x76と0x77の2通りしか設定できないので不便です。
I2Cは信号線が2本で通信できますが、複数つながっているデバイスを識別するのは、スレーブ・アドレスです。マスタ(多くはマイコン)が通信を始めるとき、必ずスレーブ・アドレスをバス上に出します。スレーブ・デバイスは、常にその情報を監視していて、自分が指定されたらAck信号を出して応答します。
●ブレッドボード上の配線
写真は、小さくてよく使われるブレッドボードです。電子工作の世界ではこの呼び方で通じますが、業界が違うと勘違いされるので、ソルダーレス・ブレッドボードというのが正しい呼び方だと忘れずに覚えておきます。
最初は、電源を確保します。両端に電源ラインがあります。赤色はプラス、青色はGND(グラウンド)にします。逆は絶対にダメです。MAKER UNO +の+5VとGNDからジャンパ線でつないで利用します。+5Vが赤色で、GNDは黒色です。このルールを守っていると、配線が終わった後、チェックをするときに、間違いにすぐ気が付きます。
電解コンデンサと積層セラミック・コンデンサのリード線を短く切って挿し込みます。電解コンデンサに表示されているマイナス側のリード線をGNDに挿しこみます。逆にしても5Vではすぐに壊れませんが、いちど逆に挿し込んで電源を入れてつかったのを逆だと気が付いて正しく挿しなおすのはだめです。潔く捨ててください。電解コンデンサ内は化学反応を利用しています。
- 電解コンデンサ 22~220uFぐらい、耐圧6~35Vぐらい
- 積層セラミック・コンデンサ 0.1もしくは0.01uF、耐圧16もしくは50V
ブレーク・アウト・ボードの電源をつなぎます。I2Cのモードを選択するためにCSB(CS)をVccへ、スレーブ・アドレスを設定するSDOをGNDにつないで0x76にします。SDOをVccにつなぐと0x77になります。
BME680のブレーク・アウト・ボードを挿しこみます。
MAKER UNO +とジャンパ線で次のようにつなぎます。見てのとおり、ここまでの利用の仕方では、ブレッドボードの電源は右側しか使いません。したがって、今現在、左右の電源の配線は不要です。
ここまでの作業では、マイコン・ボードとPCは接続していません。配線を目視で確認します。一番心配なところは、電源がショートしていないかどうかです。テスタを使って確認するのもよいでしょう。過去、筆者は、ブレッドボードの赤色のラインにUNOから赤と黒の両方を挿しこんだことが何度もあります。
USBケーブルで、MAKER UNO +とPCをつなぎます。ボード上の5V/3.3V端子横のLEDが一瞬ついて消えてしまう、PCのUSBぼ接続したことを知らせるポンという音と同時に接続が切れたときの低めの音が連続して鳴ったときなどは、ブレッドボード上の電源がショートしています。すぐにケーブルを抜きます。
接続が正しいかは、Arduino IDEでライブラリI2CscannerをインストールしてサンプルScannerを動かします。0x76に見つけてきました。見つからないと表示が出たときは、ブレッドボード上の配線を見直します。
●BME680のライブラリをインストール
メイン・メニューのツールから、ライブラリの管理を開きます。BME680で検索して、最初に表示されたAdafruit BME680 Libraryをインストールします。
同社のセンサ関連ライブラリを動かすにはAdafruit_Sensorも必要なので、こちらに行ってzipファイルをダウンロードします。もしかしたら、BME680 をインストールしたとき、もしくは別のArfruitのライブラリを利用したときにすでに入っているかもしれません。その場合、インストールは不要です。
メイン・メニューのスケッチから、ライブラリをインクルード->ZIP形式のライブラリをインストールを選びます。ダウンロードしたファイルはダウンロード・フォルダに入っています。Adafruit_Sensor-master.zipを選択してインストールを済ませます。
インストールがすむと、C:\Users\ユーザ名\Documents\Arduino\librariesの中に入っているのが確認できます。
メイン・メニューのファイルから、スケッチ例の中のAdafruit BME680 Library-bme680testを読み込みます。
正常に動きません。Could not find a valid BME680 sensor, check wiring! というメッセージが出ます。
C:\Users\ユーザ名\Documents\Arduino\libraries\Adafruit_BME680_LibraryにあるAdafruit_BME680.hをひらくと、
#define BME680_DEFAULT_ADDRESS (0x77) ///< The default I2C address |
とスレーブ・アドレスは0x77だとコーディングされています。Adafruit_BME680.cppを読むと、
bool Adafruit_BME680::begin(uint8_t addr) { _i2caddr = addr; |
アドレスは、begin()時に変更可能なことがわかります。スケッチのbegin()をbegin(0x76)に変更して実行します。
今度は正常にアクセスできました。
コラム ブレッドボード
ブレッドボードの裏には両面テープが貼ってあります。よく見ると、中央にへこみがあってのこぎりで切り離せそうです。電源ブロックは手で折り曲げると切り離せそうです。そのままでも便利ですが、工夫すると、ブレッドボードを便利に使えます。
コラム 抵抗
抵抗はよく使うので、まとめて購入しておきます。抵抗は、秋月電子通商にセットものがあります。個人では一生使いきれないですが、必要な抵抗値の種類はほぼ入っています。グループで利用するときには特に便利です。購入した後、袋から取り出してパーツ箱に入れないようにします。袋に入った状態にしておきます。これは、パーツ箱は、誰かが必ずひっくり返すものだからです。
秋月電子通商でセット販売されているものは、炭素皮膜抵抗です。金属皮膜抵抗より性能は劣りますが、普通に使えます。特徴が二つあります。一つは、4本帯の色表示です。抵抗の地の色と帯の色の判別がしやすく、皆さん覚えましょうという抵抗の値の読み方が、そのまま適用できます。もう一つは、リード線がブレッドボードの穴に挿しやすい太さです。
これに引き換え、アマゾンやebayで抵抗セットを購入すると真逆の状態の製品が手に入ります。ほとんどが金属皮膜抵抗なので、性能が良いですが、色の帯が1本多く、読めません。たぶん若い人でも読めません。色の判別がしにくいです。4本帯は、必ず誤差の表示用に金色(銀色はほとんど見ない)があるので、抵抗の値の読みははじめる方向がわかりますが、5本の帯はどちらから読んでよいかがわからないです。
そして、リード線が大変細いです。ブレッドボードで利用するには不向きです。性能というのは、温度特性と抵抗値の確度、ノイズです。どちらも電子工作のレベルでは無視してよい項目です。
電子工作では、1kと10kΩがよく使われます。1kΩは、金色の帯の反対から、
茶色、黒色、赤色、金色
です。5本帯では、
茶色、黒色、黒色、茶色、茶色
です。反対から読むと、110Ωです。
では、なぜ、1kと10kΩがよく使われるのでしょうか。オームの法則で計算した結果910Ωが一番近いとしても、一般的なE-12系列だと入っていません。なので1kで再計算して許容誤差内であればOKです。
回路の推奨される抵抗値をみると、数kから数十kΩであるならばなんでもよいと書かれていたら、たいてい10kΩを選びます。4.7kでも6.8kでもよいのに、なぜか10kΩが選ばれます。品種を増やしたくないという考えが根底にあるのかもしれません。
先ほどの秋月電子通商の「カーボン抵抗(炭素皮膜抵抗) 1/2W全部入り (73種類0Ω付)」でも、1kと10kは、それぞれ300本入っています。ほかの抵抗値は100本ずつです。コラム コンデンサ
電子工作では5Vもしくは12Vを使うので、コンデンサの耐圧は16Vや50Vで十分足ります。電解コンデンサは、正式にはアルミ電解コンデンサで、大きさの割には容量が大きいのが特徴です。電子工作では、電源回りで使います。MAKER UNO + では220uF、16V耐圧が使われています。Arduino UNOのDC入力は7~12Vなので、47uF、25V耐圧が使われています。
Arduinoでは、電源はすでに直流になっているので、電解コンデンサは、急に負荷電流がたくさん流れたときに、短い間に電流を供給する役目を担っています。電流を十分に供給できないと、一瞬電圧が下がります。マイコン類は、監視している電源電圧がある値以下になると、プログラムが正常に動かないと判断してリセットがかかります。とくにWi-Fi関連のデバイスは電流がたくさん流れるので、330uF以上が使われることが多いようです。電解コンデンサは電源をもつ機器には欠かせませんが、最大の欠点は、寿命があることです。どんな部品でも寿命がありますが、熱に弱く、高温で使うほどはやく劣化します。産業用では10年の連続動作を保証できるように回路や種類を選びます。電子工作ではそんなに長く使わないので、気にしません。
一般的な85℃と書かれた電解コンデンサは、85℃で使ったとき長寿命品を除けば使えなくなるまで2000時間です。温度が下がるほど、その時間は伸びていきます(温度が10℃下がると寿命が2倍伸びる)。1990年ごろのオーディオ製品を修理する人は、まず、電解コンデンサを新品に取り替えるそうです。積層セラミック・コンデンサは、リード付きの製品は青色が多いです。そうでない製品もあります。このコンデンサは、電源ラインで使うことが多いので電解コンデンサと同じ役割です。異なるところは、デバイスのすぐ近くに配置することです。デバイスが動作するとき、急激に電流が流れるのをフォローしたり、デバイスの出すノイズをほかのデバイスに伝えない機能をもち、デカップリング・コンデンサとも呼ばれます。
容量は0.1uF(表示は104)、0.01uF(表示は103)が使われます。耐圧は50Vが多いです。MLCCという略語で呼ばれ、米粒より小さなチップ部品は、デバイスごとに1個使うので、PCのマザーボードやスマホの基板では、すごくたくさん使われます。車の電装が増えているので需要は高まり、需要はひっ迫しています。