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