[OLED][I2C][icestudio] Integrando un Display OLED en el sistema usando el I2C de screen-pong.

453 views
Skip to first unread message

Juanma Rico

unread,
Nov 6, 2017, 6:00:17 AM11/6/17
to FPGAwars: explorando el lado libre

Buenas a todos/as,

No dispongo de mucho tiempo y me váis a perdonar si no lo encapsulo y explico mejor, pero como veo que ya hay interés en ir usando el módulo I2C para hacer funcionar algún que otro dispositivo externo (como esta mañana ha preguntado @MrChuxMan con un display OLED), voy a explicar un poco el encapsulamiento que hice en el bloque I2C para el proyecto screen-pong y así os resulte más fácil modificarlo si queréis investigar el tema.

En dicho proyecto la idea era utilizar dos potenciómetros para el control de los jugadores, para eso se usaba el integrado convertidor Analógico-Digital que dispone la iceZum Alhambra en un chip externo a la FPGA (y que se comunica con ella usando el I2C). Todo está encapsulado en el fichero de icestudio "control-pong.ice". Si lo abrís tiene un aspecto como este:


He marcado los bloques más importantes. El primero es la constante de la dirección I2C del integrado (para saber la de vuestro integrado I2C mirar el datasheet del mismo). El segundo es el módulo I2C encapsulado de Obijuan (i2c.ice + i2c.v) que se encarga de controlar el bus I2C. El tercero es la máquina de estados del integrado (fsm-adc.v) y que se encarga de la secuencia de órdenes para que se grabe o lea del integrado por el bus I2C. El cuarto bloque marcado es simplemente un "bombeo de bits" (un reloj) que marca la frecuencia con la que se ejecutan las órdenes en la máquina de estados (en nuestro caso, tras una inicialización del integrado, a cada "pálpito" del bombeo se encarga de leer los dos canales del ADC a una determinada frecuencia y actualizar la posición de cada uno de los jugadores).

El bloque más importante quizás sea la máquina de estados. Está implementada solo en código (el bloque de icestudio hace de interfaz)  y la podéis usar como referencia (no está para nada optimizada, adaptarla a vuestro integrado y sed muy críticos con el código...), fundamentalmente es una secuencia de órdenes en forma de bytes que se escriben en el bus I2C y bytes que se leen del bus, para controlar el integrado que deseamos conectar a la FPGA (en este caso conocer el datasheet del integrado es fundamental).

El módulo del bus I2C (a parte de los bits y bytes de configuración) usa un byte de entrada de escritura (data_wr) donde se sitúa el byte que se quiere escribir en el bus I2C (hacia el esclavo), otro de lectura (data_rd) donde encontraremos el byte que se leea por I2C (proveniente del esclavo), un bit de entrada (SDA) que se conectará a nuestro chip esclavo externo y otro de salida (SCL) que marcará el reloj del esclavo (el módulo I2C que sinteticemos en la FPGA hará siempre de maestro) y que conectaremos igualmente al integrado externo con el que queramos comunicarnos (estas dos serán las conexiones físicas al bus). El bit busy indica que el bus está ocupado (escribiendo el byte en data_wr o leyendo de data_rd) y el ready que hay un byte listo para ser leído en data_rd proveniente del bus (del único esclavo conectado a él). Como véis es prácticamente como funcionan los distintos módulos UART que ya hay iencapsulados en bloques en icestudio.

Las conexiones externas se harán en el fichero que utilice el bloque. En el ejemplo del screen-pong:



Como véis los pines rodeados en rojo deben ser los pines externos que uséis para conectar la iceZum Alhambra y vuestro integrado I2C. La señal star_clk era para un simple debug (nunca viene mal ver que la cosa está funcionando mediante el parpadeo de un LED) y el bloque de control entrega las posiciones de los jugadores en dos palabras de 10 bits (En el caso del OLED imagino que será unas posiciones x e y de la pantalla, junto un byte con el código ASCII que queráis escribir en la misma,... eso depende ya de como lo queráis implementar).

Creo que con esto ya podéis haceros una idea general de como funciona el bloque del bus I2C y como utilizarlo tal y como está (siempre se puede mejorar).
Animaros a usarlo y si necesitáis aclaración y/o ayuda no dudéis en preguntar.

Saludos.
Juan Manuel Rico

Auto Generated Inline Image 1
Auto Generated Inline Image 2

José Raúl Montero Ponce

unread,
Nov 6, 2017, 7:04:48 AM11/6/17
to FPGAwars: explorando el lado libre
Juanma que dispositivo, conector, has utilizado para conectar el monitor a la fpga.
Gracias

Jesús Rodríguez Conde

unread,
Nov 6, 2017, 7:05:02 AM11/6/17
to FPGAwars: explorando el lado libre
Qué guay, voy a mirar la documentación de la pantallita OLED y pruebo todo esto, lo que vea lo voy publicando aquí.

Juanma Rico

unread,
Nov 6, 2017, 7:15:32 AM11/6/17
to FPGAwars: explorando el lado libre
Tres simples resistencias.... :)))

Obijuan lo explica muy bien en su proyecto MonsterLED (https://github.com/Obijuan/MonsterLED/wiki).
Yo utilicé otros valores de resistencias y también funcionan... en este hilo o tema puedes ver mis pruebas.

Saludos.
Juan Manuel Rico

Juanma Rico

unread,
Nov 6, 2017, 7:19:04 AM11/6/17
to FPGAwars: explorando el lado libre
¡¡Perfecto Jesús!!

A ver si entre todos afinamos este módulo (falta le hace... :)) y lo incluimos en alguna colección de protocolos, buses y displays... incrementando el patrimonio tecnológico de la humanidad... ;))

Saludos
Juan Manuel Rico

Jesús Rodríguez Conde

unread,
Nov 7, 2017, 12:03:23 PM11/7/17
to FPGAwars: explorando el lado libre

Bueno, os comento los avances que se hicieron ayer:

Estuve estudiando los proyectos de Juanma, ya que aunque el objetivo era el OLED me parecía interesante echar un vistazo a los proyectos gráficos: https://github.com/juanmard/screen-logo y especialmente https://groups.google.com/forum/#!topic/fpga-wars-explorando-el-lado-libre/xk3u4XmhgMA screen-pong que es desde donde hemos partido.

El módulo I2C al principio hice una versión basada en el trabajo de otra persona, esta información ya la extenderé porque lo hice en mi casa y no lo tengo aquí ahora (escrito en verilog, por cierto)

Pero al final opté por usar el de Obijuan incorporado en el screen-pong escrito en icestudio/verilog. El módulo en verilog original en el que empecé a basarme establece sda y scl como bidireccionales (inout) y hemos visto que por ahora tenemos esa limitación con el yosys, que parece ser que no lo sintetiza bien, por lo que ha sido mejor idea usar el de Obijuan que ya se estuvo pegando con ello.

No obstante estamos viendo que tenemos que hacer algunas modificaciones (que será el siguiente avance) para convertir el módulo en bidireccional. Modificando SB_IO:


Todos los avances ya están en github por si queréis cotillearlos, y voy a acabar por hacer dos módulos que luego se puedan incorporar en alguna colección chachi: I2C e I2C con UART. El icono SVG ya está en el proyecto, extraído de la wikimedia commons, por lo que es libre.

El proyecto se encuentra aquí: https://github.com/ChuxMan/icestudio-i2c

Por ahora va así (incompleto y con errores garrafales):



Documentos de la investigación:

Juanma Rico

unread,
Nov 7, 2017, 5:40:55 PM11/7/17
to FPGAwars: explorando el lado libre
Lo que yo decía... ¡¡el puto amo!! Jajajaja

Gracias Jesús, saludos.
Juan Manuel Rico

Jesús Rodríguez Conde

unread,
Nov 7, 2017, 5:48:29 PM11/7/17
to FPGAwars: explorando el lado libre
Jajaja asiasss, cuando lo vea funcionando me lo creeré xDD

Ya está actualizado el github con los últimos cambios, por ahora la cosa queda así:


Pendiente de algunas conexiones y de probar por el puerto serie con los comandos de las librerías de arduino

Jesús Rodríguez Conde

unread,
Nov 13, 2017, 7:09:31 AM11/13/17
to FPGAwars: explorando el lado libre
Chicos, estoy ahora mismo jodidillo en el hospital que me han operado de urgencias, en cuanto salga sigo con el tema que andaba revisando la implementación de Lady Ada de la parte de uso del módulo así como otros vídeos específicos de I2C en verilog, pero creo que eso ya está. ¿alguien pudo probarlo?

Juanma Rico

unread,
Nov 13, 2017, 10:54:48 AM11/13/17
to FPGAwars: explorando el lado libre
¡¡Jobá Jesús!! ¿Qué me dices? ¿En el hospital? ¡¡Cachis!!

Recupérate pronto,... por el módulo I2C no te preocupes que lo estamos cuidando muy bien... :)))
Eso sí los haters en twitter ya te echan de menos... no podemos alimentarlos como se merecen... ¡¡Te necesitamos!! jajajajajaja :)))

¡A recuperarse campeón!

Saludos
Juan Manuel Rico



Jesús Rodríguez Conde

unread,
Nov 13, 2017, 11:28:43 AM11/13/17
to FPGAwars: explorando el lado libre
Asiassss, y los haters pueden venir cuando quieran, pero precisamente hoy no sería "diplomático" como la última vez:

Resultado de imagen de sarah connor bomba atomica

Aquí vemos a un hater recibiendo una de mis borderías hoy xDDD

Juan José Luna Espinosa

unread,
Nov 13, 2017, 2:38:25 PM11/13/17
to fpga-wars-explora...@googlegroups.com
Ánimo Jesús, que te recuperes bien y pronto.

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/00f58721-5e33-466d-a99d-330869d8b7ae%40googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

Anto Nio

unread,
Nov 20, 2017, 8:17:52 PM11/20/17
to FPGAwars: explorando el lado libre
No sabía que tuviéramos haters xD

Eso significa que este proyecto se está haciendo cada vez más grande y está llegando a nuevos lugares inexplorados.


El lunes, 13 de noviembre de 2017, 16:54:48 (UTC+1), Juanma Rico escribió:

Jesús Rodríguez Conde

unread,
Nov 21, 2017, 11:18:31 PM11/21/17
to FPGAwars: explorando el lado libre
Gracias por vuestro apoyo, me temo que aun me queda al menos un mes de postoperatorio, pero al menos ya me puedo sentar al ordenador.

Os resumo un poco por donde voy:

Tenéis que tener en cuenta que yo soy de programación, 31 años de informático entre pecho y espalda, y todo esto para mí es nuevo, pero cada vez entiendo más el verilog y con los estados y esas cosas cada vez se parece más a mi idioma. Estoy viendo una serie de vídeos donde implementan el I2C en verilog y estoy clarificando aun más todo lo que hemos hecho, lo cual me lleva a la duda de si rehacerlo o qué...

https://www.youtube.com/watch?v=skkyudHHSWY (este es el primero, enlaza a los otros 3, unas 2h de contenido en total más o menos)

y como decía en el email anterior la librería de Adafruit de éste mismo módulo pero para Arduino.

Por cierto, en Arduino tardé 10 minutos en programar el RFID y aquí llevo días con el OLED, está claro que esto tiene más misterio y mola más jajaja.

Le meteré más caña, este crucigrama lo quiero resolver yo, aunque si queréis jugar os dejo jejeje

Juanma Rico

unread,
Nov 22, 2017, 1:37:10 AM11/22/17
to FPGAwars: explorando el lado libre
¡¡sssseassss jodio, Jesús!!
En Arduino están ya todas las bibliotecas implementadas y tienes el micro... en las FPGA partes de cero... ¡¡te tienes que construir el chip!! Jajajajaja :))

Me alegra ver que estás mejor, un abrazo.

Saludos.
Juan Manuel Rico

Juan José Luna Espinosa

unread,
Nov 22, 2017, 6:56:17 AM11/22/17
to fpga-wars-explora...@googlegroups.com
Yo también me alegro que te mejores Jesús.


Juan Manuel Rico

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.

Jesús Rodríguez Conde

unread,
Nov 22, 2017, 1:08:49 PM11/22/17
to FPGAwars: explorando el lado libre
Muchas gracias por preocuparos.

De lo del Arduino, justo por eso lo decía, que la librería ya está hecha y tardas cero coma, cuando tengamos esto repletito de bibliotecas nos vamos a reir en la cara del Arduino jajajaja 

Al menos en cuanto a la comprensión del hardware, porque incluso en el nivel del arduino o raspberries el hardware es meramente un periférico, por ejemplo con el I2C, que además de ser una librería prehecha nos limitamos a usarla, sin verla en la profundidad que lo estoy viendo en la FPGA. Por eso me encanta este proyecto, era la pieza justa que faltaba para la educación, incluso para los profesionales, porque yo me lo estoy pasando teta y comprendiendo cosas que hasta ahora simplemente las usaba... O vuestro proyecto de la VGA, en la vida lo había visto en esa profundidad y ni siquiera me lo imaginaba.
Reply all
Reply to author
Forward
0 new messages