2017_07_06: UC: Electrónica digital para todos con FPGAs libres

Juan Gonzalez-Gomez edited this page Mar 12, 2018 · 44 revisions

Ficha

Resumen

En la primera actividad se dió una charla introductoria a la electrónica digital con FPGAs libres, con una demostración de la creación de un sistema de alarma:

La electrónica digital es la base tecnológica del mundo digital en el que vivimos. Con ella se diseñan todos los procesadores, controladores y demás chips digitales con los que se construyen dispositivos como móviles, ordenadores, televisiones, tablets, etc. A pesar de basarse en unos principios simples y fáciles de entender por cualquier persona, la electrónica digital es poco accesible para el público no técnico. ¿Sería posible que los niños y los no electrónicos pudiesen diseñar circuitos digitales? En esta charla se hace una demostración del uso de la herramienta libre Icestudio, que permite hacer circuitos digitales fácilmente, que se implementan en la placa con FPGA Icezum Alhambra. Todo ello es gracias a que por primera vez en 30 años disponemos de FPGAs libres

En la segunda hora se hizo un taller de Robots siguelíneas, usando circuitos digitales implementados con Icestudio en las tarjetas ICezum Alhambra

Descargas

Fichero Descripción
2017-07-06-Introduccion-FPGAs-Libres.odp Presentación. Formato LibreOffice
2017-07-06-Introduccion-FPGAs-Libres.pdf Presentación. Formato PDF
Demo-uc-17.zip Colección para Icestudio 0.3 con todos los ejemplos y bloques usados en la charla
uc-robot.zip Colección para Icestudio 0.3, con los ejemplos usados en el taller
Lattuino_Stick_t26.bin Bitstream con Lattuino para la placa Icezum Alhambra
Lattuino_Counter.ino Ejemplo hola mundo 1 para Lattuino: un contador binario de 4 bits
Lattuino_Serial.ino Ejemplo hola mundo 2 para Lattuino: Envío de una cadena por el puerto serie

Fotos

Probando los ejemplos

Para probar los ejemplos mostrados en la charla, hay que seguir los siguientes pasos:

  • Instalar Icestudio 0.3 o superior

  • Descargar esta colección: Demo-uc-17.zip (No descomprimir el archivo)

  • Abrir Icestudio

  • Añadir la colección a Icestudio: Ir a la opción Herramientas/Colecciones/Añadir. Seleccionar el archivo descargado previamente (Demo-uc-17.zip)

  • Seleccionar la colección Demo-uc-17: Ir a la opción Select/Collection/Demo-uc-17

  • Abrir el primer ejemplo: Ir a Archivos/Ejemplos/Ejemplos/01_demo_alarm/01_ledon

  • ¡Ejemplo listo para cargar en la Icezum Alhambra!

  • Repetir los pasos pero con la colleción del taller: uc-robot.zip

Probando Lattuino

La demo de Lattuino es similar a la realizada en la charla de Murcia. Toda la documentación está accesible desde este enlace

Taller de robots siguelíneas con FPGAs libres

El taller se divide en 5 bloques. En el primero instalaremos la colección uc-robot, con los componentes y ejemplos de icestudio usados en este taller. En el segundo haremos circuitos digitales básicos muy sencilos, para familiarizarnos con icestudio y la placa Icezum Alhambra. En la tercera parte calibraremos los motores, para que se queden parados (Al ser servos trucados, hay que ajustar su posición de stop). Haremos circuitos básicos de movimiento del robot. En la siguiente parte calibraremos los sensores de IR y finalmente, en la quinta parte haremos que el robot siga la línea negra

Bloque I: Instalando la colección con los ejemplos

El primer paso es instalar esta colección en Icestudio: uc-robot.zip, que contiene todos los ejemplos y bloques usados en el taller

Bloque II: Ejemplos básicos

Haremos circuitos digitales muy básicos para aprender a manejar icestudio y aprender a sintetizar los circuitos en la placa Icezum Alhambra

Comenzamos con el circuito "hola mundo" que simplemente enciende un led:

Con este ejemplo aprendemos a crear pines de salida y a tirar cables. Para sintetizarlo y cargarlo en la placa le damos a la opción Herramientas/cargar. Veremos cómo el LED0 se enciende, y el resto permanecen apagados

Ahora usaremos una de las características más importantes del hardware: el paralelismo. Para encender 2 leds, hacemos un "copy & paste" del circuito original, y cambiamos el LED0 por LED7:

Otro circuito equivalente es conectar dos cables desde un único bit a 1. Aunque en el dibujo aparecen como 2 cables conectados, en realidad se trata de 2 cables independientes y hay que tirarlos como tales: desde la parte derecha del bloque 1 hasta la parte izquierda de cada bloque amarillo de salida

  • Ejercicio: Hacer un circuito que encienda todos los leds impares

Solución:

Para leer información del exterior creamos pines de entrada. La tarjeta icezum alhambra tiene 2 pulsadores externos, para hacer pruebas. En este ejemplo los conectamos directamente a dos leds, de manera que al apretar un pulsador se recibe un 1, que se transmite por el cable al led, encendiéndolo. Al soltar el botón, se envía un 0 y el led se apaga

Modificamos el pulsador 2 añadiendo el componente Pulsador de Cambio, y comparamos la diferencia de comportamiento. Ahora, al apretar sw2, el led se enciende, igual que antes, pero al soltarlo, el led permanece encendido. Es decir, es un pulsador que tiene memoria, a diferencia del sw1. Si volvemos a realizar la operación, el led se apaga. Con cada operación de apretar-soltar el led cambia de estado

Bloque III: Motores

Los motores que lleva nuestro robot son servos trucados. Un servo es un motor que se mueve a una posición determinada, y permanece ahí hasta que le indiquemos la siguiente. Es decir, no tiene rotación continua. Se usan para hacer robots articulados o mover lo alerones de los aviones de radio-control.

Sin embargo, es posible "trucar" los servos, eliminando su tope interior y modificando el potenciómetro, consiguiendo que lo podamos mover de forma continua. Eso es lo que hemos hecho en nuestro robot

Cuando se usan servos trucados, es necesario calibrarlos. Hay que determinar el valor de su posición de parado.

El primer paso es hacer un circuito muy básico, para mover/parar el motor. Conectaremos uno de los pulsadores al motor, de manera que al apretarlo el motor gire, y al volver a apretarlo se pare

El controlador del motor que usaremos es el Motorbit-Custom. Con él haremos este circuito:

El controlador tiene 2 bits de entrada: uno para controlar el encendido/apagado del motor. El otro para determinar su sentido de giro: horario/antihorario. Este controlador NO permite modificar la velocidad del servo.

Conectamos el servo al pin D0 y cargamos el circuito. Al apretar SW1 el motor se moverá con más velocidad y al volver a apretarlo se parará o se moverá con menos velocidad. Si no se para completamente, que es lo más normal, significa que tenemos que calibrarlo

Desde el menú Básico/constante, colocamos un bloque constante, que nos permite introducir valores para la calibración. Le damos el nombre que queramos (por ejemplo ST) y lo conectamos al parámetro ST del componente MotorBit-custom

Empezamos con el valor por defecto: 144. Cargamos el circuito y probamos. Este valor lo vamos modificando hasta que encontremos uno en el que el motor se queda totalmente parado. En el caso del servo que estoy usando yo lo he conseguido con el valor 140

Repetimos el procedimiento para el otro servo, conectado a otro pin de la placa, por ejemplo el D1. En mi caso el valor obtenido es 138

Con los dos motores conectados, y ya calibrados, hacemos el primer circuito para que el robot se mueva hacia adelante. Es importante darse cuenta de que los motores están colocados en el robot con diferentes orientaciones (en espejo), de manera que para que el robot avance en línea recta, los motores se mueven en sentidos diferente (un lo hace en sentido horario, y el otro en sentido anti-horario). Por ello, los sentidos de giro de ambos motores siempre serán diferentes, y por eso usamos una puerta NOT

El circuito es el siguiente:

Si el robot se moviese hacia atrás, en vez de hacia adelante, sólo hay que cambiar el bit 0 por un bit 1. Si cuando debiese estar parado alguno de los motores se mueve, es necesaria una recalibración, cambiando las constantes ST de los motores

  • Ejercicio: Hacer un circuito con dos pulsadores para mover el robot hacia adelante, derecha, izquierda o parado

Solución:

Bloque IV: Sensores ir

Los sensores de IR los leemos igual que si fueran pulsadores. Lo primero es calibrarlos. Los colocamos en el robot, los conectamos a las entradas digitales D13 y D12 y hacemos un circuito de prueba y calibración, que simplemente saca su valor por los leds

Colocamos debajo de los sensores un papel con negro y blanco y verificamos si a la altura a la que están los sensores los leds se apagan al leer blanco y se encienden al detectar negro. En caso de que no sea así, ajustamos su potenciómetro hasta que ocurra esto

Bloque V: Robot autónomo

Ya tenemos todos los elementos listos para que el robot se pueda mover de forma autónoma. Implementaremos un primer comportamiento muy sencillo: hacer que el robot avance hasta que un sensor detecte negro. Es el ejemplo similar al del botón de avance en línea recta, pero ahora con el sensore de IR:

Este comportamiento es muy divertido. Si se coloca sobre una mesa cuya superficie sea detectada como blanco, el robot empezará a moverse. Al llegar al borde, el sensor de IR detectará negro (el negro es equivalente a una distancia muy larga) y se parará. Justo en el momento en el que parece que se va a caer al suelo :-)

Y por último, implementaremos un algoritmo de seguimiento de la línea negra. El que usaremos está definido por estos dibujos:

Cuando los dos sensores están sobre la línea negra, el robot debe avanzar hacia adelante. En un momento dado, hay una curva hacia la izquierda. El sensor derecho sale primero y pasa a leer blanco, mientras que el sensor izquierdo sigue leyendo 1. En ese caso el robot debe girar hacia la derecha, hasta lograr que el sensor derecha vuelva a leer 1. Es giro a la izquierda se consigue moviendo el motor derecho, y que el izquierdo esté parado

El caso de la curva hacia la derecha es el caso contrario. El sensor izquierdo se sale antes y pasa a detectar blanco, mientras que el sensor derecho detecta negro. En ese momento hay que girar a la derecha, activando el motor izquierdo y parando el derecho

Si los dos sensores leen blanco, consideraremos que el robot está fuera de la línea y haremos que se pare

El circuito que implementa este comportamiento es el siguiente:-

La clave está en darse cuenta de que cuando el sensor derecho detecta blanco, hay que parar el motor izquierdo, y cuando el sensor izquierdo detecta blanco, hay que parar el motor derecho. Es decir, que el sensor derecho controla el motor izquierdo, y el sensor izquierdo el motor derecho

Vídeo

En este vídeo se puede ver el comportamiento del robot en acción:

Click to see the youtube video

Más información

Créditos

Agradecimientos

  • A Ivan Bermejo, Director el curso y CEO de Iberobotics por invitarme a participar en el curso, por enseñarme Santander y regalarme uno de los robots. ¡Muchisimas gracias! :-)
  • A Jose Andrés Echevarría, profesor en el IES Valentín Turienzo, por enseñarme Santander, su ayuda en el taller, y llevarme a todos los sitios. ¡Muchísimas gracias! :-)
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.