martes, 10 de noviembre de 2009

brazo robotico

Siguiendo con los proyectos para mostrar las posibilidades del sistema ICARO, desarrolle este brazo robotico de 3 grados de libertad fabricado con motores de lectoras de CD rotas.
La idea basica era fabricar de un brazo de costo casi cero con componentes recuperados de basura electronica, poco hardware y aprovechar los 8 conectores de la placa ICARO.
Basicamente, cada motor es controlado por un relé doble inversor, y este a su ves es controlado por 2 conectores del puerto paralelo (con este esquema se puede controlar hasta 4 motores).
un conector envia tension al motor prendiendolo y apagandolo; El otro motor controla el rele que al activarlo cambia la polaridad de la tension haciendo que el motor gire para un lado o para el otro.
de esta forma con los dos conectores de lpt se puede activar/desactivar el motor , cambiar su sentido de giro (derecha/izquierda) y controlando el encedido y apagado, se puede controlar la velocidad con la que gira prendiendolo y apagandolo en pulsos regulares (PWM).
Este pequeño brazo tiene muy poca presicion y es bastante debil para levantar objetos, pero mas que nada sta diseñado para demostrar como se pueden fabricar pequeños robots educativos con un bajo costo. Sin embargo, si se utilizaran componentes de buena calidad (motores mas pontentes con servomecanismos y una estructura mas estable) se con el mismo codigo ICARO, se podria usar un brazo robotico muchisimo mas estable y profesional.



En esta fotografia se aprecia los motores y los grados de libertad del brazo robot.
los motores y sus engranajes son del dispositivo de ejeccion de la bandeja de CD de lectoras rotas.

Para controlarlo uso los 5 conectores de sensores de la placa ICARO para manejar cada motor a modo de jostick. 4 conectores controlan el giro izquierda/derecha de 2 motores. el quinto boton, cambia a los otros dos motores para asi poder controlar el giro de los 4 motores en total.





lunes, 14 de septiembre de 2009

live cd ICARO

primeras imagenes del live-cd de FEDORA 10 con Icaro instalado para pruebas.
esta version de FEDORA fue modificada ( lo que se denominca un respin) para contener programas especificos de electronica como el software Kicad, GEDA y ademas tenr instalado el binario de ICARO (esta version es la 0.3.3.110909 que todavia usa las instruccion outp de assembler) para poder trabajar directamente sin nececidad de compilar.
ESte live-cd esta compilado con XFCE4 para reducir su consumo de RAM, pero igual es recomedable usarlo con una pc de por lo menos 256 Mb de memoria RAM.
un especial agradecimeinto a Edwin del proyecto FEDORA por explicarme como armar un respin de FEDORA usando las excelentes herrramientas como REVISOR y Kickstart.

IMAGENES:

cover art del cd


splash de boot de fedora con logo ICARO


pantalla inicial de XFCE4


corriendo el programa KICAD


desde la terminal usando ICARO
con un archivo de ejemplo

miércoles, 9 de septiembre de 2009

control de motores de CC

Los motores de C.C (corriente continua) son muy comunes, suelen estar en cualquier dispositivo electromecanico y son muy sencillos de contrlar (para mas informacion consultar la wikipedia).
hay dos factores importantes a la hora de manipular un motor CC, uno es que la direccion de giro depende de la polaridad con la que se conecta la fuente de alimentacioin al motor, el otro factor, es la cantidad de tension y amperaje que se aplica al motor.
si queremos que gire para un lado o para el otro, debemos cambiar su plaridad. Si queremos aumentar o disminuir su potencia, subiremos o bajaremos la tension.
para el siguiente proyecto usaremos un rele doble inversor (bastante comun en las casa de electronica) en cada motor de CC para controlar su polaridad. como se observa En el grafico siguiente, nececitamos 2 puertos de la placa de control, el puerto 1 activa o desactiva el rele, y el puerto 2 envia tension al motor.
Cuando se aplica tension al rele, este mediante su bobina interna, mueve el interruptor cambiando la polaridad que se envia al motor mediante el puerto 2, es como si se sacaran los cables y se invirtieran cambiando su polaridad.
para controlar este motor nececitamos activar el puerto 2 para enviar tension al motor, y si queremos cambiar el sentido de giro, activamos el puerto 1 y el puerto 2.


esquema de conexiones

En el siguiente programa vemos como activar durante 2 segundos la direccion de giro y despues cambiarla durante otros 2 segundo antes de salir del sistema

#----programa de ejemplo---- 

inicio
# poner los pines del puerto a cero y esperar
#
5000 milisegundo
multipuerto(0,5000)
# activamos el puerto 2 y el motor
#girara en un sentido durante 2000 Ms
multipuerto(2,2000)
# activamos el puerto 2 y 1 (3) y el motor girara en el
#otro sentido durante 2000 Ms
multipuerto(3,2000)
# salimos del programa
multipuerto(0,0)
final

Para mostrar algunas de las posibilidades de este tipo de motores
en el siguiente video vemos un robot con 2 motores CC y 2 interruptores de contacto que al ser activados modifican el funcionamiento de os motores.


video


cuando el sensor izquierdo es activado (el robot choca contra la pared) el programa cambia la direccion del motor derecho durante 500 Ms y luego continua el ciclo normal. Cuando se activa el sensor derecho, es el motor izquierdo el que cambia de sentido de giro.
Si se activan los dos sensores al mismo tiempo, se cambia la polaridad a los dos motores para que el robot retroceda y despues se lo hace girar a la izquierda durante 500 Ms.

algunas imagenes del robotito









Aca esta el codigo de control del programa
#----programa del robot que resuelve laberintos---- 


# poner los pines del puerto a cero y esperar
inicio
#variables de movimeinto del robot
#----------------------------#
#retrocede rueda derecha
$a=2
#avanza rueda derecha
$b=3
#----------------------------#

#----------------------------#
# retrocede rueda izquierda
$c=8
# avanza rueda izquierda
$d=12
#----------------------------#

#avanza
$e=15
#retrocede
$f=10

#----------------------------#
# variables sensores
# sensor derecha
$g=63
# sensor izquierda
$h=255
# ambos sensores
$i=191
#salir
$j=119
#----------------------------#


#----------------------------#
# inicia el programa #
#----------------------------#

# pongo los pines a cero
multipuerto(0,4000)

# bucle de inicio
bucle

# salir
si(%p=$j)
multipuerto(0,0)
final
finsi

# Avanzo
multipuerto($e,2)
multipuerto(5,30)
# golpea ambos sensores
si(%p=$i)
multipuerto($f,200)
finsi

# sensor izquiero
si(%p=$h)
multipuerto($f,300)
multipuerto($d,360)
finsi

# sensor derecho
si(%p=$g)
multipuerto($f,300)
multipuerto($b,360)
finsi

finbucle

final

martes, 1 de septiembre de 2009

Hardware

El hardware propuesto es muy sencillo, se basa en el integrado UNL2803 que no es mas que un array de 8 transistores Darlington que elvan la tension TTL del puerto (5 volt) y pueden manejar cargas de hasta 12 volts 500ma, suficiente para manejar pequeños motores o accionar reles para manejar tensiones mayores.
Las 8 salidas de potencia no son mas que la amplificación mediante un array de transistores Darlington (ULN2803) de las salidas TTL 0 a 7 Este chip puede drenar una corriente máxima de 500ma, lo que es suficiente para activar un LED, un relé y hasta un motor DC de bajo consumo (tipo motor de grabador).
Las entradas son conexiones directas a los pines del puerto de control del puert paralelo

diagrama esquematico del UNL2803



diseño del PCB

Una de las ventajas de este integrado es su bajo costo y facil obtencion, haciendolo ideal para proyectos sencillos de robotica educativa, donde los alumnos podrian quemar los componentes por su falta de experiencia.
En internet existen una gran cantidad de proyectos que usan este tipo de integrado para controlar el puerto paralelo como por ejemplo:

todorobot
proyecto reess
pablin electronica
bulma

Todos estos proyectos se pueden usar con el Sistema ICARO, porque se basan en el mismo funcionamiento. La ventaja de usar ICARO radica en no nececitar programar en C/C++ para cada manejar cada placa, basta con crear los archivos de textos con instrucciones ICARO.

ejemplo 3

En este ejemplo usaremos la variable especial %p. Esta variable lee el valor del puerto de control de LPT y se utiliza para saber si alguno de los 5 pines de control han sido activados.
El ejempo inicia con la instruccion bucle que es igual a repetir( con la diferencia que hace iteraciones infinitas hasta que se sale del programa. el programa se quedara leyendo la instruccion si( y comparando el valor de %p, si %p es igual a 112 (pin 1 activado) se ejacutara todas las instrucciones abajo de si( hasta llegar a finsi. Si %p no es igual a 112, se salteara todas las instrucciones y el programa seguira desde finsi.

#----programa de ejemplo---- 

# declarar las variables al inicio del codigo
variables
$tiempo=100
$puerto=1
finvariables


inicio
# poner los pines del puerto a cero y esperar
#
5000 milisegundo
multipuerto(0,5000)
# iniciar un bucle infinito y leer
# el puerto de control
bucle

# si el puerto de control es igual a 119
# repetir 5 veces multipuerto( $puerto,$tiempo)
# y sumar $puerto + 1
si(%p=119)
repetir(5)
multipuerto($puerto,$tiempo)
$puerto=suma($puerto;1)
finrepetir
finsi

# si el puerto de control es igual a 119
# apagar todos los pines y salir del sistema
si(%p=112)
# apagar los pines y salir del programa
multipuerto(0,0)
# cuando se llega a la instruccion "final"
# se sale del sistema
final
finsi

finbucle

final



al iniciarse el programa entra en un bucle infinito, y se queda leyendo todo el tiempo el puerto de control (%p). si %p= 119 envia al puerto de datos el valor de $puerto.
si %p=119 sale del sistema.
En el video se puede ver en la protoboard 2 micro-swichts que al ser presionados ponen en estado alto los pines del puerto de control.

Ejemplo 2

En este ejemplo usaremos variables y la funcion repetir( para hacer hacer un contador y generar las 255 posibilidades de convinacion de pines que se puede hacer en el puerto paralelo.
Las variables en ICARO se declaran al inicio del codigo antes de la instruccion inicio, todas deben empezar con el simbolo $ y son enteros sin signo (solo maneja valores positivos y sin decimales).
repetir(, repetira N veces todo el codigo que este debajo hasta la instruccion finrepetir. Esta instruccion es recursiva y permite poner repeticiones dentro de repeticiones.


#----programa de ejemplo---- 

# declarar las variables al inicio del codigo
variables
$tiempo=100
$puerto=1
finvariables


inicio
# poner los pines del puerto a cero y esperar
#
5000 milisegundo
multipuerto(0,5000)
# utilizando una repeticion de 255 veces
# enviar el valor en decimal de la variable
# $puerto y esperar
100 milisegundos
repetir(255)
multipuerto($puerto,$tiempo)
# usando la instruccion suma(, adicionar el valor de
# $puerto mas 1 y o grabar de vuelta en la variable
# $puerto. haciendo un "contador" basico

$puerto=suma($puerto;1)
finrepetir

# apagar los pines y salir del programa
multipuerto(0,0)
final





La instruccion suma(, adiciona los valores entre parentesis y los almacena en una variable. Permite sumar N componentes ($variable=suma( n1;n2;n3;....) y sumar variables entre si.
En el ejemplo anterior, sumamos el valor de $puerto (que al inicio fue declarado con un valor de 1) y lo volvemos a almacenar en $puerto. En la primera iteracion, se envia el valor de 1 ($puerto=1) y luego se suma $puerto +1 guardando el resultado en $puerto, que ahora es igual a 2. en cada iteracion de la instruccion repetir, $puerto incrementara su valor en 1.

ejemplo 1

Este pequeño ejemplo, muestra como hacer el efecto "auto fantastico" mediante la funcion multipuerto(


#----programa de ejemplo---- 
inicio

# poner los pines del puerto a cero y esperar
#
5000 milisegundo
multipuerto(0,5000)
# activar uno a uno los pines del puerto paralelo
# enviando su valor en decimal y esperando
# 1000 milisegundos (1 segundo)
multipuerto(1,1000)
multipuerto(2,1000)
multipuerto(4,1000)
multipuerto(8,1000)
multipuerto(16,1000)
multipuerto(32,1000)
multipuerto(64,1000)
multipuerto(128,1000)
# apagar los pines y salgir del programa
multipuerto(0,0)
final





El codigo es bastante sencillo (en el proximo ejemplo veremos de hacerlo mas eficiciente usando la funcion repetir( y variables). Se envia al puerto un valor decimal que al ser transformado en binario activa secuencialmente cada pin del puerto.
por ejemplo, 1 en decimal es 00000001 en el tipo de sistema binario que maneja el puerto paralelo (1 byte)
Haciendo la progresion geometrica obtenemos que:

1 - 00000001
2 - 00000010
4 - 00000100
8 - 00001000
16 - 00010000
32 - 00100000
64 - 01000000
128 - 10000000


de esta forma podemos activar cualquiera de los pines del puerto o todos al mismo tiempo, solo hay que sumar los valores individuales decimales de los pines y obtendremos el valor que nececitamos para enviar al puerto, si quisieramos activar todos los pines, sumammos los 8 valores de la tabla de arriba y obtenemos 255 que es el maximo valor que se puede enviar al puerto paralelo.

jueves, 20 de agosto de 2009

Presentación

ICARO es un software desarrollado con la intención de acercar de una manera trasparente al usuario los fundamentos de la programación (iteraciones, repeticiones, recursividad, si condicionales) aplicados a un contexto físico como puede ser un robot o cualquier sistema de automatización.

Uno de los principales objetivos de la Robótica Educativa es la generación de entornos de aprendizaje basados fundamentalmente en la práctica real de los estudiantes. La idea es que los niños puedan concebir, desarrollar y poner en práctica diferentes robots educativos que les permitirán resolver algunos problemas y facilitarán, al mismo tiempo, ciertos aprendizajes.

La Robótica Educativa, dado su carácter polivalente y multidisciplinario, constituye una actividad que permite el abordaje de conocimientos complejos en torno a las nuevas tecnologías a partir de aportes provenientes de la electrónica, física, matemática e informática.

En particular, es posbile trabajar la enseñanza de las bases fundamentales de la lógica de los sistemas computacionales a través de la creación de un mecanismo autónomo electrónico (robótico).

Por otro lado, la posibilidad de desarrollar una serie de juguetes-objetos implica una experiencia que contribuye a expandir la creatividad y el pensamiento reflexivo y científico de los alumnos (en relación la formulación de hipótesis, la experimentación, la elaboración de conclusiones).


En otras palabras, se trata de crear las condiciones para la apropiación de conocimientos por parte de los niños y de permitir su transferencia en diferentes campos de problemas. Se trata de otorgar a los alumnos un rol activo en sus aprendizajes, colocándolos como diseñadores de sus propios proyectos y constructores de conocimientos.


miércoles, 19 de agosto de 2009

Como funciona ICARO

ICARO se podría considerar como un Framework para trabajar con el puerto paralelo (lpt) de una manera sencilla.

Su funcionamiento se basa en escribir instrucciones en un archivo de texto plano para que el software (que funciona como un intérprete) vaya leyendo linea por linea y enviando la información traducida al puerto paralelo, y mediante un hardware de protección eléctrico, poder encender/apagar distintos mecanismos electrónicos como motores, motores paso a paso, solenoides, servos etc etc.
El puerto paralelo es una interfaz entre una computadora y un periférico cuya principal característica es que los bits de datos viajan juntos enviando un byte completo o más a la vez. Es decir, se implementa un cable o una vía física para cada bit de datos formando un bus. El puerto paralelo de una PC es ideal para ser usado como herramienta de control de motores, relés, LED's, etc. El mismo posee un bus de datos de 8 bits (Pin 2 a 9) y muchas señales de control, algunas de salida y otras de entrada que también pueden ser usadas fácilmente.



Diagrama de pins del conector DB-25 estándar
para el puerto paralelo


En la figura se describen todas las líneas del estándar Centronics, con indicación de su denominación y el número de pin que le corresponde, tanto en el conector tipo Centronics de 36 pines como en el conector DB-25. En esta tabla se indica que las 8 líneas correspondientes a los bits de datos (Data 0 a Data 7) son líneas de salida, pues así lo establece el estándar Centronics, sin embargo y sobre todo en las implementaciones más recientes, la circuitería asociada al interface del puerto paralelo puede ser tal que las líneas de datos pueden ser leídas desde el PC y, por tanto, ser consideradas como líneas bidireccionales.

Cuando se envía un Byte al puerto paralelo, este lo separa y manda cada bit (0/1) por un pin del concetor (Data 0 a Data 7). Como los niveles de tensión y de corriente coinciden con los niveles de la lógica TTL, cuyos valores típicos son 5v - 2.6 mA para un estado alto (1) y 0V para un estado bajo (0), cuando un pin del puerto esta en estado 1, tiene una tensión de 5 volt, en cambio cuando esta en estado 0, no hay tensión a la salida del pin.

De esta forma es sencillo controlar componentes, sólo hay que saber calcular el valor binario que se le envía al puerto para poder activar (que tenga tensión) el pin especifico del conector db25.

martes, 18 de agosto de 2009

Primeros pasos con ICARO

Una vez descargadas las fuentes del software (o el binario), se tiene que crear un archivo de texto plano (usando cualquier editor de texto como vi, emac, nano, gedit etc.) con las instrucciones para pasar al Framework.

El sistema ICARO se puede considerar como un lenguaje de programación interpretado. Cada orden que se escribe es interpretada por el programa y ejecutada hasta llegar a la instrucción “final”. Todo el código debe empezar con la instrucción “inicio” y terminar con la instrucción “final”.


Código de ejemplo

#----programa de ejemplo---- 

inicio

#(todo el codigo que se quiera ejecutar)
final

Para ejecutar el programa hay que grabar el archivo (ejemplo.icr) y en la terminal escribir el siguiente comando:


$\icaro \directorio\ejemplo1.icr
El programa leerá el archivo y comenzará a interpretar las instrucciones. En el caso del código "ejemplo1.icr", el sistema elimina los comentarios (todas las líneas de código que empiezan con el carácter #) y procede a leer las instrucciones después de la instrucción "inicio". Como no hay ninguna instrucción, al leer "final" el sistema sale del programa.


La instrucción multipuerto(valor,tiempo)

Esta es la instrucción más importante y básica del sistema; tiene dos valores: en el primer campo se ingresa el valor en decimal (de 0 a 255) que se pasará (en binario) al puerto paralelo, y en el segundo campo se ingresa el tiempo en milisegundo que el sistema esperará hasta pasar a la próxima linea del código.

El ejemplo mas básico de programa funcional en sistema ÍCARO sería:


Código de ejemplo

#----programa de ejemplo----

inicio
#enciende los 8 pines del conector db25
multipuerto(255,1000)
#apaga los 8 pines del conector db25
multipuerto(0,0)
final


Al ejecutar

$\icaro \directorio\ejemplo2.icr


Se prenderán los 8 bits del puerto (tendrán tensión) durante 1000 milisegundos (1 segundo) y luego se apagarán.
De esta forma, se debe hacer un cálculo matemático para saber que valor en binario representan los pines que hay que activar, para controlar los distintos dispositivos que se conecten al puerto.