Innholdsfortegnelse:
- Trinn 1: Nødvendig maskinvare
- Trinn 2: Flerbryter Metode Forklaring
- Trinn 3: Comparator Spreadsheet
- Trinn 4: Spill en melodi
Video: DIP Tune Selector ved hjelp av 1 pin: 4 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:23
For en stund tilbake jobbet jeg med et "musikkboks" -prosjekt som trengte å velge mellom så mange som 10 forskjellige låtstykker. Et naturlig valg for å velge en bestemt melodi var en 4 -pinners dip -bryter siden 4 brytere gir 24= 16 forskjellige innstillinger. Imidlertid krever implementering av brute force for denne tilnærmingen 4 enhetsnåler, en for hver bryter. Siden jeg planla å bruke ATtiny85 til utvikling, var tapet av 4 pinner litt for mye. Heldigvis kjørte jeg på en artikkel som beskriver en genial metode for å bruke en analog pin til å håndtere flere bryterinnganger.
Multibryter; 1-inngangsteknikken bruker en spenningsdelerkrets for å gi en unik heltallverdi for hver av de 16 mulige bryterinnstillingskombinasjonene. Dette settet med 16 heltallsidentifikatorer brukes deretter i applikasjonsprogrammet til å knytte en handling til en innstilling.
Denne instruksjonsfilen bruker multi-switch-metoden for å implementere melodivalg for musikkboksprogrammet. Den valgte melodien spilles deretter gjennom en piezo -summer med Arduino -tonefunksjonen.
Trinn 1: Nødvendig maskinvare
Bruk av UNO som implementeringsplattform minimerer antall nødvendige maskinvarekomponenter. Implementering av multi-switch inngangsmetoden krever bare en 4-pinners dip switch, de 5 motstandene som brukes for spenningsdeleren, og tilkoblingskabelen for tilkoblinger. En piezo -summer er lagt til i konfigurasjonen for implementering av musikkboks -melodivelgeren. Alternativt, avhengig av hvilken type dip -bryter som brukes, er det nyttig å bruke en 2x4 8 -pinners kontakt for å koble dip -bryteren til brødbrettet siden standard dip -switch -pinner ser ut til å være laget for lodding til et perfboard som ikke kobles direkte til et brødbrett. Stikkontakten stabiliserer dip -switch -tilkoblingene og forhindrer at bryteren lett kan løftes når vippebryterne settes inn.
Navn | Mulig kilde | Hvordan brukt |
---|---|---|
4-pinners dip switch | Still inn valg | |
2x4 pinners stikkontakt (valgfritt) | Amazon | Stolpene på de fleste dip -brytere holder ikke bryteren særlig godt i et brødbrett. En stikkontakt bidrar til å gjøre tilkoblingen mer solid. Et alternativ er å finne en dip -bryter som virkelig er laget for bruk på brødbrett med vanlige IC -pinner. |
motstander:
|
Implementere spenningsdeler | |
passiv piezo summer | Amazon | Spill melodi som drevet av applikasjonen via Arduino -tonefunksjonen |
Trinn 2: Flerbryter Metode Forklaring
Denne delen diskuterer de underliggende konseptene for multi-switch-metoden og utvikler ligningene som kreves for frittstående beregning av unike identifikatorer for hver av de 16 mulige dip-switch-innstillingskonfigurasjonene. Disse identifikatorene kan deretter brukes i et applikasjonsprogram til å knytte en bryterkonfigurasjon til en handling. For eksempel vil du kanskje at innstillingen - slå på 1, slå av 2, slå av 3, slå av 4 (1, 0, 0, 0) - for å spille Amazing Grace og (0, 1, 0, 0) for å spille Løven sover i natt. For å være kortfattet og kortfattet omtales konfigurasjonsidentifikatorene som komparatorer i resten av dokumentet.
Grunnleggende konsept for multi-switch-metoden er Voltage Divider-kretsen som består av 2 seriemotstander koblet til en inngangsspenning. Utgangsspenningsledningen er koblet mellom motstandene, R1 og R.2, som vist ovenfor. Delerens utgangsspenning beregnes som inngangsspenningen multiplisert med forholdet mellom motstand R2 til summen av R1 og R.2 (ligning 1). Dette forholdet er alltid mindre enn 1, så utgangsspenningen er alltid mindre enn inngangsspenningen.
Som angitt i designdiagrammet ovenfor er multibryteren konfigurert som en spenningsdeler med R2 fast og R.1 lik kompositt/ekvivalent motstand for de 4 dip switch -motstandene. Verdien av R.1 avhenger av hvilke dip -brytere som er slått på og bidrar derfor til den sammensatte motstanden. Siden dip switch -motstandene er parallelle, er ekvivalent motstandsberegningsligning angitt i form av resiprokaler til komponentmotstandene. For vår konfigurasjon og fordi alle brytere er slått på, blir ligningen
1/R1 = 1/80000 + 1/40000 + 1/20000 + 1/10000
gir R1 = 5333,33 volt. For å ta hensyn til at minst én av bryterne er slått av på de fleste innstillingene, brukes bryterstatusen som en multiplikator:
1/R1 = s1*1/80000 + s2*1/40000 + s3*1/20000 + s4*1/10000 (2)
der tilstandsmultiplikatoren, sJeg, er lik 1 hvis bryteren er slått på og lik 0 hvis bryteren er slått av. R1 kan nå brukes til å beregne motstandsforholdet som trengs i ligning 1. Ved å bruke tilfellet der alle brytere er slått på som eksempel igjen
RATIO = R2/(R1+R2) = 10000/(5333.33+10000) =.6522
Det siste trinnet i beregningen av den forutsagte komparatorverdien er multiplikasjon av RATIO med 1023 for å etterligne effekten av analogRead -funksjonen. Identifikatoren for saken der alle brytere er på, er da
komparator15 = 1023*.6522 = 667
Alle ligningene er nå på plass for beregning av identifikatorer for de 16 mulige bryterinnstillingene. Å oppsummere:
- R1 beregnes ved hjelp av ligning 2
- R1 og R.2 brukes til å beregne den tilhørende motstandsforholdet
- RATIO multipliseres med 1023 for å få sammenligningsverdien
- eventuelt kan den forutsagte utgangsspenningen også beregnes som RATIO*Vin
Settet med komparatorer avhenger bare av motstandsverdiene som brukes for spenningsdeleren og er en unik signatur for konfigurasjonen. Fordi dividerens utgangsspenninger vil variere fra kjøring til kjøring (og lese for å lese), betyr unik i denne sammenhengen at mens to sett med identifikatorer kanskje ikke er nøyaktig like, er de nær nok til at komponentkomparatorforskjellene faller innenfor en liten forutgående angitt intervall. Intervallstørrelsesparameteren må velges stor nok til å ta hensyn til forventede svingninger, men liten nok til at forskjellige bryterinnstillinger ikke overlapper hverandre. Vanligvis fungerer 7 bra for intervallet halvbredde.
Et sett med komparatorer for en bestemt konfigurasjon kan fås på flere måter - kjør demoprogrammet og registrer verdiene for hver innstilling; bruk regnearket i neste avsnitt for å beregne; kopiere et eksisterende sett. Som nevnt ovenfor vil alle settene mest sannsynlig være litt forskjellige, men burde fungere. Jeg foreslår at du bruker metodeforfatterens sett med identifikatorer for multi-switch-oppsettet og regnearket fra neste avsnitt hvis noen av motstandene endres vesentlig eller flere motstander legges til.
Følgende demo -program illustrerer bruk av komparatorene for å identifisere gjeldende dip -switch -innstilling. I hver programsyklus utføres en analogRead for å skaffe en identifikator for den nåværende konfigurasjonen. Denne identifikatoren blir deretter sammenlignet på tvers av komparatorlisten til en kamp er funnet eller listen er oppbrukt. Hvis det blir funnet en treff, sendes en utdatamelding for bekreftelse. hvis den ikke blir funnet, blir det gitt en advarsel. En forsinkelse på 3 sekunder settes inn i sløyfen, slik at vinduet for seriell utgang ikke blir overveldet av meldinger og gir litt tid til å tilbakestille dip -switch -konfigurasjonen.
//-------------------------------------------------------------------------------------
// Demoprogram for å lese spenningsdelerutgangen og bruke den til å identifisere // nåværende dip -switch -konfigurasjon ved å se utgangsverdien opp i en rekke // sammenligningsverdier for hver mulig innstilling. Verdiene i oppslagsoppsettet kan // enten hentes fra en tidligere kjøring for konfigurasjonen eller gjennom beregning // basert på de underliggende ligningene. // ------------------------------------------------ -------------------------------------- int komparator [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Definer behandlingsvariabler int dipPin = A0; // analog pin for spenningsdeler inngang int dipIn = 0; // holder divider spenningsutgang oversatt med analogRead int count = 0; // loop counter int epsilon = 7; // sammenligningsintervall halvbredde bool dipFound = false; // true if current voltage divider output found in look up table void setup () {pinMode (dipPin, INPUT); // konfigurer spenningsdelerpinnen som en INPUT Serial.begin (9600); // aktiver seriell kommunikasjon} void loop () {delay (3000); // holde utdataene fra å rulle for fort // Initialiser oppslagsparametere telle = 0; dipFound = false; // Les og dokumenter nåværende utgangsspenning dipIn = analogRead (dipPin); Serial.print ("divider output"); Serial.print (dipIn); // Søk i sammenligningslisten for gjeldende verdi mens ((count <16) && (! DipFound)) {if (abs (dipIn - comparator [count]) <= epsilon) {// fant det dipFound = true; Serial.print ("funnet ved oppføring"); Serial.print (count); Serial.println ("verdi" + streng (komparator [count])); gå i stykker; } tell ++; } if (! dipFound) {// verdi ikke i tabellen; skulle ikke skje Serial.println ("OOPS! Ikke funnet; ring bedre Ghost Busters"); }}
Trinn 3: Comparator Spreadsheet
Beregningene for de 16 komparatorverdiene er gitt i regnearket vist ovenfor. Den medfølgende excel -filen er tilgjengelig for nedlasting nederst i denne delen.
Regnearkskolonner A-D registrerer dip-switch-motstandsverdiene og de 16 mulige bryterinnstillingene. Vær oppmerksom på at maskinvare -DIP -bryteren som er vist i fritzing -diagrammet, faktisk er nummerert fra venstre til høyre i stedet for høyre til venstre nummerering vist i regnearket. Jeg fant dette litt forvirrende, men alternativet setter ikke "1" -konfigurasjonen (0, 0, 0, 1) først på listen. Kolonne E bruker formel 2 i forrige seksjon for å beregne spenningsdelerekvivalentmotstanden R1 for innstillingen. Kolonne F bruker dette resultatet til å beregne den tilhørende motstandsforholdet, og til slutt multipliserer kolonne G RATIO med analogLes maks -verdien (1023) for å få den forutsagte komparatorverdien. De siste to kolonnene inneholder de faktiske verdiene fra en kjøring av demo -programmet sammen med forskjellene mellom de forutsagte og de faktiske verdiene.
Den forrige delen nevnte tre metoder for å oppnå et sett med komparatorverdier inkludert utvidelse av dette regnearket hvis motstandsverdiene endres vesentlig eller flere brytere legges til. Det ser ut til at små forskjeller i motstandsverdiene ikke påvirker de endelige resultatene vesentlig (som er bra siden motstandsspesifikasjonene gir en toleranse, si 5%, og motstanden sjelden er lik den faktiske oppgitte verdien).
Trinn 4: Spill en melodi
For å illustrere hvordan multi-switch-teknikken kan brukes i en applikasjon, blir sammenligningsdemoprogrammet fra "Metodeforklaring" -delen endret for å implementere valg av melodi for musikkboksprogrammet. Den oppdaterte applikasjonskonfigurasjonen er vist ovenfor. Det eneste tillegget til maskinvaren er en passiv piezo -summer for å spille den valgte melodien. Den grunnleggende endringen i programvaren er tillegg av en rutine for å spille en melodi, en gang identifisert, ved hjelp av summer og Arduino -tonerutinen.
De tilgjengelige melodiutdragene finnes i en topptekstfil, Tunes.h, sammen med definisjonen av de nødvendige støttestrukturer. Hver melodi er definert som en rekke noterelaterte strukturer som inneholder tonefrekvensen og varigheten. Notefrekvensene finnes i en egen topptekstfil, Pitches.h. Program- og topptekstfilene er tilgjengelige for nedlasting på slutten av denne delen. Alle tre filene skal plasseres i samme katalog.
Valg og identifikasjon foregår som følger:
- "Brukeren" setter dip -bryterne i konfigurasjonen som er knyttet til ønsket melodi
- hver programsløyfesyklus hentes identifikatoren for gjeldende dip -switch -innstilling via analogRead
- Trinn 2 -konfigurasjonsidentifikatoren blir sammenlignet med hver av komparatorene i den tilgjengelige melodilisten
-
Hvis det blir funnet en kamp, kalles playTune -rutinen med informasjonen som trengs for å få tilgang til melodilisten
Ved hjelp av Arduino -tonefunksjonen spilles hver tone gjennom summeren
- Hvis det ikke blir funnet noen treff, iverksettes det ingen tiltak
- gjenta 1-5
DIP -bryterinnstillinger for de tilgjengelige melodiene vises i tabellen nedenfor der 1 betyr at bryteren er på, 0 slår av. Husk at måten dip-bryteren er orientert på plasserer bryter 1 i posisjonen lengst til venstre (den som er knyttet til 80K-motstanden).
NAVN | Bryter 1 | Bryter 2 | Bryter 3 | Bryter 4 |
Danny Boy | 1 | 0 | 0 | 0 |
Lille Bjørn | 0 | 1 | 0 | 0 |
Løven sover i natt | 1 | 1 | 0 | 0 |
Ingen kjenner problemet | 0 | 0 | 1 | 0 |
Utrolig nåde | 0 | 0 | 0 | 1 |
Tom plass | 1 | 0 | 0 | 1 |
Spottende Bird Hill | 1 | 0 | 1 | 1 |
Lydkvaliteten fra en piezo -summer er absolutt ikke god, men den er i det minste gjenkjennelig. Faktisk hvis tonene måles, er de veldig nær notatets eksakte frekvens. En interessant teknikk som brukes i programmet er å lagre melodidataene i flash-/programminnedelen i stedet for standard dataminneseksjon ved å bruke PROGMEM -direktivet. Dataseksjonen inneholder programbehandlingsvariablene og er mye mindre, rundt 512 byte for noen av ATtiny -mikrokontrollerne.
Anbefalt:
DIY -- Hvordan lage en edderkopprobot som kan kontrolleres ved hjelp av smarttelefon ved hjelp av Arduino Uno: 6 trinn
DIY || Hvordan lage en edderkopprobot som kan kontrolleres ved hjelp av smarttelefon ved hjelp av Arduino Uno: Mens du lager en edderkopprobot, kan du lære så mange ting om robotikk. Som å lage roboter er både underholdende og utfordrende. I denne videoen skal vi vise deg hvordan du lager en Spider -robot, som vi kan bruke ved hjelp av smarttelefonen vår (Androi
Hvordan lese flere analoge verdier ved hjelp av en analog pin: 6 trinn (med bilder)
Hvordan lese flere analoge verdier ved hjelp av en analog pin: I denne opplæringen skal jeg vise deg hvordan du leser flere analoge verdier ved å bruke bare en analog inngangspinne
Få blind til å gjenkjenne ting ved å berøre ting rundt dem ved hjelp av MakeyMakey: 3 trinn
Gjør blinde gjenkjenne ting ved å berøre ting rundt dem ved hjelp av MakeyMakey: introduksjon Dette prosjektet tar sikte på å gjøre blindes liv lett ved å identifisere ting rundt dem gjennom berøringsfølelsen. Meg og min sønn Mustafa tenkte vi på å finne et verktøy for å hjelpe dem, og i perioden vi brukte MakeyMakey -maskinvaren til
Hvordan lage en drone ved hjelp av Arduino UNO - Lag en quadcopter ved hjelp av mikrokontroller: 8 trinn (med bilder)
Hvordan lage en drone ved hjelp av Arduino UNO | Lag en Quadcopter ved hjelp av mikrokontroller: Introduksjon Besøk min Youtube -kanal En Drone er en veldig dyr gadget (produkt) å kjøpe. I dette innlegget skal jeg diskutere hvordan jeg får det billig? Og hvordan kan du lage din egen slik til en billig pris … Vel, i India er alle materialer (motorer, ESCer
Programmerbar True Bypass Guitar Effect Looper Station ved hjelp av dip -brytere: 11 trinn
Programmerbar True Bypass Guitar Effect Looper Station ved hjelp av dip -brytere: Jeg er en gitarentusiast og en hobbyspiller. Flertallet av prosjektene mine skjer rundt gitartilbehør. Jeg bygger mine egne forsterkere og noen effektpedaler. Tidligere spilte jeg i et lite band og overbeviste meg selv om at jeg bare trengte en forsterker med en re