MicroPython – Entrada/saída digital em ESP8266 e ESP32

MicroPython: entrada/salida digital en ESP8266 y ESP32

El primer paso en la programación de dispositivos integrados es realizar entradas/salidas digitales. La entrada/salida digital se refiere a la lectura de datos paralelos. Las mismas señales lógicas se utilizan para operaciones de conmutación y control. MicroPython, un firmware integrado, esencialmente incluye bibliotecas para controlar la entrada/salida digital y otras funciones de hardware. MicroPython se puede cargar y ejecutar en una variedad de plataformas de hardware, concretamente microcontroladores. Estos microcontroladores se denominan puertas en la terminología de MicroPython. Cada puerto tiene sus propias características de hardware, periféricos integrados y configuración de pines. Aunque MicroPython admite varios sistemas de microcontroladores diferentes, tiene una sintaxis universal para todas las funcionalidades del hardware. En este artículo, discutiremos cómo podemos leer entradas digitales y generar salidas digitales usando MicroPython. Mientras probamos nuestros códigos MicroPython en ESP8266 y ESP32, nos familiarizaremos con ambas placas y mostraremos cómo funciona la entrada/salida digital.

Incluso las operaciones simples de entrada/salida digital requieren sólidos conocimientos técnicos. Para conocer los aspectos técnicos de la entrada digital en microcontroladores y tener un conocimiento profundo de los LED, consulte nuestro artículo sobre entrada digital en Arduino. Para conocer más sobre interruptores y aspectos técnicos de la salida digital en microcontroladores, recomendamos leer nuestro artículo sobre salida digital en Arduino. Se espera que esté familiarizado con lo que es MicroPython. Y sí, antes de probar la entrada/salida digital práctica en ESP8266/ESP32 usando MicroPython, debe cargar el firmware MicroPython en ESP8266/ESP32 y prepararse con uPyCraft/Thonny IDE en su computadora.

Biblioteca de máquinas MicroPython
MicroPython proporciona el módulo de máquina para varias funciones específicas relacionadas con el hardware del microcontrolador. El módulo contiene clases para controlar entrada/salida digital, controlar señales de salida de dispositivos externos, modulación de ancho de pulso, conversión analógica a digital, controlar periféricos ADC, UART, SPI, I2C, I2S, temporizador, RTC, temporizador Watchdog y gestión de tarjetas SD. El módulo está diseñado para acceder directamente a diferentes bloques de hardware de múltiples microcontroladores sin restricciones. Además de las clases relacionadas con funciones de hardware específicas, el módulo proporciona métodos para habilitar/deshabilitar interrupciones, administración de energía, reinicio y gestor de arranque. Normalmente, solo se importan las clases de módulo requeridas a un script MicroPython para mantener el código breve y limpio.

Clase PIN en la biblioteca de la máquina
La clase PIN del módulo de máquina está diseñada para controlar entradas/salidas de uso general (microcontrolador GPIO). Esta clase se importa a un script MicroPython mediante la siguiente declaración.

Pin de importación de máquina

La clase pin contiene métodos para configurar el modo pin y obtener y configurar los niveles lógicos de los pines digitales. Cada puerto (microcontrolador compatible) tiene una configuración y asignación de pines diferente. Un pin físico de un puerto está definido por un identificador, es decir, una variable. El identificador es una instancia del objeto Pin. Un pin físico específico de un puerto/microcontrolador se especifica mediante un número, cadena o ID de tupla en la creación de instancias del objeto pin. La identificación es específica de un puerto/microcontrolador en particular. La creación de instancias de Pin se realiza mediante el método Pin de la clase. Este método se define de la siguiente manera.
clase máquina.Pin(id, modo=- 1, pull=- 1, *, valor=Ninguno, unidad=0, alt=- 1)

Los parámetros del método Pin se describen a continuación.

ID : el parámetro requerido identifica un pin físico específico en un puerto/microcontrolador determinado. La identificación se puede proporcionar como un número, una cadena o una tupla.

modo : especifica el modo de pin del pin especificado. El modo se especifica mediante las siguientes constantes: Pin.IN, Pin.OUT, Pin.OPEN_DRAIN, Pin.ALT, Pin.ALT_OPEN_DRAIN, Pin.ANALOG. Si el modo está configurado en Pin.IN, el pin se configurará para entrada digital. Para dispositivos externos, este pin está en estado de alta impedancia. Si el modo está configurado en Pin.OUT, el pin se configurará para salida digital. Si el modo está configurado en Pin.OPEN_DRAIN, el pin se configurará para salida de drenaje abierto. Esto significa que si el pin se establece en 0, estará activo en BAJO. Si se establece en 1, entra en un estado de alta impedancia donde está en estado flotante hasta que un circuito externo lo baja o lo levanta. No todos los puertos/microcontroladores admiten salida de drenaje abierto. Si el modo está configurado en Pin.ALT, el pin se configurará para funciones alternativas como funciones SPI, I2C o UART asignadas a él en un puerto determinado. El modo Pin.ALT_OPEN_DRAIN es el mismo que Pin.ALT, excepto que establece el pin de drenaje abierto. Si el modo está configurado en Pin.ANALOG, el pin se configurará para entrada analógica.

pull : especifica el pull-up/pull-down interno cuando el pin está configurado como entrada. Se especifica mediante las siguientes constantes: Ninguna, Pin.PULL_UP y Pin.PULL_DOWN. Si pull se establece en Ninguno, no se habilitarán ni la resistencia pull-up ni la pull-down. Si pull se establece en Pin.PULL_UP, la resistencia pull-up se habilitará en el pin especificado. Si pull se establece en Pin.PULL_DOWN, la resistencia desplegable se habilitará en el pin especificado.

valor : Especifica el nivel de señal del pin si su modo está configurado en OUT o OPEN_DRAIN. Si se establece en 0, la señal de salida es BAJA. Si se establece en 1, la señal de salida se establecerá en ALTA.

unidad : especifica la potencia de salida o la capacidad de carga de corriente de salida de un pin determinado. Se puede configurar como Pin.DRIVE_0, Pin.DRIVE_1, Pin.DRIVE_2 o Pin.DRIVE_3, correspondiente al aumento de la potencia de salida como se menciona en la siguiente tabla.

Por ejemplo, la siguiente instrucción define el pin 2 de un puerto determinado como una salida digital.
p2 = Pin (2, Pin.OUT)

De manera similar, la siguiente instrucción define el pin 1 de un puerto determinado como una entrada digital con pull-up interno habilitado.
p1 = Pin (1, Pin.IN, Pin.PULL_UP)

A diferencia de la programación típica de microcontroladores, MicroPython le permite cambiar el modo y otros parámetros de un pin a mitad del programa. Esto se hace restableciendo el pin usando el método Pin.init. Este método se define de la siguiente manera.
Pin.init(modo=- 1, pull=- 1, *, valor=Ninguno, unidad=0, alt=- 1)

Los parámetros del método Pin.init se especifican de la misma manera que en el método Pin. El modo de un objeto pin también se puede establecer explícitamente llamando al método Pin.mode. Si se llama a Pin.mode sin argumentos, devuelve el modo actual del pin dado. De manera similar, el método Pin.pull le permite establecer u obtener el estado de tracción del pasador, y Pin.drive le permite obtener o establecer la fuerza de accionamiento del pasador.

La lógica digital en un pin determinado se obtiene o configura utilizando el método Pin.value. Se define de la siguiente manera.
Valor.pin((x))

Si se llama sin argumentos, devuelve el nivel lógico digital del pin. Si el pin está configurado en Pin.IN, devolverá el valor de entrada real actualmente presente en el pin. Si el pin está configurado en Pin.OUT, devuelve un valor indefinido. Si el pin está configurado en Pin.OPEN_DRAIN, devolverá un valor indefinido si se establece en 0; de lo contrario, devolverá el valor de entrada real actualmente presente en el pin si se establece en 1. Si Pin.value se proporciona con un argumento, debe ser booleano, es decir, verdadero/1 o falso/0. Si el pin dado está configurado en Pin.OUT, el valor pasado se establecerá inmediatamente en el búfer de salida. Si el pin está configurado en Pin.IN, el valor se almacena en el búfer de salida y se activa cuando el pin se establece en Pin.OUT o Pin.OPEN_DRAIN. Hasta entonces, el pin permanece en un estado de alta impedancia. Si el pin se define como Pin.OPEN_DRAIN, un valor de 0/falso establece el pin en un estado de bajo voltaje, mientras que un valor de 1/true establece el pin en un estado de alta impedancia, donde un circuito externo controla el pin. El método Pin.__call__ es similar al método Pin.value, excepto que es más rápido que el método Pin.value.

La salida de un pin también se puede establecer en 1 llamando a los métodos Pin.high o Pin.on. De manera similar, la salida de un pin se puede establecer en 0 llamando a los métodos Pin.low o Pin.off. El método Pin.irq se utiliza para manejar las interrupciones de pin.

Algunos métodos también tienen algunos parámetros específicos del puerto. Por ejemplo, en ESP32, el parámetro de retención en los métodos Pin y Pin.init le permite activar la función de retención del pad ESP32. Si la retención se establece en Verdadero, la configuración del pin se mantiene y no se aplican cambios adicionales. Cualquier configuración de pin definida después de establecer la retención en Verdadero solo se aplicará cuando la retención esté establecida en Falso. Si la retención se establece nuevamente en Verdadero, se aplican todos los cambios de configuración recientes y el pin se establece nuevamente en retención.

Características de ESP8266 y configuración de pines
Ejecutaremos nuestros códigos MicroPython en placas ESP8266 y ESP32. ESP8266 tiene 17 GPIO, una interfaz SPI y HSPI, un I2C, dos UART, una interfaz de entrada y salida I2S con DMA y un ADC de 10 bits. I2C se implementa en software que se puede multiplexar a cualquier GPIO. ESP8266 está disponible en una variedad de placas de conexión. La forma en que se exponen los diferentes pines y periféricos difiere entre las diferentes placas ESP8266. Las placas ESP8266 más populares son ESP8266-01 y ESP8266-12E. El pinout del ESP8266-01 se muestra en la imagen siguiente.

Diagrama de pines del módulo ESP01 ESP8266

Diagrama de pines del chip desnudo ESP8266-12E

Diagrama de pines del kit ESP8266-12E NodeMCU

El chip ESP8266-12E tiene la siguiente distribución de pines.
La placa de conexión ESP8266-12E tiene la siguiente distribución de pines.

Entrada/salida digital en ESP8266
Los GPIO ESP8266 son compatibles con 3V3 y pueden drenar o suministrar un máximo de 40 mA. Como podemos ver, GPIO6, GPIO7, GPIO8 y GPIO11 no están disponibles para entrada/salida en la placa de conexión ESP-12E, que normalmente está disponible como un kit NodeMCU. GPIO6 está expuesto como ADC0 en la placa de conexión. GPIO6 ~ GPIO11 está conectado al chip Flash. Por este motivo no se recomienda utilizarlos para entrada/salida digital. Luego nos quedan GPIO0~GPIO5 y GPIO12~GPIO16.

GPIO0 se utiliza para configurar el ESP8266 en modo de gestor de arranque. Es por eso que GPIO0 solo se puede usar después de escribir el firmware MicroPython en el ESP8266. De manera similar, GPIO16 se usa para reactivar el ESP8266 desde un SL profundo; por lo tanto, se debe evitar para la entrada/salida digital si se utiliza el modo de suspensión profunda en la aplicación integrada.

Al ensamblar un circuito externo con ESP8266, se debe considerar el comportamiento de inicialización de sus pines GPIO. Cuando se inicia el ESP8266, la placa usa GPIO0, GPIO1, GPIO2, GPIO3, GPIO9, GPIO10, GPIO15 y GPIO16. GPIO1, GPIO3, GPIO9, GPIO10 y GPIO16 se ponen en nivel ALTO al inicio, mientras que otros GPIO, excepto GPIO4 y GPIO5, emiten una señal BAJA. Por lo tanto, si se activa algún relé en el circuito conectado a ESP8266, solo GPIO4 y GPIO5 son adecuados para conectar los relés. Todos los demás GPIO pueden provocar operaciones de relé desatendidas debido al comportamiento extraño de los GPIO con el circuito de control del relé durante el inicio. También se debe tener en cuenta que la inicialización fallará si GPIO0, GPIO1 y GPIO2 se bajan externamente en el circuito. La inicialización también fallará si GPIO15 se introduce externamente en el circuito. Por lo tanto, se deben tomar las siguientes precauciones al ensamblar un circuito externo con ESP8266.

  1. Cualquier controlador de relé, si está conectado al circuito, debe estar conectado únicamente a GPIO4 y GPIO5.
  2. GPIO0, GPIO1 y GPIO2 nunca deben ser reducidos por el circuito externo.
  3. GPIO15 nunca debe ser elevado por el circuito externo.
  4. GPIO16 no debe usarse para E/S digitales si se usa el modo de suspensión profunda ESP8266 en la aplicación integrada.
  5. Se debe evitar GPIO0 si el ESP8266 necesita cargarse varias veces durante el desarrollo de la aplicación.

Por último, cabe recordar que la interfaz I2C del ESP8266 está disponible en GPIO4 (I2C SDA) y GPIO5 (I2C SCL) en el kit NodeMCU. La interfaz SPI está disponible en GPIO12 (MISO), GPIO13 (MOSI), GPIO14 (SCK) y GPIO15 (CS). PWM está disponible en todos los GPIO, mientras que las interrupciones están disponibles en todos los GPIO excepto GPIO16.

Características de ESP32 y configuración de pines
ESP32 es una placa de desarrollo Wi-Fi superior en comparación con ESP8266. Tiene 39 GPIO, de los cuales 34 GPIO son entradas/salidas digitales normales. Viene con 18 canales ADC, 16 canales de salida PWM, 3 UART, 3 interfaces SPI, 2 interfaces I2C, 2 DAC, 2 interfaces I2S y 10 GPIO de detección capacitiva. El chip ESP-WROOM-32 simple tiene el siguiente diagrama de pines.

El ESP32-DevKit V1 tiene el siguiente diagrama de pines.

Diagrama de pines del chip ESP-WROOM-32

El ESP32-DevKit V1 tiene el siguiente diagrama de pines.

Diagrama de pines del módulo ESP32 DevKit V1

Entrada/salida digital en ESP32
Los GPIO ESP32 son compatibles con 3V3 y pueden suministrar o absorber un máximo de 40 mA. Sin embargo, la placa de desarrollo también puede alimentarse con una fuente de 5V, ya que tiene un regulador de voltaje integrado. Hay 39 GPIO en el ESP32. Estos GPIO6 ~ GPIO11 están conectados al flash SPI interno; por lo tanto, lo mejor es evitarlos. GPIO28 ~ GPIO31 no está expuesto en la placa de desarrollo. Los GPIO34, GPIO35, GPIO36 y GPIO39 son solo de entrada. Rest todos los GPIO se pueden utilizar tanto para entrada como para salida digital.

Al igual que el ESP8266, el ESP32 también muestra un comportamiento extraño en algunos de sus GPIO durante el inicio. GPIO1, GPIO3, GPIO5, GPIO6 ~ GPIO11, GPIO14 y GPIO15 se ponen a nivel ALTO durante el arranque, y GPIO0, GPIO5, GPIO14 y GPIO15 emiten una señal PWM durante el arranque. Durante el arranque, GPIO1 está habilitado para depurar la salida. Por lo tanto, si hay una interfaz en el circuito, no se debe conectar ningún controlador de relé a estos pines. De lo contrario, el circuito de control de relé exhibirá un comportamiento autónomo debido al estado extraño de estos GPIO durante el inicio.

También hay que recordar que UART está disponible en los siguientes pines.

Hay dos canales I2C en ESP32. Los pines I2C predeterminados en ESP32 son GPIO21 y GPIO22. Sin embargo, el software I2C se puede implementar en cualquier GPIO.

Hay 3 canales SPI en ESP32, de los cuales uno está reservado para la comunicación con la memoria flash y dos canales están disponibles para su uso. Estos dos canales son SPI de hardware (HSPI) y SPI virtual (VSPI). Los canales SPI están disponibles en los siguientes pines.

Hay 16 canales PWM en ESP32. Se pueden multiplexar para generar salida PWM en todos los pines excepto GPIO34 ~ GPIO39. Las interrupciones de pin están disponibles en todos los GPIO. Los GPIO capacitivos son GPIO4 (T0), GPIO0 (T1), GPIO2 (T2), GPIO15 (T3), GPIO13 (T4), GPIO12 (T5), GPIO14 (T6), GPIO27 (T7), GPIO33 (T8) y GPIO32 ( T9). Los GPIO de RTC son GPIO36 (RTC_GPIO0), GPIO39 (RTC_GPIO3), GPIO34 (RTC_GPIO4), GPIO35 (RTC_GPIO5), GPIO25 (RTC_GPIO6), GPIO26 (RTC_GPIO7), GPIO33 (RTC_GPIO8), GPIO32 (RTC_GPIO9), GPIO4 (RTC_GPIO10), GPIO0 (RTC_GPIO11), GPIO2 (RTC_GPIO12), GPIO15 (RTC_GPIO13), GPIO13 (RTC_GPIO14), GPIO12 (RTC_GPIO15), GPIO14 (RTC_GPIO16) y GPIO27 (RTC_GPIO17) GPIO38 (ADC1_CH2), GPIO39 (ADC1_CH3), GPIO32 (ADC1_CH4). GPIO33 (ADC1_CH5), GPIO34(ADC1_CH6), GPIO35(ADC1_CH7), GPIO4(ADC2_CH0) GPIO13 (ADC2_CH4), GPIO12 (ADC2_CH5), GPIO14 (ADC2_CH6), GPIO27 (ADC2_CH7), GPIO25 (ADC2_CH8) y GPIO26 (ADC2_CH9). Los canales DAC están disponibles en GPIO25 (DAC1) y GPIO26 (DAC2).

Activando un LED encendiendo ESP8266/ESP32
Ahora equipados con el conocimiento de entrada/salida digital en MicroPython y familiarizados con la configuración de pines y las características del ESP8266/ESP32, podemos controlar componentes como los LED del ESP8266/ESP32 y controlar su conmutación mediante botones. Encendamos/apaguemos un LED mediante un interruptor táctil en ESP8266 usando el código MicroPython.

Componentes necesarios

  1. ESP8266x1
  2. LEDx1
  3. Resistencia 330Ω x2
  4. Pulsador x1
  5. Cables de conexión/cables de puente
  6. tablero de prueba

Conexiones de circuito
Conecte el ánodo del LED al GPIO5 del ESP8266 y conecte su cátodo a tierra a través de una resistencia en serie de 330 ohmios. Conecte el botón al GPIO4 del ESP8266 bajado por una resistencia de 330 ohmios.

Tenga en cuenta que el firmware MicroPython debe cargarse en el ESP8266. El código Python se puede escribir y enviar a ESP8266 usando uPyCraft o Thonny IDE.

Código Python
Pin de importación de máquina
del tiempo importa dormir
led = Pin (5, Pin.OUT)
botón = Pin (4, Pin.IN)
mientras que Verdadero:
valor.led(valor.botón)
dormir (0,5)

Laboral
El script comienza importando la clase Pin del módulo de máquina y la clase de suspensión del módulo de tiempo. GPIO5 está configurado como una salida digital para controlar el LED. GPIO4 está configurado como una entrada digital con un botón conectado en una configuración de baja tensión. En el bucle while, la salida de GPIO5 se establece en la entrada de GPIO4. GPIO4 está atenuado de forma predeterminada, por lo que el LED permanece apagado. Cada vez que se presiona el botón, GPIO4 pasa a ALTO, se pasa una señal ALTA a GPIO5 simultáneamente y el LED comienza a brillar.

Resultado

(Enlace al vídeo de demostración de ESP04-DV)

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.