前提
マイコンはArduino互換のSpresense、センサーはMPU6050を使用。IDEはArduino IDEでOSはApple M1です。配線は下記のようにしています。
Spresense A5 -> MPU6050 SCL (ジャンパワイヤ黄)
Spresense A4 -> MPU6050 SDA(ジャンパワイヤ黄)
Spresense 5V -> MPU6050 VCC(ジャンパワイヤ赤)
Spresense GND -> MPU6050 GND(ジャンパワイヤ黒)
実現したいこと
MPU6050を使用し、加速度を取得したいと考えています。ただ、Wire.requestFrom()メソッドでエラーが出ており、このエラーを解消したいです。
発生している問題・エラーメッセージ
下記のエラーが出ています。
ERROR: Failed to read from i2c (errno = 0)
該当のソースコード
c
1#include <Wire.h> 2 3void setup() { 4 Serial.begin(9600); 5 Wire.begin(); 6} 7 8void loop() { 9 Wire.beginTransmission(0x62); 10 Wire.write(0x3B); 11 Wire.endTransmission(); 12 Wire.requestFrom(0x62, 14); 13}
試したこと
下記よりrequestFrom()メソッドの内部の処理を確認しました。(I2C_TRANSFER内部の処理や、retにどんな値が入っているのかライブラリのコードをArduino IDEで直接デバッグしたかったのですが、まだ試せていません。)
https://github.com/sonydevworld/spresense-arduino-compatible/blob/master/Arduino15/packages/SPRESENSE/hardware/spresense/1.0.0/libraries/Wire/Wire.cpp
Wire.hで読み込んでいるerrno.hより0がどのエラーに該当するのか調べました。こちらはLinuxの標準ライブラリとのことで関連するerrno-base.hよりエラー番号を確認しましたがどのエラーにも該当しないことがわかりました。
https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno-base.h
Wireライブラリの公式リファレンスを確認しましたが有用な情報は特にありませんでした
https://www.arduino.cc/reference/en/#wire
https://www.arduino.cc/reference/en/language/functions/communication/wire/requestfrom/
配線を下記のように変更したほか、元の配線をベースにさまざまな組み合わせを試してみましたが変わらずでした。
Spresense SCL -> MPU6050 SCL (ジャンパワイヤ黄)
Spresense SDA -> MPU6050 SDA(ジャンパワイヤ黄)
Spresense 3.3V -> MPU6050 VCC(ジャンパワイヤ赤)
Spresense GND -> MPU6050 GND(ジャンパワイヤ黒)
下記のi2c_scannerを使用し、アドレスが0x62であることを確認し、beginTransmissionとrequestFromの第一引数に指定するアドレスを0x62にしました。(サンプルコードでは0x68であることが多かったのでこちらに変えて試したりもしました)
20:54:35.594 -> Scanning... 20:54:35.632 -> I2C device found at address 0x62 ! 20:54:35.668 -> done
c
1// -------------------------------------- 2// i2c_scanner 3// 4// Version 1 5// This program (or code that looks like it) 6// can be found in many places. 7// For example on the Arduino.cc forum. 8// The original author is not know. 9// Version 2, Juni 2012, Using Arduino 1.0.1 10// Adapted to be as simple as possible by Arduino.cc user Krodal 11// Version 3, Feb 26 2013 12// V3 by louarnold 13// Version 4, March 3, 2013, Using Arduino 1.0.3 14// by Arduino.cc user Krodal. 15// Changes by louarnold removed. 16// Scanning addresses changed from 0...127 to 1...119, 17// according to the i2c scanner by Nick Gammon 18// https://www.gammon.com.au/forum/?id=10896 19// Version 5, March 28, 2013 20// As version 4, but address scans now to 127. 21// A sensor seems to use address 120. 22// Version 6, November 27, 2015. 23// Added waiting for the Leonardo serial communication. 24// 25// 26// This sketch tests the standard 7-bit addresses 27// Devices with higher bit address might not be seen properly. 28// 29 30#include <Wire.h> 31 32 33void setup() 34{ 35 Wire.begin(); 36 37 Serial.begin(9600); 38 while (!Serial); // Leonardo: wait for serial monitor 39 Serial.println("\nI2C Scanner"); 40} 41 42 43void loop() 44{ 45 byte error, address; 46 int nDevices; 47 48 Serial.println("Scanning..."); 49 50 nDevices = 0; 51 for(address = 1; address < 127; address++ ) 52 { 53 // The i2c_scanner uses the return value of 54 // the Write.endTransmisstion to see if 55 // a device did acknowledge to the address. 56 Wire.beginTransmission(address); 57 error = Wire.endTransmission(); 58 59 if (error == 0) 60 { 61 Serial.print("I2C device found at address 0x"); 62 if (address<16) 63 Serial.print("0"); 64 Serial.print(address,HEX); 65 Serial.println(" !"); 66 67 nDevices++; 68 } 69 else if (error==4) 70 { 71 Serial.print("Unknown error at address 0x"); 72 if (address<16) 73 Serial.print("0"); 74 Serial.println(address,HEX); 75 } 76 } 77 if (nDevices == 0) 78 Serial.println("No I2C devices found\n"); 79 else 80 Serial.println("done\n"); 81 82 delay(5000); // wait 5 seconds for next scan 83}
追記
(ご回答を受けて繋ぎかえました)
Spresense SCL -> MPU6050 SCL (ジャンパワイヤ黄)
Spresense SDA -> MPU6050 SDA(ジャンパワイヤ白)
Spresense Vout -> MPU6050 VCC(ジャンパワイヤ赤)
Spresense GND -> MPU6050 GND(ジャンパワイヤ黒)
繋ぎかえたところアドレスに0x68が増えたのでbeginTransmissionとrequestFromの第一引数を0x68に変更しました。
23:50:09.605 -> Scanning... 23:50:09.605 -> I2C device found at address 0x62 ! 23:50:09.642 -> I2C device found at address 0x68 ! 23:50:09.676 -> done
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/24 13:36
2022/09/24 13:37
2022/09/24 14:15 編集
2022/09/24 14:56
2022/09/25 15:59