Innholdsfortegnelse:

Slik leser du mange brytere med én MCU -pin: 4 trinn
Slik leser du mange brytere med én MCU -pin: 4 trinn

Video: Slik leser du mange brytere med én MCU -pin: 4 trinn

Video: Slik leser du mange brytere med én MCU -pin: 4 trinn
Video: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, Juni
Anonim
Slik leser du mange brytere med én MCU -pinne
Slik leser du mange brytere med én MCU -pinne

Har du noen gang holdt på med et eller flere prosjekt, og prosjektet fortsetter å vokse og vokse, mens du legger til flere ting (vi kaller det en Feaping Creaturism)? På et nylig prosjekt bygde jeg en frekvensmåler og la til en femfunksjonssignalgenerator/frekvenssynthesizer. Jeg avsluttet snart med flere brytere enn jeg hadde ledige pinner igjen, så hva skal en fyr gjøre?

Imidlertid hadde jeg snart sju brytere til på Funbox (ja, det var det jeg kalte funksjonsgeneratoren min … jeg vet, jeg har ingen kreativitet) og her er en kort instruks som viser deg hvordan du kan gjøre det samme. Det krever ingen skiftregistre eller spesifikke IC -er. Faktisk krever det heller ikke en mikrokontroller, hvis diskrete halvledere er hvordan du ruller. Her er en måte du kan lese/administrere flere brytere ved å bruke en enkelt pinne på AVR -en (eller annen mikrokontroller … Jeg har hørt at det er andre mikrokontrollere i tillegg til AVR -er, men jeg kan ikke forestille meg …).:)

Trinn 1: Essentials (egentlig ikke)

For å oppnå dette trenger du noen få komponenter. Det hjelper å ha et mangfold av brytere som du må administrere. Du trenger også noen motstander og enten en mikrokontroller som har ADC (analog-til-digital konvertering) eller en annen måte du vil indikere at det var en bryter aktivert og hvilken bryter den var.

Hvis du vil, kan du bruke en spenningsstyrt oscillator for å indikere dette, kanskje med noen blinklys, eller alternativt med lyd. I denne artikkelen skal jeg late som om vi bruker en AVR, men i din verden kan du late som det som gjør deg lykkelig. Jeg savner Bob Ross.

Trinn 2: Spenningsdeleren

Spenningsdeleren
Spenningsdeleren
Spenningsdeleren
Spenningsdeleren

I hovedsak er måten vi skal gjøre dette på ved å bruke en teknikk og krets som kalles en spenningsdeler. Spenningsdelere deler, som du kanskje har gjettet, V,, in,, spenningen med en verdi du bestemmer. Du kan dele spenningen med flere komponenter, inkludert kondensatorer og induktorer, men her skal jeg gjøre det med den gode motstanden. Ideen Det vi gjør er å sette to komponenter i serie som hver for seg vil føre til et spenningsfall over komponenten. Se på det første bildet hvis jeg ikke gir mening. Det er en potensiell forskjell på 9V fra skinne til skinne. Mellom 9V og 0V er det to motstander i serie. Hver av disse vil oppleve et spenningsfall over seg selv, avhengig av motstanden, som du sannsynligvis husker fra V = IR. Hvis du tar en spenningsmåling mellom de to motstandene, får du en verdi mellom 9V og 0V, avhengig av hvor mye spenning som har falt over den første motstanden og hvor mye som er igjen å falle over den andre motstanden, før 0V. Det er en enkel formel for å beregne spenningsfallet over en motstand i denne situasjonen, og det ser slik ut. La spenningen over motstand 1 (R1) være V1 og spenningen over motstand to (R2) være V2. Siden jeg ikke kan bruke formatering lenger, se på bilde 2 nedenfor for formelen … Så i vår resistive divider kan Vout -spenningen bestemmes av vår formel for V2 (siden vi refererer GND til 0V). Hva har dette å gjøre med at en haug med brytere blir oppdaget fra en pinne? Vel, snu siden, så viser jeg deg!

Trinn 3: Spenningsdeler

Spenningsdeler stige
Spenningsdeler stige

Anta nå at vi har alle våre brytere, kanskje seks eller åtte eller seksten, alle koblet via motstander som hver fungerer som en spenningsdeler slik at når tilstanden til bryterpinnen endres, leses spenningen og er basert på spenningsnivået, vi kan vite hvilken bryter som nettopp ble aktivert. Se under. På bildet nedenfor har jeg koblet til to blokker med brytere. Den øverste blokken har to brytere, og den nederste blokken har fem brytere. Du kan koble de separate bryterne, momentane, taktile, etc. bryterne på samme måte. Det viktige å legge merke til er motstanden som bryteren er koblet til. I mitt eksempel har jeg nesten doblet motstanden til den neste motstanden for å skape et spenningsgap som er lett å måle og ikke feile med bryteren før eller etter. Hvis du ikke har lagt merke til det før, kan du se igjen og innse at vi er tilbake til vår gamle venn, den resistive spenningsdeleren. Den første motstanden, 10k ohm, er koblet til 5V og den andre motstanden - motstanden som bestemmer Vute for SWITCH_ADC -pinne, er koblet til hver bryter, og derfor er hver bryter assosiert med en bestemt Vout -spenning som kan leses fra ADC -pinnen som er koblet til SWITCH_ADC. Deretter bestemmer du forventet Vout fra hver bryter slik

Vout = Vin * (R2 / (R1 + R2))

for bryter en:

Vout = 5V * (500 / (10000 + 500)) = 5 * 0,048 = 0,24V eller 240 mV

for bryter to:

Vout = 5V * (2200 / (10000 + 2200)) = 5 * 0,18 = 0,9V eller ~ 900mV

og så videre.. Du kan gjerne bytte inn dine egne verdier for R2 hvis du bare har visse motstander hendig … Det viktigste her er å holde et stort nok spenningsgap mellom bryterne slik at enhver feilmargin på ADC vinner ' t sette deg inn i spenningen som forventes fra en nabobryter. Jeg har funnet det enkleste å gjøre er å bygge skillestigen og sette et multimeter/voltmeter på ADC -pinnen og trykke på hver pinne og se hvilke verdier du får. De burde være ganske på linje med det du regner ut. Når du har alle forventede spenningsverdier fra hver bryter ved hjelp av en bestemt motstand, kan du få MCU -en til å lese ADC -pinnen og sammenligne den med dine kjente verdier for å avgjøre hvilken bryter som ble trykket på. For eksempel, si at du har registrert en avbruddsrutine som vil bli ringt opp hver gang det oppdages en endring på ADC -pinnen. Inne i denne ISR -en kan du lese ADC og sammenligne denne verdien med bryterbordet ditt. Hvis du bruker en 8-biters ADC-verdi, blir spenningen konvertert til et tall mellom 0 og 255 som tilsvarer en spenning mellom 0V og 5V. Dette forutsetter at du har ADC konfigurert på denne måten.

Trinn 4: Oppsummering

Så nå burde du vite hvordan du skal være nøysom med å bruke GPIO -pinner for brytere. Når du er tom for GPIO -pinner, eller knapt har noen å begynne med, eller hvis du innser at du kommer til å bruke en bank med brytere, er den resistive skillelinjen veien å gå for å lagre GPIO -pinnene dine mens du fortsatt gir en robust mekanisme for å oppdage bryteradgang.

Anbefalt: