Nooit genoeg GPIO pins op een Micro Processor

Placerad på

Op de een of andere manier, ongeacht welke microprocessor ik kies, heb ik te weinig GPIO-pinnen voor de projectbehoeften of voor wat ik wil doen.


Voor een recent project ben ik daarom overgestapt van de ESP8266 naar de ESP32 die veel meer GPIO-pinnen heeft dan zijn voorganger .. maar nog steeds niet genoeg voor het project waar ik aan werk.

Om deze run voor GPIO-pinnen voor eens en voor altijd te beëindigen, besloot ik dat ik een goedkoop uitbreidingsbord nodig had dat kon worden geconfigureerd voor schakelaars (input) en LED's of andere dingen (output). En terwijl ik bezig was, dacht ik dat wat extra logica leuk zou zijn.

Dus wat ik bedacht heb is een I2C-bordje met acht GPIO-pinnen die vrij configureerbaar zijn voor invoer of uitvoer (ik noem de GPIO-pinnen "Slot's").

Het uitbreidingsbord is uitermate geschikt voor gebruik op een solderless breadboard. Het schema kan later worden opgenomen in het totale hardware-ontwerp.

ADW0720 Type 2ADW0720 Type 2

Een voor input geconfigureerd Slot, zal waarschijnlijke voor schakelaars gebruikt worden en dan zou het geweldig zijn als we onderscheid kunnen maken tussen het indrukken van de knop en het loslaten ervan (snel loslaten, midden loslaten en lang loslaten). In de code op de hoofdprocessor kun je gewoon zeggen:

Slots die zijn geconfigureerd voor output, worden een soort "shoot and forget" -type slot. Dat wil zeggen: je kunt zeggen dat het Slot HOOG of LAAG moet zijn zoals met de functie digitalWrite() in de Arduino IDE. Maar je kunt ook zeggen: wordt 2500 ms HOOG en wordt dan weer LAAG. In je hoofdprogramma hoef je de code niet te schrijven om 2500 ms te wachten en dan de GPIO-pin LOW te maken.

Je kunt het Slot ook vertellen om te knipperen met een aan-tijd en een uit-tijd en, als je wilt, een duur. Bijvoorbeeld:

Het Slot knippert met 500 ms aan, 1000 ms uit gedurende een periode van 10 seconden (10000 ms) en stopt daarna met knipperen.

Een zelfde als voorbeeld als hiervoor, maar nu zal het Slot voor altijd knipperen (of totdat je hem vertelt iets anders te doen);

De hardware is ontworpen rond een ATtiny841-microcontroller. De communicatie verloopt via de I2C bus (twee draden, SCL en SDA).
Je kunt de boards gebruiken met 5Volt of 3.3Volt afhankelijk van je behoeften (voornamelijk de spanning die de hoofdprocessor gebruikt) maar je kunt geen 5Volt- en 3,3Volt-systemen op elkaar aansluiten zonder wat extra logica (level shifters voor de SDA- en SCL-lijnen).

ADW0720 ATtiny841ADW0720 ATtiny841

Voor het aansturen van de ADW0720-borden heb ik een bibliotheek ontwikkeld met eenvoudige functies.
Elk I2C-apparaat heeft een adres in het bereik van 1 tot 127 (decimaal). Het standaard adres voor de ADW0720 borden is 0x18 (24 decimaal) maar je kunt dit veranderen naar wat je maar wilt met de volgende code:

De tweede regel slaat dit newAddress op in EEPROM en vanaf dat moment is het newAddress het adres voor deze module.

Door elk ADW0720-bord een uniek adres te geven, kunt je meerdere ADW0720-borden aansturen met alleen de twee I2C-lijnen!

Ik heb twee soorten ADW0720-borden ontworpen die klaar zijn voor gebruik. Het Type-1 bord heeft 4 tactiel schakelaars en 4 LED's, het Type-2 bord heeft 8 LED's maar geen schakelaars.

ADW0720 Type 1 (4 LED's, 4 Switches)ADW0720 Type 1 (4 LED's, 4 Switches)
ADW0720 Type-2 (8 LED's, geen Switches)ADW0720 Type-2 (8 LED's, geen Switches)


In plaats van de LED's is het ook mogelijk om een ​​N-kanaals MOSFET (zoals de 2N7000 of 2N7002) aan te sturen als schakelaar om grotere belastingen zoals zoemers, relais of motoren aan te sturen.

Je kunt de bibliotheek en de code voor de ATtiny841-I2C-slave vinden op github. Daar vind je ook de documentatie voor de bibliotheek.

De bibliotheek wordt geleverd met twee voorbeeld sketches. De eerste is om te laten zien wat de ADW0720-bordjes kunnen (show-of) en het tweede voorbeeld (I2C_ADW0720_Configurator) laat het meer geavanceerde gebruik zien.

Met het tweede voorbeeld kun je bijvoorbeeld de functie (input of output) van de Slots instellen en je kunt er het I2C adres van de ADW0720 mee instellen zodat je dat niet in je hoofdprogramma hoeft te doen.

Schema van het ADW0720 Type-1 boardSchema van het ADW0720 Type-1 board
ADW0720 Type-2 boardADW0720 Type-2 board
Helper functies uit de libraryHelper functies uit de library
Postat av Hemsida Willem Aandewiel (1955) heeft als achtergrond een opleiding in elektronica en digitale technieken. Het grootste deel van zijn werkbare leven heeft hij echter in de automatisering gewerkt waar hij zo'n beetje in alle disciplines van programmeur tot projectleider en projectmanager heeft gewerkt. Willem was één van de eerste Nederlanders met een micro-computer (KIM-1, 1976) in een tijd dat de PC nog moest worden uitgevonden. Tegenwoordig houdt hij zich vooral bezig met het ontwerpen en maken van kleine elektronische schakelingen met microprocessoren. Zijn ‘mission in life’ is om mensen enthousiast te maken voor het zelf maken van elektronische schakelingen, microcomputers en programmeren.

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 tryck på knappen eller blinkande lysdioder utan inblandning av din egen kod eller efter en angiven tid. släcka en lysdiod. 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 hade kommit till samma slutsats, båda alternativen är genomförbara. Det finns dock en sak som oroar mig när jag använder en firmware-driven 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 den fasta programvaran för en AVR MCU från en annan huvud-CPU 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