Innholdsfortegnelse:

74HC164 skiftregister og din Arduino: 9 trinn
74HC164 skiftregister og din Arduino: 9 trinn

Video: 74HC164 skiftregister og din Arduino: 9 trinn

Video: 74HC164 skiftregister og din Arduino: 9 trinn
Video: LDmicro 18: GPS-будильник Ublox NEO-6M (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, November
Anonim
74HC164 skiftregister og din Arduino
74HC164 skiftregister og din Arduino
74HC164 skiftregister og din Arduino
74HC164 skiftregister og din Arduino

Skiftregistre er en veldig viktig del av digital logikk, de fungerer som lim mellom parallelle og serielle verdener. De reduserer trådtelling, bruk av pinner og til og med hjelper til med å fjerne datamaskinen din ved å lagre dataene sine. De kommer i forskjellige størrelser, med forskjellige modeller for forskjellige bruksområder og forskjellige funksjoner. Den jeg vil diskutere i dag er 74HC164 8 -bits, seriell parallelt ut, ikke -låst, skiftregister. Hvorfor? Vel, for en er det et av de mest grunnleggende skiftregistrene der ute, noe som gjør det enklere å lære om det, men det var tilfeldigvis den eneste jeg hadde (lol!) Denne instruksen dekker hvordan denne brikken fungerer, hvordan den kobles til den, og grensesnitt den med en arduino inkludert noen eksempelskisser og ledede kretser. Jeg håper dere alle liker det!

Trinn 1: Så, hva er skiftregistre?

Så, hva er skiftregistre?
Så, hva er skiftregistre?

Som nevnt tidligere kommer de i alle forskjellige smaker, og jeg nevnte også at jeg bruker en 74HC164 8 -bits, seriell parallell ut, ikke -låst, skiftregister. Hva betyr det da?!? For det første betyr navnet 74-dets del av logikkfamilien 74xx, og siden logikken ikke kan kontrollere veldig mye strøm (16-20ma for hele brikken er vanlig), sender den bare signaler rundt, men det betyr ikke at signalet ikke går til en transistor som kan bytte høyere strømbelastning. HC betyr at det er en høyhastighets cmos -enhet, du kan lese om det på lenken nedenfor, men det du grunnleggende trenger å vite om det er at det er en lav strømforsyningsenhet og vil kjøre fra 2 til 5 volt (så hvis du bruker en 3,3 volt arduino din ok) Den kan også fungere skikkelig ved høye hastigheter, og denne brikken har en typisk hastighet på 78 MHz, men du kan gå like sakte eller så fort (til den begynner å tulle) slik du vil. www.kpsec.freeuk.com/components/74series.htm164 er modellnummeret for denne brikken, er det et stort diagram over dem på wikipediaen.wikipedia.org/wiki/List_of_7400_series_integrated_circuits Neste, 8 bit Et skiftregister består av flip -flop -kretser, en flip -flop er 1 bit minne, denne ha s 8 (eller 1 byte minne). Siden det er minne, hvis du ikke trenger å oppdatere registret, kan du bare slutte å "snakke" med det, og det vil forbli i hvilken tilstand du forlot det, til du "snakker" med det igjen eller tilbakestiller strømmen. andre skiftregistre i logikkseriene i 7400 kan gå opp til 16 biters parallelt ut. Dette betyr at arduino sender dataene serielt (på av -pulser etter hverandre) og skiftregisteret plasserer hver bit på riktig utgangspinne. Denne modellen krever bare at 2 ledninger skal kontrolleres, så du kan bruke 2 digitale pinner på arduinoen, og bryte disse 2 til 8 flere digitale utganger. Noen andre modeller er parallelle i seriell ut, de gjør det samme, men som innganger til arduinoen (for eksempel en NES gamepad) ikke -låst Dette kan være et fall av denne brikken hvis du trenger den. Når data går inn i et skiftregister via seriell, vises det på den første utgangspinnen, når en klokkepuls går inn, skiftes den første biten over ett sted, noe som skaper en rulleeffekt på utgangene, for eksempel 00000001 vil dukke opp på utgangene som 101001000100001000001000000100000001 Hvis du snakker med andre logiske enheter som deler den samme klokken og ikke forventer dette, kan det forårsake problemer. Låste skiftregistre har et ekstra sett med minne, så når dataene er ferdige med å gå inn i registret, kan du snu en bryter og vise utgangene, men det legger til en annen ledning, programvare og ting å holde tritt med. I tilfelle dette kan instrueres vi kontrollerer LED -skjermer, rulleeffekten skjer så raskt at du ikke kan se den (bortsett fra når du først slår på brikken), og når byten er i skiftregisteret, er det ikke mer rulling. Vi vil kontrollere søylediagramtype, 7 segmenter, og en 16LED 4x4 dot -matrise med denne brikken og programvaren på arduinoen som bare bruker 2 digitale pinner (+ strøm og jord)

Trinn 2: Grunnleggende ledninger og drift

Grunnleggende ledninger og drift
Grunnleggende ledninger og drift
Grunnleggende ledninger og drift
Grunnleggende ledninger og drift

Kabling 74HC164 er en 14 -pinners brikke, den har 4 inngangspinner, 8 utgangspinner, strøm og jord, så la oss starte fra toppen. Pinnene 1 og 2 er begge serielle innganger, de er satt opp som en logisk OG -port, noe som betyr at de må begge være logiske høye (dvs. 5 volt) for at biten skal bli sett på som en 1, en lav tilstand (0 volt) på begge vil lese som et null. Vi trenger egentlig ikke dette, og det er lettere å håndtere i programvare, så velg en og bind den til V+ så den alltid leser høyt. Jeg velger å bruke en jumper fra pin 1 til pin 14 (V+) siden du bare kan hoppe en brødbrett over brikken. Den ene gjenværende serielle inngangen (pin 2 i skjemaene mine) vil gå til digital pin 2 på arduinoen. Pin 3, 4, 5 og 6 i 74HC164 er de første 4 byte av output Pin 7 kobles til bakken Hoppe til høyre, pin 8 er klokkestiften, slik vet skiftregisteret at den neste serielle biten er klar for lesing, denne bør kobles til digital pin 3 på arduino. Pin 9 er for å slette hele registeret på en gang, hvis det går lavt, du har muligheten til å bruke den, men ingenting i dette ugjennomtrengelige gjør det, så knytt den til V+pinner 10, 11 12 og 13 er de siste 4 byte av utgangsnål 14 er brikkestrømmen Drift Først må du angi seriell inngang i registeret (digital pin 2 på arduino) høy eller lav, deretter må du snu klokkestiften (digital pin 3) fra lav til høy, skiftregisteret vil lese dataene på den serielle inngangen og forskyve utgangspinnene med 1, gjenta 8 ganger og du har angitt alle 8 utganger. Dette kan gjøres for hånd med sløyfer og digitale skriver i arduino IDE, men siden t hans er en veldig vanlig maskinvarenivåkommunikasjon (SPI), de har en enkelt funksjon som gjør det for deg. shiftOut (dataPin, clockPin, bitOrder, verdi) Bare fortell det hvor dataene og klokkepinnene er koblet til arduinoen, hvilken måte å sende dataene og hva de skal sende, og det blir tatt hånd om for deg (hendig)

Trinn 3: Prosjekter

Prosjekter
Prosjekter

Ok, nok foredrag og teori, la oss gjøre noen morsomme ting med denne brikken! Det er 3 prosjekter du kan prøve i denne instruksjonsfulle, de to første er enkle og kan brettes ut i løpet av øyeblikk. Den tredje, 4x4 led -matrisen, krever mer tid og tanke for å konstruere, på grunn av ledningsføringen. Liste over deler Prosjekt 1: '2 Wire' bargraph LED -skjermkontroller 1 * 74HC164 Skiftregister1 * loddeløst brødbrett1 * arduino eller arduino kompatibel (5v) 1 * 330 ohm 1/4 watt motstand 8 * normal utgang røde LED's 12 * jumperwires Prosjekt 2: '2 Wire' 7 -segment skjermkontroller 1 * 74HC164 Skiftregister1 * loddfritt brødbrett1 * arduino eller arduino -kompatibelt (5v) 1 * 330 ohm 1/4 watt motstand 1 * felles katode syv segment display9 * jumper ledninger Prosjekt 3: '2 Wire' 4x4 led matrisedisplay 1 * 74HC164 Skiftregister 1 * arduino eller arduino kompatibel (5v) 4 * 150 ohm 1 1/4 watt motstand 8 * 1Kohm 1/8 watt motstand (eller større) 8 * NpN transistor (2n3904 eller bedre) 16 * normal utgang rød LED er et middel for å konstruere den og regulert 5 volt effekt som kan håndtere 160+ma (du kan slå på alle LED -ene samtidig som et bremselys)

Trinn 4: Prosjekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware

Prosjekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware
Prosjekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware
Prosjekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware
Prosjekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware

Koble til arduino- og skiftregisteret i henhold til skjemaet, jeg har allerede et 10 -segmenters søylediagram -display klart for bruk på brødbrett, og det er det du vil se på bildet, men du kan gjøre det samme med individuelle LED'er På den andre siden Jeg uttalte at dette ikke var driverenheter, at det var logiske enheter, med små mengder strøm som kunne passere gjennom dem. For å kjøre 8 lysdioder, samtidig som kretsen er enkel og ikke tilbereder skiftregisteret, krever vi at vi begrenser strømmen ganske mye. LED -ene er parallelt koblet og deler en felles grunn (felles katode), før vi går inn i strømmen forsyningsjord de trenger for å passere gjennom en 330 ohm motstand, og begrenser den totale mengden strøm som alle lysdiodene muligens kan bruke til 10ma (ved 5 volt) Dette etterlater lysdiodene i en sykelig tilstand, men de lyser opp og tjener dermed for i dette eksempelet, for å drive lysdiodene i riktig strøm må du sette inn en transistor der skiftregisteret kan slå på / av en høyere strømkilde (se prosjekt 3) Datapinnen til skiftregistret (pin 2) trenger for å koble til arduino digital pin # 2 Klokkestiften til skiftregisteret (pin 8) må koble til arduino digital pin # 3

Trinn 5: Prosjekt 1 [pt 2]: '2 Wire' Bargraph LED Display Controller Software

Prosjekt 1 [pt 2]: '2 Wire' Bargraph LED -skjermkontrollprogramvare
Prosjekt 1 [pt 2]: '2 Wire' Bargraph LED -skjermkontrollprogramvare
Prosjekt 1 [pt 2]: '2 Wire' Bargraph LED -skjermkontrollprogramvare
Prosjekt 1 [pt 2]: '2 Wire' Bargraph LED -skjermkontrollprogramvare

Eksempel 1: Åpne filen "_164_bas_ex.pde" Inne i arduino IDE, Det er en enkel skisse som bare lar deg definere på eller av lysdioder i søylediagramvisningen. De to første linjene definerer pin -tallene vi skal bruke for data og klokke, jeg bruk #define over const heltal, jeg synes det er lettere å huske, og det er ingen fordel med den ene eller den andre når vi har samlet #definere data 2 #definere klokke 3 neste er tomromskonfigurasjonsfunksjonen, den kjører bare en gang, så arduinoen snur på, angir skiftregisteret og har ingenting annet å gjøre. Inne i oppsettfunksjonen for tomrom setter vi klokke- og datapinnene som OUTPUT -pinner, deretter bruker vi shiftOut -funksjonen dataene til oppsettet for skiftregisteret () {pinMode (klokke, OUTPUT); // gjør klokkepinnen til en utgangspinMode (data, OUTPUT); // gjør datapinnen til en output shiftOut (data, klokke, LSBFIRST, B10101010); // send denne binære verdien til skiftregisteret} I shiftOut -funksjonen kan du se argumentene data er datapinnen, klokke er klokkepinnen LSBFIRST refererer til hvilken rekkefølge den er i, når du skriver den ut i binær notasjon (Bxxxxxxxx) den 7. elementet forbi B er den minst signifikante biten Først mates denne inn først, så den ender på den siste utgangen når alle 8 bitene mates inB10101010 er den binære verdien som sendes til skiftregisteret, og den tenner hvert ulikt lys, prøv å leke med forskjellige verdier for å slå på eller av forskjellige mønstre, og til slutt en tom hulromsløyfe (fordi du trenger en selv om du ikke bruker den) hulromsløyfe () {} // tom løkke det samme som de første 8 linjene i det første eksemplet, faktisk vil de ikke endres for noen av de andre prosjektene, så #define data 2 #definere klokke 3void setup () {pinMode (clock, OUTPUT); // gjør klokkepinnen til en utgangspinMode (data, OUTPUT); // gjør datapinnen til en utgang Men nå i oppsett av tomrom er det 8 tellinger for sløyfe, det tar en tom byte og skifter 1 bit om gangen, starter fra bit til venstre og beveger seg til høyre. Dette er bakover fra det første eksemplet der vi startet fra den høyre biten og jobbet til venstre, men ved bruk av MSBFIRST sender shift out -funksjonen dataene på riktig måte. I tillegg legger vi til en forsinkelse i for -sløyfen slik at den bremser ned nok til å være synlig. for (int i = 0; i <8; ++ i) // for 0 - 7 do {shiftOut (data, klokke, MSBFIRST, 1 << i); // bit shift en logisk høy (1) verdi med i forsinkelse (100); // forsink 100 ms, ellers kan du ikke se den}} void loop () {} // tom loop for nå å laste opp skriptet, og du bør nå se søylediagrammet lyse opp hvert lys en om gangen

Trinn 6: Prosjekt 2: '2 Wire' 7 Segment Display Controller

Prosjekt 2: '2 Wire' 7 Segment Display Controller
Prosjekt 2: '2 Wire' 7 Segment Display Controller
Prosjekt 2: '2 Wire' 7 Segment Display Controller
Prosjekt 2: '2 Wire' 7 Segment Display Controller

Se på pinout på skjermen med 7 segmenter (jeg hadde bare en dobbel, men brukte bare halvparten) og bruk tegningen nedenfor for å koble hvert segment til riktig bit på skiftregisterbit 1 = pin 3bit 2 = pin 4bit 3 = pin 5bit 4 = pin 6bit 5 = pin 10bit 6 = pin 11bit 7 = pin 12bit 8 = pin 13 (hvis du vil bruke desimaltegnet) Og katoden på displayet gjennom 330ohm -motstanden og til strømforsyningen må nå åpne seven_seg_demo.pde i arduino ID Først ser du hvor vi definerer dataene og klokkepinnene #definerer data 2 #definerer klokken 3 Deretter setter vi alle charatermønstrene i binær, dette er ganske enkelt, se på tegningen nedenfor, hvis du trenger det midterste segmentet skriv inn en, neste trenger du det øverste segmentet. Skriv i så fall inn et annet. Fortsett å gjøre dette til du dekker alle 8 segmentene. Legg merke til at min bit til høyre (bit 8) alltid er 0, det er fordi jeg aldri slår på desimal punkt. byte null = B01111110; byte en = B00000110; byte to = B11011010; byte tre = B11010110; byte fire = B10100110; byte fem = B11110100; byte seks = B11111100; byte syv = B01000110; byte åtte = B11111110; byte ni = B111101 neste i void -oppsett setter vi våre data og klokkepinner til utganger void -oppsett () {pinMode (klokke, OUTPUT); // gjør klokkepinnen til en utgangspinMode (data, OUTPUT); // gjør datapinnen til en utgang3} så i void loop bruker vi shiftOut for å vise hvert mønster (tall), vent 1/2 sekund og vis det neste, 0 til 9, siden det blir gjort i void loop -funksjonen vil det telle 0-9 og gjenta for alltid. void loop () {shiftOut (data, clock, LSBFIRST, zero); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, en); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, to); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, tre); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, fire); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, fem); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, seks); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, sju); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, åtte); forsinkelse (500); shiftOut (data, klokke, LSBFIRST, ni); forsinkelse (500);}

Trinn 7: Prosjekt 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display

Project 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display
Project 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display
Project 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display
Project 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display

4x4 LED -matriseprosjektet er ganske mye mer komplekst, men det er nesten alt i konstruksjon, jeg velger å lage min loddet på perfboard, men det burde være mulig å replikere på et brødbrett, bare mye mer avstand. Kretsene også skiller seg ved at skiftregisteret ikke driver ledene direkte, i stedet sendes skiftregisterutgangene gjennom en 1Kohm -motstand til bunnen av en NpN -transistor, når utgangen til biten er høy, lar den nok strøm og spenning passere inn i transistoren for å bytte forbindelsen mellom kollektoren og emitteren, er kollektorene knyttet til en "solid" regulert 5 volt. Transistorenes sendere er koblet til 150 ohm motstander og motstandene er knyttet til annodene til 4 lysdioder på rad og begrenser raden til 20ma, selv om det bare er én lysdiode på om gangen når du tegner bilder på displayet, og derfor nær full lysstyrke (nær de slås på og av veldig raskt for å lage hele bildet) Det er 4 rader og 4 kolonner, hver rad får en motstand og en transistor, på hver kolonne er LED -katodene bundet sammen, løp inn i kollektoren til en transistor, hvis base også styres av skiftregisteret, og til slutt ut til bakken. Stor versjon av skjematisk www.instructables.com/files/orig/F7J/52X0/G1ZGOSRQ/F7J52X0G1ZGOSRQ.jpg

Trinn 8: Prosjekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display

Prosjekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Prosjekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Prosjekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Prosjekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Prosjekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Prosjekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display

Skiftregisteret styrer både anoden og katodene til lysdiodene i et YX -format, se på følgendebit 1 = kolonne 1 (til høyre) bit 2 = kolonne 2bit 3 = kolonne 3bit 4 = kolonne 4bit 5 = rad 1 (øverst) bit 6 = rad 2bit 7 = rad 3bit 8 = rad 4 For å lage et bilde, tegne ut en firkant på 4x4 på grafpapir og fyll ut hvilke du vil vise, lag deretter en YX -tabell. Nedenfor ser du en kartlegging for et liknende, så vel som det beste man kan gjøre på 4x4 "piksler" For hver utfylt seksjon skriver jeg ned hvilken kolonne (Y) den er i, deretter hvilken rad den er i (X) Nå åpner du opp _4x4.pde -filen i arduino IDE vil du se våre gamle 2 venner #definere data 2 #definere klokke 3 deretter en rekke heltall int img = {1, 1, 4, 1, 1, 3, 4, 3, 2, 4, 3, 4}; Hvis du ser det er bare en liste over mine nedskrevne YX -koordinater, ville det være en stor smerte i rumpa å konvertere disse verdiene for hånd, og vi har en datamaskin … la det gjøre det! klokken og datapinnene OUTPUTS ugyldig oppsett () {pinMode (klokke, OUTPUT); // gjør klokkepinnen til en utgangspinMode (data, OUTPUT); // gjør datapinnen til en utgang3} Og en forvirrende hulromsløyfe, for å starte ting må vi deklarere noen lokale variabler for tomløkke () {int Y; int X; byte ut; Deretter a for loop, denne loop må være så lang som mengden oppføringer i img -matrisen, for dette bildet brukte jeg bare 6 piksler, så det gir 12 YX -koordinater. Jeg får det til å hoppe over hvert annet tall ved å bruke i += 2, fordi vi leser 2 koordinater per sløyfe for (int i = 0; i <12; i += 2) // antall punkter i img -matrisen, dette tilfellet 12 {Nå leser vi Y -enteriet ved i matrisen, og trekker en fra verdien, fordi byte ikke starter med en, de starter på null, men vi teller fra 1 // få det første paret YX -ledninger Y = (avbildning - 1); // subtraher en siden bittellingen starter ved 0 Neste leser vi X -enterien ved [i + 1] i matrisen, og trekker en fra verdien på grunn av samme grunn X = (img [i + 1] - 1); Etter at vi har YX -verdiene til pikslen, gjør vi litt bitvis eller matematikk og skifter til venstre. Først må vi lese X -verdien, og uansett hvilken verdi den er, skift den så mange steder + 4 igjen, så hvis X er 4 og legg til 4 det er bit 8 (MSB), ser på diagrammet igjen … bit 1 = kolonne 1 (lengst til høyre) bit 2 = kolonne 2bit 3 = kolonne 3bit 4 = kolonne 4bit 5 = rad 1 (øverst) bit 6 = rad 2bit 7 = rad 3bit 8 = rad 4 Bit 8 er den siste raden Neste er Y -verdien også forskjøvet til venstre, denne gangen bare av seg selv, ingenting lagt til. Endelig blir de to sammenlagt til 1 byte i stedet for 2 halve byte (nibbles), ved hjelp av bitvis eller (symbolet |) tar to byte og legger dem sammen, la oss anta X = 10000000Y = 00000001 -------------------- ELLER = 10000001row 4 column 1 out = 1 << (X + 4) | 1 << Y; Og til slutt shiftOut for å vise det gjeldende bildet, og fortsett å gjøre det til vi ikke har flere data i matrisen … forsink et øyeblikk og sløyfe for alltid, siden vi flyttet data til venstre og vi trenger MSB for å være på den siste utgangspinnen av skiftregisteret send det ut først. shiftOut (data, klokke, MSBFIRST, ut); // skift byte ut til vår registerforsinkelse (1); // forsink det, så det har en sjanse til å etterlate et lyspunkt i øynene. Lag gjerne dine egne bilder og effekter. Det er 3 prøvefiler, smilefjeset og et brett (som mer ser ut som striper), og til slutt en tilfeldig gnistmaker

Trinn 9: Konklusjon

Konklusjon
Konklusjon
Konklusjon
Konklusjon
Konklusjon
Konklusjon

Over alt dette er en ganske praktisk liten brikke, og jeg er glad for at jeg fjernet den fra et gammelt stykke elektronikk på vei til søpla. Den kan brukes til andre ting enn skjermsystemer, men alle liker lys og umiddelbar tilbakemelding om å se Hva som skjer er ekstremt nyttig for de visuelle tenkerne som I. Også, tilgi koden min, jeg har bare hatt arduino siden den tredje uken i oktober, og det har vært et ganske stort krasjkurs. Men det er det flotte med systemet, hvis du setter deg ned og jobber med det, er det fullt av fine funksjoner som gjør det enkelt å kontrollere verden med en 8 -biters mikrokontroller. Som alltid er spørsmål og kommentarer hjertelig velkommen, og takk for leser, jeg håper du har lært mye

Anbefalt: