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

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

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

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

Q&A

解決済

1回答

609閲覧

Arduinoの無線接続

yyybbbyy

総合スコア13

Arduino

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

0グッド

1クリップ

投稿2022/09/18 08:35

前提

Arduinoにおいて、常に加速度センサの値を計測しつつ、モーターを動かしたい。

実現したいこと

無線で動くロボットを自作しており、まず加速度センサから値は常に加速度と角速度を出力される状態にしたいです。そのうえで例えばシリアルモニタから1という数字を入力されると、ロボットは前進。0が入力されると停止するようにしたいです。(1が入力されたらロボットは次に0が入力されるまで常に前進しているようにしたい)

発生している問題・エラーメッセージ

下記のようなプログラムを作り、有線では思い通りの動きをするのですが、無線にすると加速度センサの値は出力されるが、モーターが動かなかったりする。

該当のソースコード

#include <Wire.h> #include <SoftwareSerial.h> SoftwareSerial BTserial(2, 7); // RX,TX // デジタルピンの定義 const int IN1 = 3; const int IN2 = 4; const int IN3 = 5; const int IN4 = 6; const int ENA = 9; // PWM制御で使うENAピンをD9に(モーター1のPWM制御ピン) const int ENB = 10; // PWM制御で使うENBピンをD10に(モーター2のPWM制御ピン) int data = 0; int i = 0; int step = 5; int BTint = 0; void setup(){ pinMode(IN1, OUTPUT); // デジタルピンを出力に設定 pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT); BTserial.begin(9600);//シリアル通信開始、転送速度は9600ビット/秒 Wire.begin(); //I2C通信開始 // センサ開始動作 Wire.beginTransmission(0x68); //アドレス0x68指定でMPU-6050を選択、送信処理開始 Wire.write(0x6B); //MPU6050_PWR_MGMT_1レジスタのアドレス指定 Wire.write(0x00); //0を書き込むことでセンサ動作開始 Wire.endTransmission(); //スレーブデバイスに対する送信を完了 } void loop(){ // スタートアドレスの設定とデータの要求処理 Wire.beginTransmission(0x68); //アドレス0x68指定でMPU-6050を選択、送信処理開始 Wire.write(0x3B); //ACCEL_XOUT_Hレジスタのアドレス指定 Wire.endTransmission(false); //false設定で接続維持 Wire.requestFrom(0x68, 14, true); //MPU-6050に対して14byte分データを要求、I2Cバス開放 int16_t ax, ay, az, gx, gy, gz, Temp; //符号付き整数を格納する16ビットの変数型の設定 //シフト演算と論理和で16bitのデータを変数に格納 //ax~gzまで、16bit(2byte) × 7 = 14byte ax = Wire.read() << 8 | Wire.read(); //x軸の加速度の読み取り 16bit ay = Wire.read() << 8 | Wire.read(); //y軸の加速度の読み取り 16bit az = Wire.read() << 8 | Wire.read(); //z軸の加速度の読み取り 16bit Temp = Wire.read() << 8 | Wire.read(); //温度の読み取り 16bit gx = Wire.read() << 8 | Wire.read(); //x軸の角速度の読み取り 16bit gy = Wire.read() << 8 | Wire.read(); //y軸の角速度の読み取り 16bit gz = Wire.read() << 8 | Wire.read(); //z軸の角速度の読み取り 16bit //データの表示 1LSBの値はデータシートに記載 //AFS_SEL設定 = 0, ±2g, 16384LSB/g //FS_SEL設定 = 0, ±250deg/s, 131LSB/deg/s BTserial.print(ax/16384.0); BTserial.print(" g, "); //1LSBを加速度(G)に換算してシリアルモニタに表示 BTserial.print(ay/16384.0); BTserial.print(" g, "); //1LSBを加速度(G)に換算してシリアルモニタに表示 BTserial.print(az/16384.0); BTserial.print(" g, "); //1LSBを加速度(G)に換算してシリアルモニタに表示 BTserial.print(gx/131.0); BTserial.print(" deg/s, "); //1LSBを角速度(deg/s)に換算してシリアルモニタに表示 BTserial.print(gy/131.0); BTserial.print(" deg/s, "); //1LSBを角速度(deg/s)に換算してシリアルモニタに表示 BTserial.print(gz/131.0); BTserial.println(" deg/s, "); //1LSBを角速度(deg/s)に換算してシリアルモニタに表示 //Serial.print(Temp/340.00+36.53); Serial.println(" deg."); //温度換算シリアルモニタに表示 if (BTserial.available() > 0) { data = BTserial.read();//シリアル通信で受け取ったデータを読み込む if (data == '1') { digitalWrite(IN1, HIGH); // 直進(ノーマル) digitalWrite(IN2, LOW); // モータ1を正転 analogWrite(ENA, 120); 0 digitalWrite(IN3, HIGH); // digitalWrite(IN4, LOW); // モータ2を正転 analogWrite(ENB, 120); 0 } else if (data == '0') { digitalWrite(IN1, HIGH); // 停止 digitalWrite(IN2, HIGH); // モータ1を停止 analogWrite(ENA, 0); 0 digitalWrite(IN3, HIGH); // digitalWrite(IN4, HIGH); // モータ2を停止 analogWrite(ENB, 0); 0 } } } ### 試したこと 有線ではBTserialのところをSerialとしているだけであり、コードはそれ以外変えていません。なぜ無線にするとうまくいかないのかご教授いただきたいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/09/18 09:48

> data = BTserial.read();//シリアル通信で受け取ったデータを読み込む このデータを表示させてみたらどうなるでしょう
yyybbbyy

2022/09/18 12:16

BTserial.print(gz/131.0); BTserial.println(" deg/s, "); //1LSBを角速度(deg/s)に換算してシリアルモニタに表示 BTserial.println(data); このようにしてみたら、最初は0がずっと表示されていたにもかかわらず、1を入力したら72や240など異なる数字が出力されました。有線で試しても同じように異なる数字が出力されます。
guest

回答1

0

ベストアンサー

無線っていうより、SoftwareSerialとwireが喧嘩しているんじゃないかという気がしますが。それぞれ割り込みを使うので、とくにタイミングにシビアなSoftwareSerialの受信が失敗するケースが出てきているとか。

ArduinoはUNOですか? 使用機種を明記してください。Arduinoって言ってもいろいろありますので。
Serialを使用しないのなら、BluetoothをSerialで繋いでしまえばいいように思います。純正あるいはちゃんとしたUNO互換品ならD0/D1とUSB-UART変換の間に1KΩが噛ませてあるので、D0/D1にRX/TXを直結できるはずです。ただし、プログラム書き込みの際にはD0/D1への接続は外す必要がありますが。

投稿2022/09/18 10:02

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yyybbbyy

2022/09/18 12:21

回答ありがとうございます。使用機種はArduinoはUNOで、純正ではありませんが互換品です。 Arduinoに慣れていないため、不慣れで申し訳ありません。Bluetoothモジュール(HC-05)のRX/TXにD0/D1を接続するのがよろしいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問