dispositivos_i2c_con_esp32_y_micropython
Diferencias
Muestra las diferencias entre dos versiones de la página.
dispositivos_i2c_con_esp32_y_micropython [2025/04/04 14:39] – creado hispa | dispositivos_i2c_con_esp32_y_micropython [Fecha desconocida] (actual) – editor externo (Fecha desconocida) 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | <WRAP round box> | ||
+ | ====== Dispositivos I2C con ESP32 y MicroPython ====== | ||
+ | </ | ||
+ | <WRAP tabs> | ||
+ | * [[ESP32]] | ||
+ | * [[Parpadeo de un led con ESP32 y MicroPython|Anterior: | ||
+ | * [[Dispositivos I2C con ESP32 y MicroPython (código)|Siguiente: | ||
+ | </ | ||
+ | <WRAP collarge justify> | ||
+ | Ahora que ya nos hemos atrevido a conectar nuestro ESP32 a un dispositivo externo y hacerlo funcionar, vamos a dar un paso más, pero un paso de gigante, porque esta vez vamos a conectar nuestro primer dispositivo I2C, en este caso, un display de 16x2, dieciséis columnas por dos filas. El esquema es como el de la siguiente imagen: | ||
+ | {{ : | ||
+ | |||
+ | Y no estoy bromeando. Existen dos opciones para realizar este montaje: adquirir un display con el módulo adaptador I2C ya soldado, o adquirirlos por separado y luego soldar los pines de uno y otro. No es difícil de soldar, pero si no estás acostumbrado al soldador, mejor la primera opción. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | En estas imágenes podemos ver los dos montajes. El de arriba con el módulo adaptador I2C ya montado, y el de abajo sin el susodicho módulo. | ||
+ | |||
+ | Pero ahora te estarás preguntando: | ||
+ | |||
+ | Seguro que ahora mismo estás mirando el esquema y diciendo: «Oiga, que ahí hay cuatro hilos, no dos». Pues tienes toda la razón, pero dos de esos hilos son para la alimentación (VCC y GND), mientras los otros dos son el SDA (por donde viajan los datos entre dispositivos) y SDL (que transporta la señal de reloj que sincroniza los dispositivos). | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Como se puede ver, el montaje no es especialmente complicado: conectamos el pin VCC del display a la salida de 5V del ESP32, el pin GND al GND del ESP32, el pin SDA al pin 21 y el SCL al pin 22 de la ESP32. Si tienes dudas sobre la ubicación de los pines, te recomiendo que veas [[ESP32 DevKitC V4 Pinout|este esquema de pines del ESP32]], aunque teniendo en cuenta que diferentes modelos de ESP32 podrian tener un esquema de pines distinto. | ||
+ | |||
+ | Una de las características de los dispositivos I2C es que cada uno de ellos debe conectarse con una dirección binaria de siete bits, lo que en teoría nos permite conectar a nuestro microcontrolador un total de 112 dispositivos (teniendo en cuenta que 16 de las 128 posibles están reservadas). Para más información sobre el protocolo I2C, recomiendo [[https:// | ||
+ | |||
+ | Y es por eso que cuando vamos a conectar un dispositivo I2C a nuestro microcontrolador, | ||
+ | |||
+ | <code python | scan_i2c.py> | ||
+ | from machine import Pin, SoftI2C | ||
+ | |||
+ | sdaPIN=Pin(21) | ||
+ | sclPIN=Pin(22) | ||
+ | |||
+ | i2c=SoftI2C(sda=sdaPIN, | ||
+ | |||
+ | devices = i2c.scan() | ||
+ | if len(devices) == 0: | ||
+ | print(" | ||
+ | else: | ||
+ | print(' | ||
+ | for device in devices: | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Si copiamos este código en Thonny y lo guardamos en nuestro ESP32, al ejecutarlo nos dará una salida como ésta: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Por lo tanto, el display tiene la dirección 0x27 (en hexadecimal, | ||
+ | |||
+ | Y bueno, si ya tenemos conectado nuestro display, es la hora de ver cómo lo vamos a hacer funcionar desde Thonny y MicroPython. Esta vez tampoco será tan simple como en ejemplos anteriores, ya que necesitamos instalar en la ESP32 un par de librerías necesarias para utilizar el display. | ||
+ | |||
+ | ¿Que qué es una librería? No te asustes: una librería es sólo un conjunto de utilidades que utilizaremos llamándolas desde nuestro programa. Existen librerías en Python casi para cualquier cosa que se te pueda ocurrir, lo cual facilita muchísimo la elaboración de programas con un esfuerzo mínimo. | ||
+ | |||
+ | En este caso, las librerías que vamos a utilizar son específicas para utilizar el protocolo I2C y para utilizar displays. Es un trabajo que ya nos dan hecho, y lo único que tendremos que conocer (o consultar a medida que lo necesitemos) son las funciones, los parámetros a suministrarles y los resultados que nos ofrecerán. Para asegurarnos de que tendremos las librerías más actualizadas y sin «cosas raras», lo mejor es que nos vayamos directamente a la página de sus desarrolladores. Nosotros usaremos las librerías RPI-PICO-I2C-LCD, | ||
+ | |||
+ | Como has podido observar, al pulsar sobre el enlace has descargado un archivo zip que contiene la última versión de estas librerías. Dentro hay dos archivos: lcd_api.py y pico_i2c_lcd.py, | ||
+ | |||
+ | Una vez que tengamos estas dos librerías en nuestro ESP32, es el momento de crear el programa que hará funcionar el display, en este caso sólo una pequeña demostración, | ||
+ | |||
+ | <code python | boot.py> | ||
+ | from machine import Pin, SoftI2C | ||
+ | from lcd_api import LcdApi | ||
+ | from pico_i2c_lcd import I2cLcd | ||
+ | from time import sleep | ||
+ | from random import randint | ||
+ | |||
+ | I2C_ADDR = 0x27 | ||
+ | filas = 2 | ||
+ | columnas = 16 | ||
+ | i2c = SoftI2C(scl=Pin(22), | ||
+ | lcd = I2cLcd(i2c, I2C_ADDR, filas, columnas) | ||
+ | |||
+ | while True: | ||
+ | f = randint(0, | ||
+ | c = randint(0, | ||
+ | lcd.move_to(c, | ||
+ | lcd.putstr(' | ||
+ | sleep(1) | ||
+ | lcd.clear() | ||
+ | </ | ||
+ | |||
+ | Y el resultado al ejecutarlo es el que se puede ver en el siguiente vídeo: | ||
+ | |||
+ | {{ : | ||
+ | </ | ||
+ | |||
+ | {{tag> cacharreo MicroPython ESP32 Thonny display I2C}} |