Problema conectando 2 módulos HC-05

Hola. Vengo con un problema a la hora de enviar datos con un HC-05 maestro. La idea es controlar un servomotor (dispositivo esclavo) a través de un joystick desde otro Arduino por bluetooth (maestro).

El código que adjunto es algo más simple del que usaré, lo reduje así para probar dado que no funciona.

Creo que el problema es del que lo envía porque si me conecto al esclavo desde el móvil puedo mandar datos por el terminal sin problemas. Probé con otro módulo maestro por si ese fuera el problema, pero sigo sin poder enviarlos. Ambos módulos parpadean a la par al rato de arrancar por lo que imagino están sincronizados. Además, ya revisé en la configuración que el nombre, contraseña, si es esclavo/maestro... sea correcto y lo es.

Tan solo me queda pensar que el código no es correcto. ¿Sabéis qué puedo tener mal?

Por cierto, aunque en el esquema diga HC-06 es un HC-05. No aparece el joystick, pero está conectado al maestro al GND, 5v y a A1 (comprobé que leyera datos y los lee).

Muchas gracias a todos de antemano.

ARDUINO ESCLAVO:

#include <SoftwareSerial.h>


void setup() {

  Serial.begin(38400);

}

void loop() {

  if(Serial.available()){
    lectura=Serial.parseInt();
    //Aquí he probado también con lectura=Serial.read();
    Serial.println(lectura);
  }

}

ARDUINO MAESTRO

#include <SoftwareSerial.h>

#define joystickGiro A1

int lecturaGiro;
int giro;


void setup() {

  Serial.begin(38400);

}

void loop() {

  lecturaGiro=analogRead(joystickGiro);
  giro=map(lecturaGiro,0,1023,15,165);

  Serial.print(String (giro));
  //Aquí he probado con:
  //Serial.print(String (giro));
  //Serial.write(String (giro));
  //Serial.print(int(giro));
  //Serial.write(int (giro));
  //Serial.print(giro);
  //Serial.write(giro);

  delay(100);

}

Serial.begin(38400);

Seteaste la velocidad de los módulos a 38400?
Porque por defecto están a 9600 en modo normal (38400 es para modo AT)

En los videos que he estado viendo buscando soluciones lo tenían así y lo cambié desde el AT, ¿lo pongo de nuevo a 9600?

Si seteaste el módulo a 38400 (o sea usaste el comando AT para cambiar la velocidad) está bien así, pero si no la cambiaste, por defecto está a 9600.

En todo caso probá cambiar el serial a 9600 y lo confirmas.

Encontré la solución. Adjunto el código final por si alguien ha leído el post y tiene curiosidad. El maestro controla la velocidad del ventilador que va subido en el servomotor del esclavo (es para una lancha teledirigida).

ESCLAVO

#include<Servo.h>
#include<SoftwareSerial.h>

//Motor 
#define IN1 9
#define IN2 10
#define ENA 11

Servo myServo;

int x;
int g=90;


void setup() {
  
  Serial.begin(38400);

  Serial.println("Barco encendido.");

  myServo.attach(3);

  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  myServo.write(g);

}


void loop() {   

  if(Serial.available()){

    if(Serial.read()=='A'){    

      g=Serial.parseInt();
      Serial.print("Giro: ");
      myServo.write(g);
      Serial.println(g);

    }

    if(Serial.read()=='B'){   

      x=Serial.parseInt();
      Serial.print("Velocidad: ");

      if(x>0){
        digitalWrite (IN1, HIGH);
        digitalWrite (IN2, LOW);
        analogWrite (ENA, x);
        Serial.println(x);
      }

      if(x<0){
        x=-x;
        digitalWrite (IN1, LOW);
        digitalWrite (IN2, HIGH);
        analogWrite (ENA, x);
        Serial.println(x);
      }

      if(x==0){
        digitalWrite (IN1, LOW);
        digitalWrite (IN2, LOW);
        analogWrite (ENA, x);
        Serial.println(x);
      }

    }

  }

}

MAESTRO

#include<SoftwareSerial.h>

#define joystickVelocidad A0
#define joystickGiro A1

int lecturaVelocidad;
int velocidad;
int lecturaGiro;
int giro;

void setup() {

  Serial.begin(38400);

}

void loop() {  

  lecturaGiro=analogRead(joystickGiro); 
  giro=map(lecturaGiro,0,1023,40,140);

  lecturaVelocidad=analogRead(joystickVelocidad); 
  velocidad=map(lecturaVelocidad,0,1023,-255,255); 

  if(velocidad<=20 && velocidad>=-20){
    velocidad=0;
  }

  if(giro<=110 && giro>=70){
    giro=90;
  }

  Serial.print("A");
  Serial.print(giro);

  Serial.print("B");
  Serial.print(velocidad);

  delay(100);

}

Pero al final cuál fue el problema?

Adjunto la parte del código que me ha solucionado el problema. Tanto en el esclavo como en el maestro la parte del código está en el loop por si quieres localizarla en el código completo corregido que dejo más abajo.

RESUMEN del código que NO me funciona:

//ESCLAVO
if(Serial.available()){
    lectura=Serial.parseInt();
  }

//MAESTRO
Serial.print(String (giro));

RESUMEN del código que SI me funciona:

//ESCLAVO
if(Serial.available()){
    if(Serial.read()=='A'){    
      g=Serial.parseInt();
      Serial.print("Giro: ");
      myServo.write(g);
      Serial.println(g);
    }
}

//MAESTRO
Serial.print("A");
  Serial.print(giro);
delay(10);

Código completo del esclavo:

#include<Servo.h>
#include<SoftwareSerial.h>

//Motor 
#define IN1 9
#define IN2 10
#define ENA 11

Servo myServo;

int x;
int g=90;


void setup() {
  
  Serial.begin(38400);

  Serial.println("Barco encendido.");

  myServo.attach(3);

  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  myServo.write(g);

}


void loop() {   

  if(Serial.available()){

    if(Serial.read()=='A'){    

      g=Serial.parseInt();
      Serial.print("Giro: ");
      myServo.write(g);
      Serial.println(g);

    }

    if(Serial.read()=='B'){   

      x=Serial.parseInt();
      Serial.print("Velocidad: ");

      if(x>0){
        digitalWrite (IN1, HIGH);
        digitalWrite (IN2, LOW);
        analogWrite (ENA, x);
        Serial.println(x);
      }

      if(x<0){
        x=-x;
        digitalWrite (IN1, LOW);
        digitalWrite (IN2, HIGH);
        analogWrite (ENA, x);
        Serial.println(x);
      }

      if(x==0){
        digitalWrite (IN1, LOW);
        digitalWrite (IN2, LOW);
        analogWrite (ENA, x);
        Serial.println(x);
      }

    }

  }

}

Código completo del maestro:

#include<SoftwareSerial.h>

#define joystickVelocidad A0
#define joystickGiro A1

int lecturaVelocidad;
int velocidad;
int lecturaGiro;
int giro;

void setup() {

  Serial.begin(38400);

}

void loop() {  

  lecturaGiro=analogRead(joystickGiro); 
  giro=map(lecturaGiro,0,1023,40,140);

  lecturaVelocidad=analogRead(joystickVelocidad); 
  velocidad=map(lecturaVelocidad,0,1023,-255,255); 

  if(velocidad<=20 && velocidad>=-20){
    velocidad=0;
  }

  if(giro<=110 && giro>=70){
    giro=90;
  }

  Serial.print("A");
  Serial.print(giro);

  Serial.print("B");
  Serial.print(velocidad);

  delay(100);

}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.