Indholdsfortegnelse:

DIP Tune Selector ved hjælp af 1 pin: 4 trin
DIP Tune Selector ved hjælp af 1 pin: 4 trin

Video: DIP Tune Selector ved hjælp af 1 pin: 4 trin

Video: DIP Tune Selector ved hjælp af 1 pin: 4 trin
Video: Heated Acetone to Smooth Polycarbonate 2024, Juli
Anonim
DIP Tune Selector ved hjælp af 1 Pin
DIP Tune Selector ved hjælp af 1 Pin

For et stykke tid siden arbejdede jeg på et "musikboks" -projekt, der skulle vælge mellem hele 10 forskellige melodiuddrag. Et naturligt valg til at vælge en bestemt melodi var en 4 -pin dip switch, da 4 switches giver 24= 16 forskellige indstillinger. Imidlertid kræver implementering af brute force til denne fremgangsmåde 4 enhedsnåle, en for hver switch. Da jeg planlagde at bruge ATtiny85 til udvikling, var tab af 4 ben lidt for meget. Heldigvis stødte jeg på en artikel, der beskriver en genial metode til at bruge 1 analog pin til at håndtere flere switchindgange.

Multi-switch; 1-input teknikken bruger et spændingsdeler kredsløb til at give en unik heltal værdi for hver af de 16 mulige switch indstillingskombinationer. Dette sæt med 16 heltals -id'er bruges derefter i applikationsprogrammet til at knytte en handling til en indstilling.

Denne instruerbare anvender multi-switch-metoden til at implementere melodivalg til musikboksapplikationen. Den valgte melodi afspilles derefter gennem en piezo -summer ved hjælp af Arduino -tonefunktionen.

Trin 1: Påkrævet hardware

Påkrævet hardware
Påkrævet hardware

Brug af UNO som implementeringsplatform minimerer antallet af nødvendige hardwarekomponenter. Implementering af multi-switch input-metoden kræver kun en 4-polet dip switch, de 5 modstande, der bruges til spændingsdeleren, og tilslutningskablet til forbindelser. En piezo -summer er tilføjet til konfigurationen til implementering af musikboksens tune -vælger. Afhængigt af hvilken type dip -switch der bruges, er det valgfrit at bruge en 2x4 8 -polet fatning til at slutte dip -kontakten til brødbrættet, da standard dip -switch -pins synes at være lavet til lodning til et perfboard, der ikke tilsluttes direkte til et brødbræt. Stikket stabiliserer dip -switch -forbindelserne og forhindrer, at kontakten let kan løftes, når vippekontakterne indstilles.

Navn Mulig kilde Hvordan brugt
4-polet dip-switch Valg af melodi
2x4 pin stik (valgfrit) Amazon Stolperne på de fleste dip switches holder ikke kontakten særlig godt i et brødbræt. Et stik hjælper med at gøre forbindelsen mere solid. Et alternativ er at finde en dip -switch, der virkelig er lavet til brødbræt med almindelige IC -ben.

modstande:

  • 10K x2
  • 20K
  • 40K
  • 80K
Implementere spændingsdeler
passiv piezo -summer Amazon Spil melodi som drevet af applikationen via Arduino -tonefunktionen

Trin 2: Multi-switch Metode Forklaring

Multi-switch Metode Forklaring
Multi-switch Metode Forklaring

Dette afsnit diskuterer de underliggende begreber for multi-switch-metoden og udvikler de ligninger, der kræves til enkeltstående beregning af unikke identifikatorer for hver af de 16 mulige dip switch-indstillingskonfigurationer. Disse identifikatorer kan derefter bruges i et applikationsprogram til at knytte en switch -konfiguration til en handling. For eksempel vil du måske have indstillingen - tænd 1, sluk 2, sluk 3, sluk 4 (1, 0, 0, 0) - for at spille Amazing Grace og (0, 1, 0, 0) for at afspille Løven sover i nat. For kortfattet og præcist betegnes konfigurationsidentifikatorerne som komparatorer i resten af dokumentet.

Billede
Billede

Grundkonceptet for multi-switch-metoden er Voltage Divider-kredsløbet, der består af 2 i serie modstande forbundet til en indgangsspænding. Udgangsspændingsledningen er forbundet mellem modstandene, R1 og R.2, som vist ovenfor. Delerens udgangsspænding beregnes som indgangsspændingen ganget med forholdet mellem modstand R2 til summen af R1 og R.2 (ligning 1). Dette forhold er altid mindre end 1, så udgangsspændingen er altid mindre end indgangsspændingen.

Som angivet i designdiagrammet ovenfor er multikontakten konfigureret som en spændingsdeler med R2 fast og R1 lig med komposit/ækvivalent modstand for de 4 dip switch modstande. Værdien af R1 afhænger af, hvilke dip switches der er tændt og derfor bidrager til den sammensatte modstand. Da dip -switch -modstandene er parallelle, angives den ækvivalente modstandsberegningsligning i form af reciprokken af komponentmodstandene. For vores konfiguration og det tilfælde, at alle kontakter er tændt, bliver ligningen

1/R1 = 1/80000 + 1/40000 + 1/20000 + 1/10000

giver R1 = 5333,33 volt. For at tage højde for, at mindst én af kontakterne er slukket på de fleste indstillinger, bruges switchtilstanden som en multiplikator:

1/R1 = s1*1/80000 + s2*1/40000 + s3*1/20000 + s4*1/10000 (2)

hvor tilstandsmultiplikatoren, sjeg, er lig med 1, hvis kontakten er tændt og lig med 0, hvis kontakten er slukket. R1 kan nu bruges til at beregne det modstandsforhold, der er nødvendigt i ligning 1. Brug det tilfælde, hvor alle kontakter er tændt som eksemplet igen

FORHOLD = R2/(R1+R2) = 10000/(5333.33+10000) =.6522

Det sidste trin i beregningen af den forudsagte komparatorværdi er multiplikation af RATIO med 1023 for at efterligne effekten af analogRead -funktionen. Identifikatoren for det tilfælde, hvor alle kontakter er tændt, er derefter

komparator15 = 1023*.6522 = 667

Alle ligningerne er nu på plads til beregning af identifikatorer for de 16 mulige switchindstillinger. At opsummere:

  1. R1 beregnes ved hjælp af ligning 2
  2. R1 og R.2 bruges til at beregne den tilhørende modstandsforhold
  3. RATIO ganges med 1023 for at opnå sammenligningsværdien
  4. eventuelt kan den forudsagte udgangsspænding også beregnes som RATIO*Vin

Sættet med komparatorer afhænger kun af de modstandsværdier, der bruges til spændingsdeleren, og er en unik signatur for konfigurationen. Fordi dividerens udgangsspændinger vil svinge fra kørsel til kørsel (og læse for at læse), betyder unikt i denne sammenhæng, at selvom to sæt identifikatorer muligvis ikke er nøjagtig de samme, så er de tæt nok på, at komponentkomparatorforskellene falder inden for en lille for- angivet interval. Intervalstørrelsesparameteren skal vælges stor nok til at tage højde for forventede udsving, men lille nok til, at forskellige switchindstillinger ikke overlapper hinanden. Normalt fungerer 7 godt for intervallet halvbredde.

Et sæt komparatorer til en bestemt konfiguration kan opnås på flere måder - kør demo -programmet og registrer værdierne for hver indstilling; brug regnearket i det næste afsnit til at beregne; kopiere et eksisterende sæt. Som nævnt ovenfor vil alle sæt sandsynligvis være lidt anderledes, men burde fungere. Jeg foreslår at bruge metodeforfatterens sæt identifikatorer til multi-switch opsætningen og regnearket fra det næste afsnit, hvis nogen af modstandene ændres betydeligt eller flere modstande tilføjes.

Følgende demo -program illustrerer brug af komparatorerne til at identificere den aktuelle dip -switch -indstilling. I hver programcyklus udføres en analogRead for at opnå en identifikator for den aktuelle konfiguration. Denne identifikator sammenlignes derefter på tværs af sammenligningslisten, indtil der findes et match, eller listen er opbrugt. Hvis der findes et match, udsendes en outputbesked til verifikation; hvis der ikke findes en advarsel. En forsinkelse på 3 sekunder indsættes i sløjfen, så vinduet med det serielle output ikke bliver overvældet af meddelelser og giver lidt tid til at nulstille dip -switch -konfigurationen.

//-------------------------------------------------------------------------------------

// Demoprogram til at læse spændingsdelerudgangen og bruge den til at identificere // nuværende dip switch -konfiguration ved at se outputværdien op i en række // sammenligningsværdier for hver mulig indstilling. Værdierne i opslagsmatrixen kan // enten hentes fra en tidligere kørsel til konfigurationen eller gennem beregning // baseret på de underliggende ligninger. // ------------------------------------------------ -------------------------------------- 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 til spændingsdeler input int dipIn = 0; // holder divider spændingsoutput oversat med analogRead int count = 0; // loop counter int epsilon = 7; // sammenligningsinterval halvbredde bool dipFound = false; // sand hvis strømspændingsdelerudgang findes i opslagstabelløget opsætning () {pinMode (dipPin, INPUT); // konfigurer spændingsdeler -pin som en INPUT Serial.begin (9600); // aktiver seriel kommunikation} void loop () {delay (3000); // holde output fra at rulle for hurtigt // Initialiser opslagsparametre count = 0; dipFound = false; // Læs og dokumenter strømudgangsspænding dipIn = analogRead (dipPin); Serial.print ("divider output"); Serial.print (dipIn); // Søg i sammenligningslisten efter den aktuelle værdi, mens ((count <16) && (! DipFound)) {if (abs (dipIn - comparator [count]) <= epsilon) {// fandt det dipFound = true; Serial.print ("fundet ved indgang"); Serial.print (count); Serial.println ("værdi" + streng (komparator [count])); pause; } tæl ++; } hvis (! dipFound) {// værdi ikke i tabel; skulle ikke ske Serial.println ("OOPS! Ikke fundet; ring bedre til Ghost Busters"); }}

Trin 3: Comparator Regneark

Billede
Billede

Beregningerne for de 16 komparatorværdier er angivet i regnearket vist ovenfor. Den medfølgende excel -fil kan downloades nederst i dette afsnit.

Regneark kolonner A-D registrerer dip switch-modstandens værdier og de 16 mulige switch-indstillinger. Bemærk, at hardware -DIP -switchen, der er vist i diagrammet med fritz -design, faktisk er nummereret fra venstre mod højre i stedet for den højre til venstre -nummerering, der er vist i regnearket. Jeg fandt dette noget forvirrende, men alternativet sætter ikke "1" -konfigurationen (0, 0, 0, 1) i første række på listen. Kolonne E bruger formel 2 i det foregående afsnit til at beregne spændingsdelerækvivalentmodstanden R1 for indstillingen. Kolonne F bruger dette resultat til at beregne den tilhørende modstandsforhold, og endelig multiplicerer kolonne G RATIO med analogRead max -værdien (1023) for at opnå den forudsagte komparatorværdi. De sidste 2 kolonner indeholder de faktiske værdier fra en kørsel af demo -programmet sammen med forskellene mellem de forudsagte og de faktiske værdier.

Det foregående afsnit nævnte tre metoder til at opnå et sæt komparatorværdier inklusive forlængelse af dette regneark, hvis modstandsværdierne ændres væsentligt eller flere switches tilføjes. Det ser ud til, at små forskelle i modstandsværdierne ikke i væsentlig grad påvirker de endelige resultater (hvilket er godt, da modstandsspecifikationer giver en tolerance, siger 5%, og modstanden sjældent er lig med dens faktiske angivne værdi).

Trin 4: Afspil en melodi

Spil en melodi
Spil en melodi

For at illustrere, hvordan multi-switch-teknikken kan bruges i en applikation, ændres demo-programmet til sammenligning fra afsnittet "Metodeforklaring" for at implementere melodiudvælgelsesprocessen for musikboksprogrammet. Den opdaterede applikationskonfiguration er vist ovenfor. Den eneste tilføjelse til hardwaren er en passiv piezo -summer til at afspille den valgte melodi. Den grundlæggende ændring af softwaren er tilføjelse af en rutine til afspilning af en melodi, når den er identificeret, ved hjælp af summer og Arduino -tone -rutine.

De tilgængelige melodiuddrag findes i en header -fil, Tunes.h, sammen med definition af de nødvendige understøttelsesstrukturer. Hver melodi er defineret som en række noterelaterede strukturer, der indeholder notefrekvensen og varigheden. Notefrekvenserne findes i en separat header -fil, Pitches.h. Program- og overskriftsfiler kan downloades i slutningen af dette afsnit. Alle tre filer skal placeres i den samme mappe.

Udvælgelse og identifikation foregår som følger:

  1. "Brugeren" indstiller dip switches i den konfiguration, der er knyttet til den ønskede melodi
  2. for hver programsløjfe -cyklus opnås identifikatoren for den aktuelle dip -switch -indstilling via analogRead
  3. Trin 2 -konfigurations -id'et sammenlignes med hver af komparatorerne i den tilgængelige melodiliste
  4. Hvis der findes et match, kaldes playTune -rutinen op med de oplysninger, der er nødvendige for at få adgang til melodilisten

    Ved hjælp af Arduino -tonefunktionen afspilles hver tone gennem summeren

  5. Hvis der ikke findes et match, foretages der ingen handling
  6. gentag 1-5

DIP -switchindstillinger for de tilgængelige melodier vises i nedenstående tabel, hvor 1 betyder, at kontakten er tændt, 0 slukker. Husk, at dip-kontakten er orienteret, placerer switch 1 i positionen til venstre mest (den, der er forbundet med 80K-modstanden).

NAVN Kontakt 1 Kontakt 2 Kontakt 3 Kontakt 4
Danny Boy 1 0 0 0
Lille bjørn 0 1 0 0
Løven sover i nat 1 1 0 0
Ingen kender problemerne 0 0 1 0
Fantastisk nåde 0 0 0 1
Blank plads 1 0 0 1
Spottende Bird Hill 1 0 1 1

Lydkvaliteten fra en piezo -summer er bestemt ikke god, men den er i det mindste genkendelig. Faktisk hvis tonerne måles, er de meget tæt på tonernes nøjagtige frekvens. En interessant teknik, der bruges i programmet, er at gemme tune -data i flash-/programhukommelsesafsnittet i stedet for standarddatahukommelsesafsnittet ved hjælp af PROGMEM -direktivet. Datasektionen indeholder programbehandlingsvariablerne og er meget mindre, omkring 512 bytes for nogle af ATtiny -mikrokontrollerne.

Anbefalede: