Vamos bien!!
Este fue un fincho de poco trabajo pero de mucho avance, me tomé más tiempo para estar con mi esposa e hijo y hasta tarde de asado tuvimos!
hablando del proyecto, era hora de materializar el progreso que había tenido en el uso de los módulos, ya podía utilizarlos, pero tocaba ver como mandaba información útil del uno al otro, y eso era mandar los datos de los 2 joysticks del emisor al transmisor.
ya que la librería virtualwire los mensajes enviados son caracteres (tipo char) y por ejemplos que encontré en la web, lo mejor era usar letras en vez de palabras, esto también lo comprobé en la practica, ya que muchas veces el mensaje no se entregaba completo. Inicialmente probé con un solo stick, busqué como usar lo que se recibe (Rx) para correr mi programa inicialmente y hacer lo básico con esto.
Con esta función se compara la cadena entrante:
if(strcmp(
Realice pruebas las correspondientes, inicialmente escribiendo en a través del puerto serial del receptor la dirección accionada en el transmisor y de esto pase a activar 4 LEDs, igualmente, de acuerdo a la transmitido (Avanzar, retroceder, izquierda y derecha)
Cuando todo era solo alegría llegó lo impensable, perfduino...murió! bueno.. solamente el cuerpo, probé el chip en mi Arduino uno, y estaba bien) no encontré la falla en el circuito y es que esto ocurrió cuando atornillaba la perfboard a una caja plástica para que le sirviera de cuerpo, así que posiblemente se rompió alguna conexión o algún puente quedo aislado, y como ya tenía pensado hacerle unas modificaciones..pues eso se hizo.
El bulto negro, es la batería 9V, la cual sufrió alguna vez de recalentamiento y se deformó la carcaza |
Acá debo resaltar la labor de mi mejor amigo y colaborador (Jair Navaja) quien me ayudó a fabricar un nuevo circuito, esta vez incluyendo una base para la batería y cambiando el push button de 5 mm a uno de 12 mm, con lo que se facilita el resetado y el cargue de sketches, en fin.. ya estando en estas decidí armar de una vez el control remoto (Jair realizó toda la "carpinteria" según mi esbozo)
Se terminó de armar ya el Domingo por la tarde; después de asado y de las cervecitas, realizamos las pruebas:
Esquemas de montajes (Tx/Rx):
Código Transmisor (Tx)
//Tx_RC_V1_2.pde
//Selwins Daniel Maturana
// Módulo transmisor RF link 315Mhz
// utilizando VirtualWire.h de mikem@open.com.au
// Octubre 2012
#include <VirtualWire.h>
int pot1 = A4; //joystick avance
int pot2 = A5; //joystick dirección
int sent;
int dir;
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
}
void loop()
{
const char *msg = "X";
const char *msg2 = "Y";
dir = analogRead(pot1);
dir = map(dir,0,1023,0,255);
Serial.print("direccion: ");
Serial.println(dir);
delay(1000);
if (dir > 135){
msg = "A";
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();}
else if (dir < 117){
msg = "R";
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();}
else{
msg = "S";
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();}
sent = analogRead(pot2);
sent = map(sent,0,1023,0,255);
Serial.print("sentido: ");
Serial.println(sent);
delay(1000);
if (sent > 127){
msg2 = "D";
vw_send((uint8_t *)msg2, strlen(msg2));
vw_wait_tx();}
else if (sent < 117){
msg2 = "I";
vw_send((uint8_t *)msg2, strlen(msg2));
vw_wait_tx();}
else
{ msg2 = "C";
vw_send((uint8_t *)msg2, strlen(msg2));
vw_wait_tx();}
}
Código Receptor (Rx):
// Sketch creado por Selwins Maturana utilizando VirtualWire.h de mikem@open.com.au
// y conocimiento de arduino forums
#include <VirtualWire.h>
int av = 2;// bombillo superior
int ret = 5;//bombillo inferior
int izq = 3;//bombillo izquierda
int der = 4;//bombillo derecha
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
pinMode (av, OUTPUT);
pinMode (ret, OUTPUT);
pinMode (izq, OUTPUT);
pinMode (der, OUTPUT);
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");
for (i = 0; i < buflen; i++)
{
Serial.print((char)buf[i]); // para checkear en el puerto serial lo que se esta recibiendo, en código ASCII
Serial.print(" ");
}
Serial.println("");
digitalWrite(13, false);
if(strcmp((char *)buf,"A")==0){ // mensaje adelante
digitalWrite(ret, LOW);
digitalWrite(av, HIGH);
delay(50);}
if (strcmp((char *)buf, "R") == 0){// mensaje retroceso
digitalWrite(av, LOW);
digitalWrite(ret, HIGH);
delay(50);}
if (strcmp((char *)buf, "S") == 0){// mensaje stick derecho, en el centro, STOP
digitalWrite(ret, LOW);
digitalWrite(av, LOW);}
if(strcmp((char *)buf,"I")==0) {//mensaje izquieda
digitalWrite(der, LOW);
digitalWrite(izq, HIGH);
delay(50);}
if (strcmp((char *)buf,"D") == 0){//mensaje derecha
digitalWrite(izq, LOW);
digitalWrite(der, HIGH);
delay(50);}
if (strcmp((char *)buf, "C") == 0){// mensaje stick izquierdo,en el centro, CENTRADO
digitalWrite(izq, LOW);
digitalWrite(der, LOW);}
}
}
Videooooo:
Conclusiones y tareas:
- Realmente son fáciles de usar los módulos RF, aparte de ecónomicos.
- Ya para el transmisor esta concluido el desarrollo, esta montado y el sketch corre bien, ya en el futuro sería pensar incluir alguna función extra, como botones para encender luces (delanteras, stop) o modificar el sistema de velocidad con la inclusión de un potenciometro para regular la señal del pin "enable" del L293D
- Debo mejorar la forma de recepción, esta esta retrasada por un par de segundos, intuyo que deben ser los delay incluidos (sobre todo para la lectura e impesion vía puerto serial)
- Para acoplar todas las funciones debo optimizar el sketch del receptor y crear funciones propias para cada parte (dirección y avance)
- Probar el alcance real de los módulos (prueba de campo)
- Estoy por fabricar otro Arduino compatible (hecho en baquelita, "PCB") para el receptor, la duda es si el motor drive lo hago en una sola placa con el Arduino o lo hago tipo shield.
No hay comentarios:
Publicar un comentario