Let's play 般若心経

研究日記です。

I2Cで苦戦

7/26 大きなレポートの締切が近づいてきている

Writeしかできない

Arduino Nano 33 BLE Sense(Rev.1)ではライブラリの互換性の問題なのか、I2Cセンサの値が読み取れない問題が発生しました。
試したセンサは以下の通り。全部動きませんでした。(UNOでは動く)

・SHT35(温湿度センサ)
・VEML 7700(照度センサ)
・KP-VL53L0X(赤外線距離センサ)

昨日の記事でBlinkMのLEDにRGBの書き込みは出来たので、<Wire.h>だけを使ってプログラムを組めば問題ないのかな... ここでマイコンを変えるのはちょっと嫌

繋がっているセンサのI2Cアドレスを知るプログラムでチェックしてみます。

//I2Cスキャンプログラム

#include <Wire.h>

void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

実行結果は以下のようになりました。

ちゃんと検出されていますね。悪いのはライブラリ説が濃厚になります。

センサのライブラリを使わないで値を読む

ライブラリが使えないので送信するコマンドはデータシートを見るなりして確認する必要があるのですが、SHT35(温湿度センサ)だとこのようなプログラムになります。

//SHT35 温湿度センサ
#include <Wire.h>

#define SHT35_ADDRESS 0x45
#define SHT35_MEASURE_CMD_MSB 0x24
#define SHT35_MEASURE_CMD_LSB 0x0B

void setup() {
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop() {
  // Send measure command
  Wire.beginTransmission(SHT35_ADDRESS);
  Wire.write(SHT35_MEASURE_CMD_MSB);
  Wire.write(SHT35_MEASURE_CMD_LSB);
  Wire.endTransmission();

  delay(15); // Wait for measurement to complete (max 15ms)

  // Request 6 bytes of data
  Wire.requestFrom(SHT35_ADDRESS, 6);

  // Read data
  byte data[6];
  for (int i = 0; i < 6; i++) {
    data[i] = Wire.read();
  }

  // Convert to actual temperature and humidity
  unsigned int rawTemp = (data[0] << 8) | data[1];
  unsigned int rawHum = (data[3] << 8) | data[4];

  float temp = -45 + 175 * ((float)rawTemp / 65535);
  float hum = 100 * ((float)rawHum / 65535);

  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println(" °C");

  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.println(" %");

  delay(1000);
}

実行結果

これでライブラリが使えなくてもセンサの値を使えるようになりました。よかったです。

2万円の3Dプリンター

研究室で使っている3Dプリンターは100万くらいするOnyx Oneなのですが、夏休み中使うために片道1時間で研究室に行くのはやばいと思いました。そこで、10cm×10cmくらいの小さいやつが印刷できるTina2Sを買いました。(研究費ではない)

Tina2S

Onyx Oneは専用のOnyxというフィラメントを使うのですが、それは800cm³で29000円します。余裕でTina2Sが買えますね!

コントローラのガワはでかいので何回か研究室に行くことにはなると思います。