Skip to content

Vídeo 18: Bloques con parámetros

Juan Gonzalez-Gomez edited this page May 6, 2018 · 172 revisions

Vídeo

Click to see the youtube video

Haz click en la imagen para ver el vídeo en Youtube

Descripción

Hasta ahora hemos utilizado bloques específicos que hacían una función concreta. Aprenderemos a usar los bloques genéricos, que nos permiten crear bloques específicos mediante la asignación de valores a sus parámetros. Lo aplicaremos al manejo de tres nuevos componentes paramétricos: el corazon, el servobit y el motorbit. Esto nos permitirá fijar la frecuencia, el periodo, el ángulo del servo o la velocidad a valores diferentes de los establecidos por defecto

Colección

Academia-Jedi-HW-18.zip: Colección para este tutorial. Descargar e instalar

Contenido

Introducción

Hay dos técnicas usadas para el diseño de circuitos complejos: la composición y la parametrización. Con ellas nuestros diseños estárán mejor estructurados y los podremos reutilizar más fácilmente.

Mediante la composición construirmos bloques a partir de otros más sencillos, creando jerarquías. El situado en lo más alto es la entidad superior (top entity) cuyas entradas y salidas se corresponden con los pines de la FPGA. Los bloques intermedios se pueden reutilizar bien dentro del propio diseño o bien en otros

En esta animación, se parte la entidad superior de un circuito de ejemplo, y se profundiza hasta el nivel 4. Cada bloque superior se descompone a su vez en otros bloques en el siguiente nivel de profundidad

La otra técnica es la creación de bloques paramétricos. El objetivo es diseñar bloques genéricos, que se puedan especializar por medio de la asignación de valores a sus parámetros

Un ejemplo es el bloque genérico corazón, que veremos en el siguiente apartado, y que produce un bombeo de bits a una frecuencia genérica. Esta frecuencia se establece simplemente cambiando el valor de su parámetro

En este nos familiarizaremos con el uso de los bloques parámetricos y aprenderemos a fijar sus valores, dejando para más adelante el cómo diseñar mediante composición y parametrización

Corazón paramétrico

Hasta ahora hemos utilizado corazones con frecuencia fija, para bombear bits en nuestros diseños. Hemos usado mucho los de 1Hz y 2Hz, cuyos bloques son:

El bloque corazón paramétrico es como el mostrado a continuación. Es muy parecido a los anteriores, con la diferencia de que tiene un "cable" en la parte superior. Es el parámetro frecuencia, al que le tendremos que asignar un valor (en hercios)

Ejemplo 1: Parpadeo de un LED a 1Hz

Haremos un circuito para hacer parpadear el LED0 a la frecuencia de 1Hz, usando un corazón paramétrico. El componente lo encontramos en el menú Varios/Bombeo/Corazon_Hz

Nos falta por asignarle un valor al parámetro, pero por defecto vale 1Hz. Esto lo podemos saber viendo la información del bloque que aparece cuando dejamos el puntero del ratón sobre el bloque, durante unos segundos

Ejemplo 2: Estableciendo la frecuencia a 4Hz

Para establecer una frecuencia diferente, en Hz, tenemos que dar un valor al parámetro. Para ello usaremos un elemento nuevo: el bloque constante, que se encuentra en Básico/Constante. Igual que al colocar los pines de entrada o salida, nos pide un nombre para el valor que estamos introduciendo. Lo llamaremos, por ejemplo, HZ para representar que es un valor en hercios. A continuación lo unimos a su parámetro mediante un cable

Ahora ya podemos asignarle cualquier valor. Nos metemos en la caja de texto del bloque HZ y ponemos el valor de la frecuencia, en hercios (y usando números enteros). En este ejemplo estamos usando un valor de 4.

Si ahora sintetizamos y cargamos el circuito, vemos cómo efectivamente el LED parpadea 4 veces más rápido. ¡Hemos probado nuestro primer circuito paramétrico! En este Vídeo en Youtube lo puedes ver en funcionamiento

Click to see the youtube video

Circuitos reales y parámetros

Los bloques paramétricos son una herramienta para el diseñador de circuitos, pero en realidad no tienen existencia física. Es decir, que lo que se sintetiza en la FPGA no es el circuito genérico, sino el circuito particular que surge al utilizar el parámetro indicado.

Las herramientas de síntesis (invocadas por Icestudio) parten del circuito genérico, le aplican el parámetro y obtienen el circuito particular, que es el que se sintetiza en la FPGA

Esto es importante por los siguientes motivos:

  • El "cable" que une el parámetro con el circuito es ficticio. No tiene exitencia física. En la FPGA ese cable no aparecerá. Y lo mismo el parámetro. En el circuito particular NO hay parámetro

  • El circuito genérico tiene un tamaño desconocido. Es al aplicarle el parámetro y convertirlo en particular cuando tiene un tamaño real. Y además, este tamaño dependerá el parámetro. Parámetros distintos darán lugar, en general, a circuitos particulares con tamaños distintos

Bloques fijos

Llamamos bloques fijos, o constantes a los que no tienen parámetros. Por ejemplo el bloque "Corazón de 1Hz", que hemos estado usando para generar una señal de 1Hz. Es un bloque fijo, porque esta frecuencia no es un parámetro, sino que está prefijada al valor 1

Los bloues fijos son muy cómodos. Se colocan y listo. Y reducen la complejidad visual del circuito. Sin embargo es muy incómodo tener que crear circuitos específicos para cada uno de estos bloques. Si por ejemplo queremos tener dos corazones de frecuencias fijas, 1 y 2Hz, tendríamos que crearnos estos dos bloques de manera independiente (duplicando el trabajo). Una opción mejor es partir del bloque corazón genérico, y obtener los bloques fijos a partir de él, mediante composición, asignando valores diferentes a su parámetros

Asi es como se han creado los corazones de frecuencia fija que se encuentra en Varios/Bombeo/Fijos. Para comprobarlo no hay más que hacer doble click en uno de ellos, para entrar y ver de qué otros bloques está compuesto. Lo podemos ver en esta animación

Ejemplo 3: Fijando el periodo

También tenemos un corazón paramétrico que nos permite fijar el periodo, en vez de la frecuencia. Está disponible en el menú Varios/Bombeo/Corazón_seg, y por defecto tiene asignado un periodo de 1 segundo

Como ejemplo, haremos parpadear el LED0 con un periodo de 10 segundos. Colocamos el componente Corazon_Seg y ponemos una constante con el valor de 10 para asignársela a su parámetro

Al probar el circuito veremos que inicialmente el LED está apagado durante 5 segundos, y luego se enciende durante otros 5 (completando un periodo de 10 segundos). El ciclo se repite indefinidamente

Ejercicio 1: Tocar las notas DO,RE,MI,FA con dos switches

Diseñar un circuito digital que pueda tocar 4 notas diferentes: Do-re-mi-fa Las notas se seleccionan mediante dos interruptores externos*. Al apretarse un pulsador externo sonará la nota seleccionada

Las frecuencias de las notas a tocar son:

  • Do: 131 Hz
  • Re: 147 Hz
  • Mi: 165 Hz
  • Fa: 175 Hz

Consejo: Utilizar un multiplexor 4:1

  • En este Vídeo en youtube se muestra su funcionamiento

Click to see the youtube video

Servobit paramétrico

Para mover los servos a dos posiciones hemos estado usando el bloque servobit-90. Estas posiciones estaban fijadas en el propio bloque. Con el componente servobit paramétrico las podemos fijar a los valores que queramos. Los parámetros se denominan P0 y P1, correspondientes las posiciones del servo para sus dos valores de entrada: 0 y 1 respectivamente

Los dos parámetros, P0 y P1 (A los que nos referiremos genéricamente como Px) están en unidades de micro-segundos (μs). Cada posición se encuentra siempre entre un valor máximo Pmax y uno mínimo, Pmin, que dependen del tipo de servo.

Como ya vimos al hablar del servobit, la posición del servo queda determinada por la anchura del pulso que se mande. Esta posición, en microsegundos, es la que usamos para dar valores a P0 y P1. En la mayoría de los servos, la posición central se alcanza con pulsos de 1.5ms (1500 μs). Si la anchura es menor, el ángulo apunta hacia la derecha, y si es mayor, a la izquieda

Tabla de valores de los parámetros Px

En la siguiente tabla se resumen los valores máximos y mínimos de los parámetros para los diferentes servos. También se incluyen las posiciones P0 y P1 que se usan en el servobit-90

Es MUY IMPORTANTE NO dar valores mayores de PMAX ni menores de PMIN. Esto llevaría al servo a posiciones fuera de su rango, y lo podríamos dañar

Servo Pmax(μs) Pmin(μs) P1(μs) P0(μs)
Futaba 3003 2410 380 1670 820
Emax-ES808A 2550 580 2000 1000
TowerPro SG-90 2350 500 2000 1000

Ejemplo 4: Cambiando las posiciones al servobit

Como ejemplo usaremos un servobit paramétrico para cambiar el ángulo en un Futaba 3003. Primero colocamos el componente, que lo encontraremos en Varios/Servo/Futaba3003/Servobit. Su entrada la conectamos a un pulsador y la salida al servo. Comprobaremos su funcionamiento primero con los parámetros por defecto

El sevo se mueve igual que cuando usábamos el servobit-90. Ahora le añadimos los bloques constantes para poner valores diferentes a P0 y P1, por ejemplo sus valores extermos:

Si cargamos ahora el circuito para probarlo, veremos que el arco que recorre el servo es mucho más amplio que antes

Bloques Servobit fijos

Igual que hicimos con el corazón paramétrico, podemos definir bloques en los que el ángulo entre las posiciones P0 y P1 esté fijado, y no haya que usar parámetros. Estos bloques están formados a partir de un bloque genérico al que se le han asignado unos valores fijos. Es el caso de los componentes Servobit-90, cuyo ángulo entre P0 y P1 se ha fijado en 90 grados

En esta animación vemos el interior del bloque Servobit-90 para servos Emax-ES08A

Todavía no sabemos cómo crear esos bloques, pero lo aprenderemos en los tutoriales venideros

Ejercicio 2: Movimiento de un Servo con ángulos pequeño y grande

Diseñar un circuito digital para mover un servo a dos posiciones diferentes,
controladas por un pulsador. Mediante un interruptor externo seleccionaremos
entre dos modos: ángulo pequeño y ángulo grande. En el modo ángulo pequeño,
el servo se mueve entre dos posiciones, separadas un ángulo pequeño, menor de 90.
En el modo ángulo grande, el servo se moverá entre sus dos extremos

  • En este vídeo en Youtube se puede ver un ejemplo de funcionamiento

Click to see the youtube video

Ejemplo 5: Pinza mecánica

Como ejemplo de aplicación de nuevo bloque servobit paramétrico, lo usaremos para abrir y cerrar esta Pinza mecánica, imprimible en 3D, que tiene un mecanismo paralelo que le permite agarrar objetos

Las piezas se imprimen en 3D y se ensamblan. La parte superior queda así:

y por la parte posterior se coloca un micro-servo, atornillado a la base de la pinza:

Haremos un circuito para poder abrir y cerrar la pinza usando un pulsador externo. Sólo hay que colocar el servobit paramétrico y dar los valores adecuados a sus parámetros. En P1 especificamos el valor para que la pinza esté abierta. Estos valores dependen de cómo hayamos colocado el servo a la pinza, y en general serán diferentes para cada pinza. En mi caso, el valor de P1 es de 2050 μs. En P0 colocamos el valor para que la pinza esté cerrada: 1500 μs

En este vídeo en youtube se muestra un ejemplo de funcionamiento

Click to see the youtube video

Motorbit paramétrico

Con el controlador Motorbit que hemos usado hasta ahora las velocidades usadas tanto para el sentido horario como el antihorario eran las máximas que podía el servo. Sin embargo, con el motorbit paramétrico se puede establecer velocidades menores, para cada sentido

El que usaremos es para el servo SM-S4303R, pero al ser parámetrico, se puede adaptar a cualquier otro servo de rotación continua que tenga 20ms de periodo de señal (que son las mayoría)

El bloque parámetrico se llama igual: motorbit, y se encuentra en el mismo lugar que el anterior: en el menú Varios/Motor/SM-S4303R/Motorbit

Tiene tres parámetros: V0, V1 y V2. Los tres representan valores de la anchura del pulso en microsegundos, igual que en el caso del servobit (Los servos de rotación continua usan la misma señal PWM que los servos normales)

  • V0: Anchura del pulso de la posición que hace que el servo esté parado. Típicamente vale 1500 microsengudos (1.5ms)
  • V1: Anchura del pulso de la posición en la que el servo se mueve en sentido horario. Para el servo SM-S4303R, valores mayores o iguales a 1900 hacen que se mueva en sentido horario a máxima velocidad. Valores entre 1900 y 1500 hacen que la velocidad sea menor
  • V2: Anchura del pulso de la posición en la que el servo se mueve en sentido antihorario. Valores inferiores o iguales a 1100 hacen que el servo se mueve a la máxima velocidad en sentido antihorario. Valores entre 1500 y 1100 hacen que la velocidad sea menor (cuanto más cerca de V0 menor es la velocidad)

En esta figura se representan gráficamente los parámetros y todos sus posibles valores para el servo SpringRC SM4303R. El parámetro más importante es V0, que determina el punto en el que el servo está parado. V1 tiene valores mayores a V0, para hacer que el servo gire en sentido horario. Cuando alcanza el valor V1max, la velocidad es máxima, en este sentido. Todavía se puede seguir incrementando V1 hasta llegar a V1limit, pero la velocidad seguirá siendo la máxima.

Lo mismo sucede con V2. Su valor siempre es menor a V0, para hacer que gire en sentido antihorario. Cuando su valor llega a V2min, la velocidad es máxima, en sentido antihorario. El parámetro se puede seguir decrementando hasta alcanzar v2limit, pero la velocidad no variará

Ejemplo 6: Reduciendo las velocidades de Motorbit

Como ejemplo vamos a mover el servo de rotación continua SpringRC SM4303R a una velocidad menor de la que ya conocemos. El escenario que vamos a utilizar es el siguiente: colocremos un interruptor externo para establacer el sentido de giro, y un pulsador para mover/parar el motor

Primero probamos el motorbit paramétrico con sus valores por defecto, sin asignar constantes. El motor se moverá igual que en los tutoriales anteriores. El circuito es el siguiente:

Ahora le damos vamos a V1 y V2 para reducir la velocidad. El parámetro V0 de dejamos con su valor por defecto. Sería necesario cambiarlo si estamos usando modelos de servos diferentes. A V1 le damos por ejemplo un valor de 1600 μs. Como es mayor del valor de V0 (1500 μs), se moverá en sentido horario, y como es menor de V1max (1900 μs) la velocidad será menor a la máxima. Al parámetro V2 le damos un valor de 1400 μs, para que se mueva despacio

Al cargarlo en la placa, veremos que funciona igual que antes, pero las dos velocidades, la horaria y la atihorario, son mucho menores

Ejercicio 3: Servo con dos velocidades en cada sentido

Diseñar un circuito digital para mover un servo de rotación continua con dos
velocidades
diferentes en cada entido. Se utilizarán dos interruptores externos
uno para establecer la velocidad: rápida/lenta, y otro para fijar el
sentido de giro: horario/antohorario. Usaremos un pulsador externo para que
el motor se mueva al pulsarlo, o esté parado al soltarlo

  • En este vídeo en Youtube se puede ver un ejemplo de funcionamiento

Click to see the youtube video

Ejercicios propuestos (20 BitPoints)

Ver los detalles de los ejercicios y las entregas en el menú Archivos/Ejemplos/2-Ejercicios de la colección de este tutorial

Resumen:

  • Ejercicio 1 (Total 5 Bitpoints): Notas DO-RE-MI-FA

  • Ejercicio 2 (Total 5 Bitpoints): Movimiento de un Servo con ángulos pequeño y grande

  • Ejercicio 3 (Total 5 Bitpoints): Servo con dos velocidades en cada sentido

  • Ejercicio 4 (5 Bitpoints). Ejercicio Libre. Premiar la creatividad. Entregar por redes sociales o github: Pantallazos, enlaces, vídeos, etc...

Ejercicios entregados

Joaquín Cubillo (jcubilloarr)

Ejercicio 1

  • Vídeo en Youtube:

Click to see the youtube video

Ejercicio 2

  • Vídeo en Youtube:

Click to see the youtube video

Ejercicio 3

  • Vídeo en Youtube:

Click to see the youtube video

Ejercicio 4

  • Vídeo en Youtube:

Click to see the youtube video

Josep Montoliu (klarojms)

Ejercicio 1

  • Vídeo en Youtube:

Click to see the youtube video

Ejercicio 2

  • Vídeo en Youtube:

Click to see the youtube video

Ejercicio 3

  • Vídeo en Youtube:

Click to see the youtube video

Ejercicio 4

  • Vídeo en Youtube:

Click to see the youtube video

Jose López

Ejercicio 1

Ejercicio 2

Ejercicio 3

Autor

Licencia

Créditos y agradecimientos

Enlaces

Preguntas frecuentes

  • ¿Dónde puedo conseguir la placa Icezum Alhambra?

Pueden conseguir una desde Alhambrabits

  • ¿Dónde puedo comprar material electrónico?. Hay muchos sitios. Uno muy bueno es Bricogeek

  • ¿Cómo aprendo a manejar github?

Hay mucha información en internet. En su momento hice este Tutorial: Github y FreeCAD para enseñar a manejarlo. Los ejemplos están hechos con ficheros de FreeCAD, sin embargo, lo que se enseña es genérico. También vale para las entregas de los ejercicios del tutorial de Electrónica digital para makers

  • Los pulsadores de la Icezum Alhambra no me funcionan

Eso es debido a que se han metido restos de flux y no hacen buen contacto. En el apartado ¡No me funcionan los pulsadores! del Tutorial 9 se indica cómo solucionarlo fácilmente

  • ¿Dónde puedo encontrar más información sobre las señales PWM?

Echa un vistazo a este post de Rincón Ingenieril sobre el tema

  • He conectado un pulsador externo pero no me funciona. He hecho un circuito para conectar el botón con un led, y al apretar se enciende el LED, pero luego no se apaga. NO funciona bien

Los pulsadores externos que se conecten a los pines de 5v de la Alhambra (D0 - D13) tiene que llevar una resistencia de pull-up o pull-down con valores entre 460 ohm y 2K. Típicamente usamos 1K. Esto hace que los conversores de nivel se configuren como entradas y que el pulsador funcione correctamente. Puedes encontrar más información En este enlace

Es un servo muy usado y muy estándar. Si buscar por internet encontrarás muchos sitios donde los vendes, a diferentes precios. Aquí en España se puede conseguir muy fácilmente a través de BricoGeek: Servo SM-4303R Bricogeek y también en Iberobotics: Servo SM-4303R Iberobotics

  • Parece ser que los servos Futaba 3003 se pueden trucar para convertirlos en rotación continua. ¿Conoces algún tutorial sobre como hacerlo?

El Futaba 3003 es uno de los servos que típicamente se han trucado para construir robots móviles con ellos. Robots como Tritt, El Skybot o el Miniskybot los utilizan. Existen muchísimos tutoriales para hacerlo. En esta página puedes encontrar todas las formas de trucarlos. El que recomendamos es el caso 2

Clone this wiki locally