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