web-dev-qa-db-ja.com

Arduino:Bluetoothモジュールでシリアルおよびソフトウェアシリアルを使用する

私の目的は、Arduinoを使用して、PCとHC-05 Bluetoothモジュールを使用するAndroidデバイス間の通信をセットアップすることです。

PCとArduino(シリアルモニター)の間のUSB通信とSoftwareSerialを使用してHC-05に接続します。

私の問題は、BTからPCへの通信は正常に機能するが、他の方法では期待どおりに機能しないことです。 PCからBTに送信する場合、PCのシリアルモニターを閉じたとき、またはArduinoをリセットしたときにのみ、送信されたすべての文字がBTデバイスによって受信されます。

BTモジュールまたはAndroidアプリケーションの問題を除外しました。Arduinoの場合、「ECHO」コードを実装するためです(Androidで記述して送信Androidでは)すべてが正常に動作します。

予想される動作の下に投稿されたArduinoコードでは、Arduinoのリセット-> Helloワードが送信され、シリアルモニターが開いた->何も起こらない、シリアルモニターに書き込まれた文字-> BTで受信した文字、BTに書き込まれた文字->シリアルモニターで受信した文字、シリアルモニターが閉じました->何も起こりません。

実際の動作は次のとおりです。Arduinoのリセット->送信されたHelloワード、シリアルモニターが開いた-> BTに2つのHelloワード、PCに1(「おやすみ」)、シリアルモニターに書き込まれた文字->何もない、BTに書き込まれた文字->受信した文字シリアルモニターで、シリアルモニターが閉じられた->シリアルモニターで以前に書き込まれた文字を受け取った+ Hello Word。

この問題を解決するにはどうすればよいですか?

コード:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int a=0;
char c;
char d;
void setup() {
  Serial.begin(9600);
  Serial.println("Goodnight moon!");
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}
void loop() {
  delay(10);
  if (Serial.available()) {
    c=Serial.read();
    delay(10);
    Serial.write(c);
  }
  delay(10);
  if (mySerial.available()) {
    d=mySerial.read();
    delay(10);
    mySerial.write(d);

  }
}
6
user2706612

このコードは、HC-05を備えたArduino Mini Pro(UNOと同じである必要があります)で動作します。 HC-05をラップトップとペアリングしています。 HC-05に関連付けられたCOMポートとArduinoシリアルコンソールでハイパーターミナルを使用すると、メッセージを双方向に送信できます。 Serial.printlnステートメントがハイパーターミナルウィンドウに表示されます。

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 7

SoftwareSerial mySerial(rxPin, txPin); // RX, TX
char myChar ; 

void setup() {
  Serial.begin(9600);   
  Serial.println("Goodnight moon!");

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop(){
  while(mySerial.available()){
    myChar = mySerial.read();
    Serial.print(myChar);
  }

  while(Serial.available()){
   myChar = Serial.read();
   mySerial.print(myChar);
  }
}
3
imjosh

Arduino UnoとPCの間にシリアル通信を実装しました。これが私のコードでした。

int data;
char character;
int start_flag = 0;

void setup() {
  Serial.begin(921600); 
  pinMode(2, OUTPUT); 
}
void loop() {
  if(Serial.available() > 0){
    character = (char) Serial.read();
    if(character == 's') {
      start_flag = 1;
    }
    if(character == 't') {
      start_flag = 0;
    }
  }
  if (start_flag == 1) {
    Serial.print(data); //data that was acquired by internal ADC
  }
}
2
STiLLeN

このシリアル設定を使用します。このコードを使用すると、シリアルモニターからBluetoothに日付を送受信できます

void setup(){
  Serial.begin(9600); // Begin the serial monitor at 9600bps
  bluetooth.begin(115200); // The Bluetooth Mate defaults to 115200bps
  bluetooth.print("$"); // Print three times individually
  bluetooth.print("$");
  bluetooth.print("$"); // Enter command mode
  delay(100); // Short delay, wait for the Mate to send back CMD
  bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity
  // 115200 can be too fast at times for NewSoftSerial to relay the data reliably
  bluetooth.begin(9600); // Start bluetooth serial at 9600
  pinMode(led, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}

詳細については、 http://www.circuitmagic.com/arduino/arduino-and-bluetooth-hc-06-to-control-the-led-with-Android-device/ にアクセスしてください。

0
Mandy

this を試すことができます。 Arduino bluetooth <-> C#通信をテストするときに使用できる最も単純なコードについてです。注:コードは、PIN1(TX)<-> MODULE RX、PIN2(RX)<-> MODULE TXを接続し、PIN1(TX)5Vを2,5Vに分割してからモジュールに供給することによってテストされました。

これがこれを試しているすべての人に役立つことを願っています!

0
jaolho

同じ問題があった場合、BTモジュールを有線側と無線側の2つの異なるボーレートとして表示する必要があります。無線側はPuTTYを介して接続するものによって設定され、有線側はATコマンドによってプログラムされます。HC-05のデフォルトは38400です。

0
Davee

テストにはこのアプリを使用することをお勧めします:

https://play.google.com/store/apps/details?id=com.vagoscorp.virtualterminal

バイト(0b00000000から0b11111111(10進数では0から255))としてバイトを表示および送信できるため、ボーレートが正しいかどうかをテストするシンプルなエコーファームウェアを作成し、それが機能するかどうかを確認するコマンドの送信を開始することができます。一部のLEDがオフ

これはエコーコードの例です。

char dato = 0;

void setup() {
 Serial.begin(9600);//9600 is the default baudrate of the HC-05 (you can change it by AT commands, google it if you want)
 //pinMode(13, OUTPUT); //enable this pin if you want to use de LED idea
 //digitalWrite(13,  HIGH);
}
//////////////////////////////////////////////////////////////////////////
void serialEvent() {  //if you have received serial data
    while (Serial.available() > 0) {
        char dato = (byte)Serial.read();//save the byte
        Serial.write(dato);//send the just received byte (echo)
    }
}
///////////////////////////////////////////////////////////////////////////
void loop() {

}

お役に立てば幸いです

0
Sebasu