Innholdsfortegnelse:

DIP Tune Selector ved hjelp av 1 pin: 4 trinn
DIP Tune Selector ved hjelp av 1 pin: 4 trinn

Video: DIP Tune Selector ved hjelp av 1 pin: 4 trinn

Video: DIP Tune Selector ved hjelp av 1 pin: 4 trinn
Video: МОЩНЫЙ мультиметр UNI-T UT171B купить сегодня, или что лучше? 2024, November
Anonim
DIP Tune Selector ved hjelp av 1 pin
DIP Tune Selector ved hjelp av 1 pin

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

Nødvendig maskinvare
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:

  • 10K x2
  • 20K
  • 40K
  • 80K
Implementere spenningsdeler
passiv piezo summer Amazon Spill melodi som drevet av applikasjonen via Arduino -tonefunksjonen

Trinn 2: Flerbryter Metode Forklaring

Flerbryter Metode Forklaring
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.

Bilde
Bilde

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:

  1. R1 beregnes ved hjelp av ligning 2
  2. R1 og R.2 brukes til å beregne den tilhørende motstandsforholdet
  3. RATIO multipliseres med 1023 for å få sammenligningsverdien
  4. 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

Bilde
Bilde

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

Spill en melodi
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:

  1. "Brukeren" setter dip -bryterne i konfigurasjonen som er knyttet til ønsket melodi
  2. hver programsløyfesyklus hentes identifikatoren for gjeldende dip -switch -innstilling via analogRead
  3. Trinn 2 -konfigurasjonsidentifikatoren blir sammenlignet med hver av komparatorene i den tilgjengelige melodilisten
  4. 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

  5. Hvis det ikke blir funnet noen treff, iverksettes det ingen tiltak
  6. 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: