Sadržaj:
2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-13 06:57
Neko vrijeme sam radio na projektu "muzičke kutije" koji je trebao birati između čak 10 različitih isječaka melodija. Prirodan izbor za odabir određene melodije bio je 4 -pinski dip prekidač jer 4 prekidača pružaju 24= 16 različitih postavki. Međutim, implementacija grube sile za ovaj pristup zahtijeva 4 pina uređaja, po jedan za svaki prekidač. Budući da sam planirao koristiti ATtiny85 za razvoj, gubitak 4 pina bio je previše. Srećom, naletio sam na članak koji opisuje genijalnu metodu korištenja 1 analognog pina za rukovanje višestrukim ulazima prekidača.
Tehnika s više prekidača; 1 ulaz koristi krug razdjelnika napona za osiguravanje jedinstvene cjelobrojne vrijednosti za svaku od 16 mogućih kombinacija postavki prekidača. Ovaj skup od 16 cjelobrojnih identifikatora tada se koristi u aplikacijskom programu za povezivanje radnje s postavkom.
Ovaj instruktor koristi metodu više prekidača za implementaciju odabira melodije za aplikaciju muzičke kutije. Odabrana melodija tada se reproducira kroz piezo zvučni signal pomoću funkcije Arduino tona.
Korak 1: Potreban hardver
Korištenje UNO -a kao implementacijske platforme minimizira broj potrebnih hardverskih komponenti. Implementacija metode ulaza s više prekidača zahtijeva samo 4-pinski dip prekidač, 5 otpornika koji se koriste za razdjelnik napona i priključnu žicu za povezivanje. Konfiguraciji je dodan piezo zujalica za implementaciju birača melodija muzičke kutije. Opcionalno, ovisno o vrsti upotrijebljene dip sklopke, korisno je koristiti 2x4 8 -polnu utičnicu za spajanje dip prekidača na matičnu ploču jer izgleda da su standardni pinovi prekidača napravljeni za lemljenje na ploču koja se ne priključuje direktno na ploču. Utičnica stabilizuje veze dip prekidača i sprečava lako podizanje prekidača pri postavljanju prekidača.
Ime | Mogući izvor | Kako se koristi |
---|---|---|
4-polni dip prekidač | Odabir melodije | |
2x4 pinska utičnica (opcionalno) | Amazon | Stubovi na većini dip prekidača ne drže prekidač baš dobro na ploči. Utičnica čini vezu jačom. Alternativa je pronaći dip prekidač koji je zaista napravljen za upotrebu na matičnoj ploči s običnim IC pinovima. |
otpornici:
|
Ugradite razdjelnik napona | |
pasivni piezo zujalica | Amazon | Pustite melodiju koju pokreće aplikacija putem Arduino tonske funkcije |
Korak 2: Objašnjenje metode s više prekidača
U ovom odjeljku raspravlja se o temeljnim konceptima za metodu više prekidača i razvijaju se jednadžbe potrebne za samostalno izračunavanje jedinstvenih identifikatora za svaku od 16 mogućih konfiguracija postavki dip prekidača. Ti se identifikatori tada mogu koristiti u aplikacijskom programu za povezivanje konfiguracije prekidača s radnjom. Na primjer, možda biste htjeli postavku - uključite 1, isključite 2, isključite 3, isključite 4 (1, 0, 0, 0) - za reprodukciju Amazing Grace i (0, 1, 0, 0) za reprodukciju Lav spava noćas. Radi sažetosti i konciznosti, identifikatori konfiguracije se u ostatku dokumenta nazivaju uporednicima.
Temeljni koncept metode s više sklopki je krug razdjelnika napona koji se sastoji od 2 uzastopna otpornika spojena na ulazni napon. Izlazni naponski vod spojen je između otpornika, R1 i R.2, kao što je gore prikazano. Izlazni napon razdjelnika izračunava se kao ulazni napon pomnožen omjerom otpornika R2 na zbir R1 i R.2 (jednačina 1). Ovaj omjer je uvijek manji od 1 pa je izlazni napon uvijek manji od ulaznog napona.
Kao što je naznačeno na dijagramu dizajna iznad, višeprekidač je konfiguriran kao razdjelnik napona s R2 fiksni i R1 jednaka kompozitnom/ekvivalentnom otporu za 4 otpornika otpornika. Vrijednost R1 ovisi o tome koji su dip prekidači uključeni i stoga doprinose kompozitnom otporu. Budući da su otpornici dip prekidača paralelni, jednadžba izračuna ekvivalentnog otpora navedena je u smislu recipročnih vrijednosti komponentnih otpornika. Za našu konfiguraciju i za slučaj da su svi prekidači uključeni, jednadžba postaje
1/R1 = 1/80000 + 1/40000 + 1/20000 + 1/10000
dajući R.1 = 5333,33 volti. Kako bi se uzela u obzir činjenica da većina postavki ima isključen barem jedan prekidač, stanje prekidača se koristi kao množitelj:
1/R1 = s1*1/80000 + s2*1/40000 + s3*1/20000 + s4*1/10000 (2)
gdje je multiplikator stanja, si, je jednak 1 ako je prekidač uključen i jednak 0 ako je prekidač isključen. R1 sada se može koristiti za izračunavanje omjera otpora potrebnog u jednadžbi 1. Koristeći kao primjer opet slučaj da su svi prekidači uključeni
Omjer = R2/(R.1+R2) = 10000/(5333.33+10000) =.6522
Posljednji korak u izračunavanju predviđene vrijednosti usporedbe je množenje RATIO sa 1023 kako bi se oponašao učinak funkcije analogRead. Tada je identifikator za slučaj da su svi prekidači uključeni
komparator15 = 1023*.6522 = 667
Sada su sve jednadžbe za izračunavanje identifikatora za 16 mogućih postavki prekidača. Da rezimiramo:
- R1 izračunava se pomoću jednadžbe 2
- R1 i R.2 koriste se za izračun pridruženog otpora RATIO
- RATIO se množi sa 1023 da bi se dobila vrijednost usporedbe
- opcionalno, predviđeni izlazni napon se također može izračunati kao RATIO*Vin
Skup komparatora ovisi samo o vrijednostima otpornika koji se koriste za razdjelnik napona i jedinstveni su potpis za konfiguraciju. Budući da će izlazni naponi razdjelnika varirati od trčanja do trčanja (i čitati za čitanje), jedinstveno u ovom kontekstu znači da, iako dva skupa identifikatora možda nisu potpuno isti, oni su dovoljno blizu da razlike komparatora komponenti spadaju u male pred- određeni interval. Parametar veličine intervala mora biti izabran dovoljno velik da uzme u obzir očekivane fluktuacije, ali dovoljno mali da se različite postavke prekidača ne preklapaju. Obično 7 radi dobro za interval po širini.
Skup komparatora za određenu konfiguraciju može se dobiti na nekoliko metoda - pokrenite demo program i zabilježite vrijednosti za svaku postavku; koristite proračunsku tablicu u sljedećem odjeljku za izračun; kopirajte postojeći skup. Kao što je gore navedeno, svi setovi će se vjerojatno malo razlikovati, ali bi trebali funkcionirati. Predlažem korištenje autorskog skupa identifikatora metode za postavljanje više prekidača i proračunsku tablicu iz sljedećeg odjeljka ako se neki od otpornika značajno promijeni ili se doda više otpornika.
Sljedeći demo program prikazuje upotrebu komparatora za identifikaciju trenutne postavke dip prekidača. U svakom programskom ciklusu izvodi se analogno čitanje radi dobivanja identifikatora za trenutnu konfiguraciju. Ovaj se identifikator zatim uspoređuje na cijeloj listi usporednika sve dok se ne pronađe podudaranje ili dok se lista ne iscrpi. Ako se pronađe podudaranje, izdaje se izlazna poruka radi provjere; ako se ne pronađe, izdaje se upozorenje. U petlju je umetnuto kašnjenje od 3 sekunde tako da prozor serijskog izlaza neće biti zatrpan porukama i da ima vremena za resetiranje konfiguracije dip prekidača.
//-------------------------------------------------------------------------------------
// Demo program za čitanje izlaza razdjelnika napona i njegovu upotrebu za identifikaciju // trenutne konfiguracije dip prekidača gledajući izlaznu vrijednost prema gore u nizu // usporednih vrijednosti za svaku moguću postavku. Vrijednosti u nizu za traženje mogu se // dobiti ili iz prethodnog izvođenja za konfiguraciju ili izračunavanjem // na temelju temeljnih jednadžbi. // ------------------------------------------------ -------------------------------------- int komparator [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Definiranje varijabli obrade int dipPin = A0; // analogni pin za ulaz razdjelnika napona int dipIn = 0; // drži izlaz napona razdjelnika preveden analogRead int count = 0; // brojač petlji int epsilon = 7; // interval usporedbe poluširine bool dipFound = false; // istina ako je trenutni izlaz razdjelnika napona pronađen u tablici potrage void setup () {pinMode (dipPin, INPUT); // konfiguriramo pin razdjelnika napona kao INPUT Serial.begin (9600); // omogući serijsku komunikaciju} void loop () {delay (3000); // sprečava prebrzo pomicanje rezultata // Pokretanje parametara pretraživanja count = 0; dipFound = false; // Čitanje i dokumentiranje izlaznog napona struje dipIn = analogRead (dipPin); Serial.print ("izlaz razdjelnika"); Serial.print (dipIn); // Pretražujemo usporednu listu za trenutnu vrijednost while ((count <16) && (! DipFound)) {if (abs (dipIn - komparator [count]) <= epsilon) {// pronašao je dipFound = true; Serial.print ("pronađeno na ulazu"); Serial.print (count); Serial.println ("value" + String (komparator [broj])); break; } count ++; } if (! dipFound) {// vrijednost nije u tablici; ne bi trebalo da se dogodi Serial.println ("OOPS! Nije pronađeno; bolje nazovite Ghost Busters"); }}
Korak 3: Uporedna tabela
Izračuni za 16 usporednih vrijednosti dati su u gore prikazanoj proračunskoj tablici. Priložena excel datoteka dostupna je za preuzimanje na dnu ovog odjeljka.
Kolone proračunske tablice A-D bilježe vrijednosti otpornika dip prekidača i 16 mogućih postavki prekidača. Imajte na umu da je hardverski DIP prekidač prikazan na dijagramu dizajna fritzinga zapravo numeriran slijeva nadesno umjesto numeracije zdesna nalijevo prikazano u proračunskoj tablici. Ovo me je pomalo zbunjivalo, ali alternativa ne stavlja konfiguraciju "1" (0, 0, 0, 1) na prvo mjesto liste. Kolona E koristi formulu 2 iz prethodnog odjeljka za izračun ekvivalentnog otpora razdjelnika napona R1 za postavku. Kolona F koristi ovaj rezultat za izračunavanje pridruženog otpora RATIO, i na kraju, kolona G množi RATIO s maksimalnom vrijednosti analognog čitanja (1023) kako bi se dobila predviđena vrijednost usporedbe. Zadnje 2 kolone sadrže stvarne vrijednosti iz izvođenja demo programa, zajedno s razlikama između predviđenih i stvarnih vrijednosti.
U prethodnom odjeljku spominju se tri metode za dobijanje skupa vrijednosti usporedbe, uključujući proširenje ove proračunske tablice ako se vrijednosti otpornika značajno promijene ili se doda više prekidača. Čini se da male razlike u vrijednostima otpornika ne utječu značajno na konačne rezultate (što je dobro jer specifikacije otpornika daju toleranciju, recimo 5%, a otpornik je rijetko jednak stvarnoj navedenoj vrijednosti).
Korak 4: Pustite melodiju
Da bi se ilustriralo kako se tehnika s više prekidača može koristiti u aplikaciji, demo program za usporedbu iz odjeljka "Objašnjenje metode" modificiran je kako bi se implementirala obrada odabira melodije za program muzičke kutije. Ažurirana konfiguracija aplikacije prikazana je gore. Jedini dodatak hardveru je pasivni piezo zujalica za reprodukciju odabrane melodije. Osnovna promjena u softveru je dodavanje rutine za reprodukciju melodije, jednom identificirane, upotrebom zujalice i Arduino tonske rutine.
Dostupni isječci melodija sadržani su u datoteci zaglavlja, Tunes.h, zajedno s definicijom potrebnih struktura podrške. Svaka melodija je definirana kao niz nota povezanih struktura koje sadrže frekvenciju note i trajanje. Bilješke se nalaze u zasebnoj datoteci zaglavlja, Pitches.h. Datoteke programa i zaglavlja dostupne su za preuzimanje na kraju ovog odjeljka. Sve tri datoteke treba smjestiti u isti direktorij.
Odabir i identifikacija odvijaju se na sljedeći način:
- "Korisnik" postavlja dip prekidače u konfiguraciju povezanu sa željenom melodijom
- svaki ciklus programske petlje identifikator za trenutnu postavku dip prekidača dobiva se putem analognog čitanja
- Identifikator konfiguracije koraka 2 uspoređuje se sa svakim od usporednika na dostupnoj listi melodija
-
Ako se pronađe podudaranje, poziva se rutina playTune s podacima potrebnim za pristup popisu nota za melodiju
Korištenjem Arduino tonske funkcije svaka se nota svira putem zujalice
- Ako se ne pronađe podudaranje, ništa se ne poduzima
- ponovite 1-5
Postavke DIP prekidača za dostupne melodije prikazane su u donjoj tablici gdje 1 znači da je prekidač uključen, 0 isključen. Podsjetimo da način na koji je dip prekidač orijentiran postavlja prekidač 1 u krajnji lijevi položaj (onaj povezan sa 80K otpornikom).
NAME | Prekidač 1 | Prekidač 2 | Prekidač 3 | Prekidač 4 |
Danny Boy | 1 | 0 | 0 | 0 |
Mali medvjed | 0 | 1 | 0 | 0 |
Lav spava noćas | 1 | 1 | 0 | 0 |
Niko ne zna za nevolju | 0 | 0 | 1 | 0 |
Amazing Grace | 0 | 0 | 0 | 1 |
Prazan prostor | 1 | 0 | 0 | 1 |
MockingBird Hill | 1 | 0 | 1 | 1 |
Kvaliteta zvuka iz piezo zvučnika svakako nije sjajna, ali je barem prepoznatljiva. U stvari, ako se tonovi mjere, oni su vrlo blizu točnoj frekvenciji nota. Jedna zanimljiva tehnika koja se koristi u programu je pohranjivanje podataka o podešavanju u odjeljak flash/programske memorije umjesto zadanog odjeljka memorije podataka pomoću PROGMEM direktive. Odeljak sa podacima sadrži promenljive za obradu programa i mnogo je manji, oko 512 bajtova za neke od ATtiny mikrokontrolera.