Innehållsförteckning:

DIP Tune Selector med 1 stift: 4 steg
DIP Tune Selector med 1 stift: 4 steg

Video: DIP Tune Selector med 1 stift: 4 steg

Video: DIP Tune Selector med 1 stift: 4 steg
Video: Основные ошибки при возведении перегородок из газобетона #5 2024, Juli
Anonim
DIP Tune Selector med 1 stift
DIP Tune Selector med 1 stift

För ett tag sedan arbetade jag med ett "musiklåda" -projekt som behövde välja mellan så många som 10 olika låtar. Ett naturligt val för att välja en specifik melodi var en 4 -stifts dip switch eftersom 4 switchar ger 24= 16 olika inställningar. Emellertid kräver den brutala kraftimplementeringen för detta tillvägagångssätt 4 enhetstappar, en för varje omkopplare. Eftersom jag planerade att använda ATtiny85 för utveckling var förlusten av 4 stift lite för mycket. Lyckligtvis stötte jag på en artikel som beskriver en genial metod för att använda en analog stift för att hantera flera switchingångar.

Multi-switch; 1-ingångstekniken använder en spänningsdelare-krets för att ge ett unikt heltal för var och en av de 16 möjliga switch-inställningskombinationerna. Denna uppsättning med 16 heltalsidentifierare används sedan i applikationsprogrammet för att associera en åtgärd med en inställning.

Denna instruerbara använder multi-switch-metoden för att implementera låtval för musiklådeapplikationen. Den valda melodin spelas sedan upp via en piezo -summer med Arduino -tonfunktionen.

Steg 1: Obligatorisk maskinvara

Nödvändig hårdvara
Nödvändig hårdvara

Användning av UNO som implementeringsplattform minimerar antalet erforderliga hårdvarukomponenter. Implementering av multi-switch-ingångsmetoden kräver endast en 4-polig dip-switch, de 5 motstånd som används för spänningsdelaren och anslutningskabel för anslutningar. En piezosummer läggs till i konfigurationen för implementering av musiklådans inställningsväljare. Alternativt, beroende på vilken typ av dip -switch som används, är det bra att använda ett 2x4 8 -poligt uttag för att ansluta dip -switch till brödbrädan, eftersom standard dip -switch -pins verkar vara gjorda för lödning till en perfboard som inte ansluts direkt till ett brödbräda. Uttaget stabiliserar dip -switchanslutningarna och förhindrar att omkopplaren lätt lyfts när vippomkopplarna ställs in.

namn Möjlig källa Hur används
4-polig dip-omkopplare Stämma urval
2x4 -stiftsuttag (tillval) Amazon Stolparna på de flesta dip -switchar håller inte omkopplaren särskilt bra i en brödbräda. Ett uttag hjälper till att göra anslutningen mer solid. Ett alternativ är att hitta en dip -switch som verkligen är gjord för brödbräda med vanliga IC -stift.

motstånd:

  • 10K x2
  • 20K
  • 40K
  • 80K
Implementera spänningsdelare
passiv piezo -summer Amazon Spela melodi som drivs av applikationen via Arduino -tonfunktionen

Steg 2: Multi-switch Metod Förklaring

Multi-switch Metod Förklaring
Multi-switch Metod Förklaring

Det här avsnittet diskuterar de bakomliggande begreppen för flerväxlingsmetoden och utvecklar ekvationerna som krävs för fristående beräkning av unika identifierare för var och en av de 16 möjliga inställningarna för inställning av omkopplare. Dessa identifierare kan sedan användas i ett applikationsprogram för att associera en switchkonfiguration med en åtgärd. Till exempel kanske du vill att inställningen - slå på 1, stäng av 2, stäng av 3, stäng av 4 (1, 0, 0, 0) - för att spela Amazing Grace och (0, 1, 0, 0) för att spela Lejon sover i natt. För korthet och kortfattning kallas konfigurationsidentifierarna som komparatorer i resten av dokumentet.

Bild
Bild

Grundkonceptet för multi-switch-metoden är Voltage Divider-kretsen som består av 2 seriemotstånd anslutna till en ingångsspänning. Utgångsspänningsledningen är ansluten mellan motstånden, R1 och R.2, som visas ovan. Delarens utspänning beräknas som ingångsspänningen multiplicerat med förhållandet mellan motståndet R2 till summan av R1 och R.2 (ekvation 1). Detta förhållande är alltid mindre än 1 så att utspänningen alltid är mindre än ingångsspänningen.

Såsom anges i konstruktionsdiagrammet ovan är multibrytaren konfigurerad som en spänningsdelare med R2 fast och R1 lika med kompositmotståndet/ekvivalentmotståndet för de 4 dip -switchmotstånden. Värdet på R1 beror på vilka doppbrytare som slås på och bidrar därför till kompositmotståndet. Eftersom dip -switch -motstånden är parallella anges ekvivalentmotståndsberäkningsekvationen i termer av reciproka hos komponentmotstånden. För vår konfiguration och om alla switchar är påslagna blir ekvationen

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

ger R1 = 5333,33 volt. För att ta hänsyn till att minst en av omkopplarna är avstängda i de flesta inställningar används omkopplaren som en multiplikator:

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

där tillståndsmultiplikatorn, si, är lika med 1 om omkopplaren är påslagen och lika med 0 om omkopplaren är avstängd. R1 kan nu användas för att beräkna motståndskvoten som behövs i ekvation 1. Använd fallet där alla omkopplare är på som exemplet igen

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

Det sista steget i beräkningen av det förutsagda komparatorvärdet är multiplikation av RATIO med 1023 för att efterlikna effekten av analogRead -funktionen. Identifieraren för fallet där alla omkopplare är på är då

komparator15 = 1023*.6522 = 667

Alla ekvationer finns nu för beräkning av identifierare för de 16 möjliga switchinställningarna. För att sammanfatta:

  1. R1 beräknas med ekvation 2
  2. R1 och R.2 används för att beräkna det associerade resistansförhållandet
  3. RATIO multipliceras med 1023 för att erhålla komparatorvärdet
  4. valfritt kan den förutsagda utspänningen också beräknas som RATIO*Vin

Uppsättningen av komparatorer beror endast på motståndsvärdena som används för spänningsdelaren och är en unik signatur för konfigurationen. Eftersom dividerns utspänningar kommer att fluktuera från körning till körning (och läs för att läsa), betyder unikt i detta sammanhang att även om två uppsättningar identifierare kanske inte är exakt samma är de tillräckligt nära för att komponentkomparatorskillnaderna ska falla inom en liten för- specificerat intervall. Intervallstorleksparametern måste väljas tillräckligt stor för att ta hänsyn till förväntade fluktuationer men tillräckligt liten för att olika switchinställningar inte ska överlappa varandra. Vanligtvis fungerar 7 bra för intervallet halvbredd.

En uppsättning komparatorer för en viss konfiguration kan erhållas med flera metoder - kör demoprogrammet och spela in värdena för varje inställning; använd kalkylbladet i nästa avsnitt för att beräkna; kopiera en befintlig uppsättning. Som nämnts ovan kommer alla uppsättningar troligen att vara lite annorlunda men borde fungera. Jag föreslår att du använder metodförfattarens uppsättning identifierare för multi-switch-installationen och kalkylarket från nästa avsnitt om något av motstånden ändras avsevärt eller fler motstånd läggs till.

Följande demoprogram illustrerar användning av komparatorerna för att identifiera den aktuella dip -switch -inställningen. I varje programcykel utförs en analogRead för att erhålla en identifierare för den aktuella konfigurationen. Denna identifierare jämförs sedan över jämförelselistan tills en matchning hittas eller listan är uttömd. Om en matchning hittas skickas ett utmatningsmeddelande för verifiering. om den inte hittas utfärdas en varning. En 3 sekunders fördröjning infogas i slingan så att det seriella utmatningsfönstret inte kommer att överväldigas av meddelanden och ge lite tid att återställa dip -switchkonfigurationen.

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

// Demoprogram för att läsa spänningsdelarens utgång och använda den för att identifiera // nuvarande dip -switch -konfiguration genom att leta upp utgångsvärdet i en uppsättning // jämförelsevärden för varje möjlig inställning. Värdena i uppslagsmatrisen kan // antingen erhållas från en tidigare körning för konfigurationen eller genom beräkning // baserat på de underliggande ekvationerna. // ------------------------------------------------ -------------------------------------- int jämförare [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Definiera bearbetningsvariabler int dipPin = A0; // analog pin för spänningsdelare ingång int dipIn = 0; // håller utdelarens spänningsutgång översatt av analogRead int count = 0; // loop counter int epsilon = 7; // jämförelseintervall halvbredd bool dipFound = false; // sant om strömspänningsdelarens utgång finns i uppslagstabellens tomrumsinställning () {pinMode (dipPin, INPUT); // konfigurera spänningsdelaren som en INPUT Serial.begin (9600); // aktivera seriell kommunikation} void loop () {delay (3000); // hålla utdata från att rulla för snabbt // Initiera sökparametrar räkna = 0; dipFound = false; // Läs och dokumentera strömspänning dipIn = analogRead (dipPin); Serial.print ("divider output"); Serial.print (dipIn); // Sök komparatorlista efter aktuellt värde medan ((count <16) && (! DipFound)) {if (abs (dipIn - comparator [count]) <= epsilon) {// fann det dipFound = true; Serial.print ("hittades vid posten"); Serial.print (count); Serial.println ("värde" + String (komparator [count])); ha sönder; } räkna ++; } if (! dipFound) {// värde finns inte i tabellen; borde inte hända Serial.println ("OOPS! Hittades inte; ring bättre Ghost Busters"); }}

Steg 3: Comparator Spreadsheet

Bild
Bild

Beräkningarna för de 16 jämförande värdena anges i kalkylbladet som visas ovan. Den medföljande Excel -filen finns tillgänglig för nedladdning längst ner i detta avsnitt.

Kalkylkolumner A-D registrerar dip switch-motståndets värden och de 16 möjliga switch-inställningarna. Observera att maskinvarans DIP -omkopplare som visas i frittdesigndiagrammet faktiskt är numrerad från vänster till höger istället för höger till vänster nummerering som visas i kalkylarket. Jag tyckte att det var lite förvirrande, men alternativet sätter inte "1" -konfigurationen (0, 0, 0, 1) i den första i listan. Kolumn E använder formel 2 i föregående avsnitt för att beräkna spänningsdelarens ekvivalenta motstånd R1 för inställningen. Kolumn F använder detta resultat för att beräkna det associerade motståndet RATIO, och slutligen multiplicerar kolumn G RATIO med analogRead max -värdet (1023) för att erhålla det förutsagda komparatorvärdet. De sista två kolumnerna innehåller de faktiska värdena från en körning av demoprogrammet tillsammans med skillnaderna mellan de förutsagda och verkliga värdena.

Det föregående avsnittet nämnde tre metoder för att erhålla en uppsättning jämförelsevärden inklusive förlängning av detta kalkylblad om motståndsvärdena ändras avsevärt eller fler omkopplare läggs till. Det verkar som om små skillnader i motståndsvärdena inte signifikant påverkar de slutliga resultaten (vilket är bra eftersom motståndsspecifikationerna ger en tolerans, säg 5%, och motståndet är sällan lika med dess verkliga angivna värde).

Steg 4: Spela en låt

Spela en låt
Spela en låt

För att illustrera hur multi-switch-tekniken kan användas i en applikation, ändras jämförelsedemoprogrammet från avsnittet "Metodförklaring" för att implementera låtvalsprocessen för musikboxprogrammet. Den uppdaterade applikationskonfigurationen visas ovan. Det enda tillägget till hårdvaran är en passiv piezo -summer för att spela den valda låten. Den grundläggande ändringen av programvaran är tillägg av en rutin för att spela en låt, en gång identifierad, med hjälp av summern och Arduino -tonrutinen.

Tillgängliga låtavsnitt finns i en rubrikfil, Tunes.h, tillsammans med definition av nödvändiga stödstrukturer. Varje låt är definierad som en uppsättning notrelaterade strukturer som innehåller notfrekvensen och varaktigheten. Anteckningsfrekvenserna finns i en separat rubrikfil, Pitches.h. Program- och rubrikfilerna finns tillgängliga för nedladdning i slutet av detta avsnitt. Alla tre filerna ska placeras i samma katalog.

Urval och identifiering sker enligt följande:

  1. "Användaren" ställer in dip -switcharna i konfigurationen som är associerad med den önskade melodin
  2. varje programslingcykel erhålls identifieraren för den aktuella dip -switchinställningen via analogRead
  3. Steg 2 -konfigurationsidentifieraren jämförs med var och en av jämförarna i den tillgängliga låtlistan
  4. Om en matchning hittas kallas playTune -rutinen med den information som behövs för att komma till listan med låtar

    Med Arduino -tonfunktionen spelas varje ton genom summern

  5. Om ingen matchning hittas, vidtas ingen åtgärd
  6. upprepa 1-5

DIP -switchinställningar för tillgängliga låtar visas i tabellen nedan där 1 betyder att switch är på, 0 switch off. Kom ihåg att det sätt på vilket dip-omkopplaren är orienterad placerar switch 1 i läget längst till vänster (den som är associerad med 80K-motståndet).

NAMN Brytare 1 Brytare 2 Brytare 3 Brytare 4
Danny Boy 1 0 0 0
Lilla björnen 0 1 0 0
Lejon sover i natt 1 1 0 0
Ingen vet problemet 0 0 1 0
Fantastisk nåd 0 0 0 1
Mellanslag 1 0 0 1
MockingBird Hill 1 0 1 1

Ljudkvaliteten från en piezo -summer är verkligen inte bra men den är åtminstone igenkännbar. I själva verket om tonerna mäts är de väldigt nära noternas exakta frekvens. En intressant teknik som används i programmet är att lagra inställningsdata i flash-/programminnesdelen istället för standarddataminnessektionen med hjälp av PROGMEM -direktivet. Datasektionen innehåller programbehandlingsvariablerna och är mycket mindre, cirka 512 byte för några av ATtiny -mikrokontrollerna.

Rekommenderad: