Sommario:

Selettore di sintonia DIP con 1 pin: 4 passaggi
Selettore di sintonia DIP con 1 pin: 4 passaggi

Video: Selettore di sintonia DIP con 1 pin: 4 passaggi

Video: Selettore di sintonia DIP con 1 pin: 4 passaggi
Video: duplicazione telecomando cancello 2024, Luglio
Anonim
Selettore di sintonia DIP utilizzando 1 pin
Selettore di sintonia DIP utilizzando 1 pin

Qualche tempo fa ho lavorato a un progetto di "scatola musicale" che doveva scegliere tra un massimo di 10 frammenti di melodia diversi. Una scelta naturale per scegliere una melodia specifica era un dip switch a 4 pin poiché 4 switch forniscono 24=16 impostazioni diverse. Tuttavia, l'implementazione della forza bruta per questo approccio richiede 4 pin del dispositivo, uno per ogni switch. Dato che avevo intenzione di utilizzare l'ATtiny85 per lo sviluppo, la perdita di 4 pin era un po' eccessiva. Fortunatamente, mi sono imbattuto in un articolo che descrive un metodo ingegnoso per utilizzare 1 pin analogico per gestire più ingressi di commutazione.

La tecnica multi-switch;1-input utilizza un circuito divisore di tensione per fornire un valore intero univoco per ciascuna delle 16 possibili combinazioni di impostazione dell'interruttore. Questo insieme di 16 identificatori interi viene quindi utilizzato nel programma applicativo per associare un'azione a un'impostazione.

Questa istruzione utilizza il metodo multi-switch per implementare la selezione della melodia per l'applicazione carillon. La melodia selezionata viene quindi riprodotta tramite un cicalino piezoelettrico utilizzando la funzione tono di Arduino.

Passaggio 1: hardware richiesto

Hardware richiesto
Hardware richiesto

L'uso di UNO come piattaforma di implementazione riduce al minimo il numero di componenti hardware richiesti. L'implementazione del metodo di ingresso multi-switch richiede solo un dip switch a 4 pin, i 5 resistori utilizzati per il partitore di tensione e il cavo di collegamento per i collegamenti. Un cicalino piezoelettrico viene aggiunto alla configurazione per l'implementazione del selettore della melodia del carillon. Facoltativamente, a seconda del tipo di dip switch utilizzato, è utile utilizzare una presa 2x4 a 8 pin per collegare il dip switch alla breadboard poiché i pin standard del dip switch sembrano fatti per la saldatura a una perfboard che non si collega direttamente a una breadboard. La presa stabilizza le connessioni del dip switch e impedisce che l'interruttore venga sollevato facilmente durante l'impostazione degli interruttori a levetta.

Nome Possibile fonte Come usato
Dip switch a 4 pin Selezione del brano
Presa 2x4 pin (opzionale) Amazon I post sulla maggior parte dei dip switch non tengono molto bene l'interruttore in una breadboard. Una presa aiuta a rendere la connessione più solida. Un'alternativa è trovare un dip switch che sia veramente realizzato per l'uso su breadboard con normali pin IC.

resistori:

  • 10K x2
  • 20K
  • 40K
  • 80K
Implementa il divisore di tensione
cicalino piezo passivo Amazon Riproduci la melodia guidata dall'applicazione tramite la funzione tono di Arduino

Passaggio 2: spiegazione del metodo multi-switch

Spiegazione del metodo multi-switch
Spiegazione del metodo multi-switch

Questa sezione discute i concetti alla base del metodo multi-switch e sviluppa le equazioni necessarie per il calcolo autonomo di identificatori univoci per ciascuna delle 16 possibili configurazioni di impostazione dei dip switch. Questi identificatori possono quindi essere utilizzati in un programma applicativo per associare una configurazione di switch a un'azione. Ad esempio, potresti desiderare che l'impostazione - accendi 1, spegni 2, spegni 3, spegni 4 (1, 0, 0, 0) - per riprodurre Amazing Grace e (0, 1, 0, 0) per giocare Stanotte il leone dorme. Per brevità e concisione gli identificatori di configurazione sono indicati come comparatori nel resto del documento.

Immagine
Immagine

Il concetto fondamentale per il metodo multi-switch è il circuito divisore di tensione che consiste di 2 resistori in serie collegati a una tensione di ingresso. Il cavo della tensione di uscita è collegato tra i resistori, R1 e R2, come mostrato sopra. La tensione di uscita del divisore viene calcolata come la tensione di ingresso moltiplicata per il rapporto del resistore R2 alla somma di R1 e R2 (equazione 1). Questo rapporto è sempre inferiore a 1, quindi la tensione di uscita è sempre inferiore alla tensione di ingresso.

Come indicato nello schema di progettazione sopra, il multiswitch è configurato come partitore di tensione con R2 fisso e R1 uguale alla resistenza composita/equivalente per le 4 resistenze dip switch. Il valore di R1 dipende da quali dip switch sono accesi e, quindi, contribuiscono alla resistenza composita. Poiché i resistori dip switch sono in parallelo, l'equazione di calcolo della resistenza equivalente è espressa in termini di reciproci dei resistori componenti. Per la nostra configurazione e nel caso in cui tutti gli interruttori siano accesi, l'equazione diventa

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

dando R1 = 5333,33 volt. Per tenere conto del fatto che la maggior parte delle impostazioni ha almeno uno degli interruttori disattivato, lo stato dell'interruttore viene utilizzato come moltiplicatore:

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

dove il moltiplicatore di stato, sio, è uguale a 1 se l'interruttore è acceso e uguale a 0 se l'interruttore è spento. R1 ora può essere utilizzato per calcolare il rapporto di resistenza necessario nell'equazione 1. Utilizzando di nuovo il caso in cui tutti gli interruttori sono accesi come esempio

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

L'ultimo passo nel calcolo del valore del comparatore previsto è la moltiplicazione del RATIO per 1023 al fine di emulare l'effetto della funzione analogRead. L'identificatore per il caso in cui tutti gli interruttori sono accesi è quindi

comparatore15 = 1023*.6522 = 667

Tutte le equazioni sono ora in atto per il calcolo degli identificatori per le 16 possibili impostazioni dell'interruttore. Riassumere:

  1. R1 viene calcolato utilizzando l'equazione 2
  2. R1 e R2 vengono utilizzati per calcolare il RAPPORTO di resistenza associato
  3. il RATIO viene moltiplicato per 1023 per ottenere il valore del comparatore
  4. opzionalmente, la tensione di uscita prevista può anche essere calcolata come RATIO*Vin

Il set di comparatori dipende solo dai valori del resistore utilizzati per il partitore di tensione e sono una firma univoca per la configurazione. Poiché le tensioni di uscita del divisore fluttueranno da un'esecuzione all'altra (e da lettura a lettura), univoco in questo contesto significa che mentre due insiemi di identificatori potrebbero non essere esattamente uguali, sono abbastanza vicini da far sì che le differenze del comparatore dei componenti rientrino in un piccolo pre- intervallo specificato. Il parametro della dimensione dell'intervallo deve essere scelto sufficientemente grande da tenere conto delle fluttuazioni previste, ma sufficientemente piccolo da non sovrapporre le diverse impostazioni dell'interruttore. Di solito 7 funziona bene per l'intervallo a metà larghezza.

È possibile ottenere una serie di comparatori per una particolare configurazione con diversi metodi: eseguire il programma demo e registrare i valori per ciascuna impostazione; utilizzare il foglio di calcolo nella sezione successiva per calcolare; copiare un insieme esistente. Come notato sopra, molto probabilmente tutti i set saranno leggermente diversi, ma dovrebbero funzionare. Suggerisco di utilizzare il set di identificatori dell'autore del metodo per l'impostazione multi-switch e il foglio di calcolo della sezione successiva se uno qualsiasi dei resistori viene modificato in modo significativo o se vengono aggiunti più resistori.

Il seguente programma dimostrativo illustra l'uso dei comparatori per identificare l'impostazione corrente del dip switch. In ogni ciclo di programma viene eseguito un analogRead per ottenere un identificatore per la configurazione corrente. Questo identificatore viene quindi confrontato nell'elenco del comparatore finché non viene trovata una corrispondenza o l'elenco è esaurito. Se viene trovata una corrispondenza, viene emesso un messaggio di output per la verifica; se non trovato viene emesso un avviso. Nel loop viene inserito un ritardo di 3 secondi in modo che la finestra dell'uscita seriale non venga sovraccaricata di messaggi e per dare un po' di tempo per resettare la configurazione dei dip switch.

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

// Programma demo per leggere l'uscita del divisore di tensione e utilizzarlo per identificare la // configurazione corrente del dip switch cercando il valore dell'uscita in una matrice di // valori di confronto per ogni possibile impostazione. I valori nell'array di ricerca possono // essere ottenuti da un'esecuzione precedente per la configurazione o tramite il calcolo // basato sulle equazioni sottostanti. //------------------------------------------------ -------------------------------------- int comparatore[16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Definisce le variabili di elaborazione int dipPin = A0; // pin analogico per l'ingresso del partitore di tensione int dipIn = 0; // mantiene l'uscita di tensione del divisore tradotta da analogRead int count = 0; // contatore del ciclo int epsilon = 7; // intervallo di confronto metà larghezza bool dipFound = false; // true se l'uscita del divisore di tensione corrente è stata trovata nella tabella di ricerca void setup() { pinMode(dipPin, INPUT); // configura il pin del divisore di tensione come INPUT Serial.begin(9600); // abilita la comunicazione seriale } void loop() { delay(3000); // impedisce all'output di scorrere troppo velocemente // Inizializza i parametri di ricerca count = 0; dipFound = falso; // Legge e documenta la tensione di uscita corrente dipIn = analogRead(dipPin); Serial.print("uscita divisore"); Serial.print(dipIn); // Cerca nell'elenco dei comparatori il valore corrente while((count < 16) && (!dipFound)) { if(abs(dipIn - comparator[count]) <= epsilon) { // trovato dipFound = true; Serial.print(" trovato alla voce "); Serial.print(count); Serial.println(" valore " + String(comparator[count])); rottura; } conta++; } if(!dipFound) { // valore non in tabella; non dovrebbe succedere Serial.println(" OOPS! Non trovato; meglio chiamare Ghost Busters"); } }

Passaggio 3: foglio di calcolo comparatore

Immagine
Immagine

I calcoli per i 16 valori del comparatore sono riportati nel foglio di calcolo mostrato sopra. Il file excel allegato è disponibile per il download in fondo a questa sezione.

Le colonne A-D del foglio di calcolo registrano i valori della resistenza del dip switch e le 16 possibili impostazioni dell'interruttore. Si prega di notare che l'interruttore DIP hardware mostrato nel diagramma di progettazione fritzing è in realtà numerato da sinistra a destra invece della numerazione da destra a sinistra mostrata nel foglio di calcolo. L'ho trovato un po' confuso, ma l'alternativa non mette la configurazione "1" (0, 0, 0, 1) al primo posto dell'elenco. La colonna E utilizza la formula 2 della sezione precedente per calcolare la resistenza equivalente del divisore di tensione R1 per l'impostazione. La colonna F utilizza questo risultato per calcolare il RATIO di resistenza associato e, infine, la colonna G moltiplica il RATIO per il valore analogicoRead max (1023) per ottenere il valore del comparatore previsto. Le ultime 2 colonne contengono i valori effettivi di un'esecuzione del programma demo insieme alle differenze tra i valori previsti e quelli effettivi.

La sezione precedente ha menzionato tre metodi per ottenere una serie di valori del comparatore inclusa l'estensione di questo foglio di calcolo se i valori del resistore vengono modificati in modo significativo o vengono aggiunti più interruttori. Sembra che piccole differenze nei valori del resistore non influenzino in modo significativo i risultati finali (il che è positivo poiché le specifiche del resistore danno una tolleranza, diciamo del 5%, e il resistore è raramente uguale al suo valore effettivo dichiarato).

Passaggio 4: suona una melodia

Suona una melodia
Suona una melodia

Per illustrare come potrebbe essere utilizzata la tecnica multi-switch in un'applicazione, il programma demo di confronto della sezione "Spiegazione del metodo" viene modificato per implementare l'elaborazione della selezione del brano per il programma del carillon. La configurazione dell'applicazione aggiornata è mostrata sopra. L'unica aggiunta all'hardware è un cicalino piezo passivo per riprodurre il brano selezionato. La modifica di base al software è l'aggiunta di una routine per riprodurre una melodia, una volta identificata, utilizzando il cicalino e la routine di tono di Arduino.

I frammenti di brano disponibili sono contenuti in un file di intestazione, Tunes.h, insieme alla definizione delle strutture di supporto necessarie. Ogni brano è definito come un array di strutture correlate alla nota contenente la frequenza e la durata della nota. Le frequenze delle note sono contenute in un file di intestazione separato, Pitch.h. Il programma e i file di intestazione sono disponibili per il download alla fine di questa sezione. Tutti e tre i file dovrebbero essere collocati nella stessa directory.

La selezione e l'identificazione procede come segue:

  1. L'"utente" imposta i dip switch nella configurazione associata alla melodia desiderata
  2. ad ogni ciclo del ciclo di programma l'identificatore per l'impostazione corrente del dip switch è ottenuto tramite analogRead
  3. L'identificatore di configurazione del passaggio 2 viene confrontato con ciascuno dei comparatori nell'elenco delle melodie disponibili
  4. Se viene trovata una corrispondenza, viene chiamata la routine playTune con le informazioni necessarie per accedere all'elenco delle note della melodia

    Usando la funzione tono di Arduino ogni nota viene suonata attraverso il cicalino

  5. Se non viene trovata alcuna corrispondenza, non viene intrapresa alcuna azione
  6. ripetere 1-5

Le impostazioni degli interruttori DIP per i brani disponibili sono mostrate nella tabella sottostante, dove 1 significa che l'interruttore è acceso, 0 che è spento. Ricordiamo che il modo in cui è orientato il dip switch pone lo switch 1 nella posizione più a sinistra (quella associata al resistore da 80K).

NOME Interruttore 1 Interruttore 2 Interruttore 3 Interruttore 4
Danny Boy 1 0 0 0
Piccolo orso 0 1 0 0
Stanotte il leone dorme 1 1 0 0
Nessuno conosce il problema 0 0 1 0
Incredibile grazia 0 0 0 1
Spazio bianco 1 0 0 1
MockingBird Hill 1 0 1 1

La qualità del suono di un cicalino piezoelettrico non è certamente eccezionale, ma almeno è riconoscibile. Infatti se i toni vengono misurati, sono molto vicini alla frequenza esatta delle note. Una tecnica interessante utilizzata nel programma consiste nel memorizzare i dati della melodia nella sezione memoria flash/programma invece della sezione memoria dati predefinita utilizzando la direttiva PROGMEM. La sezione dati contiene le variabili di elaborazione del programma ed è molto più piccola, circa 512 byte per alcuni dei microcontrollori ATtiny.

Consigliato: