miércoles, 24 de octubre de 2012

Progreso 18-21 Octubre (Control RC -Tx - fabricación y prueba)

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.

Después de buscar encontré que el método usado es comparar el mensaje recibido con la lista de las posibilidades y de ahí usar algún condicional (yo he usado inicialmente el if)

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)




Después de los gajes del oficio..de falsos contactos, un crystal dañado, algún puente incorrecto o mala conexión, Perduino Maturana/Navaja v.2.0 salio al ruedo!


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