Cuprins:

Selector de reglaj DIP folosind 1 pin: 4 pași
Selector de reglaj DIP folosind 1 pin: 4 pași

Video: Selector de reglaj DIP folosind 1 pin: 4 pași

Video: Selector de reglaj DIP folosind 1 pin: 4 pași
Video: Dorian este speriat de un interlop când face poze 😱🥊🤣 #timisoara #dorianpopa #cluj #bucuresti 2024, Noiembrie
Anonim
Selector de reglaj DIP folosind 1 pin
Selector de reglaj DIP folosind 1 pin

Cu ceva timp în urmă, am lucrat la un proiect de „cutie muzicală” care trebuia să aleagă între 10 fragmente de melodii diferite. O alegere naturală pentru alegerea unei melodii specifice a fost un comutator dip cu 4 pini, deoarece 4 comutatoare oferă 24= 16 setări diferite. Cu toate acestea, implementarea forței brute pentru această abordare necesită 4 pini de dispozitiv, unul pentru fiecare comutator. Din moment ce plănuiam să folosesc ATtiny85 pentru dezvoltare, pierderea a 4 pini a fost cam prea mare. Din fericire, am intrat într-un articol care descrie o metodă ingenioasă de utilizare a unui pin analogic pentru a gestiona mai multe intrări de comutare.

Tehnica multi-comutatorului cu 1 intrare folosește un circuit divizor de tensiune pentru a oferi o valoare întreagă unică pentru fiecare dintre cele 16 combinații posibile de setare a comutatorului. Acest set de 16 identificatori întregi este apoi folosit în programul aplicației pentru a asocia o acțiune cu o setare.

Acest instructable folosește metoda multi-switch pentru a implementa selecția melodiei pentru aplicația muzicală. Melodia selectată este apoi redată printr-un buzzer piezo folosind funcția de ton Arduino.

Pasul 1: Hardware necesar

Hardware necesar
Hardware necesar

Utilizarea UNO ca platformă de implementare minimizează numărul de componente hardware necesare. Implementarea metodei de intrare cu mai multe comutatoare necesită doar un comutator dip cu 4 pini, cele 5 rezistențe utilizate pentru divizorul de tensiune și un cablu de conectare pentru conexiuni. La configurația se adaugă un buzzer piezoelector pentru implementarea selectorului de melodii pentru caseta de muzică. Opțional, în funcție de tipul de comutator dip utilizat, este util să utilizați o priză 2x4 cu 8 pini pentru a conecta comutatorul dip la placa de prindere, deoarece pinii standard ai comutatorului dip par să fie lipiți la o placă de perfecționare, nu conectându-se direct la o placă de prindere. Priza stabilizează conexiunile întrerupătorului și împiedică ridicarea cu ușurință a comutatorului atunci când setați comutatoarele.

Nume Sursa posibilă Cât de folosit
Comutator dip cu 4 pini Selectarea tonului
Priză 2x4 pini (opțional) Amazon Posturile de pe majoritatea comutatoarelor dip nu țin comutatorul foarte bine într-o placă de calcul. O priză ajută la consolidarea conexiunii. O alternativă este de a găsi un comutator dip care este cu adevărat conceput pentru utilizarea panourilor cu pini IC obișnuiți.

rezistențe:

  • 10K x2
  • 20K
  • 40K
  • 80K
Implementați divizorul de tensiune
buzzer piezoactiv pasiv Amazon Redați melodia în funcție de aplicație prin funcția de ton Arduino

Pasul 2: Explicație a metodei cu comutare multiplă

Explicație a metodei cu comutare multiplă
Explicație a metodei cu comutare multiplă

Această secțiune discută conceptele subiacente pentru metoda multi-switch și dezvoltă ecuațiile necesare pentru calcularea independentă a identificatorilor unici pentru fiecare dintre cele 16 configurații posibile de setare a switch-ului dip. Acești identificatori pot fi utilizați apoi într-un program de aplicație pentru a asocia o configurație a comutatorului cu o acțiune. De exemplu, s-ar putea să doriți setarea - comutați 1, opriți 2, opriți 3, opriți 4 (1, 0, 0, 0) - pentru a juca Amazing Grace și (0, 1, 0, 0) pentru a juca Leul doarme în seara asta. Pentru concizie și concizie, identificatorii de configurație sunt denumiți comparatori în restul documentului.

Imagine
Imagine

Conceptul fundamental pentru metoda multi-switch este circuitul divizor de tensiune care constă din 2 rezistențe în serie conectate la o tensiune de intrare. Conductorul de tensiune de ieșire este conectat între rezistențe, R1 și R2, așa cum se arată mai sus. Tensiunea de ieșire a separatorului este calculată ca tensiune de intrare înmulțită cu raportul rezistenței R2 la suma lui R1 și R2 (ecuația 1). Acest raport este întotdeauna mai mic de 1, astfel încât tensiunea de ieșire este întotdeauna mai mică decât tensiunea de intrare.

După cum se indică în schema de proiectare de mai sus, comutatorul multiplu este configurat ca un divizor de tensiune cu R2 fix și R1 egală cu rezistența compozită / echivalentă pentru cele 4 rezistențe de comutator dip. Valoarea lui R1 depinde de ce comutatoare dip sunt activate și, prin urmare, contribuie la rezistența compozitului. Deoarece rezistențele de comutator dip sunt în paralel, ecuația de calcul a rezistenței echivalente este menționată în termeni de reciprocități ale rezistențelor componente. Pentru configurația noastră și pentru cazul în care toate comutatoarele sunt activate, ecuația devine

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

dând R1 = 5333,33 volți. Pentru a ține cont de faptul că majoritatea setărilor au cel puțin unul dintre comutatoare dezactivate, starea comutatorului este utilizată ca multiplicator:

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

unde multiplicatorul de stat, seu, este egal cu 1 dacă comutatorul este pornit și egal cu 0 dacă comutatorul este oprit. R1 acum poate fi folosit pentru a calcula raportul de rezistență necesar în ecuația 1. Folosind cazul în care toate comutatoarele sunt pornite ca exemplu din nou

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

Ultimul pas în calcularea valorii comparatoare prezise este multiplicarea RATIO cu 1023 pentru a emula efectul funcției analogRead. Identificatorul cazului în care toate comutatoarele sunt activate este atunci

comparator15 = 1023*.6522 = 667

Toate ecuațiile sunt acum la locul lor pentru calcularea identificatorilor pentru cele 16 setări posibile ale comutatorului. A rezuma:

  1. R1 se calculează folosind ecuația 2
  2. R1 și R2 sunt utilizate pentru a calcula raportul de rezistență asociat
  3. RAPORTUL este înmulțit cu 1023 pentru a obține valoarea de comparare
  4. opțional, tensiunea de ieșire prezisă poate fi calculată și ca RATIO * Vin

Setul de comparatoare depinde doar de valorile rezistenței utilizate pentru divizorul de tensiune și reprezintă o semnătură unică pentru configurație. Deoarece tensiunile de ieșire ale divizorului vor fluctua de la rulare la rulare (și citite pentru citire), unic în acest context înseamnă că, deși două seturi de identificatori pot să nu fie exact aceiași, acestea sunt suficient de apropiate încât diferențele comparatorului de componente se încadrează într-o mică interval specificat. Parametrul dimensiunii intervalului trebuie să fie ales suficient de mare pentru a ține cont de fluctuațiile așteptate, dar suficient de mic pentru a nu se suprapune diferite setări ale comutatorului. De obicei, 7 funcționează bine pentru intervalul de jumătate de lățime.

Un set de comparatoare pentru o anumită configurație poate fi obținut prin mai multe metode - rulați programul demonstrativ și înregistrați valorile pentru fiecare setare; folosiți foaia de calcul din secțiunea următoare pentru a calcula; copiați un set existent. Așa cum s-a menționat mai sus, toate seturile vor fi cel mai probabil ușor diferite, dar ar trebui să funcționeze. Vă sugerez să folosiți setul de identificatori al autorului metodei pentru configurarea multi-switch și foaia de calcul din secțiunea următoare, dacă oricare dintre rezistențe este modificat semnificativ sau se adaugă mai multe rezistențe.

Următorul program demonstrativ ilustrează utilizarea comparatoarelor pentru a identifica setarea curentă a comutatorului dip. În fiecare ciclu de program se efectuează o citire analogică pentru a obține un identificator pentru configurația curentă. Acest identificator este apoi comparat în lista comparatoare până când se găsește o potrivire sau lista este epuizată. Dacă se găsește o potrivire, se emite un mesaj de ieșire pentru verificare; dacă nu este găsit, se emite un avertisment. O întârziere de 3 secunde este introdusă în buclă, astfel încât fereastra de ieșire serială să nu fie copleșită de mesaje și să acorde ceva timp pentru a reseta configurația dip switch-ului.

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

// Demo program pentru a citi ieșirea divizorului de tensiune și utilizați-l pentru a identifica // configurația curentă a comutatorului dip prin căutarea valorii de ieșire în sus într-o serie de // valori de comparație pentru fiecare setare posibilă. Valorile din matricea de căutare pot // fie să fie obținute dintr-o rulare anterioară pentru configurație, fie prin calcul // pe baza ecuațiilor subiacente. // ------------------------------------------------ -------------------------------------- int comparator [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Definiți variabilele de procesare int dipPin = A0; // pin analogic pentru intrarea divizorului de tensiune int dipIn = 0; // deține ieșirea tensiunii divizorului tradusă prin analogRead int count = 0; // loop counter int epsilon = 7; // interval de comparație jumătate de lățime bool dipFound = false; // adevărat dacă ieșirea divizorului de tensiune de curent se găsește în tabelul de căutare void setup () {pinMode (dipPin, INPUT); // configurați pinul divizor de tensiune ca INPUT Serial.begin (9600); // active serial communication} void loop () {delay (3000); // păstrați ieșirea de la derulare prea rapid // Inițializați parametrii de căutare număr = 0; dipFound = false; // Citiți și documentați tensiunea de ieșire curentă dipIn = analogRead (dipPin); Serial.print ("ieșire divizor"); Serial.print (dipIn); // Căutați lista comparatoare pentru valoarea curentă în timp ce ((număr <16) && (! DipFound)) {if (abs (dipIn - comparator [număr]) <= epsilon) {// a găsit-o dipFound = adevărat; Serial.print („găsit la intrare”); Serial.print (număr); Serial.println ("valoare" + Șir (comparator [număr])); pauză; } conta ++; } if (! dipFound) {// valoarea nu este în tabel; nu ar trebui să se întâmple Serial.println ("OOPS! Nu a fost găsit; mai bine sunați Ghost Busters"); }}

Pasul 3: Foaie de calcul comparator

Imagine
Imagine

Calculele pentru cele 16 valori de comparare sunt date în foaia de calcul prezentată mai sus. Fișierul Excel însoțitor este disponibil pentru descărcare în partea de jos a acestei secțiuni.

Coloanele A-D ale foii de calcul înregistrează valorile rezistenței switch-ului dip și cele 16 setări posibile ale switch-ului. Vă rugăm să rețineți că comutatorul DIP hardware afișat în diagrama de proiectare fritzing este de fapt numerotat de la stânga la dreapta în loc de numerotarea de la dreapta la stânga afișat în foaia de calcul. Mi s-a părut oarecum confuz, dar alternativa nu pune configurația „1” (0, 0, 0, 1) la prima listă. Coloana E folosește formula 2 din secțiunea anterioară pentru a calcula rezistența echivalentă R a divizorului de tensiune1 pentru setare. Coloana F utilizează acest rezultat pentru a calcula raportul de rezistență asociat și, în cele din urmă, coloana G înmulțește RATIO cu valoarea analogRead max (1023) pentru a obține valoarea de comparare prezisă. Ultimele 2 coloane conțin valorile reale dintr-o rulare a programului demonstrativ, împreună cu diferențele dintre valorile prezise și cele reale.

Secțiunea anterioară menționează trei metode pentru a obține un set de valori de comparare, inclusiv extinderea acestei foi de calcul, dacă valorile rezistenței sunt modificate semnificativ sau se adaugă mai multe comutatoare. Se pare că diferențele mici în valorile rezistenței nu afectează în mod semnificativ rezultatele finale (ceea ce este bun, deoarece specificațiile rezistenței oferă o toleranță, să zicem 5%, iar rezistența este rar egală cu valoarea sa declarată reală).

Pasul 4: Joacă un Tune

Cântă o melodie
Cântă o melodie

Pentru a ilustra modul în care tehnica multi-switch ar putea fi utilizată într-o aplicație, programul demonstrativ de comparație din secțiunea „Explicație metodă” este modificat pentru a implementa procesarea selecției melodiei pentru programul de muzică. Configurația actualizată a aplicației este prezentată mai sus. Singura adăugare la hardware este un buzzer piezoactiv pasiv pentru a reda melodia selectată. Schimbarea de bază a software-ului este adăugarea unei rutine pentru a reda o melodie, odată identificată, folosind buzzer-ul și rutina tonurilor Arduino.

Fragmentele de melodie disponibile sunt conținute într-un fișier de antet, Tunes.h, împreună cu definirea structurilor de suport necesare. Fiecare melodie este definită ca o serie de structuri legate de notă care conțin frecvența și durata notei. Frecvențele notelor sunt conținute într-un fișier de antet separat, Pitches.h. Fișierele cu antet și program sunt disponibile pentru descărcare la sfârșitul acestei secțiuni. Toate cele trei fișiere ar trebui plasate în același director.

Selecția și identificarea se desfășoară după cum urmează:

  1. „Utilizatorul” setează comutatoarele dip în configurația asociată cu tonul dorit
  2. la fiecare ciclu de buclă de program, identificatorul pentru setarea curentă a comutatorului dip este obținut prin analogRead
  3. Identificatorul de configurare al pasului 2 este comparat cu fiecare dintre comparatoarele din lista de melodii disponibile
  4. Dacă se găsește o potrivire, rutina playTune este apelată cu informațiile necesare pentru a accesa lista de note de acord

    Folosind funcția de ton Arduino, fiecare notă este redată prin buzzer

  5. Dacă nu se găsește nicio potrivire, nu se iau măsuri
  6. repetați 1-5

Setările comutatorului DIP pentru melodiile disponibile sunt afișate în tabelul de mai jos, unde 1 înseamnă că comutatorul este pornit, 0 oprit. Amintiți-vă că modul în care este orientat comutatorul dip pune comutatorul 1 în poziția cea mai la stânga (cea asociată cu rezistorul 80K).

NUME Comutatorul 1 Comutatorul 2 Comutatorul 3 Comutatorul 4
Danny Boy 1 0 0 0
Ursulețul 0 1 0 0
Leul doarme în seara asta 1 1 0 0
Nimeni nu cunoaște problemele 0 0 1 0
Amazing 0 0 0 1
Spațiu liber 1 0 0 1
MockingBird Hill 1 0 1 1

Calitatea sunetului de la un buzzer piezo cu siguranță nu este excelentă, dar este cel puțin recunoscută. De fapt, dacă tonurile sunt măsurate, acestea sunt foarte apropiate de frecvența exactă a notelor. O tehnică interesantă utilizată în program este stocarea datelor de reglare în secțiunea de memorie flash / program în loc de secțiunea de memorie de date implicită utilizând directiva PROGMEM. Secțiunea de date conține variabilele de procesare a programului și este mult mai mică, în jur de 512 octeți pentru unele dintre microcontrolerele ATtiny.

Recomandat: