Wio LTEにはI2CのGroveコネクタが一つありますが、複数のI2CのGroveモジュールを繋げたいことがあると思います。
I2Cの通信規格はバスのため、複数のデバイスを一つのI2Cマスタに接続することができます。
ちなみにI2CはInter-Integrated Circuitの略でIICです。なので2は2乗です。
アイツーシーと読んでもだいたい通じますが、正確にはアイ・スクエアド・シーです。
(テンションが上がったときはアイスキャシィィィィイ!と読んでください。
I2Cハブ
I2CのGroveモジュール用に複数のモジュールを繋げられるI2Cハブというものがあります。
これを使えば3つまでI2CなGroveモジュールを繋げられます。
注意点
どのモジュールも複数繋げられるわけではありません。
以下の注意点を確認する必要があります。
- 電圧が一緒
- 電源や信号レベルの電圧は統一しないといけません。
- アドレスが異なる
- Wio LTE(I2Cマスタ)はアドレスで通信する対称のモジュールを決めるので、同じアドレスを持っているモジュールは使えません。
- プルアップ抵抗値
- I2Cのプルアップ抵抗はだいたい2.2~10KΩの範囲で使用しないとうまく動きません。そのため、モジュール側でプルアップ抵抗が取り付けられているものは合計の抵抗値を気を付ける必要があります。
動作確認
以前の記事で紹介したGrove化した紫外線センサ VEML6070と同じくGrove化したBME680をI2Cハブ経由で接続します。(BME680は有名なBME280の上位のセンサで、気温、湿度、気圧に加え空気の汚染度が計測できるセンサです。)
両方ともアドレスが異なり、電圧は一緒です。プルアップ抵抗はもともと複数のデバイスが繋げられるように決めているので問題ありません。
シリアルモニタを確認するとUV light levelがUV紫外線センサの値で、そのほかがBME680のセンサ値です。
スケッチ
スケッチはただ両方の動作確認したプログラムを合わせただけです。
#include <WioLTEforArduino.h>
#include <Wire.h>
#include "Adafruit_VEML6070.h"
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme; // I2C
Adafruit_VEML6070 uv = Adafruit_VEML6070();
WioLTE Wio;
void setup() {
Wio.Init();
Wio.PowerSupplyGrove(true);
delay(3000);
SerialUSB.println(F("BME680 test"));
if (!bme.begin()) {
SerialUSB.println("Could not find a valid BME680 sensor, check wiring!");
while (1);
}
// Set up oversampling and filter initialization
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
SerialUSB.println("VEML6070 Test");
uv.begin(VEML6070_1_T); // pass in the integration time constant
}
void loop() {
SerialUSB.print("UV light level: "); SerialUSB.println(uv.readUV());
if (! bme.performReading()) {
SerialUSB.println("Failed to perform reading :(");
return;
}
SerialUSB.print("Temperature = ");
SerialUSB.print(bme.temperature);
SerialUSB.println(" *C");
SerialUSB.print("Pressure = ");
SerialUSB.print(bme.pressure / 100.0);
SerialUSB.println(" hPa");
SerialUSB.print("Humidity = ");
SerialUSB.print(bme.humidity);
SerialUSB.println(" %");
SerialUSB.print("Gas = ");
SerialUSB.print(bme.gas_resistance / 1000.0);
SerialUSB.println(" KOhms");
SerialUSB.print("Approx. Altitude = ");
SerialUSB.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
SerialUSB.println(" m");
SerialUSB.println();
delay(2000);
}
最後に
今回はオフィシャルのGroveモジュールは使用しませんでしたが、さまざまなモジュールが出ているので試してみたいと思います。
ただ意外とアドレスが同じ場合があるので注意が必要です。