Inhaltsverzeichnis:

DIP Tune Selector mit 1 Pin - Gunook
DIP Tune Selector mit 1 Pin - Gunook

Video: DIP Tune Selector mit 1 Pin - Gunook

Video: DIP Tune Selector mit 1 Pin - Gunook
Video: 19mm LED latching switch wiring 2024, November
Anonim
DIP Tune Selector mit 1 Pin
DIP Tune Selector mit 1 Pin

Vor einiger Zeit arbeitete ich an einem "Musikbox"-Projekt, bei dem ich zwischen bis zu 10 verschiedenen Melodie-Schnipseln wählen musste. Eine natürliche Wahl für die Auswahl einer bestimmten Melodie war ein 4-poliger Dip-Schalter, da 4 Schalter 2 bieten4=16 verschiedene Einstellungen. Die Brute-Force-Implementierung für diesen Ansatz erfordert jedoch 4 Geräte-Pins, einen für jeden Schalter. Da ich vorhatte, den ATtiny85 für die Entwicklung zu verwenden, war der Verlust von 4 Pins etwas zu viel. Glücklicherweise bin ich auf einen Artikel gestoßen, der eine geniale Methode zur Verwendung eines analogen Pins beschreibt, um mehrere Schaltereingänge zu handhaben.

Die Multischalter;1-Eingangstechnik verwendet eine Spannungsteilerschaltung, um einen eindeutigen ganzzahligen Wert für jede der 16 möglichen Schaltereinstellungskombinationen bereitzustellen. Dieser Satz von 16 ganzzahligen Bezeichnern wird dann im Anwendungsprogramm verwendet, um einer Einstellung eine Aktion zuzuordnen.

Dieses anweisbare verwendet die Multischaltermethode, um die Melodieauswahl für die Musikboxanwendung zu implementieren. Die ausgewählte Melodie wird dann mit der Arduino-Tonfunktion über einen Piezo-Summer abgespielt.

Schritt 1: Erforderliche Hardware

Erforderliche Hardware
Erforderliche Hardware

Die Verwendung der UNO als Implementierungsplattform minimiert die Anzahl der erforderlichen Hardwarekomponenten. Die Implementierung der Multischalter-Eingangsmethode erfordert nur einen 4-poligen Dip-Schalter, die 5 Widerstände für den Spannungsteiler und ein Anschlusskabel für die Anschlüsse. Ein Piezo-Summer wird der Konfiguration für die Implementierung des Musikbox-Stimmwählers hinzugefügt. Optional, je nach Art des verwendeten Dip-Schalters, ist es hilfreich, eine 2x4 8-polige Buchse zu verwenden, um den Dip-Schalter mit dem Steckbrett zu verbinden, da die Standard-Dip-Schalter-Pins zum Löten an ein Perfboard gedacht sind, das nicht direkt an ein Steckbrett angeschlossen wird. Die Steckdose stabilisiert die Dip-Switch-Anschlüsse und verhindert ein leichtes Anheben des Schalters beim Einstellen der Kippschalter.

Name Mögliche Quelle Wie verwendet
4-poliger Dip-Schalter Melodieauswahl
2x4-Pin-Buchse (optional) Amazonas Die Pfosten der meisten Dip-Schalter halten den Schalter in einem Steckbrett nicht sehr gut. Eine Buchse hilft, die Verbindung fester zu machen. Eine Alternative besteht darin, einen Dip-Schalter zu finden, der wirklich für den Einsatz auf Steckbrettern mit normalen IC-Pins geeignet ist.

Widerstände:

  • 10K x 2
  • 20K
  • 40K
  • 80K
Spannungsteiler implementieren
passiver Piezo-Summer Amazonas Spielen Sie die von der Anwendung gesteuerte Melodie über die Arduino-Tonfunktion

Schritt 2: Erklärung der Multischaltermethode

Erklärung der Multischaltermethode
Erklärung der Multischaltermethode

In diesem Abschnitt werden die zugrunde liegenden Konzepte für die Multiswitch-Methode diskutiert und die Gleichungen entwickelt, die für die eigenständige Berechnung eindeutiger Kennungen für jede der 16 möglichen Dip-Switch-Einstellungskonfigurationen erforderlich sind. Diese Kennungen können dann in einem Anwendungsprogramm verwendet werden, um eine Schalterkonfiguration einer Aktion zuzuordnen. Zum Beispiel möchten Sie vielleicht, dass die Einstellung - Schalter 1 an, Schalter 2 aus, Schalter 3 aus, Schalter 4 aus (1, 0, 0, 0) - Amazing Grace spielen und (0, 1, 0, 0) spielen Löwe schläft heute Nacht. Der Kürze und Prägnanz halber werden die Konfigurationskennungen im Rest des Dokuments als Komparatoren bezeichnet.

Bild
Bild

Das grundlegende Konzept für die Multischaltermethode ist die Spannungsteilerschaltung, die aus 2 in Reihe geschalteten Widerständen besteht, die an eine Eingangsspannung angeschlossen sind. Die Ausgangsspannungsleitung ist zwischen den Widerständen R. angeschlossen1 und R2, wie oben gezeigt. Die Ausgangsspannung des Teilers wird berechnet als Eingangsspannung multipliziert mit dem Verhältnis von Widerstand R2 zur Summe von R1 und R2 (Gleichung 1). Dieses Verhältnis ist immer kleiner als 1, sodass die Ausgangsspannung immer kleiner als die Eingangsspannung ist.

Wie im obigen Konstruktionsdiagramm dargestellt, ist der Multischalter als Spannungsteiler mit R. konfiguriert2 fest und R1 gleich dem zusammengesetzten/äquivalenten Widerstand für die 4 Dip-Schalter-Widerstände. Der Wert von R1 hängt davon ab, welche Dip-Schalter eingeschaltet sind und trägt daher zum zusammengesetzten Widerstand bei. Da die Dip-Switch-Widerstände parallel geschaltet sind, wird die Berechnungsgleichung für den äquivalenten Widerstand in Form der Kehrwerte der Komponentenwiderstände angegeben. Für unsere Konfiguration und den Fall, dass alle Schalter eingeschaltet sind, lautet die Gleichung

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

geben R1 = 5333,33 Volt. Um der Tatsache Rechnung zu tragen, dass bei den meisten Einstellungen mindestens einer der Schalter ausgeschaltet ist, wird der Schalterzustand als Multiplikator verwendet:

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

wobei der Zustandsmultiplikator, sich, ist gleich 1, wenn der Schalter eingeschaltet ist und gleich 0, wenn der Schalter ausgeschaltet ist. R1 kann nun verwendet werden, um das in Gleichung 1 benötigte Widerstandsverhältnis zu berechnen. Verwenden Sie den Fall, in dem alle Schalter wieder als Beispiel eingeschaltet sind

VERHÄLTNIS = R2/(R1+R2) = 10000/(5333.33+10000) =.6522

Der letzte Schritt bei der Berechnung des vorhergesagten Komparatorwerts ist die Multiplikation von RATIO mit 1023, um die Wirkung der analogRead-Funktion zu emulieren. Die Kennung für den Fall, dass alle Schalter eingeschaltet sind, lautet dann

Komparator15 = 1023*.6522 = 667

Alle Gleichungen zur Berechnung der Kennungen für die 16 möglichen Schalterstellungen sind nun vorhanden. Zusammenfassen:

  1. R1 wird mit Gleichung 2 berechnet
  2. R1 und R2 werden verwendet, um den zugehörigen Widerstand RATIO. zu berechnen
  3. das Verhältnis wird mit 1023 multipliziert, um den Komparatorwert zu erhalten
  4. optional kann die prognostizierte Ausgangsspannung auch als RATIO*Vin. berechnet werden

Der Komparatorsatz hängt nur von den für den Spannungsteiler verwendeten Widerstandswerten ab und ist eine eindeutige Signatur für die Konfiguration. Da die Ausgangsspannungen des Teilers von Durchlauf zu Durchlauf (und von Lesen zu Lesen) schwanken, bedeutet in diesem Zusammenhang eindeutig, dass zwei Sätze von Kennungen zwar nicht genau gleich sind, aber nahe genug liegen, dass die Differenzen der Komponentenkomparatoren innerhalb eines kleinen Vorlaufs liegen. angegebenen Intervall. Der Intervallgrößenparameter muss groß genug gewählt werden, um erwartete Schwankungen zu berücksichtigen, aber klein genug, damit sich verschiedene Schaltereinstellungen nicht überschneiden. Normalerweise funktioniert 7 gut für die Halbwertsbreite des Intervalls.

Eine Reihe von Komparatoren für eine bestimmte Konfiguration kann auf verschiedene Weise erhalten werden - führen Sie das Demoprogramm aus und zeichnen Sie die Werte für jede Einstellung auf; Verwenden Sie die Kalkulationstabelle im nächsten Abschnitt, um zu berechnen; kopieren Sie ein vorhandenes Set. Wie oben erwähnt, werden alle Sets höchstwahrscheinlich etwas anders sein, sollten aber funktionieren. Ich schlage vor, die Kennungen des Methodenautors für das Multischalter-Setup und die Tabelle aus dem nächsten Abschnitt zu verwenden, wenn einer der Widerstände erheblich geändert oder weitere Widerstände hinzugefügt werden.

Das folgende Demoprogramm veranschaulicht die Verwendung der Komparatoren, um die aktuelle DIP-Schaltereinstellung zu identifizieren. In jedem Programmzyklus wird ein analogRead durchgeführt, um eine Kennung für die aktuelle Konfiguration zu erhalten. Diese Kennung wird dann über die Vergleicherliste hinweg verglichen, bis eine Übereinstimmung gefunden wird oder die Liste erschöpft ist. Wenn eine Übereinstimmung gefunden wird, wird eine Ausgabenachricht zur Überprüfung ausgegeben; falls nicht gefunden, wird eine Warnung ausgegeben. In die Schleife wird eine Verzögerung von 3 Sekunden eingefügt, damit das serielle Ausgabefenster nicht mit Meldungen überhäuft wird und um etwas Zeit zum Zurücksetzen der DIP-Schalterkonfiguration zu haben.

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

// Demoprogramm zum Lesen des Spannungsteilerausgangs und zum Identifizieren der // aktuellen Dip-Switch-Konfiguration, indem der Ausgangswert in einem Array von // Vergleichswerten für jede mögliche Einstellung nachgeschlagen wird. Die Werte im Lookup-Array können // entweder aus einem vorherigen Durchlauf der Konfiguration oder durch Berechnungen // basierend auf den zugrunde liegenden Gleichungen gewonnen werden. //------------------------------------------------ -------------------------------------------------- int-Komparator [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Verarbeitungsvariablen definieren int dipPin = A0; // Analoger Pin für Spannungsteilereingang Int dipIn = 0; // hält den Spannungsausgang des Teilers, übersetzt von analogRead int count = 0; // Schleifenzähler Int Epsilon = 7; // Vergleichsintervall halbe Breite bool dipFound = false; // wahr, wenn der aktuelle Spannungsteilerausgang in der Nachschlagetabelle gefunden wurde Void setup () { PinMode (dipPin, INPUT); // Spannungsteiler-Pin als INPUT Serial.begin (9600) konfigurieren; // serielle Kommunikation aktivieren aufrechtzuerhalten. Void Schleife () { Verzögerung (3000); // Ausgabe von zu schnellem Scrollen verhindern // Lookup-Parameter initialisieren count = 0; dipFound = false; // Aktuelle Ausgangsspannung lesen und dokumentieren dipIn = analogRead (dipPin); Serial.print ("Teilerausgabe"); Serial.print (dipIn); // Komparatorliste nach aktuellem Wert durchsuchen while((count < 16) && (!dipFound)) { if(abs(dipIn -komparator[count]) <= epsilon) { // gefunden dipFound = true; Serial.print ("am Eintrag gefunden"); Serial.print (Anzahl); Serial.println ("Wert" + String (Komparator [Anzahl])); brechen; } zählen++; } if(!dipFound) { // Wert nicht in Tabelle; sollte nicht passieren Serial.println ("OOPS! Nicht gefunden; besser Ghost Busters anrufen"); } }

Schritt 3: Vergleichstabelle

Bild
Bild

Die Berechnungen für die 16 Vergleichswerte sind in der oben gezeigten Tabelle angegeben. Die beiliegende Excel-Datei steht am Ende dieses Abschnitts zum Download bereit.

Die Tabellenspalten A-D zeichnen die DIP-Schalter-Widerstandswerte und die 16 möglichen Schaltereinstellungen auf. Bitte beachten Sie, dass der im Fritzing-Design-Diagramm gezeigte Hardware-DIP-Schalter tatsächlich von links nach rechts nummeriert ist und nicht von rechts nach links in der Tabelle. Ich fand das etwas verwirrend, aber die Alternative setzt die "1"-Konfiguration (0, 0, 0, 1) nicht an den Anfang der Liste. Spalte E verwendet Formel 2 des vorherigen Abschnitts, um den äquivalenten Widerstand R. des Spannungsteilers zu berechnen1 für die Einstellung. Spalte F verwendet dieses Ergebnis, um den zugehörigen Widerstand RATIO zu berechnen, und schließlich multipliziert Spalte G den RATIO mit dem analogRead max-Wert (1023), um den vorhergesagten Komparatorwert zu erhalten. Die letzten 2 Spalten enthalten die tatsächlichen Werte aus einem Lauf des Demoprogramms zusammen mit den Unterschieden zwischen den vorhergesagten und den tatsächlichen Werten.

Im vorherigen Abschnitt wurden drei Methoden erwähnt, um einen Satz von Komparatorwerten einschließlich der Erweiterung dieser Tabelle zu erhalten, wenn die Widerstandswerte erheblich geändert werden oder mehr Schalter hinzugefügt werden. Es scheint, dass kleine Unterschiede in den Widerstandswerten die Endergebnisse nicht wesentlich beeinflussen (was gut ist, da die Widerstandsspezifikationen eine Toleranz von beispielsweise 5 % aufweisen und der Widerstand selten seinem tatsächlich angegebenen Wert entspricht).

Schritt 4: Spielen Sie eine Melodie

Spielen Sie eine Melodie
Spielen Sie eine Melodie

Um zu veranschaulichen, wie die Multischaltertechnik in einer Anwendung verwendet werden könnte, wird das Vergleichsdemoprogramm aus dem Abschnitt "Methodenerklärung" modifiziert, um die Melodieauswahlverarbeitung für das Musikboxprogramm zu implementieren. Die aktualisierte Anwendungskonfiguration wird oben angezeigt. Die einzige Ergänzung zur Hardware ist ein passiver Piezo-Summer zum Abspielen der ausgewählten Melodie. Die grundlegende Änderung an der Software ist das Hinzufügen einer Routine zum Abspielen einer einmal identifizierten Melodie mithilfe des Summers und der Arduino-Tonroutine.

Die verfügbaren Tune-Snippets sind in einer Header-Datei, Tunes.h, zusammen mit der Definition der notwendigen Stützstrukturen enthalten. Jede Melodie ist als ein Array von notenbezogenen Strukturen definiert, die die Notenfrequenz und -dauer enthalten. Die Notenfrequenzen sind in einer separaten Header-Datei, Pitches.h, enthalten. Die Programm- und Header-Dateien stehen am Ende dieses Abschnitts zum Download bereit. Alle drei Dateien sollten im selben Verzeichnis abgelegt werden.

Auswahl und Identifizierung gehen wie folgt vor:

  1. Der "Benutzer" stellt die Dip-Schalter in der Konfiguration ein, die der gewünschten Melodie zugeordnet ist
  2. bei jedem Programmschleifenzyklus wird die Kennung für die aktuelle Dip-Schalter-Einstellung über analogRead ermittelt
  3. Die Konfigurationskennung von Schritt 2 wird mit jedem der Komparatoren in der Liste der verfügbaren Melodien verglichen
  4. Wenn eine Übereinstimmung gefunden wird, wird die playTune-Routine mit den Informationen aufgerufen, die für den Zugriff auf die Liste der Melodienoten erforderlich sind

    Mit der Arduino-Tonfunktion wird jede Note über den Summer gespielt

  5. Wenn keine Übereinstimmung gefunden wird, wird keine Aktion ausgeführt
  6. 1-5. wiederholen

Die DIP-Schaltereinstellungen für die verfügbaren Melodien sind in der folgenden Tabelle aufgeführt, wobei 1 bedeutet, dass der Schalter eingeschaltet ist, 0 bedeutet, dass er ausgeschaltet ist. Denken Sie daran, dass die Ausrichtung des Dip-Schalters den Schalter 1 in die ganz linke Position bringt (die mit dem 80K-Widerstand verbunden ist).

NAME Schalter 1 Schalter 2 Schalter 3 Schalter 4
Danny Boy 1 0 0 0
Kleiner Bär 0 1 0 0
Löwe schläft heute Nacht 1 1 0 0
Niemand kennt das Problem 0 0 1 0
Erstaunliche Anmut 0 0 0 1
Leerstelle 1 0 0 1
MockingBird Hill 1 0 1 1

Die Klangqualität eines Piezo-Summers ist sicherlich nicht überragend, aber zumindest erkennbar. Tatsächlich sind die Töne, wenn sie gemessen werden, sehr nahe an der genauen Frequenz der Töne. Eine interessante Technik, die in dem Programm verwendet wird, besteht darin, die Melodiedaten im Flash-/Programmspeicherbereich anstelle des Standarddatenspeicherbereichs zu speichern, indem die PROGMEM-Direktive verwendet wird. Der Datenabschnitt enthält die Programmverarbeitungsvariablen und ist viel kleiner, etwa 512 Byte für einige der ATtiny-Mikrocontroller.

Empfohlen: