質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

解決済

Wire.requestFrom()メソッドでエラー MPU6050使用

Manamin
Manamin

総合スコア14

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

2回答

0リアクション

0クリップ

387閲覧

投稿2022/09/24 11:50

編集2022/09/24 14:53

前提

マイコンは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

#include <Wire.h> void setup() { Serial.begin(9600); Wire.begin(); } void loop() { Wire.beginTransmission(0x62); Wire.write(0x3B); Wire.endTransmission(); Wire.requestFrom(0x62, 14); }

試したこと

下記より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

// -------------------------------------- // i2c_scanner // // Version 1 // This program (or code that looks like it) // can be found in many places. // For example on the Arduino.cc forum. // The original author is not know. // Version 2, Juni 2012, Using Arduino 1.0.1 // Adapted to be as simple as possible by Arduino.cc user Krodal // Version 3, Feb 26 2013 // V3 by louarnold // Version 4, March 3, 2013, Using Arduino 1.0.3 // by Arduino.cc user Krodal. // Changes by louarnold removed. // Scanning addresses changed from 0...127 to 1...119, // according to the i2c scanner by Nick Gammon // https://www.gammon.com.au/forum/?id=10896 // Version 5, March 28, 2013 // As version 4, but address scans now to 127. // A sensor seems to use address 120. // Version 6, November 27, 2015. // Added waiting for the Leonardo serial communication. // // // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. // #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 }

追記

(ご回答を受けて繋ぎかえました)
イメージ説明
イメージ説明
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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。