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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

解決済

ArduinoでI2C通信とBluetoothシリアル通信を両立させる方法について

zum1309
zum1309

総合スコア17

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

3回答

0リアクション

0クリップ

6421閲覧

投稿2018/03/01 04:00

数か月前から電子工作を始めました。
ArduinoとPCのBluetooth通信について行き詰ってしまったため教えていただけると幸いです。

###最終目標
ArduinoにI2C通信のセンサを取り付け、センサの値をBluetoothチップのシリアル通信でPCで受信する

###構成
・Arduino側
Arduino UNO
Bluetoothチップ RN-42使用 Bluetooth評価キット
6軸センサ MPU6050使用

・Arduino配線
MPU6050とArduinoの配線
VCCと5V
GNDとGND
SCLとSCL
SDAとSDA
で配線

Bluetoothチップの配線はこちらを参考にさせていただきました。

・PC側
ubuntu16.04でbluemanを使用して接続
BluetoothドングルはLBT-UAN05C2/Nを使用

###問題点
Bluetooth通信の参考にさせていただいたこちらのサイト通りに試したところ正常にハードウェアシリアルで通信が可能でした。
ArduinoIDEのシリアルモニタで仮想シリアルポートrfcommを指定してArduinoからのシリアル送信を受信することが出来ます。

ですが、MPU6050からI2C通信でデータを取得しようとするとシリアルモニタで何も受信できなくなってしまいます。
MPU6050とのI2C通信はArduinoUNO付属のUSBケーブルを用いてのシリアル通信では成功しています。

以下、問題のスケッチです。

lang

// MPU-6050 Accelerometer + Gyro // I2CにアクセスするためにWireライブラリを使用 #include <Wire.h> // レジスタアドレス #define MPU6050_ACCEL_XOUT_H 0x3B // R #define MPU6050_WHO_AM_I 0x75 // R #define MPU6050_PWR_MGMT_1 0x6B // R/W #define MPU6050_I2C_ADDRESS 0x68 #define MPU6050_GYRO 131.0 #define MPU6050_G 16384.0 double acc_x = 0; double acc_y = 0; double acc_z = 0; double gyro_x = 0; double gyro_y = 0; double gyro_z = 0; // 構造体定義 typedef union accel_t_gyro_union { struct { uint8_t x_accel_h; uint8_t x_accel_l; uint8_t y_accel_h; uint8_t y_accel_l; uint8_t z_accel_h; uint8_t z_accel_l; uint8_t t_h; uint8_t t_l; uint8_t x_gyro_h; uint8_t x_gyro_l; uint8_t y_gyro_h; uint8_t y_gyro_l; uint8_t z_gyro_h; uint8_t z_gyro_l; } reg; struct { int16_t x_accel; int16_t y_accel; int16_t z_accel; int16_t temperature; int16_t x_gyro; int16_t y_gyro; int16_t z_gyro; } value; }; // デバイス初期化時に実行される void setup() { int error; uint8_t c; Wire.begin(); // ボーレートを115200bpsにセット Serial.begin(115200); //Serial.print("MPU-6050 "); // 初回の読み出し error = MPU6050_read(MPU6050_WHO_AM_I, &c, 1); Serial.print("WHO_AM_I : "); Serial.print(c, HEX); Serial.print(", error = "); Serial.println(error, DEC); // 動作モードの読み出し error = MPU6050_read(MPU6050_PWR_MGMT_1, &c, 1); Serial.print("PWR_MGMT_1 : "); Serial.print(c, HEX); Serial.print(", error = "); Serial.println(error, DEC); // MPU6050動作開始 MPU6050_write_reg(MPU6050_PWR_MGMT_1, 0); } void loop() { int error; float dT; accel_t_gyro_union accel_t_gyro; // 加速度、角速度の読み出し // accel_t_gyroは読み出した値を保存する構造体、その後ろの引数は取り出すバイト数 error = MPU6050_read(MPU6050_ACCEL_XOUT_H, (uint8_t *)&accel_t_gyro, sizeof(accel_t_gyro)); // I2C通信正常終了 if(error == 0){ // 取得できるデータはビッグエンディアンなので上位バイトと下位バイトの入れ替え(AVRはリトルエンディアン) uint8_t swap; #define SWAP(x,y) swap = x; x = y; y = swap SWAP (accel_t_gyro.reg.x_accel_h, accel_t_gyro.reg.x_accel_l); SWAP (accel_t_gyro.reg.y_accel_h, accel_t_gyro.reg.y_accel_l); SWAP (accel_t_gyro.reg.z_accel_h, accel_t_gyro.reg.z_accel_l); SWAP (accel_t_gyro.reg.t_h, accel_t_gyro.reg.t_l); SWAP (accel_t_gyro.reg.x_gyro_h, accel_t_gyro.reg.x_gyro_l); SWAP (accel_t_gyro.reg.y_gyro_h, accel_t_gyro.reg.y_gyro_l); SWAP (accel_t_gyro.reg.z_gyro_h, accel_t_gyro.reg.z_gyro_l); // 取得した加速度値 acc_x += accel_t_gyro.value.x_accel ; acc_y += accel_t_gyro.value.y_accel ; acc_z += accel_t_gyro.value.z_accel ; // 取得した角速度値 gyro_x += accel_t_gyro.value.x_gyro ; gyro_y += accel_t_gyro.value.y_gyro ; gyro_z += accel_t_gyro.value.z_gyro ; Serial.print("\t"); Serial.print(error, DEC); Serial.print(","); Serial.print(acc_x); Serial.print(","); Serial.print(acc_y); Serial.print(","); Serial.print(acc_z); Serial.print(","); Serial.print(gyro_x); Serial.print(","); Serial.print(gyro_y); Serial.print(","); Serial.print(gyro_z); Serial.println(""); delay(100); } } // MPU6050_read int MPU6050_read(int start, uint8_t *buffer, int size) { int i, n, error; Wire.beginTransmission(MPU6050_I2C_ADDRESS); n = Wire.write(start); if (n != 1) { return (-10); } n = Wire.endTransmission(false);// hold the I2C-bus if (n != 0) { return (n); } // Third parameter is true: relase I2C-bus after data is read. Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true); i = 0; while (Wire.available() && i < size) { buffer[i++] = Wire.read(); } if ( i != size) { return (-11); } return (0); // return : no error } // MPU6050_write int MPU6050_write(int start, const uint8_t *pData, int size) { int n, error; Wire.beginTransmission(MPU6050_I2C_ADDRESS); n = Wire.write(start);// write the start address if (n != 1) { return (-20); } n = Wire.write(pData, size);// write data bytes if (n != size) { return (-21); } error = Wire.endTransmission(true); // release the I2C-bus if (error != 0) { return (error); } return (0);// return : no error } // MPU6050_write_reg int MPU6050_write_reg(int reg, uint8_t data) { int error; error = MPU6050_write(reg, &data, 1); //Serial.print("error = "); //Serial.println(error); return (error); };

ソースを部分的に変えておかしくなる箇所を特定していったところ
Wire.beginTransmission(MPU6050_I2C_ADDRESS);
の命令があるとBluetoothを経由してシリアル通信ができなくなっているようです。
MPU6050がつながっているSDAとSCLについて調べたところ、それぞれシリアルデータピンとシリアルクロックピンとの事でしたので、もしかしてこのピンで通信しているとTX、RXピンを用いたシリアル通信はできないのでしょうか?
何かわかることがあればよろしくお願いします。

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

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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