Buenas tardes, lo primero me presento, me llamo Guillermo y estoy intentando hacer un proyecto de coche teledirigido por bluetooth con una placa UNO y un HC-06.
El problema que tengo es que no consigo que el arduino me lea las cadenas de números que le mando desde android.
Si hago un bucle que lee el puerto serie e imprime directamente el caracter leido, lo veo bien en el monitor, pero cuando intento agrupar esos caracteres para convertirlos en un entero no hay forma de que lo vea en el monitor (Y tampoco me activa las salidas, ni el pin de activar motor ni el PWM de la velocidad).
La secuencia de la cadena enviada desde android serían 8 caracteres; el primero me indica la dirección (1=adelante o 2=atrás), los tres siguientes la velocidad (de 000 a 100 mapeados hasta 255), el siguiente la dirección de giro (3=izquierda o 4=derecha), y los tres últimos sería el diferencial de velocidad entre los motores para conseguir un giro más suave o más brusco (de 000 a 100 mapeados hasta 255 también).
Seguro que tengo alguna variable declarada que no estoy utilizando, pero es que el código lo he reescrito ya varias veces de distintas formas y bucles, y seguro que me queda algo que no he borrado.
Muchas gracias por vuestro tiempo.
#include <SoftwareSerial.h>
SoftwareSerial BT1 ( 2 , 3 ) ;
String Datosleidos ;
int PinDerFow = 8 ; // Pin activación motor derecho adelante
int PinDerRev = 9 ; // Pin activación motor derecho atras10
int PinIzqFow = 10 ; // Pin activación motor izquierdo adelante
int PinIzqRev = 11 ; // Pin activación motor izquierdo atras
int PinVelder = 5 ; // Pin PWM control motor derecho
int PinVelizq = 6 ; // Pin PWM control motor izquierdo
int Dir ; // Variable que indica la dirección del coche 1=adelante 2=atrás
int Vel ; // Variable de control de velocidad
int Gir ; // Variable que indica la direción de giro 3=izquierda 4=derecha
int Difgir ; // Diferencial de velocidad de los motores para el giro
int VelDif ; // Calculo de la velocidad diferencial de giro
String Direccion ; // Subcadena para la variable Dir
String VelDireccion ; // Subcadena para la variable Vel
String Giro ; // Subcadena para la variable Gir
String DifGiro ; // Subcadena para la variable Difgir
void setup () {
Serial.begin ( 9600 ) ;
BT1.begin ( 9600 ) ;
pinMode ( PinVelder , OUTPUT ) ;
pinMode ( PinVelizq , OUTPUT ) ;
pinMode ( PinDerFow, OUTPUT ) ;
pinMode ( PinDerRev, OUTPUT ) ;
pinMode ( PinIzqFow, OUTPUT ) ;
pinMode ( PinIzqRev, OUTPUT ) ;
}
void loop () {
while ( BT1.available () ) {
//delay ( 10 ) ;
if ( BT1.available () > 0 ) {
char S = BT1.read () ;
Serial.println (S);
Datosleidos += S ;
if ( Datosleidos.length () == 8 ) {
Direccion = Datosleidos.substring (0 , 1) ;
Dir = Direccion.toInt () ;
VelDireccion = Datosleidos.substring ( 1, 4 ) ;
Vel = VelDireccion.toInt () ;
Giro = Datosleidos.substring ( 4 , 5 ) ;
Gir = Giro.toInt () ;
DifGiro = Datosleidos.substring ( 5 ) ;
Difgir = (100 - DifGiro.toInt ()) ;
Serial.print (Dir);
Serial.print (Vel);
Serial.print (Gir);
Serial.print (Difgir);
Serial.println (Datosleidos);
}
}
Vel = map ( Vel , 0, 100, 0, 255);
if ( Dir == 1 ) {
digitalWrite (PinDerRev , LOW ) ;
digitalWrite (PinIzqRev, LOW ) ;
digitalWrite (PinDerFow, HIGH ) ;
digitalWrite (PinIzqFow, HIGH ) ;
switch (Gir){
case 3:
analogWrite (PinVelizq , (Vel * Difgir )/ 100) ;
analogWrite (PinVelder , Vel) ;
case 4:
analogWrite (PinVelizq , Vel) ;
analogWrite (PinVelder , (Vel * Difgir )/ 100) ;
}
}
if ( Dir == 2 ) {
digitalWrite (PinDerFow, LOW ) ;
digitalWrite (PinIzqFow, LOW ) ;
digitalWrite (PinDerRev , HIGH ) ;
digitalWrite (PinIzqRev, HIGH ) ;
switch (Gir){
case 3:
analogWrite (PinVelizq , (Vel * Difgir )/ 100) ;
analogWrite (PinVelder , Vel) ;
case 4:
analogWrite (PinVelizq , Vel) ;
analogWrite (PinVelder , (Vel * Difgir )/ 100) ;
}
}
//Serial.println (Datosleidos);
Datosleidos = "" ;
}
}