Mai abbastanza pin GPIO su un microprocessore

Posto su

In 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.

ADW0720 Tipo 2 ADW0720 Tipo 2

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) .

ADW0720 ATtiny841 ADW0720 ATtiny841

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.

ADW0720 Tipo 1 (4 LED, 4 interruttori) ADW0720 Tipo 1 (4 LED, 4 interruttori)
ADW0720 Tipo-2 (8 LED, nessun interruttore) ADW0720 Tipo-2 (8 LED, 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.

Schema della scheda ADW0720 Type-1 Schema della scheda ADW0720 Type-1
ADW0720 Scheda di tipo 2 ADW0720 Scheda di tipo 2
Funzioni di supporto dalla libreria Funzioni di supporto dalla libreria
Pubblicato da Sito web Willem Aandewiel (1955) ha un background in elettronica e tecniche digitali. Tuttavia, la maggior parte della sua vita lavorativa ha lavorato nell'automazione, dove ha lavorato in quasi tutte le discipline, dal programmatore al project leader e al project manager. Willem è stato uno dei primi olandesi con un microcomputer (KIM-1, 1976) in un'epoca in cui il PC doveva ancora essere inventato. Attualmente si occupa principalmente della progettazione e produzione di piccoli circuiti elettronici a microprocessore. La sua "missione nella vita" è rendere le persone entusiaste di creare i propri circuiti elettronici, microcomputer e programmazione.

Commenti

The Netherlands Edwin vd Oetelaar
Salve signor Willem, l'applicazione di un espansore IO a 16 bit MCP23017 con generazione di interruzioni non sarebbe più conveniente nei progetti rispetto alla creazione di un processore IO separato? Lo chiedo perché anch'io sto facendo birdwatching. Voglio dotare un modulo ESP32-S di una serie di interfacce per termocoppie - una coppia di ADC 0-10V - e una fila di ingressi/uscite logiche per fare un progetto riguardante il controllo delle pompe di calore (e capirne anche il comportamento) è aiutare questo club https://www.adelaar-innovatie.nl/over-ons." rel="nofollow" target="_blank">https://www.adelaar-innovatie.nl/over-ons. Spero in 2 pensieri, un ESP32 con tutto tramite bus I2C o un AVR separato (ad esempio un atmega2560) che gestisce tutti gli IO (e possibilmente il comportamento in tempo reale) e con il quale lascio parlare l'ESP32 tramite un protocollo seriale. Per favore le tue intuizioni. Saluti, Edwin van den Oetelaar
Posto su 
Willem
Ciao Edwin, Anche un espansore I/O di questo tipo è adatto, ma non fornisce opzioni extra come la gestione di pressioni brevi, medie e lunghe dei pulsanti o il lampeggio dei LED senza l'intervento del proprio codice o dopo un tempo specificato. di nuovo spento. Vedi: 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/
Posto su 
Edwin
Salve signor Willem, grazie per il suo feedback su questo argomento. Sono giunto alla stessa conclusione, entrambe le opzioni sono fattibili. Tuttavia, c'è una cosa che mi preoccupa quando utilizzo un processore IO controllato dal firmware. Cioè il fatto che il firmware potrebbe avere problemi (bug o altro). Aggiornando il firmware principale dell'ESP32, vorrei anche aggiornare e rimuovere i bug nell'intero sistema. Hai mai eseguito il flashing da un'altra CPU master del firmware di un MCU AVR che era già in circuito e distribuito? Un approccio alternativo che sto prendendo in considerazione è utilizzare un FPGA per l'elaborazione IO. Il firmware FPGA (immagine) viene fornito dal processore principale all'avvio del sistema. In questo modo è possibile aggiornare il firmware dell'intero sistema mentre il sistema è sul campo, senza intervento umano. I tuoi pensieri e la tua ricca esperienza sono molto apprezzati. Cordiali saluti, Edwin
Posto su 
Webwinkelkeur Kiyoh Trustpilot Opencircuit