Extraño problema con el módulo Bluetooth JY-MCU (HC-06)

Breve explicación: los datos enviados por el serial bluetooth no llegan correctamente al Arduino.

Ayer conecté un módulo bluetooth JY-MCU a mi Arduino UNO R3 para probarlo. Conecté los pines TXD y RXD a los pines 10 y 11 de Arduino respectivamente y usé SoftSerial para comunicarme. Primero probé algunos comandos AT que encontré en línea. Después de ATregresar OK, ejecuté el código que se encuentra aquí y obtuve este resultado:

Starting config
OK
OKlinvorV1.6


OK57600
Done!

Entonces, el cambio de nombre y pin falló, pero (supuestamente) cambié la velocidad en baudios con éxito. Sin embargo, cualquier otro intento de ejecutar cualquier comando AT falló (sin salida), incluso cuando configuré la nueva velocidad en baudios (57600) en el módem de software. Luego traté de emparejarlo con mi PC y usé el siguiente código para probar:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11);

void setup() {
  Serial.begin(9600);
  mySerial.begin(57600);
  delay(1000);
}

void waitForResponse() {
    if (mySerial.available()) {
      while (mySerial.available()) {
        int a = mySerial.read();
        Serial.println(a);
      }
      Serial.write("\n");
    }
}

void loop() {
  waitForResponse();
  delay(2000);
}

En resumen, espero a que el módulo reciba algo y luego imprimo el valor de cada byte. Lo extraño es que los datos que envío (usando cutecom en la PC) simplemente no son correctos; por ejemplo, enviar la letra A (ya sea en minúsculas o mayúsculas) genera el número 161. Sin embargo, enviar dos letras A genera los números 161 y 176. a pesar de que son la misma letra. Tengo muy poca experiencia con la comunicación en serie, pero parece que la velocidad en baudios no es correcta. Sin embargo, si este es el caso, no sé cómo cambiar la tasa de baudios a 9600 ya que ya no puedo enviar comandos AT al módulo.

Cualquier ayuda sobre cómo hacer que el módulo funcione correctamente o al menos una explicación sobre lo que está sucediendo aquí es más que apreciada.

Sugeriría conectar el HC-06 directamente a su PC a través de un cable FT232 / PL2303, etc. para configurar y probar. No te equivoques con el SoftwareSerial de Arduino: SS nunca es una buena idea a menos que realmente no tengas otra opción; especialmente a velocidades de transmisión más altas. También tenga en cuenta que el HC-06 solo responderá a los comandos AT cuando no esté emparejado con su PC.

Respuestas (1)

La tasa de baudios 57600 es bastante marginal en un AVR (el microcontrolador utilizado) a 16 MHz, normalmente está bien con solo un poco más del 2% de error, pero algunos módulos pueden ser exigentes. La Calculadora de tasa de baudios AVR del sitio WormFood muestra algunas buenas tablas sobre porcentajes de error para varias combinaciones de reloj/tasa de baudios.

También acabo de notar el comentario de Majenko y tiene toda la razón, la serie de software que está usando será peor a esa velocidad, así que para empezar, intente usar un UART de hardware.

Ese Arduino funciona a niveles lógicos de 5 V, por lo que si no está utilizando un divisor de voltaje para bajar la línea de transmisión a 3,3 V, podría valer la pena intentarlo primero. He leído algunas cosas contradictorias sobre si los módulos HC son tolerantes a 5 V en las líneas seriales o no y ciertamente no hará ningún daño intentarlo primero para ver si lo resuelve.

Pero si ninguno de esos pasos funciona, recomendaría obtener un convertidor serial USB a TTL, parece que para ese módulo debería buscar uno con un nivel lógico de 3.3 V como este para Sparkfun. También son útiles para muchas otras cosas, por lo que generalmente es útil tenerlos a su disposición.

Gracias: un USB a TTL funcionó bien y logré devolver la velocidad de transmisión a 9600, por lo que ahora funciona bien. Sin embargo, solo para estar seguro, me gustaría bajar el voltaje en la salida de Arduino. Sé cómo armar un divisor de voltaje, pero ¿cuál debería ser la resistencia? Supongo que debería ser alto ya que la carga de salida probablemente sea muy baja, pero no sé cómo determinar la resistencia real.