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:
- Enciendo el sistema y el bluetooth se pone en espera (la luz parpadea)
- Emparejo el teléfono (la luz es continua)
- Envío la orden de avanzar el motor
- 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);
}