Aldrig nok GPIO-ben på en mikroprocessor

Placeret på

På en eller anden måde, uanset hvilken mikroprocessor jeg vælger, løber jeg tør for GPIO-pins til projektets behov eller til det, jeg vil gøre.


Så for et nyligt projekt skiftede jeg fra ESP8266 til ESP32, som har mange flere GPIO-pins end sin forgænger.. men stadig ikke nok til det projekt, jeg arbejder på.

For at afslutte denne kørsel for GPIO-ben én gang for alle besluttede jeg, at jeg havde brug for et billigt udvidelseskort, der kunne konfigureres til switches (input) og LED'er eller andre ting (output). Og mens jeg var i gang, tænkte jeg, at noget ekstra logik ville være rart.

Så det, jeg fandt på, er et I2C-kort med otte GPIO-ben, der frit kan konfigureres til input eller output (jeg kalder GPIO-benene "Slots").

Udvidelsesbrættet er ideelt til brug på et loddefrit brødbræt. Skemaet kan senere indarbejdes i det overordnede hardwaredesign.

ADW0720 Type 2 ADW0720 Type 2

Et slot, der er konfigureret til input, vil sandsynligvis blive brugt til switches, og så ville det være fantastisk, hvis vi kunne skelne mellem at trykke på knappen og slippe den (hurtigudløser, mellemfrigivelse og lang udløsning). I koden på hovedprocessoren kan du bare sige:

Slots konfigureret til output bliver en "skyd og glem" type slot. Det vil sige, du kan fortælle Slot til at være HIGH eller LOW som med digitalWrite()-funktionen i Arduino IDE. Men du kan også sige: går HIGH i 2500 ms og går derefter LOW igen. I dit hovedprogram behøver du ikke skrive koden for at vente 2500 ms og derefter gøre GPIO-pinden LAV.

Du kan også bede låsen om at blinke med et tændt og et slukket tidspunkt og, hvis du vil, en varighed. For eksempel:

Låsen blinker ved 500ms tændt, 1000ms slukket i en periode på 10 sekunder (10000ms) og holder derefter op med at blinke.

Svarende til eksemplet ovenfor, men nu vil låsen blinke for evigt (eller indtil du beder den om at gøre noget andet);

Hardwaren er designet omkring en ATtiny841 mikrocontroller. Kommunikation foregår via I2C-bussen (to ledninger, SCL og SDA).
Du kan køre kortene ved enten 5Volt eller 3,3Volt afhængigt af dine behov (hovedsageligt den spænding, hovedprocessoren bruger), men du kan ikke koble 5Volt og 3,3Volt systemer sammen uden noget ekstra logik (niveauskiftere til SDA- og SCL-linjerne) .

ADW0720 ATtiny841 ADW0720 ATtiny841

For at styre ADW0720-kortene udviklede jeg et bibliotek med simple funktioner.
Hver I2C-enhed har en adresse i området 1 til 127 (decimal). Standardadressen for ADW0720-kortene er 0x18 (24 decimaler), men du kan ændre dette til hvad du vil med følgende kode:

Den anden linje gemmer dette ny adresse ind i EEPROM og fra da af er det ny adresse adressen for dette modul.

Ved at give hvert ADW0720-kort en unik adresse, kan du styre flere ADW0720-kort kun ved at bruge de to I2C-linjer!

Jeg har designet to typer ADW0720 boards, der er klar til brug. Type-1-kortet har 4 taktile kontakter og 4 LED'er, Type-2-kortet har 8 LED'er, men ingen kontakter.

ADW0720 Type 1 (4 LED'er, 4 kontakter) ADW0720 Type 1 (4 LED'er, 4 kontakter)
ADW0720 Type-2 (8 LED'er, ingen kontakter) ADW0720 Type-2 (8 LED'er, ingen kontakter)


I stedet for LED'erne er det også muligt at drive en N-kanal MOSFET (såsom 2N7000 eller 2N7002) som en switch til at drive større belastninger såsom summer, relæer eller motorer.

Du kan finde biblioteket og koden til ATtiny841-I2C-slaven på github. Der finder du også dokumentationen til biblioteket.

Biblioteket kommer med to eksempelskitser. Det første er at vise, hvad ADW0720-kortene kan (show-of), og det andet eksempel (I2C_ADW0720_Configurator) viser den mere avancerede brug.

For eksempel kan du med det andet eksempel indstille funktionen (input eller output) for Slots, og du kan indstille I2C-adressen for ADW0720, så du ikke behøver at gøre det i dit hovedprogram.

Skematisk af ADW0720 Type-1-kortet Skematisk af ADW0720 Type-1-kortet
ADW0720 Type-2-kort ADW0720 Type-2-kort
Hjælpefunktioner fra biblioteket Hjælpefunktioner fra biblioteket
Sendt af Internet side Willem Aandewiel (1955) har en baggrund i elektronik og digitale teknikker. Det meste af sit arbejdsliv har han dog arbejdet med automation, hvor han har arbejdet i stort set alle discipliner fra programmør til projektleder og projektleder. Willem var en af de første hollændere med en mikrocomputer (KIM-1, 1976) på et tidspunkt, hvor pc'en endnu ikke var opfundet. I dag beskæftiger han sig hovedsageligt med design og produktion af små elektroniske kredsløb med mikroprocessorer. Hans 'mission i livet' er at gøre folk begejstrede for at lave deres egne elektroniske kredsløb, mikrocomputere og programmering.

Kommentarer

The Netherlands Edwin vd Oetelaar
Hej hr. Willem, Ville det ikke være mere praktisk i projekterne at anvende en MCP23017 16 bit IO-expander med interrupt-generering end at lave en separat IO-processor selv? Jeg spørger om dette, fordi jeg også selv kigger på fugle. Jeg ønsker at udstyre et ESP32-S-modul med en række termoelement-grænseflader - et par 0-10V ADC'er - og en række logiske input/outputs for at lave et projekt vedrørende styring af varmepumper (og også forstå adfærden) Det er at hjælpe denne klub https://www.adelaar-innovatie.nl/over-ons. Jeg håber på 2 tanker, en ESP32 med alt via I2C bus eller en separat AVR (f.eks. en atmega2560) der håndterer al IO (og evt. realtime adfærd) og som jeg lader ESP32’eren tale med via en seriel protokol. Venligst din indsigt. Med venlig hilsen Edwin van den Oetelaar
Placeret på 
Willem
Hej Edwin, sådan en I/O-expander er også velegnet, men den giver ikke de ekstra muligheder, såsom håndtering af korte, mellemlange og lange knaptryk eller blinkende LED'er uden indgriben af din egen kode eller efter en specificeret tid slukke for en LED en gang til. Se: https://willem.aandewiel.nl/index.php/2020/08/10/extending-gpio-pins-on-your-micro-processor/
Placeret på 
Edwin
Hej Mr. Willem, tak for din feedback om dette emne. Jeg kom til samme konklusion, begge muligheder er gennemførlige. Der er dog én ting, der bekymrer mig, når jeg bruger en firmwarestyret IO-processor. Det er det faktum, at firmwaren kan have problemer (fejl eller andet). Ved at opdatere hovedfirmwaren i ESP32 vil jeg også gerne opdatere og fjerne fejl i hele systemet. Har du nogensinde flashet firmwaren til en AVR MCU fra en anden master-CPU, der allerede var i kredsløb og installeret? En alternativ tilgang, jeg overvejer, er at bruge en FPGA til IO-behandling. FPGA-firmwaren (image) leveres af hovedprocessoren ved systemstart. På denne måde kan hele systemets firmware opdateres, mens systemet er i marken, uden menneskelig indgriben. Dine tanker og rige erfaring er meget velkomne. Venlig hilsen Edwin
Placeret på 
Webwinkelkeur Kiyoh Trustpilot Opencircuit