Nunca suficientes pines GPIO en un microprocesador

Colocado en

De alguna manera, no importa qué microprocesador elija, me quedo sin pines GPIO para las necesidades del proyecto o para lo que quiero hacer.


Entonces, para un proyecto reciente, cambié del ESP8266 al ESP32, que tiene muchos más pines GPIO que su predecesor... pero aún no es suficiente para el proyecto en el que estoy trabajando.

Para finalizar esta carrera de pines GPIO de una vez por todas, decidí que necesitaba una placa de expansión económica que pudiera configurarse para interruptores (entrada) y LED u otras cosas (salida). Y mientras estaba en eso, pensé que algo de lógica extra estaría bien.

Entonces, lo que se me ocurrió es una placa I2C con ocho pines GPIO que se pueden configurar libremente para entrada o salida (llamo a los pines GPIO "ranuras").

La placa de expansión es ideal para usar en una placa de prueba sin soldadura. El esquema se puede incorporar posteriormente al diseño general del hardware.

ADW0720 Tipo 2 ADW0720 Tipo 2

Una ranura configurada para la entrada probablemente se usará para los interruptores y luego sería genial si pudiéramos distinguir entre presionar el botón y soltarlo (liberación rápida, liberación media y liberación prolongada). En el código del procesador principal, simplemente puede decir:

Las ranuras configuradas para la salida se convierten en un tipo de ranura "dispara y olvida". Es decir, puede indicarle a la ranura que sea ALTO o BAJO como con la función digitalWrite() en el IDE Arduino . Pero también puede decir: pasa a ALTO durante 2500 ms y luego vuelve a BAJO. En su programa principal, no tiene que escribir el código para esperar 2500 ms y luego hacer que el pin GPIO sea BAJO.

También puede indicarle a la cerradura que parpadee con un tiempo de encendido y apagado y, si lo desea, una duración. Por ejemplo:

El bloqueo parpadea a los 500 ms encendido, 1000 ms apagado durante un período de 10 segundos (10000 ms) y luego deja de parpadear.

Similar al ejemplo anterior, pero ahora el bloqueo parpadeará para siempre (o hasta que le indiques que haga otra cosa);

El hardware está diseñado alrededor de un microcontrolador ATtiny841. La comunicación se realiza a través del bus I2C (dos hilos, SCL y SDA).
Puede hacer funcionar las placas a 5 voltios o 3,3 voltios según sus necesidades (principalmente el voltaje que usa el procesador principal), pero no puede conectar sistemas de 5 voltios y 3,3 voltios juntos sin alguna lógica adicional (cambiadores de nivel para las líneas SDA y SCL) .

ADW0720 ATtiny841 ADW0720 ATtiny841

Para controlar las tarjetas ADW0720, desarrollé una biblioteca con funciones simples.
Cada dispositivo I2C tiene una dirección en el rango de 1 a 127 (decimal). La dirección predeterminada para las placas ADW0720 es 0x18 (24 decimales), pero puede cambiarla a la que desee con el siguiente código:

La segunda línea almacena esto nueva direccion en EEPROM y desde entonces es nueva direccion la dirección de este módulo.

Al dar a cada placa ADW0720 una dirección única, puede controlar varias placas ADW0720 usando solo las dos líneas I2C.

He diseñado dos tipos de placas ADW0720 que están listas para usar. La placa Tipo 1 tiene 4 interruptores táctiles y 4 LED, la placa Tipo 2 tiene 8 LED pero no tiene interruptores.

ADW0720 Tipo 1 (4 LED, 4 interruptores) ADW0720 Tipo 1 (4 LED, 4 interruptores)
ADW0720 Tipo-2 (8 LED, sin interruptores) ADW0720 Tipo-2 (8 LED, sin interruptores)


En lugar de los LED, también es posible controlar un MOSFET de canal N (como el 2N7000 o el 2N7002) como interruptor para controlar cargas más grandes, como zumbadores, relés o motores.

Puede encontrar la biblioteca y el código para el esclavo ATtiny841-I2C en github. Allí también encontrará la documentación para la biblioteca.

La biblioteca viene con dos bocetos de ejemplo. El primero es para mostrar lo que pueden hacer las placas ADW0720 (show-of) y el segundo ejemplo (I2C_ADW0720_Configurator) muestra el uso más avanzado.

Por ejemplo, con el segundo ejemplo puede configurar la función (entrada o salida) de las ranuras y puede configurar la dirección I2C del ADW0720 para que no tenga que hacer eso en su programa principal.

Esquema de la placa ADW0720 Tipo-1 Esquema de la placa ADW0720 Tipo-1
Tablero ADW0720 tipo 2 Tablero ADW0720 tipo 2
Funciones auxiliares de la biblioteca Funciones auxiliares de la biblioteca
Publicado por Sitio web Willem Aandewiel (1955) tiene experiencia en electrónica y técnicas digitales. Sin embargo, la mayor parte de su vida laboral ha trabajado en automatización, donde ha trabajado en casi todas las disciplinas, desde programador hasta líder de proyecto y gerente de proyecto. Willem fue uno de los primeros holandeses con una microcomputadora (KIM-1, 1976) en un momento en que aún no se había inventado la PC. Actualmente se dedica principalmente al diseño y producción de pequeños circuitos electrónicos con microprocesadores. Su 'misión en la vida' es hacer que la gente se entusiasme con la fabricación de sus propios circuitos electrónicos, microcomputadoras y programación.

Comentarios

The Netherlands Edwin vd Oetelaar
Hola Sr. Willem, ¿No sería más conveniente en los proyectos aplicar un expansor de E/S de 16 bits MCP23017 con generación de interrupciones... que hacer usted mismo un procesador de E/S independiente? Pregunto esto porque yo también estoy observando aves. Quiero equipar un módulo ESP32-S con una serie de interfaces de termopar (un par de ADC de 0-10 V) y una fila de entradas/salidas lógicas para hacer un proyecto sobre el control de bombas de calor (y también comprender el comportamiento). es ayudar a este club https://www.adelaar-innovatie.nl/over-ons." rel="nofollow" target="_blank">https://www.adelaar-innovatie.nl/over-ons. Espero dos pensamientos, un ESP32 con todo a través del bus I2C o un AVR separado (por ejemplo, un atmega2560) que maneja todas las E/S (y posiblemente el comportamiento en tiempo real) y con el que dejo que el ESP32 hable a través de un protocolo en serie. Por favor sus ideas. Saludos, Edwin van den Oetelaar
Colocado en 
Willem
Hola Edwin, un expansor de E/S de este tipo también es adecuado, pero no proporciona opciones adicionales como manejar pulsaciones cortas, medias y largas de botones o LED parpadeantes sin la intervención de su propio código o apagar un LED después de un tiempo específico. de nuevo. Ver: https://willem.aandewiel.nl/index.php/2020/08/10/extending-gpio-pins-on-your-micro-processor/" rel="nofollow" target="_blank">https://willem.aandewiel.nl/index.php/2020/08/10/extending-gpio-pins-on-your-micro-processor/
Colocado en 
Edwin
Hola Sr. Willem, gracias por sus comentarios sobre este tema. Llegué a la misma conclusión, ambas opciones son factibles. Sin embargo, hay una cosa que me preocupa cuando uso un procesador IO controlado por firmware. Ese es el hecho de que el firmware puede tener problemas (errores o de otro tipo). Al actualizar el firmware principal del ESP32, también me gustaría actualizar y eliminar errores en todo el sistema. ¿Alguna vez ha actualizado desde otra CPU maestra el firmware de una MCU AVR que ya estaba en circuito e implementada? Un enfoque alternativo que estoy considerando es utilizar una FPGA para el procesamiento de IO. El firmware FPGA (imagen) lo proporciona el procesador principal durante el inicio del sistema. De esta manera, el firmware de todo el sistema se puede actualizar mientras el sistema está en campo, sin intervención humana. Sus pensamientos y su rica experiencia son muy bienvenidos. Saludos cordiales Edwin
Colocado en 
Webwinkelkeur Kiyoh Trustpilot Opencircuit