Taula de continguts:

Selector de sintonització DIP amb 1 pin: 4 passos
Selector de sintonització DIP amb 1 pin: 4 passos

Vídeo: Selector de sintonització DIP amb 1 pin: 4 passos

Vídeo: Selector de sintonització DIP amb 1 pin: 4 passos
Vídeo: Ingeniería inversa 04: Interruptor 2024, Desembre
Anonim
Selector de sintonització DIP amb 1 pin
Selector de sintonització DIP amb 1 pin

Fa un temps vaig treballar en un projecte de "caixa de música" que necessitava triar entre fins a 10 fragments de melodia diferents. Una opció natural per escollir una melodia específica era un interruptor dip de 4 pins, ja que 4 interruptors en proporcionen 24= 16 paràmetres diferents. Tot i això, la implementació de la força bruta per a aquest enfocament requereix 4 pins de dispositiu, un per a cada commutador. Com que tenia previst utilitzar l'ATtiny85 per al desenvolupament, la pèrdua de 4 pins era una mica excessiva. Afortunadament, em vaig trobar amb un article que descrivia un mètode enginyós per utilitzar 1 pin analògic per manejar diverses entrades de commutador.

La tècnica multi-switch; 1 entrada utilitza un circuit divisor de tensió per proporcionar un valor enter únic per a cadascuna de les 16 possibles combinacions de configuració de commutadors. Aquest conjunt de 16 identificadors enters s'utilitza al programa d'aplicació per associar una acció a un paràmetre.

Aquesta instrucció utilitza el mètode de commutació múltiple per implementar la selecció de melodies per a l'aplicació de caixa de música. A continuació, la melodia seleccionada es reprodueix mitjançant un brunzidor piezoelèctric mitjançant la funció de to Arduino.

Pas 1: maquinari obligatori

Maquinari obligatori
Maquinari obligatori

L’ús de l’ONU com a plataforma d’implementació minimitza el nombre de components de maquinari necessaris. La implementació del mètode d’entrada de commutadors múltiples requereix només un commutador dip de 4 pins, les 5 resistències que s’utilitzen per al divisor de tensió i un cable de connexió per a les connexions. A la configuració s’afegeix un brunzidor piezoelèctric per a la implementació del selector de cançons de música. Opcionalment, en funció del tipus d’interruptor dip utilitzat, és útil utilitzar un endoll de 2x4 de 8 pins per connectar l’interruptor dip a la placa de control, ja que els passadors estàndard del commutador de dipòsit semblen fabricats per soldar a una placa de perfils que no es connecten directament a una placa de control. El sòcol estabilitza les connexions del commutador dip i evita que es pugui aixecar fàcilment quan es col·loquen els commutadors.

Nom Possible font Com s'utilitza
Interruptor dip de 4 pins Selecció de sintonització
Presa de 2x4 pins (opcional) Amazon Les publicacions de la majoria dels interruptors dip no mantenen l'interruptor molt bé en una taula de proves. Un sòcol ajuda a fer la connexió més sòlida. Una alternativa és trobar un commutador dip que estigui realment dissenyat per a ús de taulers amb pins clàssics IC.

resistències:

  • 10K x2
  • 20K
  • 40K
  • 80K
Implementeu el divisor de tensió
timbre piezoelèctric passiu Amazon Reproduïu la melodia segons l’aplicació mitjançant la funció de to Arduino

Pas 2: explicació del mètode de commutació múltiple

Explicació del mètode de commutació múltiple
Explicació del mètode de commutació múltiple

En aquesta secció es discuteixen els conceptes subjacents per al mètode de commutació múltiple i es desenvolupen les equacions necessàries per al càlcul autònom d’identificadors únics per a cadascuna de les 16 configuracions possibles de configuració del commutador de dip. Aquests identificadors es poden utilitzar en un programa d'aplicació per associar una configuració de commutador a una acció. Per exemple, és possible que vulgueu que el paràmetre: encendre 1, apagar 2, apagar 3, apagar 4 (1, 0, 0, 0) - per jugar a Amazing Grace i (0, 1, 0, 0) per jugar Lleó dorm aquesta nit. Per brevetat i concisió, els identificadors de configuració es denominen comparadors a la resta del document.

Imatge
Imatge

El concepte fonamental per al mètode de commutació múltiple és el circuit divisor de tensió que consta de 2 resistències en sèrie connectades a una tensió d’entrada. El cable de tensió de sortida està connectat entre les resistències, R1 i R2, com es mostra més amunt. El voltatge de sortida del divisor es calcula com la tensió d’entrada multiplicada per la proporció de la resistència R2 a la suma de R1 i R2 (equació 1). Aquesta relació sempre és inferior a 1, de manera que el voltatge de sortida és sempre menor que el voltatge d’entrada.

Tal com s’indica al diagrama de disseny anterior, el commutador múltiple es configura com un divisor de tensió amb R2 fix i R1 igual a la resistència composta / equivalent per a les 4 resistències de dip switch. El valor de R1 depèn de quins commutadors dip s’activen i, per tant, contribueixen a la resistència del compost. Com que les resistències del commutador de dip són paral·leles, l'equació de càlcul de resistència equivalent s'indica en termes de recíprocs de les resistències components. Per a la nostra configuració i el cas que tots els commutadors estiguin activats, l'equació es converteix en

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

donant R1 = 5333,33 volts. Per tenir en compte el fet que la majoria de configuracions tenen almenys un dels commutadors desactivats, l'estat del commutador s'utilitza com a multiplicador:

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

on el multiplicador estatal, sjo, és igual a 1 si l'interruptor està activat i igual a 0 si l'interruptor està apagat. R1 ara es pot utilitzar per calcular la relació de resistència necessària a l'equació 1. Utilitzant el cas en què tots els interruptors estan activats com a exemple de nou

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

L'últim pas en el càlcul del valor del comparador predit és la multiplicació del RATIO per 1023 per emular l'efecte de la funció analogRead. L'identificador del cas en què tots els interruptors estan activats és llavors

comparador15 = 1023*.6522 = 667

Totes les equacions ja estan al seu lloc per al càlcul dels identificadors dels 16 possibles paràmetres de commutació. Resumir:

  1. R1 es calcula mitjançant l’equació 2
  2. R1 i R2 s’utilitzen per calcular la relació de resistència associada
  3. la RATIO es multiplica per 1023 per obtenir el valor del comparador
  4. opcionalment, la tensió de sortida prevista també es pot calcular com a RATIO * Vin

El conjunt de comparadors només depèn dels valors de resistència utilitzats per al divisor de tensió i són una signatura única per a la configuració. Com que les tensions de sortida del divisor fluctuaran d’execució en execució (i llegides per llegir), únic en aquest context significa que, tot i que dos conjunts d’identificadors poden no ser exactament iguals, són prou propers perquè les diferències del comparador de components es trobin dins d’un petit interval especificat. El paràmetre de la mida de l'interval s'ha de triar prou gran per tenir en compte les fluctuacions esperades, però prou petit perquè els diferents paràmetres de commutació no es superposin. Normalment, 7 funcionen bé per a l'interval de mig ample.

Es pot obtenir un conjunt de comparadors per a una configuració particular mitjançant diversos mètodes: executeu el programa de demostració i anoteu els valors de cada paràmetre; utilitzeu el full de càlcul de la secció següent per calcular; copieu un conjunt existent. Com s’ha indicat anteriorment, tots els conjunts probablement seran lleugerament diferents, però haurien de funcionar. Suggereixo fer servir el conjunt d’identificadors de l’autor del mètode per a la configuració de diversos commutadors i el full de càlcul de la secció següent si es canvia significativament alguna de les resistències o s’hi afegeixen més resistències.

El següent programa de demostració il·lustra l’ús dels comparadors per identificar la configuració actual del dip switch. A cada cicle de programa es realitza una lectura analògica per obtenir un identificador de la configuració actual. A continuació, es compara aquest identificador a la llista de comparació fins que es troba una coincidència o s’esgota la llista. Si es troba una coincidència, s'emet un missatge de sortida per verificar-lo; si no es troba, s'emet un avís. S'insereix un retard de 3 segons al bucle de manera que la finestra de sortida sèrie no es veurà desbordada de missatges i per donar temps a restablir la configuració del commutador dip.

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

// Programa de demostració per llegir la sortida del divisor de tensió i utilitzar-lo per identificar la // configuració actual del commutador dip, buscant el valor de sortida en una matriu de // valors de comparació per a cada configuració possible. Els valors de la matriu de cerca // es poden obtenir d'una execució anterior per a la configuració o mitjançant càlcul // basat en les equacions subjacents. // ------------------------------------------------ -------------------------------------- int comparator [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Definiu variables de processament int dipPin = A0; // pin analògic per a l’entrada divisor de tensió int dipIn = 0; // manté la sortida de tensió del divisor traduïda per analogRead int count = 0; // loop counter int epsilon = 7; // interval de comparació bool de mig ample dipFound = false; // cert si la sortida del divisor de tensió actual es troba a la taula de cerca void setup () {pinMode (dipPin, INPUT); // configureu el pin divisor de tensió com a INPUT Serial.begin (9600); // habilita la comunicació serial} void loop () {delay (3000); // evitar que la sortida es desplaci massa ràpid // Inicialitzar el recompte de paràmetres de cerca = 0; dipFound = false; // Llegir i documentar la tensió de sortida actual dipIn = analogRead (dipPin); Serial.print ("sortida del divisor"); Serial.print (dipIn); // Cerqueu el valor actual a la llista de comparadors mentre que ((recompte <16) && (! DipFound)) {if (abs (dipIn - comparador [recompte]) <= epsilon) {// l’ha trobat dipFound = true; Serial.print ("es troba a l'entrada"); Serial.print (recompte); Serial.println ("valor" + cadena (comparador [recompte])); trencar; } comptar ++; } if (! dipFound) {// valor no a la taula; no hauria de passar Serial.println ("OOPS! No s'ha trobat; millor truqueu Ghost Busters"); }}

Pas 3: full de càlcul del comparador

Imatge
Imatge

Els càlculs dels 16 valors de comparació es donen al full de càlcul que es mostra més amunt. El fitxer excel adjunt està disponible per descarregar a la part inferior d'aquesta secció.

Les columnes A-D del full de càlcul registren els valors de la resistència del commutador dip i els 16 paràmetres possibles del commutador. Tingueu en compte que el commutador DIP de maquinari que es mostra al diagrama de disseny fritzing està realment numerat d’esquerra a dreta en lloc de numeració de dreta a esquerra que es mostra al full de càlcul. Em va semblar una mica confús, però l'alternativa no posa la configuració "1" (0, 0, 0, 1) al primer de la llista. La columna E utilitza la fórmula 2 de la secció anterior per calcular la resistència equivalent del divisor de tensió R1 per a la configuració. La columna F utilitza aquest resultat per calcular el RATIO de resistència associat i, finalment, la columna G multiplica el RATIO pel valor màxim analogRead (1023) per obtenir el valor del comparador predit. Les 2 columnes finals contenen els valors reals d'una execució del programa de demostració juntament amb les diferències entre els valors previstos i reals.

La secció anterior esmentava tres mètodes per obtenir un conjunt de valors de comparació, inclosa l'extensió d'aquest full de càlcul, si es canvien significativament els valors de la resistència o s'afegeixen més commutadors. Sembla que petites diferències en els valors de la resistència no afecten significativament els resultats finals (cosa que és bo ja que les especificacions de la resistència donen una tolerància, per exemple un 5%, i la resistència rarament és igual al seu valor real declarat).

Pas 4: toqueu una melodia

Toca una melodia
Toca una melodia

Per il·lustrar com es pot utilitzar la tècnica de commutació múltiple en una aplicació, es modifica el programa de demostració de comparació de la secció "Explicació del mètode" per implementar el processament de selecció de melodies per al programa de caixa de música. La configuració actualitzada de l'aplicació es mostra a la part superior. L'única addició al maquinari és un brunzidor piezoelèctric passiu per reproduir la melodia seleccionada. El canvi bàsic del programari és l’addició d’una rutina per reproduir una melodia, un cop identificada, mitjançant el timbre i la rutina de tons Arduino.

Els fragments de sintonia disponibles es troben en un fitxer de capçalera, Tunes.h, juntament amb la definició de les estructures de suport necessàries. Cada melodia es defineix com un conjunt d'estructures relacionades amb les notes que contenen la freqüència i la durada de les notes. Les freqüències de les notes es troben en un fitxer de capçalera separat, Pitches.h. Els fitxers de programa i de capçalera es poden descarregar al final d'aquesta secció. Els tres fitxers s’han de col·locar al mateix directori.

La selecció i la identificació es produeixen de la següent manera:

  1. L '"usuari" estableix els dip switches a la configuració associada a la melodia desitjada
  2. a cada cicle de bucle de programa, l’identificador del paràmetre actual del dip switch s’obté mitjançant analogRead
  3. L'identificador de configuració del pas 2 es compara amb cadascun dels comparadors de la llista de melodies disponibles
  4. Si es troba una coincidència, es crida a la rutina playTune amb la informació necessària per accedir a la llista de notes de sintonització

    Mitjançant la funció de to Arduino, cada nota es reprodueix a través del timbre

  5. Si no es troba cap coincidència, no es prenen mesures
  6. repetir 1-5

Els paràmetres del commutador DIP per a les cançons disponibles es mostren a la taula següent, on 1 significa que el commutador està activat, 0 es desactiva. Recordeu que la forma d’orientar el commutador dip col·loca l’interruptor 1 a la posició més esquerra (la associada a la resistència de 80 K).

NOM Commutador 1 Interruptor 2 Commutador 3 Commutador 4
Danny Boy 1 0 0 0
Petit ós 0 1 0 0
Lleó dorm aquesta nit 1 1 0 0
Ningú no sap el problema 0 0 1 0
Amazing Grace 0 0 0 1
Espai en blanc 1 0 0 1
MockingBird Hill 1 0 1 1

La qualitat del so d'un brunzidor piezoelèctric certament no és gran, però almenys es reconeix. De fet, si es mesuren els tons, són molt propers a la freqüència exacta de les notes. Una tècnica interessant que s’utilitza al programa és emmagatzemar les dades de sintonització a la secció de memòria flash / programa en lloc de la secció de memòria de dades per defecte mitjançant la directiva PROGMEM. La secció de dades conté les variables de processament del programa i és molt més petita, al voltant de 512 bytes per a alguns dels microcontroladors ATtiny.

Recomanat: