Mai abbastanza pin GPIO su un microprocessore
Posto suIn qualche modo, indipendentemente dal microprocessore che scelgo, esaurisco i pin GPIO per le esigenze del progetto o per quello che voglio fare.
Quindi per un progetto recente sono passato dall'ESP8266 all'ESP32 che ha molti più pin GPIO rispetto al suo predecessore .. ma ancora non abbastanza per il progetto su cui sto lavorando.
Per terminare una volta per tutte questa corsa ai pin GPIO, ho deciso che avevo bisogno di una scheda di espansione economica che potesse essere configurata per interruttori (ingresso) e LED o altre cose (uscita). E già che c'ero, ho pensato che un po' di logica in più sarebbe stata carina.
Quindi quello che mi è venuto in mente è una scheda I2C con otto pin GPIO liberamente configurabili per input o output (chiamo i pin GPIO "Slot").
La scheda di espansione è ideale per l'uso su una breadboard senza saldatura. Lo schema può essere successivamente incorporato nella progettazione hardware complessiva.
Uno slot configurato per l'input verrà probabilmente utilizzato per gli interruttori e quindi sarebbe fantastico se potessimo distinguere tra la pressione del pulsante e il rilascio (rilascio rapido, rilascio intermedio e rilascio lungo). Nel codice sul processore principale puoi semplicemente dire:
Gli slot configurati per l'output diventano un tipo di slot "spara e dimentica". Cioè, puoi dire allo Slot di essere ALTO o BASSO come con la funzione digitalWrite() nell'IDE Arduino . Ma puoi anche dire: va ALTO per 2500 ms e poi va di nuovo BASSO. Nel tuo programma principale non devi scrivere il codice per attendere 2500 ms e quindi rendere il pin GPIO BASSO.
Puoi anche dire al lucchetto di lampeggiare con un orario di attivazione e uno di disattivazione e, se lo desideri, una durata. Per esempio:
Il lucchetto lampeggia a 500 ms acceso, 1000 ms spento per un periodo di 10 secondi (10000 ms) e poi smette di lampeggiare.
Simile all'esempio sopra, ma ora il lucchetto lampeggerà per sempre (o fino a quando non gli dirai di fare qualcos'altro);
L'hardware è progettato attorno a un microcontrollore ATtiny841. La comunicazione avviene tramite il bus I2C (due fili, SCL e SDA).
È possibile far funzionare le schede a 5 Volt o 3,3 Volt a seconda delle esigenze (principalmente la tensione utilizzata dal processore principale) ma non è possibile collegare insieme sistemi a 5 Volt e 3,3 Volt senza una logica aggiuntiva (commutatori di livello per le linee SDA e SCL) .
Per controllare le schede ADW0720 ho sviluppato una libreria con semplici funzioni.
Ogni dispositivo I2C ha un indirizzo compreso tra 1 e 127 (decimale). L'indirizzo predefinito per le schede ADW0720 è 0x18 (24 decimali) ma puoi cambiarlo in qualsiasi cosa tu voglia con il seguente codice:
La seconda riga lo memorizza nuovo indirizzo in EEPROM e da quel momento in poi lo è nuovo indirizzo l'indirizzo di questo modulo.
Assegnando a ciascuna scheda ADW0720 un indirizzo univoco, è possibile controllare più schede ADW0720 utilizzando solo le due linee I2C!
Ho progettato due tipi di schede ADW0720 pronte per l'uso. La scheda di tipo 1 ha 4 interruttori tattili e 4 LED, la scheda di tipo 2 ha 8 LED ma nessun interruttore.
Invece dei LED, è anche possibile pilotare un MOSFET a canale N (come il 2N7000 o 2N7002) come interruttore per pilotare carichi più grandi come cicalini, relè o motori.
Puoi trovare la libreria e il codice per lo slave ATtiny841-I2C su github. Lì troverai anche la documentazione per la biblioteca.
La libreria viene fornita con due schizzi di esempio. Il primo è quello di mostrare cosa possono fare le schede ADW0720 (show-of) e il secondo esempio (I2C_ADW0720_Configurator) mostra l'utilizzo più avanzato.
Ad esempio, con il secondo esempio puoi impostare la funzione (ingresso o uscita) degli Slot e puoi impostare l'indirizzo I2C dell'ADW0720 in modo da non doverlo fare nel tuo programma principale.