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.

viernes, 19 de octubre de 2012

Progreso 4 - 7 Oct (Arduino RF links y avance de Servo homemade) Parte 2-3

Cerebro nuevo para el perfduino:

Tocaba hacer una break en este proyecto, así que el 06 fue día de playa con la family ;)


De regreso me encontré con el atmega328-PU con bootloader, un nuevo puente H (L293D) y un kit de LEDs... pero con el cansancio del día, eso quedó para el día siguiente...

El 07 cambie el integrado al perfduino le conecté el cable FTDI, el cual es un Nokia DKU-50 al cual le soldé unos headers machos y , esto lo saque del blog http://txapuzas.blogspot.com/2010/07/cable-de-programacion-para-arduino-ftdi.html  con la diferencia que ese es con el cable DKU-5, que difiere en la cantidad de cables con el que yo use; revise la distribución de pines (pinout) y solo me queda faltando +VCC (5V) el cual no me afecta mucho (debo tenerlo alimentado con fuente externa)


Se deben descargar los drivers del CD que trae

Cargue un par de sketches con el cable, para comprobar el funcionamiento, todo bien..todo bien como el Pibe!

Perfduino conectado


Comunicación RF link entre Arduinos, prueba de librería virtualwire


Ya anteriormente había probado la funcionalidad de la pareja de Emisor/Receptor ahora tocaba ver si podía hacer que los 2 Arduinos se hablaran, con la la librería virtualwire esto es posible.

Acá descargan la libreria  www.open.com.au/mikem/arduino/ (la última es la 1.9, alguna anteriores ya no funcionan con el IDE actual de Arduino) la deben guardar en la carpeta del programa arduino (librerías)

En esta ocasión probé los ejemplos que trae (emisor y receptor) el cual básicamente uno le dice al otro "hello" y esto se puede ver en el PC ya que el receptor va conectado al puerto serial.


Conexión Receptor


Pin Rx por defecto 11, se puede cambiar con un comando de la librería.
 Conexión Transmisor
PinTx por defecto 12, se puede cambiar con un comando de la librería.

 Fotos de los 2 montajes.

Este es lo que se observa en el receptor conectado vía puerto serial al PC:


no se preocupen por que supuestamente iba a salir "hello" es que el código de recepción esta especificado para mostrar en pantalla los caracteres como código HEX (base 16) esto es:

h = 68, e = 65, l = 6C, l = 6C, o = 6F, si quieren que les salga texto cambian esta línea:

 Serial.print(buf[i], HEX);  


por esta:

  Serial.print((char)buf[i]); // ahora se muestra en la pantall (puerto serial) en ASCII   

Servo casero, avances

Ahora tocaba el turno de avanzar en la dirección, ya que no se cuando llega el servo motor nuevo (de china salió el 15 de Sep y pueden ser hasta 40 días hábiles) seguí experimentando con el moto reductor, después de instalarle el potenciometro y avanzar en el tema de controlarle la velocidad (ya que volví a quemar otro integrado) le puse que recorriera 1 seg, ya que estaba leyendo tarde el valor del potenciometro de retorno y se pasaba un poco los finales de carreras que les puse.


Moto reductor, con potenciometro (100K) acoplado al eje de salida



Esquema de montaje, creado en Fritzing



Código:

 //Programa para control de carro v.1.1, dirección  
 //Selwins Maturana Oct 2012  
 int pot1 = A4; //joystick avance  
 int pot2 = A5; //joystick dirección   
 int enable = 3; //Enable IC L293D - PWM control de velocidad  
 int forward = 6; // Señal para ir hacia adelante  
 int backward = 5; // Señal para ir hacia atrás  
 int rigth = 9; // Señal para ir hacia adelante  
 int left = 7; // Señal para ir hacia atrás  
 int LED = 13; //verificación  
 int dir; //valor pot2 (dirección)  
 int sign;// Señal potenciometro moto reductor  
 void setup(){  
      pinMode(enable, OUTPUT);  
     pinMode(forward, OUTPUT);  
      pinMode(backward, OUTPUT);  
     Serial.begin(9600);  
 }  
 void loop(){  
      dir = analogRead(pot2);  
     sign = analogRead(A3);  
     sign = map(sign, 0,1023, 0, 255);  
     Serial.println(sign);  
     delay(1000);   
     if(dir >= 344 && sign > 105) {  
         digitalWrite(rigth, LOW);  
         analogWrite(enable, 70);  
         digitalWrite(left, HIGH);  
         delay(1000);  
         digitalWrite(left, LOW);  
         delay(10);  
           }  
           else if (dir <= 334 && sign < 127){  
              digitalWrite(left, LOW);  
              analogWrite(enable, 80);  
              digitalWrite(rigth, HIGH);  
              delay(1000);  
              digitalWrite(rigth, LOW);  
              delay(10);  
           }  
             else  
             {                 
             digitalWrite(rigth,LOW);  
             digitalWrite(left, LOW);  
             analogWrite(enable, 0);  
             }  
  }  





Ya tengo claro como controlarlo, falta idear las líneas para que retorne al centro una vez se suelte el joystick y ver que puedo hacer para que sea continua la revisión de la señal de retorno.


domingo, 14 de octubre de 2012

Progreso 4 - 7 Oct ( Comunicación RF links) Parte 1 de 2


Arrancando en serio!


Después de un mes de expectativas con más ansias de ver una forma en el proyecto, me encontré con más piedras en el camino , y más temas para investigar.

En días previos solicite un L293D (integrado, puente H), un Arduino con bootloader y un kit de LEDs para aprovechar el envío desde la Capital y hacerme de un stock de estos (estoy con la idea de una matriz de LEDs 4 x 4 por lo menos) y la entrega estaba a mitad de mi descanso así que para matar la espera y adelantar, decidí probar el funcionamiento de los módulos RF que había comprado en www.sparkfun.com y cuyas reseñas en otras partes comentaban solo bondades a un bajo costo (casi 10U$ la pareja), así que me puse manos a la obra.


En este caso ya que no tenía 2 Arduinos, realice la prueba con HT12E Y HT12D de la siguiente manera:

Circuito Rx




Circuito Tx









Montajes Tx y Rx , de izquierda a derecha.

Resultados:

Excelentes transmisores, inicialmente me preocupe ya que soló transmití a una distancia de 1 metro, luego agregue unas antenas de alrededor de 6" para el receptor y de 5 para el emisor, esto mejoró pero no lo suficiente (unos 5 mts) así que revisando todo apuntaba que la alimentación de el transmisor estaba fallando, ya que usaba un pila de 9V, así que la cambie por un recargable a full de carga y listo! logré un alcance de alrededor de 20 mts (según datasheet, alcanza hasta 150 mts en campo abierto) y solo porque mi hija le dio pena el recorrer por el conjunto gritando....





P.D. Para este post me dí el lujo de crear las imagenes de los Tx/Rx, vistos en los esquemas que realice en fritzing, ya que estos no vienen incluidos en la librería. para esto use el programa de código libre inkscape.


viernes, 12 de octubre de 2012

Arduino para el camino.... (semana 26-30 Sept)

 

Kit viajero y pericias after work...

 Con ese cuento de estar trabajando en proyecto cada 10 días y quitándole tiempo a mi familia, decidí traerme implementos para adelantar después del trabajo..sí trabajo al trabajo, y no es nada fácil, después de una jornada de más de 12 horas...

kit viajero: Arduino uno, protoboard pequeña, kit de cables, batería 9V recargable, chip puente H, LEDs y conectores



Ya que tenía uno de los callejones de este proyecto: la dirección, después de fracasar con el micro servo y haber encargado uno de mayor tamaño en China (quien sabe cuando vendrá) decidí modificar el moto reductor que tenía instalándole un potenciometro de 100K al eje de salida (este trajo uno inicialmente, no se de cuanto, pero no pude trabajar con él ya que desconectaba el arduino)





Así que aprovechando las noches, hice algunas pruebas, simplemente ajuste mi código de prueba con el joystick, el cual consiste en encender 2 LEDs el primero si muevo el stick hacia la derecha y el segundo hacía la izquierda, y le incluí el potenciometro, así que enciende o no de acuerdo al valor del potenciometro simulando el ángulo máximo a girar el eje del motor; revisando esto con la conexión puerto serial de arduino.

1:  int pot1 = A2;//joystick  
2:  int pot2 = A1;// señal reductor  
3:  int forward = 13;//led para prueba avance  
4:  int backward = 9;//led para prueba retroceso  
5:  int dir, sign;  
6:  void setup()  
7:  {  
8:   pinMode(forward, OUTPUT);  
9:   pinMode(backward, OUTPUT);  
10:   Serial.begin(9600);  
11:  }  
12:  void loop()  
13:  {  
14:   int dir = analogRead(pot1);  
15:   int sign = analogRead(pot2);  
16:   sign = map(sign, 0, 1023, 0, 255);  
17:   if (dir > 342 && sign != 100){  
18:    digitalWrite(forward, HIGH);  
19:   }  
20:   else if (dir < 338 && sign != 152){  
21:    digitalWrite(backward, HIGH);  
22:   }  
23:   else{  
24:    digitalWrite(forward, LOW);  
25:    digitalWrite(backward, LOW);  
26:   }  
27:   Serial.println(dir);  
28:   delay(500);  
29:  }     

"Serial

Se utiliza para la comunicación entre la placa Arduino y un ordenador u otros dispositivos. Todas las placas Arduino tienen al menos un puerto serie (también conocido como UART o USART): Serial. Se comunica a través de los pines digitales 0 (RX) y 1 (TX), así como con el ordenador mediante USB. http://arduino.cc/es/Reference/Serial"

 

habiendo funcionado esta parte, procedí a instalar el potenciometro a la carcasa y al eje del moto-reductor  menos mal acá conté con mototool y taladro!




una vez terminado, a realizar pruebas, realice el siguiente montaje:





Resultado


El potenciometro quedaba flojo y al no regular la velocidad de giro del motor, en un arranque brusco, este se atascó al llegar al tope del potenciometro, el cual solo tiene rango de giro de 180º, causando que el chip  SN754410NE pase a mejor vida.

Experiencia:


Aunque el programa que corrí  estaba muy en pañales, si pude verificar que me sería posible controlar el movimiento de este moto reductor y usarlo para la dirección, de acá me surgen 2 cosas por resolver:

  • Encontrar un circuito para manejar los IC puente H, con algún tipo de protección para el chip (diodo u otro elemento)
  • implementar el control por PWM a la entrada "enable" del integrado, y así evitar atascamientos mientras   implemento un buen codigo de control.


P.D. aproveche la falta de materiales para porner la documentación de este documento.






jueves, 11 de octubre de 2012

Progreso días 20 - 23/Sep (dirección) - Parte 2 de 2


Prueba de servo motor!



Tanto esperar el famoso servo (motor acoplado a un reductor, cuya posición se conoce y modifica por medio de un potenciometro acoplado al eje de salida) que llegó de sparkfun, y resultó ser un micro servo,  y estaba listado como small..bueno para que tengan claro del tamaño (sin contar el cable) mide 1" (2.54 cms) y aunque lo vi pequeño quise probar instalándolo en el chasis del carrito (sujeto de prueba)  y trabajar con él.


Previamente hice pruebas en el entorno arduino, con el ejemplo "knob" el cual consiste en manipular un potenciometro (tal como se ilustra en la imagen; esta no la realice yop) y así como se gira la "perilla" del potenciometro así mismo gira el servo.




http://www.arduino.cc/en/Tutorial/knob

Después de probar la el control por medio de mi joystick, el resto fue carpintería, así que adaptamos y montamos una base con el servo a la dirección (en plural, seguí contando con la ayuda de JIR)
pero lastimosamente apenas lo movía, no tuvo el torque suficiente, ya la verdad es q este servo de 90 gramos, dejó mucho que desear, es más tiene problemas para regresar a su origen (0º) y que como en 16º (este servo tiene rango de operación de 0º a 180º)


Así que de la frustración, intentamos acoplar el chip del servo al motoreductor original del sujeto de pruebas tipo frankenstein en loco último esfuerzo del que dudábamos igual..y obviamente no resultó

De lo que se tenía proyectado:

  • Probar servo motor
    • Implementar la librería Servo incluida en Arduino.
    • Desarrollar el código para interactuar con el joystick.
    • Armar sistema de dirección sobre el sujeto de pruebas.↓ Se hizo pero el servo quedó corto :S
  • Realizar montaje preliminar  Dadas las trabas resultantes ya era poco productivo continuar.
  • Realizar pruebas en el sujeto de manera "alámbrica" inicialmente. menos...

lunes, 1 de octubre de 2012

Progreso días 20 - 23/Sep (Perfduino) - Parte 1 de 2

Para estos días recibí mi pedido de sparkfun.com  (Servo motor, módulos RF, accesorios varios) y otro de una tienda nacional microcontroladores.com (Atmega328-PU, kit de condensadores y resistencias)


Expectativas:

  • Probar módulos RF link
    • Ensamblar otro Arduino (stripduino ó perfduino, clones)
    • Aprender sobre la libreria virtualwire (leí que era perfecta para estos módulos)
    • Realizar pruebas de conectividad y alcance.
  • Probar servo motor
    • Implementar la libreria Servo incluida en Arduino.
    • Desarrollar el código para interactuar con el joystick. 
    • Armar sistema de dirección sobre el sujeto de pruebas.
  • Realizar montaje preliminar
  • Realizar pruebas en el sujeto de manera alámbrica inicialmente.

 Al llegar a casa, aparte del recibimiento de mis amores, me encontré con 2 paqueticos! con las provisiones para el fincho!



  1.  Al investigar y encontrar en la red el uso de los módulos de radio frecuencia (A.M.) ví que los trabajaban con unos integrados (codificador y decodificador) los HT12E y HT12D los cuales tambien adquirí, pero que más tarde encontre que transmiten 1 ó 0 en palabras claras, como de pronto me quedarñia corto a la hora de mandar información, encontre sobre el uso de la librería virtualwire (la cual es la hora y no he probado, ya les diré x q) pero para esto necesito otro Arduino, y claro como no pensaba invertir en otro más (sale acá como en unos 40 US$) y podía esperar otras 2 semanas, decidí emprender el viaje hacia la fabricación de mi propio Arduino (de hecho eso estaba contemplado, para la versión final del sistema) y ahí vamos.
    • Teniendo como guía los esquemas que se encuentran en la red y la guía de este blog: http://txapuzas.blogspot.com/2010/07/paperduino-perfboard.html y con la ayuda de mi mejor amigo, se inició la fabricación, aunque en la página citada se puede descargar un imprimible para usar de patrón sobre el cual ubicar los diferentes componentes, yo opté por variarlo, ya que no necesitaba algunas conexiones incluidas y quería una versión más pequeña. El método de conexión al PC es por medio de un cable FTDI cuyas instrucciones sacamos del anterior blog y que se construye con base al cable BKU- 5 de Nokia, aunque yo encontré el cable DKU-50 y lo adaptamos de igual manera (esto lo desarrollaré en otro post)
    • Versión 1.0 Perfduino Maturana/Navaja


      Después de un largo día, ya noche y con unas cervezas encimas, lo logramos, aunque debo comentar que antes tuvimos varias trabas, entre ellas: al querer cargar el primer programa, el famoso blink, tuvimos el siguiente error:

       avrdude: stk500_getsync(): not in sync: resp=0xf0


      buscando en Internet y verificando, encontramos que el chip que había comprado no tenía el bootloader (configuración inicial del chip, para carga los programas y operar) probamos el método de carga usando mi Arduino uno y nos apareció otro error:

      Avrdude: usbdev_open() did not find any USB device "usb

      de ese la información fue difusa y al fin no aclaramos nada, cuando ya me iba de "a orillas del rio piedras me sente y lloré" se me ocurrió salir de dudas si el error era el chip* o si la c**amos en la fabricación, así que le desmonté el chip a mi Arduino uno y se lo monté al Perfduino, probamos con el cable hechizo la carga y gualá!!!! está blink blink!!


       
      Perfduino con sketch BLINK cargado


       también se cargó el ejemplo de manejo de servos y funcionó sin problemas..solo que me quedé con un solo arduino disponible.. :(
    • Al no poder contar con otro Arduino, se fue al piso el objetivo de realizar pruebas de funcionamiento de los módulos RF.

Aprendizaje:

  •  Comprobar inicialmente el bootloader del chip, si no lo tiene, utilizar el método de carga montando todo en protoboard.