lunes, 30 de diciembre de 2013

Imprimir matrices y formas en C/C++ con Dev-C++ y WinBGIm

Primero debes configurar Dev-C++ para trabjar con WinBGIm. Para ello debes

1 - Descargar graphics.h y pegarlo en el directorio "include" de Dev-C++.
     Por defecto es C:\Dev-Cpp\include




2- Descargar libbgia y pegarlo en el directorio "lib" 
Por defecto es C:\Dev-Cpp\lib


3- Entrar en Herramientas / Opciones del Compilador

4- En el text area del linker copiar lo siguiente:
-lbgi
-lgdi32
-lcomdlg32
-luuid
-loleaut32
-lole32



Aceptas y ya debe estar configurado.

Ahora un pequeño ejemplo de impresión una matriz columna por columna. Cosa que no se puede hacer con printf que imprime fila por fila


#include <graphics.h>

int main( )
{
    // Inicia un cuadro de 400x300 caracteres
    initwindow(400, 400, "Ejemplo Matriz");
    
    int n=10; // Cantidad de columnas de la matriz
    int m=10; // Cantidad de filas de la matriz
    char matriz[n][m];    
    memset((void*)matriz,48,sizeof(char)*m*n); // Limpa la zona de memoria 
    char  caracter_puntual[2]={0,'\n'}; // Caracter específico de la matriz
        
    for (int x=0; x < n ; ++x )
    {       
            // Imprime la columna
            for (int y=0; y < m ; ++y )
            {
                caracter_puntual[0]=matriz[x][y];
                // Imprime el valor x,y de la matriz
                outtextxy(x*20,y*20,caracter_puntual);
            }            
            delay(200);
            
    }    
    getchar();    
    return 0;
}



Otro ejemplo. Impirmiendo un circulo:

#include <graphics.h>

int main( ){    initwindow(400, 300, "First Sample");    circle(100, 50, 40);    while (!kbhit( ))    {        delay(200);    }    return 0;}




Otro Ejemplo: Imprimiendo letras con colores:

#include <winbgim.h>

void waitForLeftMouseClick();

int main()
{
    initwindow(700,300); 
    settextstyle(0,0,2);
    setcolor(RED);
    outtextxy(100,100,"WELCOME TO CÓDIGO INFORMÁTICO");
    setcolor(GREEN);
    outtextxy(280,130,"INFO - UNT");

    // while(!kbhit()); // wait for user to press a key
    waitForLeftMouseClick(); 

    closegraph();        //close graphics window
    return 0;
}

void waitForLeftMouseClick()
{
    clearmouseclick(WM_LBUTTONDOWN);
    const int DELAY = 50; 
    int x, y;
    while (!ismouseclick(WM_LBUTTONDOWN))
        delay(DELAY);
    getmouseclick(WM_LBUTTONDOWN, x, y);
}

La documentación oficial está en esta pagina:

http://www.cs.colorado.edu/~main/bgi/

martes, 29 de octubre de 2013

Control del Robot Velocista

El control del robot, es una combinación de la aplicación del control Proporcional Integral Derivativo (PID) y el uso oportuno de la capacidad de frenar que nos brinda el Driver TB6612FNG.

Antes de continuar con la publicación del código, esbocemos algunos conceptos importantes para el control de robots velocistas.

1. ¿Qué es el Control PID?

Un PID es un mecanismo de control por realimentación que calcula la desviación o error entre un valor medido y el valor que se quiere obtener, para aplicar una acción correctora que ajuste el proceso. (http://es.wikipedia.org/wiki/Proporcional_integral_derivativo)

La explicación del uso de sus parámetros se basa en:
  • Proporcional: La proporcional tiene que ver con el error directo, es la respuesta que se tiene que entregar de manera inmediata.
  • Integral: La integral tiene como propósito el disminuir y eliminar el error en estado estacionario provocado por el modo proporcional.
  • Derivativo: La función de la acción derivativa es mantener el error al mínimo corrigiendo proporcionalmente con la misma velocidad que se produce, de esta manera evita que el error se incremente.


2. ¿Y como se aplica esté en robots velocistas?

La mayaría de los robots velocistas usan tracción diferencial, es decir varían la velocidad de alguna de las dos ruedas para conseguir un giro hacia un determinado lado, de allí la importancia del uso del Control PID, esté nos permite obtener un valor apropiado para asignarle al PWM de los motores según el estado del robot sobre la línea, aplicando un correctivo necesario en su dirección de desplazamiento para que esté no se salga de la línea.

Para velocistas la "Integral" de este control no se utiliza porque tiene que ver con errores acumulativos ocasionados por estados estacionarios, es decir cuando el robot esta totalmente detenido o en movimiento con velocidad constante. Debido a que a lo largo de la trayectoria en su recorrido por la pista se esta acelerando y desacelerando, el robot experimenta cambios dinámicos que imposibilitan el uso de este parámetro haciéndolo tender a 0. (es decir no lo usaremos).

Nota: En muchos caso se le llama Control PD


3. Frenos y su Importancia

Los frenos son sin duda alguna muy importantes cuando se trata de obtener un mayor control en los robots velocistas, nos permiten tener una segunda opción cuando nos salimos del rango de visión que nos muestran los sensores infrarrojos (estos eventos tienen mucha probabilidad de ocurrir en curvas obtusas o de 90°, haciendo de verdad muy difícil el control sin la opción de los frenos).

Cuando se aplican, es necesario tomar en cuenta que debemos hacerlo dándole dirección a la inercia que ocasiona el frenado hacia la toma correcta de la curva, para ello debemos frenar la rueda interna y liberar la rueda externa.

Nota: El frenado del robot Lenin, se hace de manera acumulativa usando una espera de un microsegundo, liberándose una vez que vuelve a la línea.

Recomiendo la publicación de Robot Zero en el año 2012
(http://webdelcire.com/wordpress/archives/1330)

La libreria QTRSensors.h la puede descargar de este lugar.

NOTA: Este código puede no funcionar en tu robot velocista. Recuerda que debes modificar los pines de dirección, sensores, etc.  También los valores de P, D y la potencia aplicada a los motores varían según el peso y su distribución, el centro de masa, la potencia de los motores, el largo y ancho, la distancia entre las ruedas, el alto de los ejes, la vibración generada por los motores, la rigidez de la parte delantera (cabeceo de los sensores). Incluso debes modificar estos valores dependiendo del tipo de pista en el que corra el robot.

El código funcional lo pueden conseguir por acá:  
https://github.com/abrahamjoc/robot-lenin

domingo, 20 de octubre de 2013

Robot seguidor de linea para competencias

Este es robot seguidor de lineas muy sencillo construido con módulos básicos. Se diseñó basándose en el robot Zero.



Los componentes usados son:

Arduino Pro Mini 16 MHz 5v






Sensores QTR-8A de pololu


























Ball caster de plastico


Bateria walkera de 3,7 V y 240 mAh








Soporte de motores




Boost de 4-25 V


Boost de 5 V



Motor HP pololu 10:1














Driver TB6612FNG












Tornillos de plastico (opcionales)












Forex (para el chasis) en Venezuela lo consigues como "pvc inflado" o "espuma de pvc"



Esta configuración se obtuvo luego de muchas pruebas. Resultó ser la mas idónea para las pruebas en competencias venezolanas donde hay muchas curvas y poco espacio para acelerar, por lo que se necesita un robot pequeño y lo más ligero posible, para salir de las curvas rápido y tener poca inercia.
El tema del peso fue extremadamente importante, nos dimos cuenta que mientras más ligero mejor. Llegando al punto que el robot solo pesa 54 gramos (47 sin batería). Para lograrlo usamos hilos de cobre esmaltado para las conexiones entre módulos y sensores y substituimos los pesados tornillos de metal por unos de acrílico.

Explicación detallada de componentes probados:

Dimensiones y peso:
~15x10 cm
  57 gramos


Controlador (arduino pro mini)



Elegimos el arduino pro mini por varias razones: 
- Es liviano
- Consume muy poco
- Facilidad de programación
- Viene sin pines soldados (usamos los que necesitemos)
- Se consigue en Venezuela
- Es el más económico
- En nuestro caso compramos la versión más moderna que tiene 8 entradas analógicas que es justamente la cantidad de sensores analógicos que vamos a usar.
Aunque tiene la desventaja de no poseer puerto usb, hay que cargarle los sketch a través de un adaptador usb-serial, para ello usamos un arduino duamilanove sin micro. 


Sensores de linea QTR-8A:

QTR-8A

- Por ser analógico nos permite lecturas más precisas de la linea y una mayor resolución, permitiendo que podamos distinguir si el sensor está sobre la linea e inclusive si está a medias sobre esta.
- Tiene 8 sensores que es una cantidad suficiente para llevar un buen control PID del robot.

Estos sensores son costosos, pero pueden ser sustituidos por CNY70 o por QRD1114. 










Ruedas:
Es sin duda uno de los aspectos más importantes. Por lo general, la mayor limitación es el agarre. Mientras más agarre a mayor velocidad puede girar en las curvas.
Hemos comprado 3 ruedas para determinar cual es la mejor.


Ruedas de solarbotics
Ruedas de solarbotics:

Tienen buen agarre, aunque son pesadas. Cuando se usan el robot es sacado de las curvas por la centrifuga.









Ruedas banebots.
Vienen en tres tipos de material: verde blando, naranja semiduro y azul duro. Elegí las verdes porque son las que tienen mejor tracción. Aunque estas son las que se desgastan más, no importa, puesto que las pistas de velocistas son lisas y el desgaste es mínimo.
Estas ruedas tienen el mejor agarre, el detalle es que son demasiado pesadas (incluso mucho mas que las solarbotics). Hacen que el robot acelere lento, y la respuesta sea mucho menos delicada, por lo cual quedan descartadas. Se puede usar si se substituye la pieza central por una de acrílico, pero no lo he intentado.

Este es un modelo que las usa y se ven muy bien







Ruedas pololu: Son finitas y pesan solo 3 gramos. El caucho tiene surcos lo cual no es beneficioso en absoluto puesto que limita la superficie de contacto. La solución a esto es quitar esos surcos lijando la rueda. Por ser tan liviana esta rueda no nos saca en las curvas. Es ideal para pistas pequeñas y con muchas curvas como en las competencias venezolanas. Nos decantamos por estas rueditas.

Un dato: en cada prueba, debe limpiar las ruedas del robot puesto que estas recogen el polvo de la pista creando una película que disminuye el agarre 




Actualizado (2015)
Para las ultimas competencias se utilizaron ruedas impresas en 3D
Estas ofrecen más superficie de contacto y su radio es muy inferior a las de pololu.
El aumento de estabilidad y agarre fue considerable. Nos basamos en el modelo en 3D de las ruedas del robot zero. Se le modificó el ancho de la chapa puesto que esta se quebraba con mucha facilidad.
Puedes descargarte el modelo 3D (sin modificar) desde aqui.
Para las gomas se usaron las que traen las ruedas de pololu, las de banebots, inclusive se hizo la prueba con silicón frió. Al final nos quedamos con unas gomas kyosho que compramos por ebay. La dureza de estas ruedas están medidas en grados. Las que compramos son de 10° (las más blandas). Mientras menor es el grado más blandas y por lo tanto mayor agarre y mayor desgaste.

Este es el link de las gomas:
http://www.ebay.com/itm/GPM-Racing-MZ888AF10G-Kyosho-Mini-Z-Front-Standard-Slick-Tires-10-Deg-/262501721350?hash=item3d1e526506:g:XygAAOSwZ1BXcn9E





Ball caster

La ball caster no debe estar muy alejada del eje de las ruedas, puesto que mientras mayor sea la separación mayor es la distancia que recorre para un giro determinado, lo que aumenta la fricción y disminuye el control.
Puede ver que mientras mas se aleja del eje de las ruedas "más se mueve"

Estas son las opciones que hemos probado:

Led:

Sí, así como lees. Un led como ball caster es una buena opción, Es liviano y podemos graduar la altura inclinandolo. La desventaja es que con la fricción el led se va desgastando y hay que cambiarlo continuamente.






Ball caster de metal: tiene muy poca fricción y se desliza muy bien. La recomiendo para pistas largas. La desventaja es que pesa mucho (3.96 gramos) y si lo colocas en la parte delantera del robot el control se va a complicar por el efecto palanca.







Ball caster de plástico. Ideal, es liviana y rueda bien. Los inconvenientes es que luego de mucho uso va desgastando el holder trayendo consigo serios problemas de control puesto que aumenta la fricción. Aunque tenga más fricción esta es la que gana la batalla por pesar 4 veces menos que la de metal. La diferencia de control entre ambas es notorio.







Batería (Lipo walkera 3.7 V y 240 mAh)
bateria lipo de 3,7 V y 240 mAh

La batería a usar depende del consumo del robot y la duración de prueba en la competencia. La batería ideal es aquella que se agota justo después de haber pisado la meta. Si dura mucho más es porque hay peso adicional inútil y si dura menos es que no es suficiente para nuestro robot. La tasa de descarga nos indica "cuanta corriente puede proveer la bateria". Debemos conseguir una batería en la cual la tasa de descarga sea ligeramente superior al consumo de nuestro robot.
Para calcular la tasa de descarga puedes usar esta formula:

Tasa_de_descarga = Capacidad_de_la_bateria * Razón_de_descarga

Donde:
La Capacidad_de_la_bateria es la indicada en mAh. La batería de la foto tiene una capacidad de 240 mAh.

La Razón_de_descarga  es un número seguido de la letra "C", por ejemplo la batería de la foto indica  30C por lo que su razón de descarga es 30.

Entonces, la tasa de descarga de la batería de la foto es = 240 * 30 = 7200 mA = 7,2 A
Como sé que mi robot consume 4,2 A (en pico) entonces puedo determinar que esta batería le funciona perfectamente sin cortes de energía.

Para cargar las baterías se utilizaron varios cargadores, cada uno cargando una bateria de forma paralela para poder siempre tener las baterias cargadas y funcionando. Se usó un arduino fio, un cargador de lipos comercial y dos cargadores de lipo caseros. Compramos un set de varias baterías de estas para usarlas en la competencia.

Soporte de motores:
shaft de motores
Es de suma importancia la alineación de los motores, para ello puedes usar estos soportes. Recuerda que los elementos pegados con pegamentos tienden a ceder por la vibración. Estos soportes vienen con tornillos de metal con sus respectivas arandelas. Substituimos esto por tornillos de acrílico y nos ahorramos unos cuantos gramos.





tornillos de plastico acrilico


Elevador de voltaje (Boost o DC-DC)
Es lo que nos permite convertir los 3.7 V de la batería a los 12 V que necesitan los motores para funcionar.
Es una gran ventaja porque nos ahorra el tener que usar dos pesadas baterias de 7.4V.
Además mantiene estable el voltaje de alimentación lo que garantiza que el PWM aplicado a los motores no debe ser ajustado dependiendo del estado de la batería.
Este circuito se puede fabricar a mano o se puede comprar el módulo (ahorra mucho trabajo).
Nosotros usamos el boost 4-25V de Pololu pero se pueden usar otros como el XL6009. También se pueden construir uno ustedes mismos.


Boost de 4-25 V De Pololu


Son EXTREMADAMENTE delicados y deben ser tratados con mucha precaución. Durante el proceso de construcción del robot quemamos 3 de estos. Son caros pero hacen bien su trabajo. El voltaje de entrada nunca puede ser superior al voltaje de salida. Recomiendo colocar un diodo a la salida para evitar contras. Cuando se recalienta, el carbon que tiene en la bobina se despega. Si esto ocurre revisa que estás haciendo mal, es el primer aviso antes de quemarse.Este es un punto débil del robot que siempre nos tiene alertas porque puede dañarse en cualquier momento puesto que le exigimos más de lo que indica de fabrica.




Boost XL6009

Es unas 5 veces más barato que el de Pololu. Soporta el doble de amperaje, se recalienta menos y es mucho más robusto y durable, además de tener protección contra-corriente. El único inconveniente es su peso y tamaño. Es una buena opción si quieres quitarte la preocupación de que se te queme el boost en cualquier momento.






Este es un velocista llamado Xubots. Participó en la ulabots 2014, usaba el XL6009 y se movía bastante rápido.













Boost de 5 V:


 Se usa para alimentar los componentes lógicos (Arreglo de sensores, arduino y motor driver). También son delicados y de igual forma se recomienda ponerle un diodo a la salida.



Nosotros usamos el módulo de Pololu pero se puede usar cualquier regulador que eleve a 5v, incluso la puedes crear con componentes discretos. Hay otras versiones mucho más económicas que la de pololu (esta por ejemplo)








Motor HP 10:1 de Pololu:


Inconvenientes:
- El shaft en media luna hace que vibre
- Su consumo no es eficiente.
- Los engranajes están expuestos y se dañan con facilidad ante la obstrucción de algún granito de arena. Hay que protegerlos mucho.
- No son precisos y el freno fem es débil.
Ventajas:
- Es pequeño y liviano
- Es lo mejor que vamos a conseguir en ese precio.
- Tiene un torque aceptable.


Consejo: suelden bien los cables de alimentación puesto que la vibración por el shaft en D hace que se despeguen con facilidad.
Cuando se piensa en motores pololu generalmente se elige entre 10:1 y 5:1. La elección depende del peso de tu robot y del tipo de pista.
Si eliges motores 10:1 tendras más torque, lo que permite tener buen control, preciso, aceleración y un mejor frenado. Es ideal si tu robot pesa más de 60 Gramos y/o si el tipo de pista es pequeña con muchas curvas. En las competencias venezolanas el mayor tiempo del recorrido se tarda en desacelerar para entrar en una curva y acelerar para salir de esta, no hay tramos de recta que nos dejen alcanzar altas velocidades.
Los 5:1 nos permiten llegar a mayores velocidades pero con menor aceleración. Además la inercia del motor es mayor y es difícil detenerlo para frenar en las curvas. Para usarlos deberías tener un robot liviano y bastante agarre. Además con la experiencia aprendimos que hay que trabajarlos con más de (13 V) para poder frenar en las curvas.

Existen otras alternativas para los motores como los motores maxon o faulhaber. Aunque son alternativas muy caras valen la pena si queremos hacer un velocista fuera de lo normal. Por lo general, en micromouse usan los motores faulhaber 1717, logrando velocidades increíbles. Una opción más barata son los motores mabuchi. Aquí puede ver un video de un robot que los tiene y va bastante rápido.


Driver 


L298n
L298n: Fue el primer driver que usamosEs barato pero desperdicia demasiada energía en forma de calor lo que reduce el tiempo de batería y recalienta el boost. Además de ser pesado y no poseer la función de freno, ocupa mucho espacio y eleva el centro de masa. El control se vuelve bastante difícil y es complicado alcanzar una velocidad alta. No lo recomiendo para seguidores de linea. Aunque conseguimos un robot relativamente rápido.




TB6612FNG

TB6612FNGBuen driver, con el se logró una buena velocidad. Es liviano, pequeño y tiene la función de freno. Cuando lo instalamos conseguimos que la duración de la batería pasara de 4 min a 13 min. El boost ya no se recalienta tanto como antes. 






Chasis
Para nuestro primer modelo usamos forex de 3 mm. Luego rebajamos el peso y lo cambiamos a uno de 2 mm, lo cual disminuyó de forma considerable el peso. Ventajas















  • - Peso ligero
  • - Alta resistencia
  • - Facilidad de limpieza
  • - No se hincha ni se pudre
  • - Es rígido pero fácilmente se puede cortar con un exacto
  • - Permite imprimir sobre el (para hacer diseños)
  • El forex tiene muchos nombres:
    "PVC espumado"
    "Espuma de PVC"
    "PVC inflado"

    Mis laminas de 20 x 20 las compre por mercadolibre a una distribuidora de pvc.


    Conexiones

    Diagrama de conexiones de un seguidor de linea básico:



     Las conexiones entre módulos se hicieron con hilos de cobre esmaltado. Lo que reduce el peso de forma considerable.
    conexiones al sensor qtrrollo de cable esmaltado de cobre hilo




    conexiones de los módulosconexiones al pro mini


    Algoritmo y código
    Se usó algoritmo PD para el control. Luego explicaré un poco más de esto
    Para tener más información puede entrar en este post
    http://wannabe-programmer.blogspot.com/2013/10/control-del-robot-velocista-lenin.html

    Telemetría
    Se usó un modulo bluetooth hc-05 para la telemetría. En la parte del programa monitor se usó Qt con Bluez.


    Otras cosas:

    Capacitores en los motores

    Cuando los motores arrancan o frenan se producen picos de consumo que pueden afectar el micro (apagarlo o resetearlo). También las aceleraciones constantes producen ruido que puede afectar la lectura de los sensores. Se recomienda colocar capacitores cerámicos para soportar estos picos y suprimir el ruido eléctrico. (Aqui puede ver más info sobre esto)






    Fotos y video




    Modelo de la última competencia




    Este es el vídeo del robot corriendo en la final del ccsbots en la cual obtuvo el primer lugar de su categoría. Se puede notar que el gran problema fue la curva de 90°. Reducimos la velocidad del robot para no salirnos en esa curva. En en ese momento el PWM estaba a 120. Es decir, está trabajando a menos de la mitad de la potencia maxima (255), con un poco más de agarre el robot puede ir mucho más rápido.





    * Actualizado *
    Este es el vídeo de la final de la categoría velocista del CISAI 2014 donde obtuvo el 1er lugar en la categoría velocista.




    También a participado como laberinto

    * Actualizado *
    Esta fue en la final de la Ulabots 2014. Para esa edición se mejoraron las ruedas colocando rines impresos en 3D y unas gomas que aumentaron considerablemente el agarre. También se le colocó una paleta de madera para evitar el cabeceo. Aunque se ve horrible estéticamente, mejoró mucho el control. En esta edición ganó el 1er lugar de su categoria de nuevo. Ya en este punto lo que queda es reducir el peso lo más posible e intentar bajar más aun el centro de masa.




    El robot es un prototipo muy básico, todavía queda implementar los encoders, mejorar las ruedas, cambiar los componentes a otros mas livianos para llegar a la meta propuesta de 40 gramos, entre otras cosas.

    Sus sugerencias serán bien recibidas