Buenas tardes.
En un trabajo de una asignatura nos piden que hagamos un proyecto con arduino y decidimos realizar un coche teledirigido.
Estamos usando un transmisor FS1000A y un receptor XD-RF.
El objetivo es el siguiente: Un arduino (emisor) envía una señal a partir de la lectura de un jostic, y el otro arduino (receptor) activa el motor de corriente continua a través de un puente en H para que gire hacia delante o hacia atrás.
La comunicación la realizamos empleando la librería RCswitch
Lo hacemos de la siguiente manera:
-
El arduino emisor lee la entrada de un jostick, la guarda como movdelante, la convierte a un rango de valores de 0 a 100 y la envía.
-
El arduino receptor recibe esta señal, la guarda en una variable llamada igual, movdelante y, si el valor de esta variable es mayor a 55, se activan las puertas de los transistores correspondientes para que le motor gire hacia delante, si es menor a 45, se activan las puertas de los transistores de forma que la corriente circule en sentido inverso por el motor y circule hacia atrás, y si la variable está entre esos dos valores, no haga nada.
Las comprobaciones que realizamos fueron las siguientes:
- La primera, solamente tratábamos de mover el motor al leer el jostick, trabajando solo con un arduino y nos funcionó bien.
- La segunda, trabajando con dos arduinos, enviamos una señal desde el arduino emisor, y el arduino receptor la muestra en pantalla. También funcionó.
- La tercera, leemos el jostick en el arduino emisor, la enviamos, y el arduino emisor la muestra en pantalla. También funciona.
El problema surge cuando conectamos el motor al circuito del arduino receptor. En este caso parece que el sistema se bloquea ya que, tras recibir la primera señal y entrar dentro del bucle if correspondiente (dependiendo si es menor a 45, mayor a 55, o estáen ese rango de valores), no reacciona frente a variaciones de la señal leída del jostick. Y siempre se queda dentro de ese bucle. Por ejemplo, para que se entienda mejor por si no me expliqué bien, supongamos que la primera señal que recibe es mayor a 55, lo que hace que se mueva hacia delante. Y realmente hace eso, se empieza a mover hacia delante, pero hasta el infinito. Solo se desbloquea si dejamos de alimentar el motor, es decir, la corriente que circula por los transistores se hace cero.
Pienso que le problema puede estar en el apagado de los transistores, pero lo raro es que la prueba número 1) de las enumeradas anteriormente no daba error....
Adjunto el código para los dos arduinos, tanto para el emisor como para el receptor
ARDUINO EMISOR:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
mySwitch.enableTransmit(6); /Conectamos el pin ATAD del emisor FS1000A al pin 6/
}
void loop() {
// put your main code here, to run repeatedly:
float movdelante= analogRead(A3); /Lee la entrada A3, analogica, y la convierte en un valor entre 0 y 1023 (10 bits)/
/* El pin VRy del jostic lo conectamos al pin de entrada A3*/
movdelante=map(movdelante, 0, 1024, 0, 100);
mySwitch.send(movdelante,8);
delay(200);
}
ARDUNIO RECEPTOR
#include <RCSwitch.h>
RCSwitch myRF = RCSwitch();
int delante =3; /*conexión de la puerta de los transistores, pines 3 y 4 */
int atras =4;
float movdelante;
int mover;
void setup() {
// put your setup code here, to run once:
myRF.enableReceive(0); /* ponemos 0 pero es pin 2 de arduino*/
pinMode(delante, OUTPUT); /Configuro el pin 3 como salida/
pinMode(atras, OUTPUT); /Configuramos el pin 4 como salida/
Serial.begin (9600);
digitalWrite(delante, LOW);
digitalWrite(atras,HIGH);
void loop() {
// put your main code here, to run repeatedly:
movdelante=myRF.getReceivedValue();
Serial.println(movdelante);
if ( movdelante>55)
{
digitalWrite(delante, HIGH);
digitalWrite(atras,LOW);
}
else if (movdelante<45)
{
digitalWrite(delante, LOW);
digitalWrite(atras,HIGH);
}
else if (movdelante>=45 && movdelante<=55)
{
digitalWrite(delante,LOW);
digitalWrite(atras,LOW);
}
myRF.resetAvailable(); /* retraso 200 ms entre la lectura de la variable y la posterior orden de encendido al led, y la siguiente lectura*/
delay(200);
}
Espero que alguien pueda ayudarme. Gracias de antemano!!