Aldrig tillräckligt med GPIO-stift på en mikroprocessor

Placerad på

På något sätt, oavsett vilken mikroprocessor jag väljer, får jag slut på GPIO-stift för projektets behov eller för vad jag vill göra.


Så för ett nyligen projekt bytte jag från ESP8266 till ESP32 som har mycket fler GPIO-stift än sin föregångare... men fortfarande inte tillräckligt för projektet jag jobbar på.

För att avsluta denna körning för GPIO-stift en gång för alla, bestämde jag mig för att jag behövde ett billigt expansionskort som kunde konfigureras för switchar (ingång) och lysdioder eller andra saker (utgång). Och medan jag höll på så tänkte jag att lite extra logik skulle vara trevligt.

Så det jag kom på är ett I2C-kort med åtta GPIO-stift som är fritt konfigurerbara för ingång eller utgång (Jag kallar GPIO-stiften för "Slots").

Expansionsbrädan är idealisk för användning på en lödfri brödbräda. Schemat kan senare införlivas i den övergripande hårdvarudesignen.

ADW0720 Typ 2 ADW0720 Typ 2

En Slot konfigurerad för ingång kommer troligen att användas för switchar och då vore det bra om vi kunde skilja mellan att trycka på knappen och släppa den (snabbsläpp, mitten och lång frigöring). I koden på huvudprocessorn kan du bara säga:

Slots konfigurerade för utmatning blir en "skjut och glöm"-typ av slot. Det vill säga, du kan säga till Slottet att vara HÖG eller LÅG som med digitalWrite()-funktionen i Arduino IDE. Men du kan också säga: går HÖG i 2500 ms och går sedan LÅG igen. I ditt huvudprogram behöver du inte skriva koden för att vänta 2500 ms och sedan göra GPIO-stiftet LÅG.

Du kan också säga till låset att blinka med en på- och en av-tid och, om du vill, en varaktighet. Till exempel:

Låset blinkar vid 500ms på, 1000ms av under en period av 10 sekunder (10000ms) och slutar sedan blinka.

Liknar exemplet ovan, men nu kommer låset att blinka för alltid (eller tills du säger åt det att göra något annat);

Hårdvaran är designad kring en ATtiny841 mikrokontroller. Kommunikation sker via I2C-bussen (två ledningar, SCL och SDA).
Du kan köra korten på antingen 5Volt eller 3,3Volt beroende på dina behov (främst spänningen som huvudprocessorn använder) men du kan inte koppla ihop 5Volt och 3,3Volt system utan lite extra logik (nivåväxlingar för SDA- och SCL-linjerna) .

ADW0720 ATtiny841 ADW0720 ATtiny841

För att styra ADW0720-korten utvecklade jag ett bibliotek med enkla funktioner.
Varje I2C-enhet har en adress i intervallet 1 till 127 (decimal). Standardadressen för ADW0720-korten är 0x18 (24 decimaler) men du kan ändra detta till vad du vill med följande kod:

Den andra raden lagrar detta ny adress till EEPROM och från och med då är det ny adress adressen för denna modul.

Genom att ge varje ADW0720-kort en unik adress kan du styra flera ADW0720-kort med bara de två I2C-linjerna!

Jag har designat två typer av ADW0720-kort som är redo att användas. Typ-1-kortet har 4 taktila strömbrytare och 4 lysdioder, Type-2-kortet har 8 lysdioder men inga strömbrytare.

ADW0720 Typ 1 (4 lysdioder, 4 omkopplare) ADW0720 Typ 1 (4 lysdioder, 4 omkopplare)
ADW0720 Typ-2 (8 lysdioder, inga strömbrytare) ADW0720 Typ-2 (8 lysdioder, inga strömbrytare)


Istället för lysdioderna är det också möjligt att driva en N-kanals MOSFET (som 2N7000 eller 2N7002) som en switch för att driva större belastningar som summer, reläer eller motorer.

Du hittar biblioteket och koden för ATtiny841-I2C-slaven på github. Där hittar du också dokumentationen till biblioteket.

Biblioteket kommer med två exempelskisser. Det första är att visa vad ADW0720-korten kan göra (show-of) och det andra exemplet (I2C_ADW0720_Configurator) visar den mer avancerade användningen.

Med det andra exemplet kan du till exempel ställa in funktionen (ingång eller utgång) för Slots och du kan ställa in I2C-adressen för ADW0720 så att du inte behöver göra det i ditt huvudprogram.

Schematisk beskrivning av ADW0720 Type-1-kortet Schematisk beskrivning av ADW0720 Type-1-kortet
ADW0720 Typ-2 kort ADW0720 Typ-2 kort
Hjälparfunktioner från biblioteket Hjälparfunktioner från biblioteket
Postat av Hemsida Willem Aandewiel (1955) har en bakgrund inom elektronik och digital teknik. Men större delen av sitt yrkesverksamma liv har han arbetat inom automation där han har arbetat inom i stort sett alla discipliner från programmerare till projektledare och projektledare. Willem var en av de första holländarna med en mikrodator (KIM-1, 1976) vid en tidpunkt då datorn ännu inte hade uppfunnits. Numera sysslar han främst med design och produktion av små elektroniska kretsar med mikroprocessorer. Hans "uppdrag i livet" är att göra människor entusiastiska över att göra sina egna elektroniska kretsar, mikrodatorer och programmering.

Kommentarer

The Netherlands Edwin vd Oetelaar
Hej herr Willem, Skulle det inte vara bekvämare att använda en MCP23017 16 bitars IO-expander med avbrottsgenerering i projekten än att göra en separat IO-processor själv? Jag frågar det här för att jag också fågelskådar själv. Jag vill utrusta en ESP32-S-modul med en serie termoelementgränssnitt - ett par 0-10V ADC - och en rad logiska ingångar/utgångar för att göra ett projekt angående styrning av värmepumpar (och även förstå beteendet) Det är att hjälpa denna klubb https://www.adelaar-innovatie.nl/over-ons. Jag hoppas på 2 tankar, en ESP32 med allt via I2C-buss eller en separat AVR (t.ex. en atmega2560) som hanterar all IO (och eventuellt realtidsbeteende) och som jag låter ESP32 prata med via ett seriellt protokoll. Snälla dina insikter. Hälsningar, Edwin van den Oetelaar
Placerad på 
Willem
Hej Edwin, En sådan I/O-expander är också lämplig, men den ger inte de extra alternativen som att hantera korta, medelstora och långa knapptryckningar eller blinkande lysdioder utan ingripande av din egen kod eller efter en viss tid stänga av en lysdiod igen. Se: https://willem.aandewiel.nl/index.php/2020/08/10/extending-gpio-pins-on-your-micro-processor/
Placerad på 
Edwin
Hej Mr Willem, tack för din feedback om detta ämne. Jag kom till samma slutsats, båda alternativen är genomförbara. Det finns dock en sak som oroar mig när jag använder en firmware-styrd IO-processor. Det är det faktum att den fasta programvaran kan ha problem (buggar eller annat). Genom att uppdatera den huvudsakliga firmwaren i ESP32 vill jag också uppdatera och ta bort buggar i hela systemet. Har du någonsin flashat från en annan huvud-CPU den fasta programvaran för en AVR MCU som redan var i krets och installerad? Ett alternativt tillvägagångssätt jag överväger är att använda en FPGA för IO-bearbetning. FPGA-firmware (bild) tillhandahålls av huvudprocessorn vid systemstart. På så sätt kan hela systemets firmware uppdateras medan systemet är i fält, utan mänsklig inblandning. Dina tankar och rika erfarenhet är mycket välkomna. Med vänlig hälsning, Edwin
Placerad på 
Webwinkelkeur Kiyoh Trustpilot Opencircuit