Problemas con Adafruit Motor Shield y Bluetooth HC-06

Hola a todos.

Estoy realizando un proyecto que consiste en un carril para macrofotografía controlado por Bluetooth. Para el proyecto, utilizo un arduino uno, el adafruit motor shield, para controlar un Nema17, y el HC-06.

Las conexiones del HC-06 son:

HC-06 Arduino
RX ------> TX (cable marrón)
TX ------> RX (cable rojo)
GND ----> GND (cable negro)
5V ------> Pin 11 (cable blanco)

La razón por la que alimento el HC-06 por un pin es por que si lo hacia directamente por el pin de los 5V de arduino, cada vez que tenía que actualizar el código me decía que el puerto estaba ocupado y tenía que desconectar el bluetooth.

Las pruebas las hago por el puerto USB del arduino pero el problema también lo tengo si alimento el sistema con una Lipo de 7.4V.

El montaje funciona si pruebo el motor y el bluetooth por separado. Es decir, si modifico el código para que sólo avance y retroceda sin tener en cuenta el bluetooth, funciona sin problemas y si modifico el código para que sólo lea la información recibida por bluetooth, me la muestra corractamente. Pero si quiero que el motor avance o retroceda en función de una orden enviada por bluetooth, falla el bluetooth se apaga del todo o, en el mejor de los casos, se desvincula del teléfono.

La secuencia de lo que sucede es la siguiente:

  1. Enciendo el sistema y el bluetooth se pone en espera (la luz parpadea)
  2. Emparejo el teléfono (la luz es continua)
  3. Envío la orden de avanzar el motor
  4. El motor avanza pero el bluetooh se apaga!!!.

Aquí lo podeis ver en video:

Le he estado dando vueltas y mirando los muchos tutoriales que existen sobre el control de motores por bluetooth pero no doy con la solución.

¿Que estoy haciendo mal? Gracias por la ayuda.

Este es el código fuente que estoy utilizando:

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

const char nameBT[10] = "MACROBT";
const char bpsBT = '4'; // 9600 bps
const char pinBT[5] = "0000";

const int RAIL = 50;        // mm
const float M8STEP = 0.04;  // mm
const int MOTORSTEPS = 200; // units

int pinBTPWR = 11;
int pinPHOTO = 7;

int currentPhoto;
int maxPhotos;
int steps;

bool bRun;

char blueToothVal;           //value sent over via bluetooth
char lastValue;              //stores last state of device (on/off)

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

void setup() {
  pinMode(pinBTPWR, OUTPUT);
  pinMode(pinPHOTO, OUTPUT);

  digitalWrite(pinBTPWR, HIGH);

  Serial.begin(9600);

  Serial.print("AT");
  delay(1000);

  Serial.print("AT+NAME");
  Serial.print(nameBT);
  delay(1000);

  Serial.print("AT+BAUD");
  Serial.print(bpsBT);
  delay(1000);

  //Serial.print("AT+PIN");
  //Serial.print(pinBT);
  //delay(1000);

  bRun = true;

  currentPhoto = 0;
  maxPhotos = 200;
  steps = 20;

  AFMS.begin();
  myMotor->setSpeed(10);  // RPM
}

void loop() {
  if (Serial.available()) {
    blueToothVal = Serial.read();
  }

  if (blueToothVal == 'b') {
    if (lastValue != 'b') Serial.println(F("Backward"));
    moveBackward(steps);
    lastValue = blueToothVal;
  }
  else if (blueToothVal == 'f') {
    if (lastValue != 'f') Serial.println(F("Forward"));
    moveForward(steps);
    lastValue = blueToothVal;
  }

  blueToothVal = 0;
  
  delay(1000);


  /*
    if (currentPhoto < maxPhotos && bRun) {
    moveForward(steps);
    takePhoto();
    currentPhoto++;
    }
    else {
    if (bRun) {
      moveBackward(maxPhotos * steps);
      currentPhoto = 0;
      bRun = false;
      myMotor->release();
    }
    }
  */
}

void moveForward(int steps) {
  myMotor->step(steps, FORWARD, MICROSTEP);
}

void moveBackward(int steps) {
  myMotor->step(steps, BACKWARD, MICROSTEP);
}

void takePhoto() {
  delay(1000);
  digitalWrite(pinPHOTO, HIGH);
  delay(1000);
  digitalWrite(pinPHOTO, LOW);
  delay(1000);
}

Aunque puede que no sea la solucion a tu problema ,alimentar el hc-06 por un pin digital no es buena idea por la poca corriente que suministran.Alimenta el hc-06 con los 5v del arduino y o bien a la hora de programar la placa simplemente quitas el cable de alimentacion del hc-06,por ejemplo el que te acabo de comentar que viene de 5v para que no interfiera con el puerto serial,o si te sobran un par de pines ,define un serial por sofware con la libreria SoftwareSerial para no usar el puerto serial hardware en los pines 0 y 1.Se da por hecho que alimentas el motor con una fuente externa.....

Yo no veo fuente externa a riesgo de equivocarme por supuesto y creo que ese es el problema.

Hola.

jose:
Aunque puede que no sea la solucion a tu problema ,alimentar el hc-06 por un pin digital no es buena idea por la poca corriente que suministran.Alimenta el hc-06 con los 5v del arduino y o bien a la hora de programar la placa simplemente quitas el cable de alimentacion del hc-06,por ejemplo el que te acabo de comentar que viene de 5v para que no interfiera con el puerto serial,o si te sobran un par de pines ,define un serial por sofware con la libreria SoftwareSerial para no usar el puerto serial hardware en los pines 0 y 1.Se da por hecho que alimentas el motor con una fuente externa.....

Si no muevo el motor y sólo muestro información por la consola, el HC-06 no da ningún problema por estar alimentado por el pin. De todas maneras, he alimentado el HC-06 por el pin de los 5V y la única diferencia es que cuando doy la orden para mover el motor, el HC-06 no se apaga. Sólo se desvincula del teléfono.

surbyte:
Yo no veo fuente externa a riesgo de equivocarme por supuesto y creo que ese es el problema.

Si las órdenes para mover el motor las programo directamente desde el código, el motor funciona sin problema ya sea alimentando el sistema por USB o con una LIPO 2S. El problema lo tengo cuando trabajan a la vez el HC-06 y el motor.

Gracias por las sugerencias.

no me queda claro si lo has probado alimentando con la lipo directamente la adafruit para los motores con el jumper para separar alimentacion de motores de la alimentacion de la logica.

Sólo utilizo una fuente de alimentación (USB o LiPo). No utilizo una fuente separada para el motor.

A ver si nos entendemos,una bateria es una fuente externa en este caso,y me referia a quitar el jumper VIN de la adafruit y conectar la bateria en la regleta power justo abajo,el bluetooth a los 5v del arduino.El arduino se alimentara por el cable usb .prueba a ver.

Hola de nuevo.

Al final he dado con la solución. Por lo visto, utilizar los pines RX/TX del arduino con el motor shield de Adafruit da algún problema. He cambiado los pines Rx y TX al 3 y 4 el HC-06 lo alimento por los 5V del arduino (en vez de por el pin 11) y con la libreria SerialSofware todo funciona.

Gracias por todo.