Nunca suficientes pines GPIO en un microprocesador
Colocado enDe 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.
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) .
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.
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.