Tengo un proyecto que usa los HC-06 a una velocidad diferente a la de origen de esos modulos que es 9600, los cambio a 38400. Hasta ahora he funcionado sin problemas.
Dependiendo que version tenga e BT uso diferentes codigos y comandos AT para cambiar la velocidad.
Ultimamente todos los HC-06 que me llegan vienen con la version HC-06-20190901 y no encuentro la manera de poder setear la nueva velocidad con exito.
Alguien tiene experiencia con esta version de HC-06???
esta en alemán.
La traducción de Google a español da esto:
Recientemente recibí un nuevo lote de módulos HC-06. Estos tienen la versión HC-06-20190901. Hasta ahora, muy mal.
Hasta ahora he podido identificar tres tipos diferentes de módulos BT con relativa facilidad:
Retraso de AT + 1s AT + nueva línea AT + Newline & Baudchange con "AT + UART = 57600,0,0" (Bluetooth LE) Para este propósito, construí una "detección" simple que pasa por todas las velocidades en baudios en un bucle y escucha para ver si algo regresa a "AT". Una vez con un salto de línea, una vez con retraso (1000). Luego, consígame la versión del módulo y cambie la velocidad en baudios, si es necesario.
Eso requirió algunas pruebas antes de que el método funcionara bastante bien. ¡Hasta este módulo mencionado anteriormente!
Parece que toma más de un segundo después de que el voltaje está encendido para que responda. Un comando AT no se reconoce después de un segundo, sino después de aproximadamente 1200 ms. Pero no siempre: see_no_evil:
Cuando reviso las velocidades en baudios, tengo que esperar unos 2 segundos después de un intento fallido para que el módulo vacíe el búfer. Pero incluso aquí es como un juego de ruleta, funcione o no. Incluso si agrego retrasos a mi boceto en un área grande, el módulo no se reconoce correctamente. Desafortunadamente, el objetivo del ejercicio no puede ser que el inicio tarde varios segundos. Si un dispositivo se conecta al módulo mientras tanto, los comandos AT terminan allí. Para ser tolerado en la primera detección, pero no en todos los comienzos.
Incluso después de que cambié la velocidad en baudios manualmente y quemé la versión correcta en la EEPROM de mi Arduino, existe una probabilidad de 50-50 de una reacción a un AT. -> Probado con diferentes módulos, directamente en un Nano y en su propia placa con ATMega328. ¡Se tienen en cuenta los 3.3V en RX & TX!
Por supuesto, ordené 10 de ellos de inmediato: roll_eyes:
¿Alguien ha experimentado con un comportamiento tan obstinado o incluso esta versión?
PD: todavía tengo una versión anterior de la función de detección aquí. Tengo que actualizarlo: músculo: t2:
*¡Puede que ya haya encontrado la solución al acertijo!
Al probar la velocidad en baudios correcta, estoy destruyendo el búfer del HC-06 por completo.
Los otros módulos, obviamente, parecen vaciar el búfer en modo AT después de aproximadamente 1 segundo si no hay nada decente, pero esto no es así.
¡Así que "sólo" tengo que llenar menos el búfer!
Si simplemente cambio la prueba de baudios 4800 -> 115200 al revés, ¡parece funcionar!*
long BtFindCurrentBaud() {
static const long rates[] = { 4800, 9600, 19200, 38400, 57600, 115200 };
uint8_t numRates = sizeof(rates) / sizeof(long); //6
//for (int rn = 0; rn < numRates; rn++) {
for (int rn = numRates-1; rn >= 0 ; rn--) {
BT.begin(rates[rn]);
delay(200);
PrintBtAt();
BT.flush();
if (btVersion >= 3)
delay(100);
else
delay(BT_Cmd_Delay); //No Linefeed, but 1Sec idle
if (BtDataAvailable())
return rates[rn];
}
return 0L;
}
void PrintBtAt() {
if (btVersion >= 3)
BT.println(F("AT"));
else
BT.print(F("AT"));
}
bool BtDataAvailable() {
if (BT.available()) {
//Read what´s on the buffer
while (BT.available())
BT.read();
return true;
}
return false;
}
Obviamente, no llega nada debido a las altas velocidades en baudios y, por lo tanto, el búfer permanece al menos algo vacío. Ahora es el momento de probar mis otros módulos BT, si no son alérgicos a esta adaptación ..
*Qué violín ...
Afortunadamente, los otros módulos HC-06 no quedaron impresionados por la adaptación.
Actualmente funciona con las siguientes versiones:*
Etiquetado
AT+Version
Salto de línea
AT-Delay
ohne
HC-06-20190901
Nein
~1200
FC-114
hc01.comV2
Nein
1000
1744
VERSION:3.0-20170609
Ja
0
ZS-40
Firmware V3.0.6,Bluetooth V4.0 LE
Ja
0
ZS-040
DX_smartv2.0
Nein
1000
*Sin embargo, debe esperar unos buenos 1-2 segundos para el módulo mencionado en primer lugar al comenzar.
Luego, el reconocimiento se ejecuta primero con un salto de línea y luego sin él.
Comenzando con la tasa de baudios más alta posible. Después de BT.begin () espero 200ms.
Actualmente espero 2 segundos entre los comandos AT antes de verificar una reacción.
Por lo tanto, todo lleva mucho tiempo la primera vez que se usa, pero como ocurre después de que se quema el FW, no es crítico el tiempo.
Se ve diferente con el inicio normal, donde tengo que esperar al menos 2 segundos hasta que el módulo BT se haya "calentado".
Luego, la seguridad verifica si la velocidad en baudios + la versión coinciden y espera otros 2 segundos para la respuesta ...
Después de una cuidadosa consideración, ¡esto es superfluo! Tan pronto como la versión de Bluetooth esté en la EEPROM! = 0xff, ¡todo debería encajar! También dispara y olvida: muecas:
Por supuesto, si algo falla durante la inicialización, la versión debe configurarse internamente en 0xff una y otra vez hasta que funcione.
Quizás ayude a alguien.*
Bueno si te sirve @cas6678 creo que debes traductor mediante darle las gracias porque lo merece.
El alemán @TriB ha hecho una actualización en su repositorio Github
#include <SoftwareSerial.h>
#define BT_Baud 57600
#define BT_BaudFallback 9600
#define BT_Cmd_Delay 2000 //1000 is okay, until HC-06-20190901
SoftwareSerial BT(8, 7);
long baud = 0;
uint8_t btVersion = 0xFF;
void setup() {
Serial.begin(115200);
InitializeBluetooth();
}
void loop() {
bool received;
while (BT.available()) {
Serial.write(BT.read());
received = true;
}
if (received) {
received = false;
Serial.println();
}
while (Serial.available())
{
char c = Serial.read();
BT.write(c);
}
}
void InitializeBluetooth() {
GetBtVersion();
//Uninitialized
if (btVersion == 0xFF)
FindBtModule();
//Clear outgoing buffer
BT.flush();
//Clear incoming buffer
BtDataAvailable();
}
bool FindBtModule() {
Serial.println(F("BT Init"));
delay(BT_Cmd_Delay);
//First try with CarriageReturn/Linefeed. Otherwise the buffer might be filled with previous value
btVersion = 3;
baud = BtFindCurrentBaud();
//Change Version to use delay(1000) without linebreak
if (baud == 0L) {
btVersion = 0;
baud = BtFindCurrentBaud();
}
//Nothing found
if (baud == 0L) {
//Reset Version to uninitialized
btVersion = 0xff;
baud = BT_BaudFallback;
//Try with default value
BT.begin(baud);
Serial.println(F("BaudNotFound"));
return false;
}
//Get Version to use lineend or delay
if (BtGetVersion())
SetBtVersion();
//Clear incoming Buffer
BtDataAvailable();
//Baud not 57000
if (baud != BT_Baud)
if (!ChangeBtBaud()) {
Serial.println(F("BaudNotChanged"));
//Stay with found baud or default value
if (baud == 0L)
baud = BT_BaudFallback;
BT.begin(baud);
return false;
}
baud = BT_Baud;
BT.begin(baud);
return true;
}
long BtFindCurrentBaud() {
static const long rates[] = { 4800, 9600, 19200, 38400, 57600, 115200 };
uint8_t numRates = sizeof(rates) / sizeof(long); //6
//start with highest baud, to not buffer crap into HC-06
//for (int rn = 0; rn < numRates; rn++) {
for (int rn = numRates - 1; rn >= 0 ; rn--) {
BT.begin(rates[rn]);
BtDataAvailable();
delay(200);
PrintBtAt();
BT.flush();
if (btVersion >= 3)
delay(100);
else
delay(BT_Cmd_Delay); //No Linefeed, but 1Sec idle
if (BtDataAvailable())
return rates[rn];
}
return 0L;
}
// AT+BAUD<X> -> OK<X>
// X=4 : 9600bps (Default)
// X=6 : 38400bps
// X=7 : 57600bps
// X=8 : 115200bps
bool ChangeBtBaud() {
Serial.println(F("BT ChangeBaud"));
if (btVersion < 3)
BT.print(F("AT+BAUD7"));
if (btVersion == 3)
BT.println(F("AT+UART=57600,0,0"));
if (btVersion > 3)
BT.println(F("AT+BAUD7"));
delay(BT_Cmd_Delay);
return BtDataAvailable();
}
void PrintBtAt() {
if (btVersion >= 3)
BT.println(F("AT"));
else
BT.print(F("AT"));
}
bool BtDataAvailable() {
if (BT.available()) {
//Read what´s on the buffer
while (BT.available())
BT.read();
return true;
}
return false;
}
bool BtGetVersion() {
if (btVersion != 0xFF)
return BtGetVersion(btVersion >= 3);
if (BtGetVersion(true))
return true;
delay(BT_Cmd_Delay);
return BtGetVersion(false);
}
bool BtGetVersion(bool linebreak) {
BT.print(F("AT+VERSION"));
if (linebreak) {
BT.println();
delay(200);
}
else
delay(BT_Cmd_Delay);
char input[40];
uint8_t j = 0;
while (BT.available()) {
if (j < sizeof(input))
input[j++] = BT.read();
else
BT.read();
//0 HC-06-20190901
//1 ZS-040 (DX_smartv2.0)
//2 FC-114 (hc01.comV2)
//3 1744 (VERSION:3.0-20170609)
//4 ZS-40 (Firmware V3.0.6,Bluetooth V4.0 LE)
//4 BT05 (+VERSION=Firmware V3.0.6,Bluetooth V4.0 LE)
if (input[0] == 'O' && input[1] == 'K') {
btVersion = 1;
return true;
}
if (input[0] == 'D' && input[1] == 'X') {
btVersion = 1;
return true;
}
if (input[8] == 'V' && input[9] == '2') {
btVersion = 2;
return true;
}
if (input[0] == 'H' && input[1] == 'C') {
btVersion = 0;
return true;
}
if (input[8] == '3' && input[10] == '0') {
btVersion = 3;
return true;
}
if (input[10] == '3' && input[27] == '4') {
btVersion = 4;
return true;
}
if (input[19] == '3' && input[36] == '4') {
btVersion = 4;
return true;
}
}
if (j > sizeof(input) - 1)
j = sizeof(input) - 1;
input[j] = '\0';
Serial.println(F("VersionNotFound"));
return false;
}
void GetBtVersion() {
//ToDo: get version from EEPROM
}
void SetBtVersion() {
//ToDo: store version to EEPROM
}
Te saluda y dice que es un copy & paste de su código y que tienes que usarlo tal como esta. El código compila y espera que te sirva.
El código encuentra la versión en uso, la velocidad de comunicación, etc, etc.
Creo que deberías probarlo @cas6678 .