Arduino portudvidelse til knapper. Udvider analoge indgange i Arduino

Alle elsker billige Arduino boards, men så ofte har et projekt bare brug for en eller to gratis porte! Og nogle gange er der nok porte, men du vil ikke trække en masse ledninger til en anden del af strukturen. Lad os sige, at du skal placere flere knapper og lysdioder på enhedens frontpanel. Det er mere pålideligt og lettere at forbinde dem til hovedkortet med kun to databusledninger i stedet for et kabel eller sele, er det ikke?

Forskellige Arduino port expandere er designet til sådanne situationer.

Typisk implementerer mikrocontrollerstifter flere forskellige funktioner, så der er forskellige udvidere:

  1. Standard GPIO portudvidelse
  2. PWM udgangsudvidelse
  3. Analog input expandere – multipleksere og eksterne ADC'er

Separat er det værd at nævne digital-til-analog-konvertere (DAC'er) og adresserumsudvidelser i I2C-bussen. Disse enheder duplikerer ikke direkte portenes funktioner, men udvider mikrocontrollernes muligheder.

I den første artikel i serien vil vi tale om de enkleste og mest nyttige udvidere, der fungerer som digitale I/O-porte. Disse er mikrokredsløb og . De er designet og fungerer fuldstændig identisk og adskiller sig kun i antallet af porte.

Valg af udvidelsesmodul til Arduino

Det mest populære og billige modul er lavet på PCF8574-chippen (fig. 1)

Ris. 1. Populært PCF8574 portudvidelsesmodul

Fordele:
  • Lav pris.
  • Moduler kan forbindes i en kæde ved blot at indsætte stikkene fra det ene modul i stikkene på det forrige. Glem ikke at indstille jumpere til forskellige moduladresser!
Fejl:
  • Det kan ikke indsættes direkte i et brødbræt (jeg anbefaler at lodde portstikket på bagsiden).
  • I alt otte porte i ét modul.

Hvis du er i humør til mere seriøse projekter, så bestil et 16-bit PCF8575-modul på Aliexpress. Jeg anbefaler stærkt modulet vist i fig. 2.

Ris. 2. PCF8575 Port Expander Module

Fordele:
  • Dobbelt så mange havne.
  • Indbygget 3,3 volt strømforsyning, kan drive andre moduler.
  • Indbygget logisk niveautilpasning til I2C-bussen ved forskellige forsyningsspændinger.
  • Praktisk format til prototyping board.
Fejl:
  • Højere pris.

Funktionsprincip for PCF8574/PCF8575 GPIO-portudvidelse

Dataudveksling sker via I2C-bussen. Forbindelsen til Arduino-kortet kræver kun fire ledninger, inklusive strøm. Udvidelsesadressen indstilles af tre jumpere på indgangene A0...A2, så du samtidigt kan tilslutte otte identiske chips til bussen og få maksimalt 8*8=64 ekstra porte med PCF8574 eller 8*16=128 med PCF8575-chip .

For at udlæse data til porten skal du skrive en databyte til moduladressen på I2C-bussen. For at læse data fra en port skal du læse en byte på samme adresse. En byte skrives og læses altid som en helhed; individuelle bits håndteres programmatisk.

Udgangene på mikrokredsløbet er også indgange, og der er ikke noget serviceregister, der bestemmer formålet med udgangen. Der er kun et låseregister, hvori outputbyten skrives. Hvordan er det muligt?

Portene fungerer på en lignende måde med åben opsamler og er udstyret med interne pull-up modstande. Hvis der skrives et logisk nul til udgangen, åbner udgangstransistoren, hvilket med magt trækker udgangen til jord. Aflæsning fra en sådan port vil altid returnere nul.

Vær forsigtig, når du tilfører direkte forsyningsspænding til en pin, der er lav, eller når strømmen overskrides. 50 mA du vil ødelægge chippen!

For at bruge en port som input, skal du skrive en til den. I dette tilfælde vil den interne transistor blive slukket, og aflæsningsresultatet vil blive bestemt af det eksterne logiske niveau påført stiften. Den frie pin er forbundet til strømforsyningen med en indbygget modstand.

For samtidig at bruge nogle af portene som input og nogle som output, før hver skrivning af en byte af data til ekspanderen, er det nødvendigt at anvende en maske af et til de bits, der svarer til inputs ved hjælp af "logiske ELLER” operation. Det er alt)))

Afbryd generation

PCF857* Portudvidelser genererer en afbrydelsespuls lavt niveau ved INT-udgangen for enhver ændring i indgangssignalet ved enhver indgang på mikrokredsløbet. Dette er praktisk, hvis udvideren betjener et tastatur. Men du skal selv bestemme i interrupt-handleren, hvilken knap der blev trykket eller sluppet. Afbrydelsesgeneratoren er udstyret med et kontaktbounce-undertrykkelsesfilter.

Eksempel 1: Brug af PCF8574-modulet

Lad os samle et simpelt kredsløb af fire LED'er, et PCF8574-modul og et Arduino-kort (fig. 3 og 4). Med dette tilslutningsskema har vi ikke engang brug for slukningsmodstande til LED'erne. Strøm løber gennem LED'en og en indbygget modstand forbundet til strømskinnen.

Ris. 3. PCF8574-modultilslutningsdiagram

Ris. 4. Kredsløbslayout med PCF8574-modul

Kopier og skriv skitse 1 til Arduino-tavlen:

// Moduladresse på bussen (A0, A1, A2 = 0) int adresse = 0x38; // Data læst fra modulet uint8_t dataReceive; // Data til at skrive til modulet uint8_t dataSend; void setup() ( Wire.begin(); Serial.begin(9600); // Højt niveau til alle porte PCF8574 dataSend = B11111111; pcf8574_write(dataSend); ) void loop() ( // Læs en byte fra modulet dataReceive = pcf8574_read (); // Output til monitoren i binært format Serial.println(dataReceive, BIN); // Skift bitsene til venstre med en nibble dataSend = dataReceive<< 4; // Накладываем битовую маску dataSend |= B00001111; // Записываем байт в модуль pcf8574_write(dataSend); delay(500); } // Процедура записи байта в модуль void pcf8574_write(uint8_t dt) { Wire.beginTransmission(address); Wire.write(dt); Wire.endTransmission(); } // Процедура чтения байта из модуля int8_t pcf8574_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 1); return (Wire.read()); }

Et højt niveau skrives i starten til alle chippens porte, så porte P0...P3 kan fungere som input.

Niveauerne ved portstifterne aflæses hver 500 ms, og aflæsningsresultatet vises på monitoren. Hvis du forbinder en af ​​indgangene P0...P3 til en fælles ledning, vises et nul i dens bit. Derefter flyttes den aflæste værdi til venstre med fire bit, resultatet sendes til porten, og en af ​​LED'erne slukker. For eksempel, hvis et nul aflæses på pin P0, vil LED'en, der er forbundet til pin P4, slukke.

Bemærk venligst, at før hver skrivning til expanderen skal vi anvende en bitmaske af ener til alle bits, der skal indlæses: dataSend |= B00001111;

Rutinerne for at arbejde med I2C-bussen er ekstremt forenklede, ingen fejl behandles.

Råd: For at finde og kontrollere moduladressen på I2C-bussen kan du bruge . Den viser i terminalen adresserne på alle enheder, der reagerer på en busanmodning.

Eksempel 2: Brug af PCF8575-modulet

Det særlige ved PCF8575-modulet er, at det har 16 porte, så det skriv altid to bytes og læs to bytes. Denne regel skal følges, selvom den anden byte ikke er nødvendig.

Lad os ændre diagrammet lidt. Vi forbinder LED'erne til portene P10…P13, og vi forbinder portene P00…P03 med en jumper til den fælles ledning (fig. 5 og 6).

Ris. 5. PCF8575-modultilslutningsdiagram

Ris. 6. Kredsløbslayout med PCF8575-modul

I skitse 2 skrives 1'er først til alle porte, derefter læses deres status hver 500 ms. Læserutinen returnerer et 16-bit ord, som er opdelt i bytes. Indholdet af den lave byte (ben P00...P07) kopieres til den høje byte og uploades tilbage til modulet. Hvis du forbinder et af benene P00...P03 til den fælles ledning, vil en af ​​LED'erne, der er forbundet til P10...P13, slukke.

// Bibliotek til at arbejde med I2C #include // Moduladresse på bussen som standard int-adresse = 0x20; // Data læst fra modulet uint8_t hi, lo; uint16_t dataReceive; uint8_t dataHighByte; // Høj byte (P10...P17) uint8_t dataLowByte; // Lav byte (P00...P07) void setup() ( Wire.begin(); Serial.begin(9600); // Højt niveau til alle porte PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; dataLowByte, dataLowByte, dataLowByte, ); ) void loop() ( // Læs en byte fra modulet dataReceive = pcf8575_read(); // Output til monitoren i binært format Serial.println(dataReceive, BIN); // Vælg den lave byte fra et langt ord dataLowByte = lowByte(dataReceive); // Kopier den lave byte til den høje byte dataHighByte = dataLowByte; // Sæt en maske på den lave byte dataLowByte |= B11111111; // Skriv nye data til modulet, to bytes pcf8575_write(dataLowByte, dataHighByte); delay(500); ) / / Proceduren for at skrive en byte til modulet void pcf8575_write(uint8_t dtl, int8_t dth) ( Wire.beginTransmission(adresse); Wire.write(dtl); // Skriv den lave byte (P00...P07) Wire.write(dth); / / Skriv den høje byte (P10...P17) Wire.endTransmission(); ) // Procedure for læsning af en byte fra modulet int16_t pcf8575_read() ( Wire .beginTransmission(adresse); Wire.endTransmission(); Wire.requestFrom(adresse, 2); lo = Wire.read(); // Læs den lave byte (P00...P07) hi = Wire.read(); // Læs den høje byte (P10...P17) return (ord(hej, lo)); // Returner det lange ord)

Arduino-bibliotek til PCF8574/PCF8575

Biblioteket kan downloades fra GitHub. Men som du kan se, er det meget enkelt at arbejde med portudvidelser, og du kan nemt undvære et særligt bibliotek.

Beskrivelse af Expander Shield

Expander Shield er et originalt ekstra modul designet til at øge antallet af input/output-porte på mikrocontrollere baseret på Arduino-platformen, såvel som andre mikrocontrollere, ved hjælp af portudvidelser med et SPI- eller I2C-interface.


Hovedelementerne i Expander Shield-tillægsmodulet er to MCP23S17- eller MCP23017-mikrokredsløb (to 16-bit I/O-portekspandere med henholdsvis SPI- eller I2C-interface), som giver dig mulighed for at tilføje fire 8-bit I/O-porte, dvs. , 32 ekstra "ben".

Udstyr

Expander Shield-modulet leveres enten som en samlet SPI- eller I2C-version (med tilhørende chips), eller som et sæt uden chips, som kan købes separat.

Modulklemmerne kan forsynes med transportlåse, som skal fjernes inden arbejdet påbegyndes.

Expander Shield SPI 1100 rub. 850 gnid. Tilføj til kurv

Bestillingsblanket.

ExpanderShield til SPI-bus (med MCP23S17-chips).

Expander Shield I2C 1100 rub. 850 gnid. Tilføj til kurv

Opmærksomhed! Du har deaktiveret JavaScript. Normal betjening af bestillingssystem og indkøbskurv er ikke mulig. Hvis du af en eller anden grund ikke kan aktivere JavaScript, skal du blot angive de varer, du bestiller, på bestillingsformularen.

ExpanderShield til I2C-bus (med MCP23017-chips).

specifikationer

Her er de vigtigste funktionelle funktioner i Expander Shield-modulet.

  • praktisk moduldriftstilstandsomskifter afhængigt af typen af ​​portudvidelseschips, der aktuelt er installeret;
  • for hver af de to brugte 16-bit I/O-port-udvidelseschips indstilles en tre-bit adresse på bussen ved hjælp af jumpere, som giver dig mulighed for at placere op til 8 sådanne chips på en bus;
  • evnen til at bruge en jumper til at vælge nummeret på den tilsvarende Freeduino/Arduino mikrocontrollerudgang (digital pin 8, 9 eller 10) for CS-signalet fra SPI-bussen;
  • modulet bruger "pass-through"-stik, hvilket giver dig mulighed for at docke flere moduler uden at skifte i forhold til Arduino-kortet;
  • mikrokredsløbssignaler udsendes til fire PBD-10R stik med ekstra jord og +5V kontakter;
  • muligheden for at vælge en separat eller fælles hardwarenulstilling (RESET-knap) af 16-bit I/O-portudvidelseschipsene og Freeduino/Arduino-mikrocontrolleren ved hjælp af jumpere;
  • ekstra JPIC-stik med afbrydelsesben (INTA, INTB), hardwarenulstilling (RST) og chipvalg (CS);

Andre karakteristika ved modulet bestemmes primært af egenskaberne for MCP23S17/MCP23017 mikrokredsløb, hvis tekniske beskrivelse er tilgængelig i producentens dokumentation.

Før du begynder at arbejde med det ekstra Expander Shield-modul, anbefaler vi desuden, at du gør dig bekendt med dets kredsløbsdiagram.

Driftstilstande

Driftstilstanden Expander Shield vælges ved hjælp af en DIP-switch og jumpere.

Interfacevalg og I2C bus pull-up kontrol

Ved at bruge en DIP-switch vælger du enten SPI-tilstand (ved at tænde for kontaktgruppe 1-4) for MCP23S17-mikrokredsløb eller I2C-tilstand (ved at tænde for kontaktgruppe 5-6) for MCP23017-mikrokredsløb. Også i I2C-tilstand, ved hjælp af ben 7 og 8, om nødvendigt, trækkes I2C-bussen gennem strømbegrænsende modstande til +5V-strømbussen. Typisk skal pull-up-modstande tilsluttes, hvis der kun er én enhed på I2C-bussen. Hvis der er flere enheder, er modstande kun tilsluttet til en af ​​enhederne.

Samtidig aktivering af SPI- og I2C-bussen samt SPI-bussen og 7, 8-bens gruppe ikke tilladt.

Den kombinerede driftstilstand, når et af de to mikrokredsløb i et Expander Shield-modul fungerer via SPI-grænsefladen (MCP23S17), og den anden via I2C-grænsefladen (MCP23017), er umulig.

Hvis du skal organisere arbejdet samtidigt via SPI- og I2C-grænseflader, skal du bruge to (flere) ekstra Expander Shield-moduler med de tilsvarende kontaktpositioner.

Valg af pin-nummer for at styre CS-signalet fra SPI-bussen

Til SPI-bussen skal du vælge Freeduino/Arduino-mikrocontrollerpinden, der bruges som CS-signal. Typisk anvendes ben 10, som svarer til jumperpositionen længst til venstre på SS1-stikket. Ved at flytte jumperen til en af ​​de to andre positioner er det muligt at vælge henholdsvis ben 9 og 8.

Valg af adresse på mikrokredsløb på bussen

De laveste tre bits af adressen på MCP23S17/MCP23017-mikrokredsløbene vælges ved hjælp af jumpere på IC1_addr/IC2_addr-stikkene ved at trække bits 0, 1, 2 til jord (Gnd) eller +5V (5V).

Adressen på hver chip skal være unik.

Der kan således placeres op til 8 mikrokredsløb på én bus (ved at kombinere f.eks. 4 Expander Shields).

Valg af driftstilstand for nulstilling af hardware (RESET-knap)

Det er muligt at organisere en af ​​en række driftstilstande for RESET-knappen

  • RESET-knappen nulstiller Freeduino/Arduino og MCP23S17/MCP23017 chips
  • RESET-knappen nulstiller kun Freeduino/Arduino
  • NULSTIL-knappen nulstiller kun MCP23S17/MCP23017-chips

De tilsvarende jumperpositioner på JRS-stikket (fra venstre mod højre) er vist nedenfor.

Bibliotek MCP23xxx

For at forenkle arbejdet med dette og en række andre moduler er MCP23xxx-biblioteket udviklet, som giver en enkel grænseflade til funktionaliteten af ​​MCP23xxx-seriens mikrokredsløb. Biblioteket er tilgængeligt til gratis download: Biblioteket er kompatibelt med Arduino-softwareversion 1.0.5 (kompatibilitet med senere versioner forventes også).

Faktisk er dette et sæt af to biblioteker: MCP23xxx og LiquidCrystal_MCP23x17.

Installationen af ​​biblioteker er beskrevet mere detaljeret i afsnittet, der forbinder biblioteker. Biblioteksstrukturen i biblioteksmappen efter installationen skulle være sådan:

/libraries/LiquidCrystal_MCP23x17
/libraries/MCP23xxx

MCP23xxx-biblioteket implementerer klasseskabeloner, der organiserer arbejdet med MCP23017, MCP23S17, MCP23008 og MCP23S08 portudvidelserne. LiquidCrystal_MCP23x17-biblioteket er et modificeret standard LiquidCrystal-bibliotek, der understøtter det russiske sprog og fungerer gennem en portudvidelse.

Biblioteket kommer med eksempler, der forklarer, hvordan man arbejder med det. Den tidligere version af biblioteket er også tilgængelig til download:

Lad os se på et eksempel på at arbejde med et modul til I2C-bussen:

//I eksemplet aflæses tilstanden af ​​stifterne på 1. chip, og de samme værdier er indstillet på 2.

//For I2C-versionen, tilslut Wire.h:
#omfatte
//tilslut biblioteket
#omfatte

//Opret to objekter af klassen CMCP23017, men initialiser dem ikke, fordi I2C-bussen er ikke klar
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;

ugyldig opsætning()
{
//Initialiser I2C-bussen...
Wire.begin();
//... og MCP23* objekter med adresse 0 og 1
mcp23_1.init(0);
mcp23_2.init(1);

//Alle ben på 1. chip skal laves som input, og de 2. - output
//Dette kan gøres i en løkke
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_1.pinMode (i, INPUT) ;
mcp23_2.pinMode (i, OUTPUT) ;
}
//eller på én gang ved at kalde pinMode16-metoden
//mcp23_1.pinMode16(0x0ffff);
//mcp23_2.pinMode16(0x00000);
}

void loop()
{
//Du kan læse alle input fra 1. chip og indstille det samme på 2. i en loop
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_2.digitalWrite (i, mcp23_1.digitalRead (i) );
}
//eller ad gangen ved hjælp af digitalRead16- og digitalWrite16-metoderne
//mcp23_2.digitalWrite16(mcp23_1.digitalRead16());
}

En af de vigtigste fordele ved Arduino-platformen er dens popularitet. Den populære platform understøttes aktivt af producenter af elektroniske enheder, der frigiver specielle versioner af forskellige boards, der udvider controllerens grundlæggende funktionalitet. Sådanne boards, ganske logisk kaldet udvidelseskort (et andet navn: arduino shield, shield), bruges til at udføre en lang række opgaver og kan væsentligt forenkle en arduino-operatørs levetid. I denne artikel vil vi lære, hvad et Arduino-udvidelseskort er, og hvordan det kan bruges til at arbejde med en række forskellige Arduino-enheder: motorer (motordriver-skjolde), LCD-skærme (LCD-skjolde), SD-kort (datalogger), sensorer (sensor skjold) og mange andre.

Lad os først forstå vilkårene. Et Arduino-udvidelseskort er en komplet enhed designet til at udføre visse funktioner og er forbundet til hovedcontrolleren ved hjælp af standardstik. Et andet populært navn for udvidelseskortet er det engelsksprogede Arduino-skjold eller blot skjold. Alle de nødvendige elektroniske komponenter er installeret på udvidelseskortet, og interaktion med mikrocontrolleren og andre elementer på hovedkortet sker gennem standard Arduino-stifter. Oftest leveres strøm til skjoldet også fra hoved arduino-kortet, selvom det i mange tilfælde er muligt at forsyne det fra andre kilder. I ethvert skjold er der flere ledige ben, som du kan bruge efter eget skøn ved at forbinde andre komponenter til dem.

Det engelske ord Shield er oversat til skjold, skærm, skærm. I vores sammenhæng skal det forstås som noget, der dækker controllerkortet, hvilket skaber et ekstra lag af enheden, en skærm, bag hvilken forskellige elementer er skjult.

Hvorfor har vi brug for arduino-skjolde?

Alt er meget enkelt: 1) så vi sparer tid, og 2) nogen kan tjene penge på dette. Hvorfor spilde tid på at designe, placere, lodde og fejlfinde noget, som du kan tage allerede samlet og begynde at bruge med det samme? Veldesignede udvidelseskort samlet på udstyr af høj kvalitet er normalt mere pålidelige og fylder mindre i den endelige enhed. Dette betyder ikke, at du helt skal opgive selvmontering, og du behøver ikke at forstå princippet om drift af visse elementer. En rigtig ingeniør forsøger jo altid at forstå, hvordan det, han bruger, fungerer. Men vi vil være i stand til at lave mere komplekse enheder, hvis vi ikke genopfinder hjulet hver gang, men fokuserer vores opmærksomhed på, hvad de færreste har løst før.

Selvfølgelig skal du betale for muligheder. Næsten altid vil prisen på det endelige skjold være højere end prisen på individuelle komponenter; du kan altid gøre en lignende mulighed billigere. Men her er det op til dig at beslutte, hvor kritisk den tid eller penge, der bruges, er for dig. Under hensyntagen til al mulig bistand fra den kinesiske industri falder omkostningerne til brædder konstant, så oftest træffes valget til fordel for at bruge færdige enheder.

De mest populære eksempler på skjolde er udvidelseskort til arbejde med sensorer, motorer, LCD-skærme, SD-kort, netværks- og GPS-skjolde, skjolde med indbyggede relæer til tilslutning til belastningen.

Tilslutning af Arduino Shields

For at forbinde skjoldet skal du bare omhyggeligt "sætte" det på hovedkortet. Typisk indsættes kontakterne på skjoldet af kamtypen (han) let i stikkene på Arduino-kortet. I nogle tilfælde er det nødvendigt at omhyggeligt justere stifterne, hvis selve brættet ikke er ordentligt loddet. Det vigtigste her er at handle omhyggeligt og ikke bruge overdreven kraft.

Som regel er et skjold beregnet til en meget specifik version af controlleren, selvom for eksempel mange skjolde til Arduino Uno fungerer ret godt med Arduino Mega boards. Pinout'en på mega'en er lavet på en sådan måde, at de første 14 digitale pins og pindene på den modsatte side af brættet falder sammen med pinout'en på UNO'en, så der nemt kan indsættes et Arduino skjold i det.

Arduino Shield programmering

Programmering af et kredsløb med et udvidelseskort adskiller sig ikke fra almindelig Arduino-programmering, for fra controllerens synspunkt tilsluttede vi simpelthen vores enheder til dens almindelige ben. I skitsen skal du angive de ben, der er forbundet i skjoldet til de tilsvarende kontakter på brættet. Som regel angiver producenten overensstemmelsen mellem stifterne på selve skjoldet eller i en separat tilslutningsinstruktion. Hvis du downloader skitserne anbefalet af brætproducenten selv, behøver du ikke engang at gøre dette.

Læsning eller skrivning af skjoldsignaler udføres også på den sædvanlige måde: ved at bruge funktionerne og andre kommandoer, som enhver Arduino-bruger kender. I nogle tilfælde er kollisioner mulige, når du er vant til en bestemt forbindelsesordning, og producenten har valgt en anden (for eksempel trak du knappen til jorden og på skærmen til strømforsyningen). Her skal du bare være forsigtig.

Som regel kommer dette udvidelseskort i Arduino-sæt, og derfor er det med det, at Arduino-ingeniører støder på det oftest. Skjoldet er ret simpelt - dets hovedopgave er at give mere bekvemme muligheder for tilslutning til Arduino-kortet. Dette gøres gennem yderligere strøm- og jordstik placeret på kortet til hver af de analoge og digitale ben. Også på kortet kan du finde stik til tilslutning af en ekstern strømkilde (du skal installere jumpere for at skifte), en LED og en genstartsknap. Afskærmningsmuligheder og eksempler på brug kan findes i illustrationerne.




Der er flere versioner af touch-udvidelseskortet. De er alle forskellige i antallet og typen af ​​stik. De mest populære versioner i dag er Sensor Shield v4 og v5.

Dette Arduino-skjold er meget vigtigt i robotprojekter, fordi... giver dig mulighed for at tilslutte almindelige og servomotorer til Arduino-kortet på én gang. Hovedopgaven for skjoldet er at give kontrol over enheder, der forbruger en strøm, der er høj nok til et almindeligt Arduino-kort. En yderligere funktion ved kortet er funktionen til at styre motoreffekten (ved hjælp af PWM) og ændre rotationsretningen. Der findes mange typer motorafskærmningsplader. Fælles for dem alle er tilstedeværelsen i kredsløbet af en kraftig transistor, gennem hvilken en ekstern belastning er forbundet, køleelementer (normalt en radiator), et kredsløb til tilslutning af ekstern strøm, stik til tilslutning af motorer og en pin til tilslutning til Arduinoen.



At organisere arbejdet med netværket er en af ​​de vigtigste opgaver i moderne projekter. Et tilsvarende udvidelseskort er tilgængeligt for tilslutning til et lokalt netværk via Ethernet.




Ekspansionstavler til prototyping

Disse boards er ret enkle - de har kontaktpuder til montering af elementer, en nulstillingsknap og muligheden for at tilslutte ekstern strøm. Formålet med disse skjolde er at øge enhedens kompakthed, når alle de nødvendige komponenter er placeret umiddelbart over hovedkortet.





Arduino LCD skjold og tft skjold

Denne type skjold bruges til at arbejde med LCD-skærme i Arduino. Som du ved, er tilslutning af selv den enkleste 2-linjers tekstskærm langt fra en triviel opgave: du skal korrekt tilslutte 6 skærmkontakter på én gang, strømforsyningen ikke medregnet. Det er meget nemmere at indsætte det færdige modul i Arduino-kortet og blot uploade den tilsvarende skitse. I det populære LCD Keypad Shield installeres der straks fra 4 til 8 knapper på tavlen, hvilket giver dig mulighed for straks at organisere en ekstern grænseflade til brugeren af ​​enheden. TFT Shield hjælper også



Arduino Data Logger Shield

En anden opgave, der er ret svær at implementere selvstændigt i dine produkter, er at gemme data modtaget fra sensorer med en tidsreference. Det færdige skjold giver dig mulighed for ikke kun at gemme data og få tid fra det indbyggede ur, men også at forbinde sensorer i en bekvem form ved lodning eller på et printkort.




Kort opsummering

I denne artikel har vi kun set på en lille del af det enorme udvalg af forskellige enheder, der udvider funktionaliteten i Arduino. Udvidelseskort giver dig mulighed for at fokusere på det vigtigste - logikken i dit program. Skaberne af skjoldene har sørget for korrekt og pålidelig installation og den nødvendige strømforsyning. Alt, der er tilbage for dig, er at finde det nødvendige bræt ved hjælp af det skattede engelske ordskjold, forbinde det til Arduino og uploade skitsen. Typisk består enhver skjoldprogrammering af at udføre simple handlinger for at omdøbe de interne variabler i et færdiglavet program. Som et resultat får vi brugervenlighed og tilslutning, samt hastigheden på montering af færdige enheder eller prototyper.

Ulempen ved at bruge udvidelseskort er deres omkostninger og mulige tab af effektivitet på grund af skjoldes universalitet, som ligger i deres natur. Til din smalle opgave eller slutenhed er alle skjoldfunktioner muligvis ikke nødvendige. I dette tilfælde skal du kun bruge skjoldet på prototype- og teststadiet, og når du opretter den endelige version af din enhed, skal du tænke på at erstatte det med et design med dit eget kredsløb og type layout. Det er op til dig at bestemme, du har alle muligheder for at træffe det rigtige valg.

SPI- eller I2C ADC-chips er let tilgængelige i en række opløsninger, samplingsfrekvenser og kanalantal. De er ret nemme at tilføje til enhver Arduino.

For eksempel vil MCP3208 give 8 kanaler med 12-bit opløsning pr. SPI, hvilket betyder 3 ben (MOSI/MISO/SCK) + 1 pr. chip (SS). Så 1 chip ville være 4 ben, 2 chips 5 ben, 3 chips 6 ben osv.

At tilføje en masse chips til SPI-bussen kan dog være en smerte i sig selv med den øgede kapacitans af alle disse input, hvilket betyder, at du skal reducere beskedhastigheden en smule eller tilføje ekstra buffering for mere intensiv buskontrol.

I2C-chips kan være sværere at have, da der kun er et begrænset antal adresser på I2C-bussen - plus på mange Arduinos er I2C også to analoge ben, som du måske ikke ønsker at ofre.

Den anden mulighed involverer brug af analoge multipleksere (såsom 4051) til at skifte forskellige kilder til eksisterende analoge indgange.

En tredje mulighed, som du sandsynligvis ikke har overvejet, er at have flere Arduinos (eller andre billige mikrocontrollere), der hver især laver nogle prøver og derefter implementerer en eller anden metode til kommunikation mellem dem (eller til en enkelt master). Dette har den ekstra fordel, at du så kan sample flere kanaler på samme tid (en pr. mikrocontroller), hvilket fremskynder dit arbejde noget.

Udvidende på Mazhenkos svar, kan du bruge en analog multiplekser såsom 74HC4051 til at omdanne en analog port til 8.

Dens fætter, 74HC4067, vil multiplekse 16 porte. Nu med 6 analoge indgange på Arduino Uno kan du have 6 x 16 indgange = 96. A/B/C styresignaler kan være parallelle.

Dette vil tillade dig at håndtere 96 input med 6 ekstra chips og ret simpel kode. Jeg har kodeeksempler på min 74HC4051 Multiplexer/Demultiplexer side.

For 8 indgange kode:

// Eksempel på brug af 74HC4051 multiplexer/demultiplexer // Forfatter: Nick Gammon // Dato: 14. marts 2013 const byte sensor = A0; //hvor multiplexerens ind/ud-port er tilsluttet // multiplekserens adressevalgslinjer (A/B/C) const byte addressA = 6;//low-order bit const byte addressB = 5; const byte addressC = 4;//high-order bit void setup() ( Serial.begin(115200); Serial.println("Starter multiplexer test..."); pinMode(addressA, OUTPUT); pinMode(addressB, OUTPUT) ); pinMode (adresseC, OUTPUT); ) //slut af opsætning int readSensor (konst byte hvilken) ( //vælg korrekt MUX-kanal digitalWrite (adresseA, (hvilken & 1) ? HØJ: LAV); //lav-ordens bit digitalWrite (adresse B, (hvilken & 2) ? HØJ: LAV); digitalWrite (adresse C, (hvilken & 4) ? HØJ: LAV); //high-order bit //læs nu sensoren retur analogRead (sensor); ) / /end of readSensor void loop () ( //vis alle 8 sensoraflæsninger for (byte i = 0; i< 7; i++) { Serial.print ("Sensor "); Serial.print (i); Serial.print (" reads: "); Serial.println (readSensor (i)); } delay (1000); } //end of loop

Jeg arbejdede præcis med det samme problem. Jeg har brug for et program, der læser 100 termistorer... Hvorfor? godt, hvis du har brug for det.

Jeg er allerede færdig med dette.

Jeg prøvede 74HC4051 multiplexer/demultiplexer. Men af ​​en eller anden grund fik jeg ikke det ønskede resultat.

Det første du finder...POWER, du skal bruge en ekstern strømforsyning, i mit tilfælde har jeg lige lavet en spændingsdeler og tilsluttet en termistor til den strøm, så skal du bare bruge den analoge port til at læse...

Jeg bruger I2C-protokol, 8 arduino Mega 7-slaver og en master. og efter at have sendt send integer, hjalp float og bla bla mig ikke til bare at gøre det. Den kan sende analog læsning via I2C og masteren udfører al den nødvendige konvertering.

Hvis du stadig er interesseret, kan jeg sende dig kildekoden til herre og slaver. Med denne skabelon kan du forbinde op til 50 Arduinoer, og guiden vil søge efter hver tilsluttet Arduino på netværket og bede om data.

→ Hvordan udvider man antallet af analoge ind- og udgange på din Arduino?

Hvordan udvider man antallet af analoge ind- og udgange på din Arduino?

En multiplexer eller demultiplexer giver dig mulighed for at udvide antallet af input og output på din Arduino.
4051 er en 8-kanals analog multiplexer/demultiplexer, således:
*Hvis du bruger 4051 som multiplekser: Du kan vælge en hvilken som helst af de 8 forskellige indgange og læse dens status ind i controlleren.
* Hvis du bruger 4051 som en demultiplexer, kan du vælge en af ​​de 8 forskellige udgange og skrive den værdi, du har brug for der.

4051 kan også håndtere analoge værdier i din Arduino, du kan bruge 0-5V analoge signaler og forbinde IC'en til de analoge indgange på Arduino.

For at vælge den ønskede indgang til mikrokredsløbet samt læse- eller skrivedriftstilstande skal vi bruge tre styresignaler (S0, S1 og S2). Hver af disse ben skal tilsluttes en af ​​Arduinos digitale udgange. Hver udgang har et tal (S0 = 1; S1 = 2; S2 = 4), og hvis du indstiller en af ​​disse udgange til et højt logisk niveau, vil antallet af repræsenterede ben være 4051.

For eksempel:
* Hvis du indstiller log "1" til indgangene på mikrokredsløbet S0 og S1 og logger "0" til S2, så vælges indgang y3 på mikrokredsløbet, det ser sådan ud (1 +2 +0 = 3).
* Hvis du indstiller log "1" til indgangene på mikrokredsløbet S0 og S2 og logger "0" til S1, så vælges indgang y5 på mikrokredsløbet, det ser sådan ud (1 +0 +4 = 5).

Det er ikke muligt at læse eller skrive status til mere end én 4051-pin ad gangen. Men du kan læse og skrive tilstand fra chippens output ret hurtigt. Der er ikke behov for en forsinkelse mellem at vælge, læse eller skrive tilstanden for 4051-benene.

* Z ----- fælles ind- eller udgangssignal (forbundet til Arduino I/O)
* E ----- aktiver input (aktiv log "0") (forbundet til jord (GND))
* Vee --- negativ forsyningsspænding (forbundet til jord (GND))
* GND --- almindelig minus (0 V)
* S0-S2 - indgangsvalg (forbundet til tre Arduino digitale ben)
* y0-Y7 - uafhængige input/outputs
*Vcc ---Positiv forsyningsspænding (5V)



Det venstre billede ovenfor er for eksempel, hvordan man bruger en 9 multiplexer til at læse 64 analoge indgange med kun én Arduino analog indgang.
Det højre billede ovenfor er et eksempel på, hvordan man bruger to 4051'ere (en konfigureret som en demultiplexer og en som en multiplekser) i en 8x8 matrix til at teste 64 knapper eller andre digitale input fra kun én digital indgang på Arduino (med den anden opsætning du kan kun bruge to knapper på samme tid, ellers skal du bruge den første (venstre) opsætning).

Eksempelkode:

// Eksempel på brug af 4051 analog multiplexer/demultiplexer
// af david c.

int led = 13; // Opsæt LED'en på ben 13
int r0 = 0; // værdi vælg pin til 4051 (S0)
int r1 = 0; // værdi vælg pin til 4051 (S1)
int r2 = 0; // værdi vælg pin til 4051 (S2)
int række = 0 ; // lagring af bin-koden
int count = 0 ; // børste
int bin = (000, 1, 10, 11, 100, 101, 110, 111); // En matrix af binære tal, der definerer nummeret på den valgte input/output på 4051-chippen, fra 1 til 8.
void setup() ( // INITIALISERING
pinMode(2, OUTPUT); // s0 output
pinMode(3, OUTPUT); // s1 output
pinMode(4, OUTPUT); // s2 output
digitalWrite(led, HIGH); //tænd LED'en
startSerial(9600); // UART valutakurs
}

void loop() (
for (count = 0 ; count ≤ 7 ; count ++) ( // cyklus gennem array-elementer fra 1 til 8
række = bin [antal];
r0 = række & 0x01 ;
r1 = (række >> 1) & 0x01 ; //
r2 = (række >> 2) & 0x01 ; //
digitalWrite(2, r0);
digitalWrite(3, r1);
digitalWrite(4, r2);
Serial.println(bin);
forsinkelse(1000);