martes, 25 de diciembre de 2012

Planeando mis vacaciones! - pidiendo tiempo

"Engineers like to solve problems. If they are not problems handly available, they will create their own problems"

Scott Adams


Es una triste realidad que al crecer y lograr cierta estabilidad laboral (profesional) nos podemos hacer a las cosas que siempre quisimos y que muchas veces nuestros padres no pudieron darnos, pero empezamos a carecer de tiempo para disfrutar, más cuando son hobbies.

En general mis padres  nos dieron a mis hermanos y a mí (somos tres hermanos) muchas cosas, siempre fui de los niños que más tenían juguetes (una buena parte era en conjunto con mis hermanos) hasta tuvimos super nintendo (no todos los juegos fueron originales) y ultra 64, que era un lujo en la sociedad Colombiana de estrato 3 (acá va de 1 a 5, sin contar los de extrema pobreza, 0) pero al crecer se nos enseño de prioridades, al ser tres e ingresar 2 casi al tiempo a la U, se hicieron recortes en el presupuesto de gustos, y así me perdí de nintendo game cube y del playstation one ....

Hoy llevando una vida más estable y casera, casado con 2 hijos, trabajando a 4 horas de mi hogar, + 12 horas diarias, por 10 diez días continuos, la verdad no es que salga mucho en mis 4 días de descanso en los cuales hay que dejar tiempo para diligencias, mercado y pago de facturas. así que el resto paso en casa..con mi esposa y los niños (un bebe y una adolescente) Pero aparte de eso, siempre tengo algún proyecto...desde lo más sencillo hasta lo más geek friki o tonto...como mi disfraz de Spartan! el cual cree con variadas tecnicas como el papel mache para el casco y uso de fibra de vidrio para el escudo



En general me gustan los hobbies de aventuras e invención, todos ellos costosos (el problema de vivir en un país tercermundista, donde la tecnología importada es carisma, no pregunten por el famoso TLC) y de mucho tiempo de inversión, como el snorkelling, que no hes que sea experto pero me gusta y solía hacerlo con mi hermano  +Daniel Maturana y +Jair Navaja Galindo, la mayoría en el P.N Tayrona o alrededores.

Hace unos 5 años retome mi afición a los video juegos con la adquisición del playstation 2 y un psp3000, más tarde me actualice al playstation 3! (si,ya abandone a nintendo, pero ese es otro tema, por cierto, soy de los que piensan que Zelda Ocarina of time, es mejor juego ever!)

Tambien me llama la atención el paintball, que es como hacer realidad la plomera de los juegos de niño (tuve cierta cantidad de juguetes belicos :S) de hecho me compre la careta..pero casi nunca consigo armar un combo de amigos para jugar :'(

Y bueno como ya saben, desde unos 6 meses estoy otra vez enganchado una vez más con la electrónica  más exactamente con el mundo de Arduino, y para completar el cuadro voy a entrar al mundo del lego technic!!!! algo que había estado en my wish list por lo menos 20 años!

ya hace unos meses me compre estos 2 mini sets, acá LEGO es carisimo! y ahora me encargue un set más grande entre otras cosas .. ^ . ^ ya saben navidad! + mi cumple ;)




Set 9395! Tow truck! 

Mi idea es manejar las invenciones con lego, por medio del Arduino... ya veremos como nos va!


Estas líneas las escribí hoy 25 de Diciembre desde mi oficina, día laboral para mí...un sacrificio que hago por mi Familia, y que de una u otra forma me permite cumplir mis propios sueños..

En fin de acá salgo a vacaciones y tengo mucha cosas que hacer...además de estudiar el máster online que estoy haciendo debo terminar un par de proyectos..

Feliz Navidad, muchas bendiciones, aprovechen el tiempo...


lunes, 24 de diciembre de 2012

+ Stand by (Diciembre 13 - 16)


Desde china...sin gastos de envío...

Sin mayor novedad en el trabajo...solo que por fin llegó lo último de lo pedido a china por ebay... en total pedí unos attiny85, un servo motor y este proto shield para mi Arduino 1

En general se gastaron entre 2 y 2 meses y 1/2 siendo lo ofertado 40 días hábiles + ó - mes y 1/2, me ahorre más el 50% si lo comprara en USA ó Colombia, lo único es el tiempo de entrega pero como no tenía prisa, ta bien...además llegó a tiempo para mis vacaciones!! que empiezan en un par de días!





En cuanto a la calidad, tiene muy buen acabado y presentación, de hecho es algo muy sencillo el circuito, tiene la posibilidad de dejar componentes permanentes y no usar la proto, la cual yo pegué. si me costó un poco hacerla coincidir, doble un poquito los pines para alinearlas con los header hembra del Arduino, creo q es normal en ese tipo de juntas.

Pienso comprar otra para customizarla, además de un moto shield, ya que me gustó el arreglo en sandwich.

Shield montada sobre mi Arduino 1 R3, le soldé un par de botones para funciones y  tiene  puesta en la proto mi  RF Receiver (sin conexiones)

miércoles, 19 de diciembre de 2012

Avance Noviembre 15 - 18 (Creación de PCB método Tóner)

Solucionando problemas de uno....en uno....


Este fincho seguí queriendo alistar cada elemento, aún tengo pendiente mejorar la dirección y montarla en el chasis, pero ya que había quemado un par de integrados en el intento (U$ 10 c/u) el paso siguiente era mejorar este eslabón de mi cadena y en esto llegue a otro punto: el querer pasar del breadboard a algo permanente, he estado utilizando perfboard, los circuitos han sido funcionales pero ha sido muy difícil la implementación de los esquemas por lo limitado de las opciones para conectar, lo que ha acarreado el uso de infinidad de puentes, haciendo del ejercicio un caos.

Seguí así hasta la necesidad de dejar terminado el nuevo circuito puente H, esta vez con el IC L298N que soporta más amperaje, después de revisar esquemas en google, me decidí por este (Este fue creado por mí directamente en Eagle, según los esquemas encontrados)





Fabricación

Hace casi unos diez años cuando me inicie en esto de la electrónica (no ha sido permanente) como hobby (en ese tiempo el curso de CEKIT) aprendí de un amigo a utilizar baquelita, trazando el circuito con marcador permanente y después a retirar el cobre con  Cloruro de Hierro (etching - en inglés). funcional pero muy lejos de la presentación profesional.

Hoy a retomar me encontré con la técnica de la impresión del toner láser, en donde se imprime el esquema realizado en algún software CAD especializado de electrónica, en una impresora o fotocopiadora de las que usan tóner, sobre algún papel fino de revistas o inclusive el envoltorio de las resmas de papel bond, para luego transferirlo por medio de una plancha a nuestra placa de baquelita, para al final hecharle ácido y retirar el material no cubierto con el polvo del tóner y dejando el trasado deseado. (no pienso hacer un tutorial de esto, ya que hay mucho en la red)

Software-Procedimiento


Fritzing me parece de fácil de uso, pero es muy limitado en cuanto a librerías de objetos. y crearlos resulta algo más complicado, por eso busque alternativas y encontré Eagle, de los más usados y cuenta con una gran cantidad de librerías con los elementos más utilizados, así como librerías especializadas como la de sparkfun; al principio me pareció un software no muy intuitivo, pero al no encontrar todos los elementos a usar en Fritzing, sobre todo el L298D, opte por el primero y bueno luego de algunas horas ya fui capaz de realizar mi primer circuito, sin utilizar un tutorial de guía, simplemente cacharreando.

En este caso quería que la placa fuera con conectores de tornillo para facilitar el armado, y no tener problemas por conexiones sueltas.


Al transferir la imagen impresa a la baquelita (con una plancha)

Después de someter la baquelita al ácido

Jair me ayudó con la soldadura, debo decir que el uso de un buen cautín y la práctica ha pulido su técnica...cosa que yo por dedicarme a lo conceptual he dejado rezagada.







Después de corregir un pequeño cruce de líneas (las patas dek IC están bastante pegadas cosa que dificulta un poco el proceso) realice prueba exitosa del circuito.

El acabado es grandioso, quede sorprendido por las letras, por que a pesar de que son bastante delgadas quedaron "nitidas".

Mejorare el diseño para el próximo circuito, evitare los empalmes en lo mínimo.


domingo, 11 de noviembre de 2012

Progreso 01 - 05 Nov ( Mejorando la dirección)


Poco pero rompe coco!


Un fin de semana con puente abordo, la verdad he disminuido el tiempo dedicado a este proyecto, por dedicarle más tiempo a mi familia, como he comentado anteriormente y gracias a que siento que logrado nivelarme en mi curva de aprendizaje, actualmente tengo todos los aspectos de este proyecto cubierto y solo me resta afinarlos antes de ensamblarlo... ya saben..."El todo es la suma de sus partes"


"Halloween" 31/10/2012

Fuerte Sn Felipe de barajas - Cartagena de Indias 03/11/12

Ya que suele gustarme ir por el camino difícil  y más cuando consiste en torturar mis neuronas, me puse a investigar como hacer funcionar la transmisión con aquel servo motor rudimentario, me imagine como hacerlo funcionar, pero no tenía del todo claro como implementarlo en el código... buscando y búscando encontré un par vídeos en youtube de servo casero, y era como me habia imaginado, pero no mostraba el trasfondo (como retroalimentar constantemente la lectura del potenciometro para que no pasarme de los limites) los dejo a continuación (mi meta es llegar a este nivel de precisión..ya es algo personal)





Como soy egocéntrico no  puedo aceptar que algo me quede grande, decidí averiguar la base de esto, después de googlear un montón, encontré el método PID, metodología de control de sistemas de Ingeniería  la cual se aplica a variados sistemas y es básicamente  modular constantemente una variable para para obtener el resultado deseado, de acuerdo a la desviación presentada (error), un ejemplo práctico es cuando estas conduciendo un auto, y quieres mantener una velocidad estable, estas viendo el velocímetro (tu feedback) y de acuerdo a si estas por encima o por debajo, aprietas o sueltas el acelerador, que tanto lo sueltas o aprietas, dependerá de que tan alejado o pasado estés de la velocidad deseada.

PID viene de proporcional, derivativo e integral, son las tres funciones matemáticas aplicadas al error de tu sistema, en términos sencillos:

y(salida) =  error*Kp + ( §error)*Ki + (error - error anterior)*kd

donde:

 error = (valor deseado - valor obtenido)

y Kp, Ki, Kd, son constantes del sistema, estas se pueden obtener definiendo el algoritmo de tu sistema, en donde se relacionan matemáticamente tu entrada con tu salida. este modelado se puede realizar con herramientas informáticas como Labview o Matlab/simulink..lastimosamente no cuento con estas herramientas por el momento, y como no requiero tanta exactitud por el momento trate de hacerlo manualmente, para esto hay unas técnicas de tunning (PID tunning) basadas en el ensayo y error.


Para nuestro caso:


El potenciometro es nuestro feedback (valor de salida del sistema y de entrada para nuestra función), vamos a saber donde esta (ángulo del motor) pero como haces efectivo tu posicionamiento?...pues con el PID aplicado a la velocidad (salida de la función y entrada de nuestro sistema) variaremos la velocidad usando PWM( modulación del ancho del pulso).

Espero haber sido claro en este punto, hay mucha literatura del tema, no siempre tan clara, la mejor esta en ingles.

Después de un par de horas de prueba y error logre unos valores, escribí el sketch y lo probé  me parece que voy por el buen camino, estoy más que complacido con lo logrado, para la aplicación la precisión es suficiente (pero lo mejorare en la próxima sesión de trabajo)

Este es el esquema de conexionado:

utilice un par de botones para indicar el sentido de giro:





El sketch


 int D = 6 ;  
 int I = 5 ;  
 int LED = 13 ;  
 boolean state1 = 0;  
 boolean state2 = 0;  
 int currenPosition;  
 int der = 7;//cable amarillo  
 int izq = 9;//cable negro  
 int enable = 3;  
 float Kp = 0.2;  
 float Ki = 0.05;  
 float Kd = 1.75;  
 int setpointDer = 70;   
 int setpointIzq = 170;  
 int setpointCenter = 120;  
 float speedVal = 70;  
 float error = 0;  
 float lastError = 0;  
 float sumError = 0;  
 void setup(){  
  pinMode(D, INPUT);  
  pinMode(I, INPUT);  
  pinMode(LED, OUTPUT);  
  Serial.begin(9600);  
  Serial.println ("Setup");  
 }  
 void loop(){  
  currenPosition = analogRead(A5);  
  currenPosition = map(currenPosition,0,1023,0,255);  
  state1 = digitalRead(I);  
  state2 = digitalRead(D);  
  //Serial.print ("currenpos ");  
  //Serial.println(currenPosition);  
  if(state1 == HIGH){  
   if (currenPosition > 100){  
     error = currenPosition - setpointDer;  
     speedSetup();  
     analogWrite(enable, speedVal);  
     digitalWrite(izq,HIGH);  
     digitalWrite(der,LOW);  
               }  
    else { analogWrite(enable, 0);}  
   Serial.print("IZQUIERDA");  
   Serial.print ("currenpos ");  
   Serial.print(currenPosition);  
   Serial.print ("speed ");  
   Serial.print(speedVal);  
   Serial.print ("error ");  
   Serial.println(error);  
    }  
  if(state2 == HIGH){  
     if (currenPosition < 230){  
     error = setpointIzq - currenPosition;  
     speedSetup();  
     analogWrite(enable, speedVal);  
     digitalWrite(der,HIGH);  
     digitalWrite(izq,LOW);  
               }  
    else { analogWrite(enable, 0);}  
   Serial.print("DERECHA");  
   Serial.print ("currenpos ");  
   Serial.print(currenPosition);  
   Serial.print ("speed ");  
   Serial.print(speedVal);  
   Serial.print ("error ");  
   Serial.println(error);  
  }  
  if (state1 == 0 && state2 == 0) {  
   if ( currenPosition < setpointCenter ){  
     error = setpointCenter - currenPosition;  
     speedSetup();  
     analogWrite(enable, speedVal);  
     digitalWrite(der,HIGH);  
     digitalWrite(izq,LOW);  
     }  
   else if ( currenPosition > setpointCenter){  
     error = currenPosition - setpointCenter;  
     speedSetup();  
     analogWrite(enable, speedVal);  
     digitalWrite(izq,HIGH);  
     digitalWrite(der,LOW); }  
   digitalWrite(LED, HIGH);  
   Serial.print("DERECHA");  
   Serial.print ("currenpos ");  
   Serial.print(currenPosition);  
   Serial.print ("speed ");  
   Serial.print(speedVal);  
   Serial.print ("error ");  
   Serial.println(error);  
   delay(200);  
  }  
  else   
  {digitalWrite(LED, LOW);}  
  }  
 void speedSetup(){  
  float lastError = 0;  
  float sumError = 0;  
  speedVal = Kp*error;  
  speedVal += Kd*(error - lastError);  
  speedVal += Ki*sumError ;  
  lastError = error ;  
  sumError += error ;  
   if (speedVal > 255){  
    speedVal = 255; }  
   else if(speedVal < 40){  
    speedVal = 0;}   
 }  

Video del funcionamiento:





conclusiones y acciones correctivas:


  • El método PID es una excelente herramienta, algo complicada de realizar de manera manual, pero los resultados son asombrosos, utilizado ampliamente en diferentes proyectos de robotica como los quadcopters (para lograr equidad entre las velocidades de los rotores) péndulo invertido y robots auto-balanceantes. seguiré trabajando hasta mejorar la implementación.
  • una vez probado el funcionamiento del sistema, al querer aplicar el sistema inalámbrico y modificar el sketch, por algún error el motor siguió andando más allá del límite establecido quedando trabado al final del giro del potenciometro, quedando trabado y trayendo como consecuencia aumento del amperaje del motor y daño del integrado L293D. ya que no es la primera vez y me parecen muy susceptibles estos integrados, utilizare el L298n que soporte con 2A (hasta 3A en picos) por canal (4en total, 2 puentes H, osea 2 motores)
  • Me llama la atención el uso de Matlab para sacar las constantes, aunque ví el programa durante el curso de sistemas de control en la U, no fue el fuerte de nuestra institución y debo repasar su uso.  Ya tengo el ubicado el software, falta aprender a conectar el Arduino y estudiar el uso de simulink.
  • El Sketch que realice sigue mejorando ya es capaz de regresar a la posición cero de mi dirección quiero aumentar la precisión u sospecho de un pequeño error en el algoritmo.

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...