Inhoudsopgave:

DIP Tune-kiezer met 1 pin: 4 stappen
DIP Tune-kiezer met 1 pin: 4 stappen

Video: DIP Tune-kiezer met 1 pin: 4 stappen

Video: DIP Tune-kiezer met 1 pin: 4 stappen
Video: Speed😈😈#speed #ishowspeed #strength #muscle 2024, November
Anonim
DIP Tune-kiezer met 1 pin
DIP Tune-kiezer met 1 pin

Een tijdje terug werkte ik aan een "muziekdoos"-project dat moest kiezen tussen maar liefst 10 verschillende melodiefragmenten. Een natuurlijke keuze voor het kiezen van een specifieke melodie was een 4-pins dip-schakelaar, aangezien 4 schakelaars 2. bieden4=16 verschillende instellingen. De brute force-implementatie voor deze benadering vereist echter 4 apparaatpinnen, één voor elke schakelaar. Aangezien ik van plan was om de ATtiny85 te gebruiken voor ontwikkeling, was het verlies van 4 pinnen een beetje te veel. Gelukkig kwam ik een artikel tegen dat een ingenieuze methode beschrijft om 1 analoge pin te gebruiken om meerdere schakelaaringangen te verwerken.

De multi-switch;1-ingangstechniek maakt gebruik van een spanningsdelercircuit om een unieke integerwaarde te bieden voor elk van de 16 mogelijke schakelaarinstellingscombinaties. Deze set van 16 integer-ID's wordt vervolgens in het applicatieprogramma gebruikt om een actie aan een instelling te koppelen.

Deze instructable maakt gebruik van de multi-switch-methode om de melodieselectie voor de muziekdoostoepassing te implementeren. De geselecteerde melodie wordt vervolgens afgespeeld via een piëzo-zoemer met behulp van de Arduino-toonfunctie.

Stap 1: Vereiste hardware

Vereiste hardware
Vereiste hardware

Gebruik van de UNO als implementatieplatform minimaliseert het aantal benodigde hardwarecomponenten. Implementatie van de invoermethode met meerdere schakelaars vereist alleen een 4-pins dip-switch, de 5 weerstanden die worden gebruikt voor de spanningsdeler en aansluitdraad voor verbindingen. Een piëzo-zoemer is toegevoegd aan de configuratie voor implementatie van de muziekdoos-tunerkiezer. Optioneel, afhankelijk van het type dipswitch dat wordt gebruikt, is het handig om een 2x4 8-pins aansluiting te gebruiken om de dipswitch op het breadboard aan te sluiten, aangezien de standaard dipswitch-pinnen gemaakt lijken te zijn om te solderen op een perfboard die niet rechtstreeks op een breadboard kan worden aangesloten. Het stopcontact stabiliseert de aansluitingen van de dipswitches en zorgt ervoor dat de schakelaar niet gemakkelijk kan worden opgetild bij het instellen van de tuimelschakelaars.

Naam Mogelijke bron Hoe gebruikt?
4-pins dip-schakelaar Selectie afstemmen
2x4 pins aansluiting (optioneel) Amazone De posten op de meeste dipswitches houden de schakelaar niet erg goed vast in een breadboard. Een stopcontact helpt om de verbinding steviger te maken. Een alternatief is om een dip-switch te vinden die echt gemaakt is voor breadboard-gebruik met gewone IC-pinnen.

weerstanden:

  • 10K x2
  • 20K
  • 40K
  • 80K
Spanningsdeler implementeren
passieve piëzo-zoemer Amazone Melodie afspelen zoals aangestuurd door de applicatie via de Arduino-toonfunctie

Stap 2: Uitleg over meerdere schakelaars:

Multi-switch Methode Uitleg
Multi-switch Methode Uitleg

In dit gedeelte worden de onderliggende concepten voor de multiswitch-methode besproken en worden de vergelijkingen ontwikkeld die nodig zijn voor zelfstandige berekening van unieke identifiers voor elk van de 16 mogelijke configuraties voor dipswitch-instellingen. Deze identifiers kunnen vervolgens in een applicatieprogramma worden gebruikt om een switchconfiguratie aan een actie te koppelen. U wilt bijvoorbeeld de instelling - schakel 1 aan, schakel 2 uit, schakel 3 uit, schakel 4 uit (1, 0, 0, 0) - om Amazing Grace te spelen en (0, 1, 0, 0) om te spelen Leeuw slaapt vannacht. Voor de beknoptheid en beknoptheid worden in de rest van het document naar de configuratie-ID's verwezen als vergelijkers.

Afbeelding
Afbeelding

Het basisconcept voor de methode met meerdere schakelaars is het spanningsdelercircuit dat bestaat uit 2 in serie geschakelde weerstanden die zijn aangesloten op een ingangsspanning. De uitgangsspanningskabel is aangesloten tussen de weerstanden, R1 en R2, zoals hierboven getoond. De uitgangsspanning van de verdeler wordt berekend als de ingangsspanning vermenigvuldigd met de verhouding van weerstand R2 tot de som van R1 en R2 (vergelijking 1). Deze verhouding is altijd kleiner dan 1, dus de uitgangsspanning is altijd kleiner dan de ingangsspanning.

Zoals aangegeven in het ontwerpschema hierboven is de multischakelaar geconfigureerd als een spanningsdeler met R2 vast en R1 gelijk aan de samengestelde/equivalente weerstand voor de 4 dipswitch-weerstanden. De waarde van R1 hangt af van welke dipswitches zijn ingeschakeld en dragen daarom bij aan de samengestelde weerstand. Aangezien de dipswitch-weerstanden parallel staan, wordt de equivalente vergelijking van de weerstandsberekening uitgedrukt in termen van de reciproke waarden van de componentweerstanden. Voor onze configuratie en het geval dat alle schakelaars zijn ingeschakeld, wordt de vergelijking:

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

R. geven1 = 5333,33 volt. Om rekening te houden met het feit dat bij de meeste instellingen ten minste één van de schakelaars is uitgeschakeld, wordt de schakelaarstatus gebruikt als een vermenigvuldiger:

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

waarbij de staat multiplier, sl, is gelijk aan 1 als de schakelaar is ingeschakeld en gelijk aan 0 als de schakelaar is uitgeschakeld. R1 kan nu worden gebruikt om de weerstandsverhouding te berekenen die nodig is in vergelijking 1. Gebruik opnieuw het geval waarin alle schakelaars aan staan

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

De laatste stap in de berekening van de voorspelde comparatorwaarde is vermenigvuldiging van de RATIO met 1023 om het effect van de analogRead-functie te emuleren. De identifier voor het geval waarin alle schakelaars aan staan is dan

comparator15 = 1023*.6522 = 667

Alle vergelijkingen zijn nu aanwezig voor de berekening van identifiers voor de 16 mogelijke schakelaarinstellingen. Samenvatten:

  1. R1 wordt berekend met behulp van vergelijking 2
  2. R1 en R2 worden gebruikt om de bijbehorende weerstand RATIO. te berekenen
  3. de RATIO wordt vermenigvuldigd met 1023 om de vergelijkingswaarde te verkrijgen
  4. optioneel kan de voorspelde uitgangsspanning ook worden berekend als RATIO*Vin

De set comparatoren is alleen afhankelijk van de weerstandswaarden die worden gebruikt voor de spanningsdeler en zijn een unieke handtekening voor de configuratie. Omdat de uitgangsspanningen van de deler van run tot run zullen fluctueren (en van lezen om te lezen), betekent uniek in deze context dat, hoewel twee sets identifiers mogelijk niet precies hetzelfde zijn, ze dicht genoeg bij elkaar liggen dat de verschillen in componentvergelijkers binnen een kleine pre- opgegeven interval. De parameter intervalgrootte moet groot genoeg worden gekozen om rekening te houden met verwachte fluctuaties, maar klein genoeg zodat verschillende schakelaarinstellingen elkaar niet overlappen. Meestal werkt 7 goed voor de halve breedte van het interval.

Een set vergelijkers voor een bepaalde configuratie kan op verschillende manieren worden verkregen: voer het demoprogramma uit en noteer de waarden voor elke instelling; gebruik de spreadsheet in de volgende sectie om te berekenen; een bestaande set kopiëren. Zoals hierboven vermeld, zullen alle sets hoogstwaarschijnlijk iets anders zijn, maar zouden moeten werken. Ik raad aan om de set identificatiecodes van de auteur van de methode te gebruiken voor de multi-switch setup en de spreadsheet uit de volgende sectie als een van de weerstanden aanzienlijk wordt gewijzigd of als er meer weerstanden worden toegevoegd.

Het volgende demoprogramma illustreert het gebruik van de comparatoren om de huidige dipswitch-instelling te identificeren. In elke programmacyclus wordt een analogRead uitgevoerd om een identificatie voor de huidige configuratie te verkrijgen. Deze identifier wordt vervolgens vergeleken in de vergelijkingslijst totdat een overeenkomst is gevonden of de lijst is uitgeput. Als een overeenkomst wordt gevonden, wordt een uitvoerbericht verzonden ter verificatie; indien niet gevonden wordt een waarschuwing gegeven. Er wordt een vertraging van 3 seconden in de lus ingevoegd, zodat het seriële uitvoervenster niet wordt overspoeld met berichten en om wat tijd te geven om de configuratie van de dipswitches te resetten.

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

// Demoprogramma om de spanningsdeleruitgang te lezen en deze te gebruiken om de // huidige dipswitchconfiguratie te identificeren door de uitgangswaarde op te zoeken in een reeks // vergelijkingswaarden voor elke mogelijke instelling. De waarden in de opzoekarray kunnen // worden verkregen uit een eerdere uitvoering van de configuratie of door berekening // op basis van de onderliggende vergelijkingen. //------------------------------------------------ -------------------------------------- int comparator [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Definieer verwerkingsvariabelen int dipPin = A0; // analoge pin voor spanningsdeleringang int dipIn = 0; // houdt de uitgangsspanning van de deler vast, vertaald door analogRead int count = 0; // lusteller int epsilon = 7; // vergelijkingsinterval halve breedte bool dipFound = false; // waar als de huidige spanningsdeleruitgang wordt gevonden in de zoektabel void setup () {pinMode (dipPin, INPUT); // configureer de spanningsdelerpin als een INPUT Serial.begin (9600); // seriële communicatie inschakelen} void loop () { delay (3000); // zorg ervoor dat de uitvoer niet te snel scrolt // Initialiseer lookup parameters count = 0; dipFound = onwaar; // Lezen en documenteren huidige uitgangsspanning dipIn = analogRead (dipPin); Serial.print("verdeler uitgang "); Seriële.print(dipIn); // Zoek de vergelijkingslijst voor huidige waarde while((count <16) && (!dipFound)) {if(abs(dipIn - comparator[count]) <= epsilon) { // vond het dipFound = true; Serial.print(" gevonden bij invoer "); Serial.print(telling); Serial.println ("waarde" + String (vergelijker [telling])); pauze; } tellen++; } if(!dipFound) { // waarde niet in tabel; zou niet moeten gebeuren Serial.println(" OOPS! Niet gevonden; bel beter Ghost Busters"); } }

Stap 3: Vergelijkingsspreadsheet

Afbeelding
Afbeelding

De berekeningen voor de 16 vergelijkingswaarden worden gegeven in de bovenstaande spreadsheet. Het bijbehorende Excel-bestand kunt u onderaan deze sectie downloaden.

Spreadsheetkolommen A-D registreren de weerstandswaarden van de dipswitches en de 16 mogelijke switchinstellingen. Houd er rekening mee dat de hardware-DIP-schakelaar die wordt weergegeven in het ontwerpdiagram van fritzing eigenlijk van links naar rechts is genummerd in plaats van de nummering van rechts naar links die in de spreadsheet wordt weergegeven. Ik vond dit enigszins verwarrend, maar het alternatief plaatst de "1" -configuratie (0, 0, 0, 1) niet bovenaan de lijst. Kolom E gebruikt formule 2 van de vorige sectie om de equivalente weerstand van de spanningsdeler R. te berekenen1 voor de instelling. Kolom F gebruikt dit resultaat om de bijbehorende weerstand RATIO te berekenen, en tot slot vermenigvuldigt Kolom G de RATIO met de analogRead max-waarde (1023) om de voorspelde comparatorwaarde te verkrijgen. De laatste 2 kolommen bevatten de werkelijke waarden van een uitvoering van het demoprogramma, samen met de verschillen tussen de voorspelde en werkelijke waarden.

In de vorige sectie werden drie methoden genoemd om een reeks vergelijkingswaarden te verkrijgen, inclusief uitbreiding van dit werkblad, als de weerstandswaarden aanzienlijk worden gewijzigd of meer schakelaars worden toegevoegd. Het lijkt erop dat kleine verschillen in de weerstandswaarden de uiteindelijke resultaten niet significant beïnvloeden (wat goed is omdat weerstandsspecificaties een tolerantie geven, zeg 5%, en de weerstand zelden gelijk is aan de werkelijke opgegeven waarde).

Stap 4: Speel een deuntje

Speel een deuntje
Speel een deuntje

Om te illustreren hoe de multischakelaartechniek in een toepassing zou kunnen worden gebruikt, is het vergelijkingsdemoprogramma uit de sectie "Methodeverklaring" aangepast om de melodieselectieverwerking voor het muziekdoosprogramma te implementeren. De bijgewerkte applicatieconfiguratie wordt hierboven weergegeven. De enige toevoeging aan de hardware is een passieve piëzo-zoemer om het geselecteerde deuntje te spelen. De basiswijziging aan de software is de toevoeging van een routine om een deuntje te spelen, eenmaal geïdentificeerd, met behulp van de zoemer en de Arduino-toonroutine.

De beschikbare melodiefragmenten zijn opgenomen in een headerbestand, Tunes.h, samen met de definitie van de noodzakelijke ondersteunende structuren. Elke melodie wordt gedefinieerd als een reeks nootgerelateerde structuren die de nootfrequentie en -duur bevatten. De nootfrequenties zijn opgenomen in een apart headerbestand, Pitches.h. Het programma en de header-bestanden kunnen aan het einde van dit gedeelte worden gedownload. Alle drie de bestanden moeten in dezelfde map worden geplaatst.

Selectie en identificatie verloopt als volgt:

  1. De "gebruiker" zet de dipswitches in de configuratie die hoort bij de gewenste melodie
  2. elke programmaluscyclus wordt de identifier voor de huidige dipswitch-instelling verkregen via analogRead
  3. De configuratie-ID van stap 2 wordt vergeleken met elk van de comparators in de beschikbare melodielijst
  4. Als er een overeenkomst wordt gevonden, wordt de playTune-routine aangeroepen met de informatie die nodig is om toegang te krijgen tot de lijst met melodienotities

    Met behulp van de Arduino-toonfunctie wordt elke noot door de zoemer gespeeld

  5. Als er geen match wordt gevonden, wordt er geen actie ondernomen
  6. herhaal 1-5

DIP-schakelaarinstellingen voor de beschikbare melodieën worden weergegeven in de onderstaande tabel, waarbij 1 betekent dat schakelaar aan is, 0 uitgeschakeld. Bedenk dat de manier waarop de dip-schakelaar is georiënteerd, schakelaar 1 in de meest linkse positie plaatst (degene die is gekoppeld aan de 80K-weerstand).

NAAM Schakelaar 1 Schakelaar 2 Schakelaar 3 Schakelaar 4
Danny Boy 1 0 0 0
Kleine Beer 0 1 0 0
Leeuw slaapt vannacht 1 1 0 0
Niemand kent het probleem 0 0 1 0
Geweldige genade 0 0 0 1
Lege ruimte 1 0 0 1
Spottende Vogelheuvel 1 0 1 1

De geluidskwaliteit van een piëzozoemer is zeker niet geweldig maar wel herkenbaar. Als de tonen worden gemeten, liggen ze zelfs heel dicht bij de exacte frequentie van de noten. Een interessante techniek die in het programma wordt gebruikt, is om de melodiegegevens op te slaan in het flash-/programmageheugengedeelte in plaats van in het standaardgegevensgeheugengedeelte met behulp van de PROGMEM-richtlijn. De gegevenssectie bevat de programmaverwerkingsvariabelen en is veel kleiner, ongeveer 512 bytes voor sommige van de ATtiny-microcontrollers.

Aanbevolen: