Hola chicos.
Como podeis ver en la imagen que adjunto tengo parte de mi proyecto terminado, digo parte por que en mi mountainboard yo quiero por una parte dotarle de un servo freno y por la otra montar dos motores electricos pero eso sera en una segunda fase.
Ahora he termidado la parte de frenado la cual es controlada por dos arduinos y un emisor rc tx y otro receptor.
Simplemente lo que hago es enviar la posicion de mi portenciometro en el emisor y cuando es leido por mi repector este posiciona el motor servo que esta unido a las guias de las mordazas de las pastillas de freno actuando sobre los platos de disco, contra mas pulso en mi emisor en el potenciometro de freno mas tensa el servo las guias y las mordazas hacen frenar mas.
En resumen lo que electronicamente hago es comparar el potenciometro de mi emisor con el del receptor y en funcion de como esta posicionado el motor gira a uno u otro lado.
Todo va bien ya lo he probado por alguna cuestecita y perfecto, es jugueton.
Tan solo un fallo y aqui es donde pido ayuda.... cuando pierdo la comunicacion entre emisor y receptor lo que quiero es que si en el receptor se esta ejecutando la orden de giro para que el motor gire mas hasta que compare valor y frene mas, si en ese momento se pierde la comunicacion he notado y comprobado que ahora no puede comparar valor y sigue frenado hasta bloquear las ruedas y esto puede ser peligroso ya que si la velocidad es alta....imaginaros...
Alguna sugerencia de como puedo parar esa orden que se esta ejecutando si en ese momento por el puerto serie se deja de recibir datos ??????.
///CODIGO ARDUINO UNO BRAKE (FRENO ) entrada datos por puerto serie pin 7y recoge datos de arduino FIO salida pin7
#include <VirtualWire.h>
// Programa que solo envía los datos al ordenador cuando la variación en la lectura del sensor es //superior a una diferencia determinado por el varlor delta.
int led4izqui = 5;
int led3derec = 6;
int chaxon = 9;
int bloqueoMotor = 11;
int lucesFreno = 8;
int display7 = 7;
int sensorPOTmotor = 0; // corresponde a la entrada Analog In 3 de la placa
int x = 0;
int y = 0;
int valorPOTmotor = 2;
const int threshold = 70;
const int RX_DIO_Pin = 12;
void setup() {
Serial.begin(9600); // no es necesario declarar el pin como entrada analógica
pinMode (led4izqui, OUTPUT);
pinMode (led3derec, OUTPUT);
pinMode (chaxon, OUTPUT);
pinMode (bloqueoMotor, OUTPUT);
pinMode (lucesFreno, OUTPUT);
pinMode (display7, OUTPUT );
vw_set_rx_pin(RX_DIO_Pin); /* Declara el pin 2 como salida para recibir datos en virtual wire /
vw_setup(2000); / Transmite a 2000 bits por segundo /
/ Enable the receiver */
vw_rx_start();
}
void loop() {
uint8_t Buffer_Size = 8; /* declara el tamaño del array para recibir los datos /
unsigned int Data0; / Declara las variables para el volcado de datos de recepción (unsigned int de 8 bits) /
unsigned int Data1;
unsigned int Data2;
unsigned int Data3;
uint8_t RxBuffer[Buffer_Size]; / declara el array para la recepción de datos /
/ Condicional ¿se ha recibido el mensaje?*/
if (vw_get_message(RxBuffer, &Buffer_Size)) {
Data0 = RxBuffer[0] << 8 | RxBuffer[1];
Data1 = RxBuffer[2] << 8 | RxBuffer[3];
Data2 = RxBuffer[4] << 8 | RxBuffer[5];
Data3 = RxBuffer[6] << 8 | RxBuffer[7];
y = (analogRead(sensorPOTmotor) - threshold);
x = (analogRead(sensorPOTmotor) + threshold);
////////////////////////////////////////////////////////
if (Data2 == 0) { digitalWrite(chaxon, LOW); }
if (Data2 == 1) { digitalWrite(chaxon, HIGH); }
////////////////////////////////////////////////////////
if (Data3 == 0) { digitalWrite(display7, LOW); }
if (Data3 == 1) { digitalWrite(display7, HIGH); }
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
if ( Data0 <= ( y )) {
digitalWrite( led3derec, HIGH);
digitalWrite( bloqueoMotor, HIGH);
} else {
digitalWrite( led3derec, LOW);
digitalWrite( bloqueoMotor, LOW);
}
/////////////////////////////////////////////////////////
if ( Data0 == ( x + y )) {
digitalWrite( bloqueoMotor, LOW);
digitalWrite( led3derec, LOW);
digitalWrite( led4izqui, LOW);
digitalWrite( lucesFreno, LOW);
}
else {
digitalWrite( lucesFreno, HIGH);
}
/////////////////////////////////////////////////////////
if ( Data0 >= ( x ) ) {
digitalWrite( bloqueoMotor, HIGH);
digitalWrite( led4izqui, HIGH);
digitalWrite( led3derec, LOW); }
else {
digitalWrite( led4izqui, LOW);
}
/////////////////////////////////////////////////////////
////////////////////////////////////////////TOPE DE FRENO -- FINAL DE CARRERA DE BRENO//////////
if ( Data0 >= ( 650 ) ) {
digitalWrite( bloqueoMotor, LOW);
digitalWrite( led4izqui, LOW);
digitalWrite( led3derec, LOW);
}
else {
}
{
Serial.print(" data0 ");Serial.print(Data0);
Serial.print(" "); Serial.print(Data1);
Serial.print(" "); Serial.print(Data2);
Serial.print(" "); Serial.print(Data3);
Serial.print(" x = "); Serial.print(x);
Serial.print(" y = "); Serial.println(y);
}
delay (15);
}
}
