Bolea Alexandru Ionut Ism 2020 [608361]
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI
ELECTRONICĂ
DEPARTAMENTUL DE AUTOMATICĂ ȘI ELECTRONICĂ
PROIECT DE DIPLOMĂ
Bolea Alexandru -Ionuț
COORDONATOR ȘTIINȚIFIC
Conf . Dr. Ing. Ionuț Cristian Resceanu
Iunie 2020
CRAIOVA
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI
ELECTRONICĂ
DEPARTAMENTUL DE AUTOMATICĂ ȘI ELECTRONICĂ
Sistem integrat pentru reprezentarea nivelului de
semnal in echipamentele audio
Bolea Alexandru -Ionuț
COORDONATOR ȘTIINȚIFIC
Conf . Dr. Ing. Ionuț Cristian Resceanu
Iunie 2020
CRAIOVA
„Învățătura este o comoară care își urmează stăpânul pretutindeni .”
Proverb popular
DECLARAȚIE DE ORIGINALITATE
Subsemnatul Bolea Alexandru -Ionuț student: [anonimizat], Calculatoare și Electronică a Universit ății din Craiova, certific prin prezenta
că am luat la cunoșt ință de cele prezentate mai jos și că î mi asum, în acest context, originalita tea
proiectului meu de licență :
• cu titlul Sistem integrat pentru reprezentarea nivelului de semnal in echip amentele audio
• coordonată de Conf. Dr. Ing. Ionuț Cristian Resceanu ,
• prezentată în sesiunea Iulie 2020.
La elaborarea proiectului de licență, se consideră plagiat una dintre următoarele acțiuni:
• reproducerea exactă a cuvintelor unui alt autor, dintr -o altă lucrare, în limba română sau prin
traducere dintr -o altă limbă, dacă se omit ghilimele și referința precisă,
• redarea cu alte cuvinte, reformularea prin cuvinte proprii sau rezumarea ideilor din alte lucrări ,
dacă nu se indică sursa bibliografică,
• prezentarea unor date experimentale obținute sau a unor aplicații realizate de alți autori fără
menționarea corectă a acestor surse,
• însușirea totală sau parțială a unei lucrări în care regulile de mai sus sunt respectate, dar care
are alt autor.
Pentru evitarea acest or situații neplăcute se recomandă:
• plasarea într e ghilimele a citatelor directe și indicarea referinței într -o listă corespunzătoare la
sfărșitul l ucrării,
• indicarea în text a reformulării unei idei, opinii sau teorii și corespunzător în lista de referințe a
sursei originale de la care s -a făcut preluarea,
• precizarea sursei de la care s -au preluat date experimentale, descrieri tehnice, figuri, imag ini,
statistici, tabele et caetera ,
• precizarea referințelor poate fi omisă dacă se folosesc informații sau teorii arhicunoscute, a
căror paternitate este unanim cunoscută și acceptată.
Data , Semnătura candidat: [anonimizat] ,
20.06.2020
UNIVERSITA TEA DIN CRAIOVA
Facultatea de Automatică, Calculatoare și Electronică
Departamentul de Automatică și Electronică
Aprobat la data de
…………………
Director de
departament,
Prof. dr. ing.
Cosmin IONETE
PROIECTUL DE DIPLOMĂ
Numele și prenumele student: [anonimizat]/ –
ei:
Bolea Alexandru -Ionuț
Enunțul temei:
Sistem integrat pentru reprezentarea nivelului de semnal în
echipamentele audio
Datele de pornire:
Pasiunea pentru LED -uri RGB și muzică
Conținutul proiectului :
În conținutul lucrării am urmărit următoarele puncte :
– descrierea generala a pl ăcutei arduino
– prezentarea microcontroler olelor
pricipii de funcționare a diverselor componente hardware
Material grafic obligatoriu:
Imagini , scheme,componente hardware ,diagram ă bloc
Consultații:
Saptămanale
Conducătorul științific
(titlul, nume și prenume,
semnătura): Conf. Dr. Ing. Ionuț Cristian Resceanu
Data eliberării temei :
27.10.2019
Termenul estimat de predare a
proiectului :
20.06.2020
Data predării proiectului de către
student și semnătura acestuia: 20.06.2020
UNIVERSITATEA DIN CRAIOVA
Facultatea de Automatică, Calculatoare și Electronică
Departamentul de Automatică și Electronică
REFERATUL CONDUCĂTORULUI ȘTIINȚIFIC
Numele și prenumele candidatului: Bolea Alexandru -Ionuț
Specializarea: Ingineria sistemelor multimedia
Titlul proiectului : Sistem integrat pentru reprezentarea nivelului de semnal in
echipamentele audio
Locația în care s -a realizat practica de
documentare (se bifează una sau mai
multe din opțiunile din dreapta): În facultate □
În producție □
În cercetare □
Altă locație: [ se detaliază ]
În urma analizei lucrării candidatului au fost constatate următoarele:
Nivelul documentării Insuficient
□ Satisfăcător
□ Bine
□ Foarte bine
□
Tipul proiectului Cercetare
□ Proiectare
□ Realizare
practică □ Altul
[se detaliază ]
Aparatul matematic utilizat Simplu
□ Mediu
□ Complex
□ Absent
□
Utilitate Contract de
cercetare □ Cercetare
internă □ Utilare
□ Altul
[se detaliază ]
Redactarea lucrării Insuficient
□ Satisfăcător
□ Bine
□ Foarte bine
□
Partea grafică, desene Insuficient ă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Realizarea
practică Contribuția autorului Insuficientă
□ Satisfăcătoare
□ Mare
□ Foarte mare
□
Complexitatea
temei Simplă
□ Medie
□ Mare
□ Complexă
□
Analiza cerințelor Insuficient
□ Satisfăcător
□ Bine
□ Foarte bine
□
Arhitectura Simplă
□ Medie
□ Mare
□ Complexă
□
Întocmirea
specificațiilor
funcționale Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Implementarea Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Testarea Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Funcționarea Da
□ Parțială
□ Nu
□
Rezultate experimentale Experiment propriu
□ Preluare din bibliografie
□
Bibliografie Cărți
Reviste
Articole
Referințe
web
Comentarii
și
observații
În concluzie, se propune:
ADMITEREA PROIECTULUI
□ RESPINGEREA PROIECTULUI
□
Data, Semnătura conducătorului științific,
20.06.2020
REZUMATUL PROIECTULUI
Puncul de pornire acestui proiect a fost pasiunea mea pentru lumini RGB dar și pentru muzică.Acesta
constă în realizarea unui proiect arduino cu un microcontroler ATmega328p(Arduino Nano).Reprezintă
reglarea luminozității cât și regralrea sensibilității dar și r eprezentarea nivelului de semnal pe cele două
ring-uri LED.
Cu ajutorul acestui proiect am dezvoltat noi cunoștințe de electronică și programare în arduino cu care
nu am lucrat foarte mult dar pe parcurul anilor a început să mă atragă.
Una din problem ele întâmpinate pe parcursul derulării proiectului a fost arderea unei plăcute arduino
din neatenție , dar prin înlocuirea plăcuței am remediat problema. O altă problema a fost nefunctionarea
corectă a unui potențiometru, dar s -a rezolvat rapid deoarece am avut altul la schimb.
Termenii cheie : [microcontroler ,arduino ].
CUPRINSUL
1 INTRODUCERE ARDUINO ………………………….. ………………………….. ………………………….. …………………. 1
1.1 ISTORIC ………………………….. ………………………….. …………………….. ERROR ! BOOKMARK NOT DEFINED .
1.2 CE ESTE ARDUINO ………………………….. ………………………….. ………………………….. ………………………….. … 2
1.3 HARDWARE ………………………….. ………………………….. ………………………….. ………………………….. ………… 3
2 REPREZENTAREA NIVELULUI DE SEMNAL(VU) ………………………….. ………………………….. ……….. 5
2.1 CE ESTE NIVELUL DE SEMNAL ………………………….. ………………………….. ………………………….. ……………. 5
2.2 SCURT ISTORIC ………………………….. ………………………….. ………………………….. ………………………….. ……. 6
2.3 SUNETUL STEREO ………………………….. ………………………….. ………………………….. ………………………….. … 6
2.4 CARACTERISTICI STANDARD ………………………….. ………………………….. ………………………….. ……………… 7
2.4.1 Nivel de referin ță ………………………….. ………………………….. ………………………….. ………………………… 7
2.4.2 Timp de cre ștere ………………………….. ………………………….. ………………………….. …………………………. 7
2.4.3 Răspuns în frecven ță ………………………….. ………………………….. ………………………….. ……………………. 7
2.4.4 Impendan ța ………………………….. ………………………….. ………………………….. ………………………….. ……. 8
3 PROIECTUL PROPRIU -ZIS ………………………….. ………………………….. ………………………….. ………………… 9
3.1 COMPONENTE ………………………….. ………………………….. ………………………….. ………………………….. …….. 9
3.2 ASAMBLARE ………………………….. ………………………….. ………………………….. ………………………….. …….. 11
3.3 DESPRE COMPONENTE ………………………….. ………………………….. ………………………….. …………………….. 11
3.3.1 Arduino nano ………………………….. ………………………….. ………………………….. ………………………….. .. 11
3.3.2 Poten țiometru ………………………….. ………………………….. ………………………….. ………………………….. . 13
3.3.3 Buton ………………………….. ………………………….. ………………………….. ………………………….. …………… 14
3.3.4 Rezistor ………………………….. ………………………….. ………………………….. ………………………….. ……….. 14
3.3.5 Condensator ………………………….. ………………………….. ………………………….. ………………………….. …. 15
4 ARHITECTURA MICROCONTROLERELOR ………………………….. ………………………….. ……………….. 16
4.1 CONTROLER ………………………….. ………………………….. ………………………….. ………………………….. ……… 16
4.2 MICROCONTROLER ………………………….. ………………………….. ………………………….. ………………………… 16
4.2.1 Unitatea centrală de procesare (UCP) ………………………….. ………………………….. ……………………… 17
4.2.2 Unitatea aritmetică și logică (UAL) ………………………….. ………………………….. …………………………. 17
4.2.3 Unitatea de comanda și control (UCC) ………………………….. ………………………….. …………………….. 18
4.2.4 Unitatea centrală de prelucrare ………………………….. ………………………….. ………………………….. ….. 18
4.2.5 Accumulator, numărător de program, indicator de stivă ………………………….. …………………………. 18
4.2.6 Tipuri de arhitecturi și magistrale ………………………….. ………………………….. ………………………….. .. 19
4.2.7 Memoria ………………………….. ………………………….. ………………………….. ………………………….. ………. 19
4.2.8 Dispozitive I/O ………………………….. ………………………….. ………………………….. ………………………….. 20
4.2.9 Sistemul de întreruperi ………………………….. ………………………….. ………………………….. ……………….. 21
5 CONCLUZII ………………………….. ………………………….. ………………………….. ………………………….. ………….. 23
6 BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. ………………………….. …….. 24
7 REFERINȚE WEB ………………………….. ………………………….. ………………………….. ………………………….. …. 25
A. CODUL SURSĂ ………………………….. ………………………….. ………………………….. ………………………….. ……… 26
B. SITE -UL WEB AL PROIECTULUI ………………………….. ………………………….. ………………………….. …….. 38
C. CD / DVD ………………………….. ………………………….. ………………………….. ………………………….. ……………….. 39
INDEX ………………………….. ………………………….. ………………………….. ………………………….. ………………………….. . 40
LISTA FIGURILOR
FIGURA 1. PLĂCUȚĂ ARDUINO CU O INTERFAȚĂ SERIALĂ RS-232 ȘI UN CIP DE MICROCONTROLER ATMEL
ATMEGA 8 ………………………….. ………………………….. ………………………….. ………………………….. ………………….. 4
FIGURA 2. APARAT ANALOGIC DE MĂSURARE A NIVELULUI DE SEMNAL ………………………….. ………………………….. 6
FIGURA 3. CUM FUNCȚIONEAZĂ SISTEMUL STEREO ………………………….. ………………………….. ………………………….. 7
FIGURA 4. RĂSPUNSUL UNUI APARAT VU (LINIE NEAGRĂ ) ÎN COMPARAȚIE CU NIVELUL DE INTRARE INSTANTANEE
(ZONA GRI ) A UNUI RITM DE TOBE . NIVELUL ESTE ÎN D B ȘI TIMPUL ESTE ÎN SECUNDE …………………………… … 8
FIGURA 5. SCHEMĂ ASAMBLARE ………………………….. ………………………….. ………………………….. ……………………. 11
FIGURA 6. SCHEMĂ PLACUTĂ ………………………….. ………………………….. ………………………….. ………………………… 12
FIGURA 7. ATMEGA 328P 32-PIN ………………………….. ………………………….. ………………………….. …………………….. 13
FIGURA 8. POTENTIOMETRU ………………………….. ………………………….. ………………………….. ………………………….. . 14
FIGURA 9. DIAGRAMA BLOC MICROCONTROLER ………………………….. ………………………….. ………………………….. … 17
LISTA TABELELOR
TABELUL 1. DESCRIERE PINI PLACA ARDUINO ………………………….. ………………………….. ………………………….. ……. 12
1
1 INTRODUCERE ARDUINO
1.1 Istoric
Arduino a început în 2005 ca un proiect al unui student al Institutului de Interacțiune a
Designului din Ivrea, Italia. La acea vreme studenții foloseau o plăcuță de dezvoltare BASIC
Stamp care costau 100 de dolari, ceea ce era considerat foarte s cump pentru studenți. Massimo
Banzi, unul dintre fon datori, era student la Ivrea. Numele "Arduino" provine de la un bar din
Ivrea, locul unde o parte din fondat ori obișnuiau să se întâlnească.
Studentul columbian Hernando Barragán a creat platforma de dezvoltare Wiring care a
servit ca bază pentru Arduino. După finalizarea platformei Wiring, mai multe versiu ni, mai
light și mai ieftine , au fost create și puse la dispoziția comunităților open -source. Din echipa
inițială Arduino au făcut parte Massimo Banzi, David Cuartielles, Tom Igoe, Gian luca Martino
și David Mellis.
După finalizarea platformei de cablare, versiunile mai ușoare și mai puțin costisitoare au
fost distribuite în comunitatea open -source.
La mijlocul anului 2011, a fost estimat că peste 300.000 de Arduinos oficiali au fost produși în
comerț , iar în 2013, 700.000 de comisii oficiale erau în mâinile utilizatorilor.
În octombrie 2016, Federico Musto, fostul director general al lui Arduino, a asigurat o
proprietate de 50% a companiei. În aprilie 2017, Wired a raportat că Musto și -a „fabricat
palmaresul academic … Pe site -ul companiei sale, pe conturile personale de LinkedIn și chiar
pe documentele de afaceri italiene, Musto a fost listat până de curâ nd ca dețin un doctorat de la
Massachusetts Institute of Technology. În unele cazuri, biografia sa a revendicat și un MBA de
la New York University ". Wired a raportat că niciun fel de universitate nu a înregistrat vreo
înregistrare a prezenței lui Musto ș i, mai târziu, Musto a recunoscut într -un interviu cu Wired
că nu a câștigat niciodată aceste diplome.
Cam în aceeași perioadă, Massimo Banzi a anunțat că Fundația Arduino va fi „un nou
început pentru Arduino.” Dar un an mai târziu, Fundația încă nu a fost înființată, iar starea
proiectului rămâne neclară. Controversele din jurul Musto au continuat atunci când, în iulie
2017, a scos multe licențe, scheme și coduri open source de pe site -ul Arduino, ceea ce a
determinat scrutinul și criza. În octombrie 2017, Arduino și -a anunțat parteneriatul cu ARM
Holdings (ARM). Anunțul spunea, în parte, „ARM a recunoscut independența ca valoare
2
esențială a Arduino … fără nicio blocare cu arhitectura ARM.” Arduino intenționează să
continue să lucreze cu toți furnizorii de tehnologie și arhitecturi.
1.2 Ce este Arduino
Arduino este o companie open -source care produce atât plăcuțe de dezvoltare bazate pe
microcontrolere, cât și partea de software destinată funcționării și programării acestora. Pe
lângă acestea include și o comunitate uriașă care se ocupă cu creația și distribuirea de proiecte
care au ca scop crearea de dispozitive care pot sesiza și controla diverse activităț i sau procese în
lumea reală.
Proiectul este bazat pe designul plăcilor cu microcontroler produse de câțiva furnizori,
folosind diverse tipuri de microcontrolere. Aceste plăci pun la dispoziția utilizatorului pini I/O,
digitali și analogici, care pot fi interfațați cu o gamă largă de plăcuțe numite scuturi (s hield -uri)
și/sau cu alte circuite. Plăcile au interfețe de comunicații seriale, inclusiv USB pe unele modele,
pentru a încărca programe din calculatorele personale. Pentru programarea microcontrolerelor,
Arduino vine cu un mediu de dezvoltare integrat (ID E) bazat pe proiectul Processing, care
include suport pentru limbaje de programare ca C și C++.
Primul Arduino a fost lansat în 2005, având ca țintă asigurarea unei soluții ieftine și simple
pentru începători și profesioniști spre a crea dispozitive capabile să interacționeze cu mediul,
folosind senzori și sisteme de acționare. Cele mai comune exemple sunt dispozitivele pentru
utilizatorii începători precum: roboții simpli, termostatele și/sau detectoarele de mișcare.
Plăcuțele Arduino sunt di sponibile comercial sub formă preasamblată sau sub forma unor
kit-uri de asamblat acasă (do -it-yourself). Specificațiile schemelor sunt disponibile pentru orice
utilizator, permițând oricui să fabrice plăcuțe Arduino. Adafruit Industries estimase la mijloc ul
anului 2011 că peste 300.000 de plăcuțe oficiale Arduino au fost produse, iar în 2013 700.000
de plăcuțe oficiale erau în posesia utilizatorilor .
3
1.3 Hardwar e
Majoritatea plăcilor Arduino constau dintr -un microcontroller AVR pe 8 biți Atmel (ATmeg a8,
ATmega168, ATmega328, ATmega1280 sau ATmega2560), cu cantități diferite de memorie flash,
pini și funcții. Arduino Due pe 32 de biți, bazat pe Atmel SAM3X8E a fost introdus în 2012. Plăcile
folosesc pini cu un singur rând sau dublu rând sau anteturi ca re facilitează conexiunile pentru
programare și încorporarea în alte circuite. Acestea se pot conecta cu module suplimentare cu scuturi
denumite scuturi. Scuturi multiple și, eventual, stivuite pot fi adresate individual printr -un autobuz
serial I²C. Major itatea plăcilor includ un regulator liniar de 5 V și un oscilator de cristal de 16 MHz
sau rezonator ceramic. Unele modele, cum ar fi LilyPad, rulează la 8 MHz și se dispensează cu
regulatorul de tensiune de la bord din cauza restricțiilor specifice ale fa ctorului de formă.
Microcontrolerele Arduino sunt preprogramate cu un încărcător de boot care simplifică
încărcarea programelor în memoria flash on -chip. Bootloader -ul implicit al Arduino Uno este
bootloader -ul Optiboot.Plăcile sunt încărcate cu co dul programului printr -o conexiune serială la un alt
computer. Unele plăci Arduino seriale conțin un circuit de schimbător de nivel pentru a converti între
nivelurile de logică RS -232 și semnale de nivel tranzistor -tranzistor (TTL). Plăcile Arduino actuale
sunt programate prin USB Serial Bus (USB), implementate folosind cipuri adaptor USB -serial, cum ar
fi FTDI FT232. Unele placi, cum ar fi plăcile model Uno, înlocuiesc cipul FTDI cu un cip AVR
separat care conține firmware USB -serial, care este reprogramab il prin propriul antet ICSP. Alte
variante, cum ar fi Arduino Mini și Boarduino neoficial, folosesc o placă de adaptare USB -la-serial
detașabilă sau un cablu, Bluetooth sau alte metode. Când este utilizat cu instrumente tradiționale de
microcontroler, în l oc de IDE Arduino, se utilizează programarea standard a programului (ISP) AVR
în sistem.
Placa Arduino expune cea mai mare parte a pinilor I / O ai microcontrolerului pentru utilizare de
alte circuite. Diecimila, [a] Duemilanove, [b] și Uno [c] act uale furnizează 14 pini de I / O digitale,
șase dintre care pot produce semnale modulate cu lățimea pulsului și șase intrări analogice, care pot fi
de asemenea folosite ca șase I digitale / O pins. Acești pini se află în partea de sus a plăcii, prin
interm ediul anteturilor de 0,1 inci (2,54 mm) de sex feminin. Mai multe scuturi pentru aplicații plug –
in sunt de asemenea disponibile în comerț. Plăcile Arduino Nano și placa Bare Bones compatibile cu
Arduino și Boarduino pot furniza știfturi pentru antet mascul in pe partea inferioară a plăcii, care se
pot conecta la panouri fără lipit.
Există multe plăci compatibile cu Arduino și derivate de Arduino. Unele sunt funcțional
echivalente cu un Arduino și pot fi utilizate în mod interschimbabil. Mulți îmbunăt ățesc Arduino de
bază prin adăugarea de drivere de ieșire, adesea utilizate pentru educația la nivel școlar, pentru a
4
simplifica crearea de bug -uri și roboți mici. Altele sunt echivalente electric, dar schimbă factorul de
formă, păstrând uneori compatibili tatea cu scuturile, alteori nu. Unele variante folosesc diferite
procesoare, cu o compatibilitate diferită.
Figura 1. Plăcuță Arduino cu o interfață serială RS -232 și un cip de microcontroler Atmel
ATmega8
5
2 REPREZENTAREA NIVELULUI DE SEMNAL(VU)
2.1 Ce este nivelul de semnal
Un contor de unitate de volum (VU) sau indicator de volum standard (SVI) este un dispozitiv
care afișează o reprezentare a nivelului semnalului în echipamentele audio. Designul original a
fost propus în lucrarea IRE din 1940, Un nou indicator de volum și un nivel de referință,
redactate de experți de la CBS, NBC și Bell Telephone Laboratories. Societatea Acustică din
America a standardizat -o în 1942 (ANSI C16.5 -1942) pentru utilizare în instalații de telefonie
și stații de radiodifuziune. Echipamentul audio pentru consumatori are adesea contoare VU, atât
în scopuri de utilitate (de exemplu, în echipamente de înregistrare), cât și pentru estetică (în
dispozitive de redare).
Contorul VU original este un dispozitiv electromecanic pasiv, și anume un ampermetru de
mișcare DC d'Arsonval de 200 µA alimentat dintr -un redresor cu undă completă de oxid de
cupru montat în carcasa contorului. Masa acului provoacă un răspuns relativ lent , care, de fapt,
integrează sau netezește semnalul, cu un timp de creștere de 300 ms. Aceasta are ca efect
medierea vârfurilor și a jgheaburilor de scurtă durată și reflectă sunetul perceput al materialului
mai îndeaproape decât contoarele PPM mai moderne și inițial mai scumpe. Din acest motiv,
mulți profesioniști audio preferă contorul VU pentru alternativele sale, deși indicația contorului
nu reflectă unele dintre caracteristicile cheie ale semnalului, în special nivelul de vârf al
acestuia, care în multe cazuri nu trebuie să depășească o limită definită. 0 VU este egal cu +4
dBu, sau 1,228 volți RMS, o putere de aproximativ 2,5 miliwati atunci când este aplicată pe o
sarcină de 600 ohmi. 0 VU este adesea denumit "0 dB". Contorul a fost proiectat nu pentru a
măsura semnalul, ci pentru a permite utilizatorilor să direcționeze nivelul semnalului până la un
nivel țintă de 0 VU (uneori etichetat 100%), deci nu este important ca dispozitivul să fie
neliniar și imprecis pentru niveluri scăzute. De fapt, scara var iază de la -20 VU la +3 VU, cu -3
VU chiar la mijloc. Dispozitivele pur electronice pot imula răspunsul acului; sunt VU -metri în
măsura în care respectă standardul. În industria de difuzare, monitorizarea sonorității a fost
standardizată, în 2009 în Statel e Unite de către ATSC A / 85, în 2010 în Europa de EBU R -128,
în 2011 în Japonia de TR -B32 și în 2010 în Australia de OP -59.
6
Figura 2. Aparat analogic de m ăsurare a nivelului de semnal
2.2 Scurt istoric
A fost inițial dezvoltat în 1939 prin efortul combinat al Bell Labs și al radiodifuzorilor CBS și
NBC. În anii ’70 -’80, decatronele cu afișaj dublu plan, plin cu neon, cu până la 201 segmente
pe canal stereo au fost populare în rândul emisiilor, ca contoar e de bare rapide cu grafic de
bare.
2.3 Sunetul stereo
Sunetul stereofonic sau, mai frecvent, stereo, este o metodă de reproducere a sunetului care
creează o iluzie de perspectivă sonoră multidirecțională. Acest lucru se obține de obicei folosind
două sau mai multe canale audio independente printr -o configurație a două sau mai multe
difuzoare (sau căști stereo), astfel încât să creeze impresia sunetului auzit din diverse direcții, ca
în auzul natural. Astfel, termenul „stereofonic” se aplică așa -numitelor siste me „quadrafonice”
și „surround -sound”, precum și sistemelor mai comune cu două canale, cu două difuzoare.
Adesea este contrastat cu sunetul monofonic sau „mono”, unde sunetul este auzit ca provenind
dintr -o poziție, adesea înainte în câmpul sonor (analog c u un câmp vizual). Sunetul stereo a fost
utilizat în mod obișnuit încă din anii ’70 în sisteme de divertisment precum radio, televiziune,
muzică înregistrată, internet, audio pentru computer și cinema.
7
Figura 3. Cum func ționeaz ă sistemul stereo
2.4 Caracteristici standard
Comportamentul aparatelor de m ăsură (VU) este definit în ANSI C16.5 -1942, British Standard
BS 6840 și IEC 60268 -17.
2.4.1 Nivel de referință
VU definit:
Citirea indicatorului de volum va fi de 0 VU atunci când este con ectat la o tensiune de curent
alternativ egală cu 1.228 Volți RMS pe o rezistență de 600 ohmi (egală cu +4 [dBu]) la 1000
de cicluri pe secundă. Depășirea trebuie să fie între 1 și 1,5%.Timpul de cădere este același cu
timpul de creștere, 300 ms
2.4.2 Timpul de creștere
Definit ca timpul necesar pentru ca acul să ajungă la 99% din distanța până la 0 VU atunci
când VU -contorul este transmis unui semnal care trece de la 0 la un nivel care citește 0 VU,
este de 300 ms.
2.4.3 Răspuns în frecvență
Specificaț ia de nivel este definită la 1000 Hz. Citirea nu trebuie să se îndepărteze de la citire
la 1000 Hz cu mai mult de 0,2 dB de la 35 Hz la 10 kHz sau mai mult de 0,5 dB între 25 Hz și
16 kHz. corpul literelor va avea dimensiunea de 11 puncte;
8
2.4.4 Impedanța
Contoru l VU și atenuatorul său ar trebui să prezinte o impedanță de 7.500 ohmi la circuitul pe care
este aplicat, măsurat cu un semnal sinusoid al care setează indicatorul la 0 dB.
Figura 5. Răspunsul unui aparat VU (linie neagră) în comparație cu nivelul de intrare
instantanee (zona gri) a unui ritm de tobe . Nivelul este în dB și timpul este în secunde .
9
3 PROIECTUL PROPRIU -ZIS
3.1 Componente
Lista cu componentele necesare pentru realizarea acestui proiect
• Ardu ino Nano (sau Arduino Uno)
• 2xNeoPixel Ring , 24xRGB LED
• 2xPoten țiometre
• Buton
• Rezistor 10k ohm
10
• Rezistor 470 ohm
• Conde nsator 1 mF 6.3V
• Breadboard
• Jumper Wires
11
3.2 Asamblare
Figura 5. Schem ă asamblare
3.3 Despre componente
3.3.1 Arduino nano
Arduino Nano este o placă mică, completă și prietenoasă, bazată pe ATmega328P. Acesta
oferă aceeași conectivitate și specificații ale plăcii Arduino Uno într -un factor de formă mai
mic. Arduino Nano este programat folosind software -ul Arduino (IDE), Mediul de dezvoltare
integrată Arduino.cc comun tuturor placilor Arduino și care rulează atât online cât și offline.
12
Figura 6. Schem ă placut ă
Pin
Nr. Nume Tip Descriere
1-2
5-16 D0-D13 I/O Intrare/ Ie șire digital ă porturile 0 la 13
3,28 RESET Intrare
Resetare
4,29 GND PWR Împământare
17 3V3 Ieșire +3.3V ieșire
18 AREF Intrare Referin ță ADC
19-26 A7-A0 Intrare Intrare analogic ă porturile 0 la 7
27 +5V Ieșire sau
Intrare +5V Ieșire (de la regulatorul de bord) sau
+ 5V (intrare de la sursa de alimentare externă)
30 VIN PWR Tensiunea de alimentare
Tabel 1. Descriere pini placa arduino
13
Specificatii:
Microcontroller: ATmega328p
Tensiune de funcționare: 5 V
Tensiune de intrare (recomandat): 8 -12 V
Pini digitali I/O: 14 (din care 6 pini PWM de ieșire)
Pinii de intrare analogici: 8
Conexiune: mini USB
Curent DC pe pin I/O: 40 mA
Memorie FLASH: 32 KB (ATmega328p)
Frecventa: 16 MHz
Dimensiuni: 0,73" x 1.70"
3.3.2 Poten țiometru
Un potențiometru este un rezistor cu trei terminale cu un contact glisant sau rotativ care
formează un divizor de tensiune reglabil .
Figura 8. Potențiometru
14
Simbol electronic
3.3.3 Buton
Un buton (de asemenea, buton cu litere ortografice) sau simplu buton este un mecanism de
comutare simplu pentru a controla unele aspecte ale unei mașini sau ale unui proces.
Butoanele sunt fabricate din material dur, de obicei din plastic sau metal. Supraf ața este de
obicei plană sau în formă pentru a se potrivi cu degetul sau mâna umană, astfel încât să poată
fi deprimat sau împins ușor. Butoanele sunt de cele mai multe ori comutatoarele părtinitoare,
deși multe butoane care nu sunt părtinitoare (datorită naturii lor fizice) necesită încă un arc
pentru a reveni la starea lor nepăsată. Termenii pentru „apăsarea” unui buton includ apăsarea,
apăsarea, bâlbâirea, bătutul, lovirea și perforarea.
Simbol electronic
3.3.4 Rezistor
Un rezistor este o componentă electri că pasivă cu două terminale care implementează
rezistența electrică ca element de circuit. În circuitele electronice, rezistențele sunt utilizate
pentru a reduce fluxul de curent, pentru a regla nivelurile semnalului, pentru a împărți
tensiunile, elementel e de părtinire active și a termina liniile de transmisie, printre alte utilizări.
Rezistențele de mare putere care pot disipa multe wați de energie electrică sub formă de
căldură, pot fi utilizate ca parte a comenzilor motorului, în sistemele de distribuți e a puterii
sau ca sarcini de testare pentru generatoare. Rezistențele fixe au rezistențe care se schimbă
ușor doar cu temperatura, timpul sau tensiunea de funcționare. Rezistențele variabile pot fi
utilizate pentru a regla elementele de circuit (cum ar fi un control al volumului sau un dimmer
al lămpii) sau ca dispozitive de detectare pentru căldură, lumină, umiditate, forță sau activitate
chimică.
Simbol electronic
15
3.3.5 Condensator
Un condensator este un dispozitiv care stochează energia electrică într-un câmp electric. Este
o componentă electronică pasivă cu două terminale.
Efectul unui condensator este cunoscut sub numele de capacitanță. În timp ce există o anumită
capacitate între oricare dintre cei doi conductori electrici aflați în apropierea u nui circuit, un
condensator este o componentă concepută pentru a adăuga capacitate la un circuit.
Condensatorul a fost inițial cunoscut sub numele de condensator sau condensator. Acest nume
și conținutul său sunt încă utilizate pe scară largă în multe limb i, dar rareori în engleză, o
excepție notabilă sunt microfoanele condensatoare, numite și microfoane condensatoare.
Simbol electronic
16
4 ARHITECTURA MICROCONTROLERELOR
4.1 Controlerul
La modul general un controler este o structură electronică destinată controlului unui proces sau,
mai general, unei interacțiuni caracteristice cu mediul exterior, fară să fie necesară intervenția
operatorului uman. Primele controlere au fost realizate în tehnologii pur analogice, folosind
componente electronice discrete și/sau componente electromecanice (relee). Cele care fac apel
la tehnica numerica moderna au fost realizate inițial pe baza logicii cablate și a unei electronici
analogice uneori complexe, motiv pentru care "straluceau" prin dimensiuni mari, consum
energetic pe masură și, nu de puține ori, o fiabilitate care lasă de dorit.
4.2 Microc ontrolerul
Este un circuit realizat pe un singur chip care contine :
• CPU ( Creierul)
• Generatorul
• RAM(Memorie volatil ă)
• ROM ,PROM,EPROM,EEPROM (Memorie n evolatil ă)
• Dispozitive seriale si paralele
• Controler DMA
• Controler de întreruperi
17
Figura 9. Diagrama bloc microcontroler
4.2.1 Unitatea centrală de procesare (UCP)
Este componenta cea mai complex ă a unui sistem și este alcătuit din patru elemente :
• Unitatea de comandă și control .
• Unitatea aritmetică și logică (UAL): se ocup ă cu prelucrările datelor .
• Regiștrii asigură stocarea internă a operanzilor din unitatea aritmetică și logică.
• Interconexiunile asigură transferul de date sau comunicarea între regiștrii, unitatea
aritmetică și logică ș i unitatea de control.
4.2.2 Unitatea aritmetică și logică (UAL)
Implementează diferite operații aritmetice și logice asupra operanzilor obținuți din
memorie. Conține un circuit logic pentru adunare, numit sumator, toate operațiile aritmetice
reducându -se la o succesiune de operații de adunare.
• Operații de comparație a doi operanzi ;
• Operații aritmetice cu operanzii adresați de Unitatea de c ontrol si comand ă;
• Transferuri de date între registre și între acestea și memorie;
• operații logice (SI, SAU, NU) cu operanzii adresați de Unitatea de control si
comand ă;
• operații de deplasare a conținutului unui registru sau locație de memorie;
18
4.2.3 Unitatea de comand ă și control (UCC)
Este responsabilă cu decodificarea codului operației conținut de codul unei instructiuni.
Pe baza decodificării unitatea de control elaborează semnale pentru comanda celorlalte
blocuri funcționale pentru a finaliza executa rea unei instrucțiuni. Modul de implementare al
acestui bloc este de asemenea transparent utilizatorului.
• adresează și extrage din memoria principală instrucțiunile binare ale programului;
• analizează semnalele de stare și sincronizare ce provin de la celelalte unități
funcționale ale calculatorului și, ca urmare, poate schimba succesiunea semnalelor de
comandă pe care le generează. La terminarea execuției instrucțiunii curente, se trece
la instrucțiunea următoare.
• decodifică instrucțiunile și generează secvența semnalelor de comandă necesare către
toate celelalte unități funcționale ale calculatorului; ca urmare a acestor semnale
instrucțiunea curentă este executată;
4.2.4 Unitatea centrală de prelucrare
Conține un set de regi ștri intern i, similar i unor locații de memorie, folosiț i pentru
memorarea unor date des apelate sau pentru programarea unor anumite funcții.
Diferitele familii de microcontroler folosesc seturi diferite de registre. Exista însă
câteva registre comune.
4.2.5 Accumulator, număr ător de program , indicator de stivă
• A (Accumulator) – registrul acumulator – este folosit deseori pentru a stoca un
operand și rezultatul operației aritmetice sau logice.
• PC (Program Counter) – registru numărător de program – este registrul care stochează
adresa urmatoarei instrucțiuni de executat. Dupa un RESET (initializarea
microcontroler), registrul PC se încarca dintr -o locație de memorie numita vector de
reset. Această locație conține adresa primei instructiuni de executat. PC este
incrementat automat la execuția unei instrucțiuni.
• SP (Stack Pointer) – registrul indicator de stivă – conținutul acestui registru indică
adresa curentă a stivei. Stiva reprezinta o zonă de memorie accesibila rapid în care se
depun temporar informații importante în desfăsura rea programului. Stiva este definită
de obicei în RAM. Implementarea accesului presupune existența unui registru de
adresare (SP) și a mecanismului de memorare declansat de instrucțiuni specifice
(instrucțiunile PUSH/POP).
19
Un aspect important ce se reflect ă în arhitectura unui microcontroler este modul de
programare. Prin arhitectură întelegem felul în care sunt dispuse resursele unui
microcontroler. Cu cât structura, funcționalitatea și accesul la acestea sunt mai
profund standardizate și simetrizate, cu a tât numărul de instructiuni de care dispune
microcontrolerul este mai redus și viteza de execuție a programelor crește.
4.2.6 Tipuri de arhitecturi și magistrale
• Arhitectura von Neumann prevede existența unui bus unic folosit pentru circulația
datelor și a instrucțiunilor. Când un controller cu o astfel de arhitectură adresează
memoria, bus -ul de date este folosit pentru a transfera înti codul instrucțiunii, apoi
pentru a transfera date. Accesul fiind realizat în doi pași, este destul de lent.
• Arhitectura Ha rvard prevede un bus separat pentru date și instrucțiuni. Cand codul
instrucțiunii se află pe bus -ul de instrucțiuni, pe bus -ul de date se află datele
instrucțiunii anterioare. Structura microcontroler este mai complexă, dar
performanțele de viteză sunt ma i bune.
• Magistralele interne, după numele lor, nu sunt accesibile în exterior la nivel de pin.
Această stare caracterizează regimul normal de funcționare. În regimuri speciale de
funcționare, numite diferit la diferitele tipuri de microcontroler, semnalele
magistralelor de adrese și de date sunt accesibile la nivel de pin sacrificând funcțiile
inițiale ale pinilor respectivi.
4.2.7 Memoria
Microcontrolerele folosesc diferite tipuri de informații, care sunt stocate în diferite
tipuri de memorii. Instrucțiunile ca re controlează funcționarea microcontroler trebuie
stocate într -o memorie nevolatilă, unde informațiile se pastrează și după oprirea și
repornirea sursei de alimentare.
• Memoria RAM (Random Access Memory) este o memorie volatilă care poate
fi citită sau scr isă de unitatea centrală. Locațiile din RAM sunt accesibile în
orice ordine. Pe chip, memoria RAM ocupă mult loc și implicit costurile de
implementare sunt mari. De aceea un microcontroler include de obicei putin
RAM. Memorie RAM static alimentată de la ba terie se folosește pentru
stocarea nevolatilă a cantităților mari de date, la o viteză de acces mare și cu
un număr nelimitat de ștergeri și reînscrieri.
20
• Memoria ROM (Read Only Memory) este cea mai ieftină și cea mai simplă
memorie și se folosește la stoca rea programelor în faza de fabricatie. Unitatea
centrala poate citi informațiile, dar nu le poate modifica.
• Memoria PROM (Programmable Read Only Memory) este similară cu
memoria ROM, dar ea poate fi programată de către utilizator. După
posibilitațile de șt ergere, această memorie poate fi de mai multe feluri:
• Memoria EPROM (Erasable PROM) care se poate șterge prin expunere la
raze ultraviolete. Microcontrolerele cu EPROM au un mic geam de cuart care
permite ca chip -ul sa fie expus la radiația ultravioletă. Ștergerea este
neselectivă, adica se poate sterge doar întreaga informatie și nu numai
fragmente. Memoria poate fi ștearsă și reînscrisa de un număr finit de ori.
• Memoria EEPROM (Electrically Erasable Programmable Read Only
Memory) poate fi ștearsă electri c de către unitatea centrală, în timpul
funcționării. Ștergerea este selectivă, iar pentru reînscriere trebuie parcurși
mai mulți pași. Memoria EEPROM echipează multe microcontroler, fiind
ieftină.
• Memoria FLASH este o memorie asemanătoare EPROM si EEPROM în
sensul că poate fi ștearsă și reprogramată în sistemul în care este folosită (fară
a fi necesar un sistem dedicat). Are capacitatea unui EPROM, dar nu necesita
fereastră pentru ștergere. Ca și EEPROM, memoria FLASH poate fi ștearsa și
programată electri c. Memoria FLASH nu permite ștergerea individuală de
locații, utilizatorul poate să steargă doar întregul conținut.
4.2.8 Dispozitive I /O
Dispozitivele I/O reprezintă un aspect de mare interes atunci când este vorba de
microcontrolere, interes rezultat din însaș i particularitatea unui microcontroler: aceea
de a interacționa cu mediul în procesul de control pe care îl conduce.
Avantajele mapării în spații separate:
• Dispozitivele nu ocupă spațiu de memorie;
• Decodificatorul de adrese pentru dispozitive este mai simplu deoarece spațiul
de adresare al dispozitivelor este mai mic.
• Metoda nu este susceptibilă de a provoca erori soft deoarece se folosesc
instrucțiuni diferite pentru a accesa memoria și dispozitive le;
21
Dezavantaje ale mapării în spatii separate:
• instru cțiunile nu permit folosirea modurilor de adresare folosite în lucrul cu
memoria.
• instruțiunile sunt mai puțin flexibile în comparație cu instrucțiunile de lucru
cu memoria;
Avantajul mapării în spatiu comun:
• toate instrucțiunile de lucru cu memoria și to ate modurile de adresare sunt
utilizabile și în tratarea dispozitivelor
Dezavantajele mapării în acelasi spatiu:
• spațiul de adresare disponibil pentru memorie este mai mic.
• este susceptibil la erori software;
Avantajul mapării într -un spațiu comun este acela că se poate opera cu porturile la fel
ca și cu o locație de memorie; multe operații aritmetice și logice folosesc operanzi
direct de la port, datele pot fi mutate între porturi cu o singură instructiune, conținutul
unui port poate fi citit, increment at și rezultatul scris din nou la port de asemenea cu o
singură instrucțiune.
4.2.9 Sistemul de întreruperi
Sistemul de întreruperi reprezintă mecanismul ce asigură sincronizarea funcționării
unității centrale cu evenimentele. Acest mecanism asigură implementare a unui
raspuns prompt și specific al sistemului la orice cerere de întrerupere.
În anii 80 ”-85” s-a conturat un principiu care se confirmă și astăzi: 'fiecare funcțiune
complexă cu procesorul ei', respectiv 'fiecare funcțiune a unui sistem de comandă cu
rutina ei de servire a întreruperilor.
În cazul microcontrolerelor, ca de altfel și în acela al microprocesoarelor, aceste
evenimente trebuie privite ca informații de stare a sistemului, informații ce rezultă fie
urmare a prelucrării de catre UC a datelor, fie urmare interactiunii sistemului cu
mediul înconjurator .Acest din urmă aspect este preponderent în cazul
microcontrolerelor.
Unitatea centrală a unui microcontroler analizează în cadrul ultimei perioade de ceas
corespunzătoare fiecarui ciclu instrucțiune eventualele cererii de întreruper e postate
pe parcursul execuției instrucțiunii curente.
22
Realizarea stărilor generatoare de cereri de întrerupere este urmată de analiza acestora
de catre CI. Aceasta analiză presupune următoarele:
• Determinarea ordinii de servire a cererilor de întrerup ere, în cazul apariției
simultane a mai multor astfel de cereri.
• Identificarea sursei generatoare a cererii de întrerupere;
Ambele etape pot fi implementate atât hard cât și soft, neexcluzandu -se posibilitatea
unor implementari mixte.
23
5 CONCLUZII
Proiectul mi -a oferit șansă de a cunoaște lucruri noi , dar și de a îmbină cunoștințe teoretice cu lucruri
practice.
Scopul final al proiectului este funcționarea creșterii și scăderii luminozității, reglarea sensibilitatea
dar și afișarea nivel ului de semnal pe cele două ring -uri.
Că urmare acestui proiect , consider că am reușit să acumulez cunoștințe în ceaa ce privește
electronică și de a lucra cu Arduino IDE
24
6 BIBLIOGRAFIE
Bibliografia va fi ordonată alfabetic dupa eti cheta fiecărei element (de ex. DOOM05 în lista
de mai jos este o etichetă). Etichetele materialelor consultate vor fi formatate folosind:
• primele litere ale primului autor urmate de cele două cifre semnificative ale anului
apariției materialului, sau
• dintr -un acronim popular al lucrării respective, urmat din nou de cele două cifre
semnificative ale anului apariției.
[DOOM05] – Dicționarul ortografic, ortoepic și morfologic al limbii române , Editura
Univers Enciclopedic, București, 2005
25
7 REFERINȚE WEB
Recomandăm și aici respectarea regulilor enunțate pentru secțiunea 6.
[Alm08] – Pedro de Almeida, Patrik F uhrer, Documentation Guidelines for Diploma and
Master Thesis, Universitatea din Fribourg, Elveția, 2008, disponibil on -line la adresa
http://diuf.unifr.ch/drupal/softeng/teaching/guidelines
[Olt07] – Th. Olteanu, C. Albu , Ghid pentru redactarea lucrării de diplomă sau a disertației
de masterat , Universitatea Română de Arte și Științe „Gheorghe Cristea”, 2007, disponibil
via web la adresa http://www.ugc.ro/tpl/GHID REDACTARE DIPLOMA LICENTA.pdf
26
A. CODUL SURSĂ
// Includem librăria NeoPixel :
#include <Adafruit_NeoPixel.h>
#define led_2_rings_24
const int useSensorValues = true;
//
// Setarea Pinilor
//
int leftPin = A0, rightPin = A1; // audio stânga în analog 0, dreapta pe analog
1
int brightnessPin = A4, sensitivityPin = A5; // potențiometre pentru luminozitate și
sensibilitate pe analog 4 și 5
int stripPin = 6; // DIN de leduri pe pin digital 6
int showPeaksPin = 7; // comutare pentru a ac tiva sau dezactiva
vârfurile de pe pinul digital 7
int momentarySwitch = false; // setați false pentru un comutator de
comutare on / off
//
// Setarea de configurare pentru numărul de leduri și 2 inele
//
#elif defined (led_ 2_rings_24)
int stripNumOfLeds = 48;
uint32_t stripColor[25];
int displayMiddleLed = false;
int splitStrip = true;
int middleOffset = 0;
int startupAnimationDelay = 5;
int orangeLimitAmount = 0;
int swapLeftRight = false;
int dropDelay = 2;
float dropFactor = .96;
int peakTimeNoDropDelay = 250;
int peakTimeFirstDropDelay = 100;
int peakTimeDropDelay = 10;
27
float peakDropFactor = .94;
int droppingPeakFade = false;
int bouncingPeaksNumOfLeds = 3;
int bouncing PeakDelay = 4;
int bouncingPeakCounterInc = 9;
//
// Setarea pentru alte variabile
//
// Setări de bază
int minValue = 10; // valoare min de intrare analogică
int maxValue = 350; // valoarea maximă de intrare analogică (0 -1023
este egală cu 0 -5V)
int sensitivityValue = 128; // 0 – 255, valoarea inițială (valoarea citită din
potențiometru dacă useSensorValues = true)
int maxSensitivity = 2 * 255; // lasă 'volumul' să crească pană la 200%!
int ledBrightness = 30; // 0 – 255,valoarea inițială (valoare citită din
potențiometru dacă useSensorValues = true)
int sensorDeviationBrightness = 1; // elimină valorile fluctuante
int overflowDelay = 20; // timpul de reținere overflow
// setări de vârf
int displayPeaks = true; // valoarea va fi setată de comutator
dacăuseSensorValues = true
int droppingPeak = true ; // afișează vârfuri care picură sau nu. Notă:
displayPeaks trebuie să fie adevărat
int bouncingPeaks = true; // afișează vârfuri care picură sau nu. Notă:
displayPeaks trebuie să fie adevăr at
//
// inițializare variabile necesare schiței
//
int numOfSegments = stripNumOfLeds / 2;
int halfNumOfSegments = numOfSegments / 2;
int stripMiddle = stripNumOfLeds / 2;
int maxDisplaySegments = stripMiddle – 1;
float sensitivityFactor;
int brightne ssValue, prevBrightnessValue;
float ledFactor, ledFactor_div_numOfSegments;
int leftValue = 0, rightValue = 0, maxReadValue = 0;
int leftAnalogValue = 0, rightAnalogValue = 0;
28
int prevLeftValue = 0, prevRightValue = 0;
int prevLeftAnalogValue = 0, prevRi ghtAnalogValue = 0;
int i, j;
int dropLeft, dropRight;
int leftDropTime, rightDropTime;
int leftPeak = 0, rightPeak = 0;
int leftPeakTime = 0, rightPeakTime = 0;
int leftFirstPeak = true, rightFirstPeak = true;
int readShowPeaksPin, prevReadShowPeaksPin;
uint32_t stripMiddleColor, stripOverflowColor, stripHoldColor;
int leftPeakBouncing = false, rightPeakBouncing = false;
int leftPeakBounce = 0, rightPeakBounce = 0;
int prevLeftPeakBounce = 0, prevRightPeakBounce = 0;
int leftPeakBo unceCounter = 0, rightPeakBounceCounter = 0;
int leftPeakBounceDelayCounter = 0, rightPeakBounceDelayCounter = 0;
//
// inițializare inele
//
Adafruit_NeoPixel strip = Adafruit_NeoPixel(stripNumOfLeds, stripPin, NEO_GRB +
NEO_KHZ800);
//
// Setarea
//
void setup() {
#ifdef DEBUG
Serial.begin(9600);
#endif
pinMode(showPeaksPin, INPUT);
strip.begin();
setStripColors();
startupAnimation();
if (useSensorValues)
setInitialDisplayPeaks();
else
setSensitivityFactor();
}
29
// bucla principală
void loop() {
if (useSensorValues)
readSensorValues();
readValues();
drawValues();
if (displayPeaks) {
getPeaks();
drawPeaks();
}
storePrevValues();
}
//
// Functii
//
void setInitialDisplayPeaks() {
readShowPeaksPin = digitalRead(showPeaksPin);
if (readShowPeaksPin == HIGH)
displayPeaks = false;
else
displayPeaks = true;
prevReadShowPeaksPin = readShowPeaksPin;
}
void readSensorValues() {
readShowPeak sPin = digitalRead(showPeaksPin);
if (momentarySwitch) {
if (readShowPeaksPin == LOW && prevReadShowPeaksPin == HIGH) {
if (displayPeaks == true) {
displayPeaks = false;
clearLeftPeak();
clearRightPeak ();
if (momentarySwitch)
while (digitalRead(showPeaksPin) == LOW) {}
}
else {
displayPeaks = true;
}
}
30
}
else {
if (readShowPeaksPin == LOW && prevReadShowPeaksPin == HIGH)
displayPeaks = true;
else if (readShowPeaksPin == HIGH && prevReadShowPeaksPin == LOW) {
displayPeaks = false;
clearLeftPeak();
clearRightPeak();
}
}
prevReadShowPeaksPin = readShowPeaksPin;
brightnessValue = anal ogRead(brightnessPin);
brightnessValue = map(brightnessValue, 0, 1023, 0, 255);
if (abs(brightnessValue – prevBrightnessValue) > sensorDeviationBrightness) {
ledBrightness = brightnessValue;
setStripColors();
prevBrightnessValue = bright nessValue;
}
sensitivityValue = analogRead(sensitivityPin);
sensitivityValue = map(sensitivityValue, 0, 1023, 0, 255);
setSensitivityFactor();
}
void setSensitivityFactor() {
sensitivityFactor = ((float) sensitivityValue / 255 * (float) maxSens itivity / 255);
}
void readValues() {
leftAnalogValue = analogRead(leftPin);
rightAnalogValue = analogRead(rightPin);
if (swapLeftRight) {
int tempValue = leftAnalogValue;
leftAnalogValue = rightAnalogValue;
rightAnalogValue = tempValue;
}
if (leftAnalogValue < prevLeftAnalogValue) {
leftDropTime++;
if (leftDropTime > dropDelay) {
leftAnalogValue = prevLeftAnalogValue * dropFactor;
leftDropTime = 0;
}
else
leftAnalogValue = prevLeftAnalogValue;
31
}
if (rightAnalogValue < prevRightAnalogValue) {
rightDropTime++;
if (rightDropTime > dropDelay) {
rightAnalogValue = prevRightAnalogValue * dropFactor;
rightDropTime = 0;
}
else
rightAnalogValue = prevRightAnalogValue;
}
#ifdef DEBUG
Serial.print(leftAnalogValue);
Serial.print(" ");
Serial.println(rightAnalogValue);
#endif
// valorile hărții
leftValue = map(leftAnalogValue * sensitivityFactor, minValue, maxValue, 0,
maxDisplaySegments);
rightValue = map(rightAnalogValue * sensitivityFactor, minValue, maxValue, 0,
maxDisplaySegments);
if (leftValue > maxDisplaySegments) {
leftValue = maxDisplaySegments;
drawOve rflow();
}
if (rightValue > maxDisplaySegments) {
rightValue = maxDisplaySegments;
drawOverflow();
}
}
void storePrevValues() {
prevLeftAnalogValue = leftAnalogValue;
prevRightAnalogValue = rightAnalogValue;
prevLeftValue = lef tValue;
prevRightValue = rightValue;
}
void getPeaks() {
if (leftValue > leftPeak) {
leftPeak = leftValue;
leftPeakTime = 0;
leftFirstPeak = true;
32
if (bouncingPeaks) {
leftPeakBouncing = true;
leftPeakBounceCounter = 0;
leftPeakBounceDelayCounter = 0;
}
}
else {
leftPeakTime++;
if (droppingPeak) {
if (leftFirstPeak) {
if (leftPeakTime > peakTimeFirstDropDelay) {
clearLeftPeak();
leftFirstPe ak = false;
}
}
else {
if (leftPeakTime > peakTimeDropDelay) {
clearLeftPeak();
}
}
}
else {
if (leftPeakTime > peakTimeNoDropDelay) {
clearLeftPeak();
}
}
}
if (leftPeakBouncing) {
if (leftFirstPeak) {
leftPeakBounceDelayCounter++;
if (leftPeakBounceDelayCounter >= bouncingPeakDelay) {
leftPeakBounceDelayCounter = 0;
leftPeakBounceCounter += bouncingPeakCounterInc;
if (le ftPeakBounceCounter >= 180) {
clearLeftBouncePeak();
clearLeftBounce();
}
else {
leftPeakBounce = min((sin(leftPeakBounceCounter * 0.0174532925) *
bouncingPeaksNumOfLeds), (maxDisplaySegments – leftPeak ));
if (leftPeakBounce != prevLeftPeakBounce) {
clearLeftBouncePeak();
}
prevLeftPeakBounce = leftPeakBounce;
}
33
}
}
}
if (rightValue > rightPeak) {
rightPeak = rightValue;
rightPeakTime = 0;
rightFirstPeak = true;
if (bouncingPeaks) {
rightPeakBouncing = true;
rightPeakBounceCounter = 0;
rightPeakBounceDelayCounter = 0;
}
}
else {
rightPeakTime++;
if (droppingPeak) {
if (right FirstPeak) {
if (rightPeakTime > peakTimeFirstDropDelay) {
clearRightPeak();
rightFirstPeak = false;
}
}
else {
if (rightPeakTime > peakTimeDropDelay)
clearRightPeak();
}
}
else {
if (rightPeakTime > peakTimeNoDropDelay)
clearRightPeak();
}
}
if (rightPeakBouncing) {
if (rightFirstPeak) {
rightPeakBounceDelayCounter++;
if (rightPeakBounceDelayCounter >= bouncingPeakDelay) {
rightPeakBounceDelayCounter = 0;
rightPeakBounceCounter += bouncingPeakCounterInc;
if (rightPeakBounceCounter >= 180) {
clearRightBouncePeak();
clearRightBounce();
}
else {
34
rightPeakB ounce = min((sin(rightPeakBounceCounter * 0.0174532925) *
bouncingPeaksNumOfLeds), (maxDisplaySegments – rightPeak));
if (rightPeakBounce != prevRightPeakBounce) {
clearRightBouncePeak();
}
prevRightPeakBounce = rightPeakBounce;
}
}
}
}
}
void drawValues() {
if (splitStrip) {
for (i = middleOffset; i < leftValue; i++)
strip.setPixelColor(i, stripColor[i]);
for (i = prevLeftValue; i > leftValue; i –)
strip.setPixelColor(i, 0);
for (i = middleOffset; i < rightValue; i++)
strip.setPixelColor(stripMiddle + i, stripColor[i]);
for (i = prevRightValue; i > rightValue; i –)
strip.setPixelColor(stripMiddle + i, 0);
}
else {
for (i = middleOffset; i < leftValue; i++)
strip.setPixelColor(stripMiddle + i, stripColor[i]);
for (i = prevLeftValue; i > leftValue; i –)
strip.setPixelColor(stripMiddle + i, 0);
for (i = middleOffset; i < rightValue; i++)
strip.setPixelColor(stripMiddle – i, stripColor[i]);
for (i = prevRightValue; i > rightValue; i –)
strip.setPixelColor(stripMiddle – i, 0);
}
if (displayMiddleLed) strip.setPixelColor(stripMiddle, stripMiddleColor);
strip.show();
}
void drawPeaks() {
if (leftPeak > 0) {
if (droppingPeakFade && leftPeakBouncing == false)
35
stripHoldColor = strip.Color(max(1, (255 * leftPeak * ledFactor_div_numOfSegments)),
0, 0);
else
stripHoldColor = stripColor[ numOfSegments];
if (splitStrip)
strip.setPixelColor((leftPeak + leftPeakBounce), stripHoldColor);
else
strip.setPixelColor(stripMiddle + (leftPeak + leftPeakBounce), stripHoldColor);
}
if (rightPeak > 0) {
if (droppingPeakFade && rightPeakBouncing == false)
stripHoldColor = strip.Color(max(1, (255 * rightPeak *
ledFactor_div_numOfSegments)), 0, 0);
else
stripHoldColor = stripColor[numOfSegments];
if (splitStrip)
strip.setPixelColor (stripMiddle + rightPeak + prevRightPeakBounce, stripHoldColor);
else
strip.setPixelColor(stripMiddle – (rightPeak + prevRightPeakBounce), stripHoldColor);
}
if (leftPeak > 0 || rightPeak > 0)
strip.show();
}
void clearLeftPeak() {
if (splitStrip)
strip.setPixelColor((leftPeak + prevLeftPeakBounce), 0);
else
strip.setPixelColor(stripMiddle + (leftPeak + prevLeftPeakBounce), 0);
if (droppingPeak)
leftPeak = leftPeak * peakDropFactor;
else
leftPeak = 0;
leftPeakTime = 0;
}
void clearLeftBounce() {
leftPeakBouncing = false;
leftPeakBounceCounter = 0;
leftPeakBounce = 0;
prevLeftPeakBounce = 0;
}
36
void clearLeftBouncePeak() {
if (splitStrip)
strip.setPixelColor((leftPeak + prevLeftPeakBounce) , 0);
else
strip.setPixelColor(stripMiddle + (leftPeak + prevLeftPeakBounce), 0);
}
void clearRightPeak() {
if (splitStrip)
strip.setPixelColor(stripMiddle + rightPeak + prevRightPeakBounce, 0);
else
strip.setPixelColor(stripMiddle – (rightPeak + prevRightPeakBounce), 0);
if (droppingPeak)
rightPeak = rightPeak * peakDropFactor;
else
rightPeak = 0;
rightPeakTime = 0;
}
void clearRightBounce() {
rightPeakBouncing = false;
rightPeakBounceCounter = 0;
rightPeakBounce = 0;
prevRightPeakBounce = 0;
}
void clearRightBouncePeak() {
if (splitStrip)
strip.setPixelColor((stripMiddle + rightPeak + prevRightPeakBounce), 0);
else
strip.setPixelColor(stripMiddle – (righ tPeak + prevRightPeakBounce), 0);
}
void drawOverflow() {
for (i = 0; i <= numOfSegments; i++) {
strip.setPixelColor(stripMiddle + i, stripOverflowColor);
strip.setPixelColor(stripMiddle – i, stripOverflowColor);
}
strip.show();
delay( overflowDelay);
for (i = 0; i <= numOfSegments; i++) {
strip.setPixelColor(stripMiddle + i, 0);
strip.setPixelColor(stripMiddle – i, 0);
}
strip.show();
}
37
void setStripColors() {
int orangeLimit;
ledFactor = (float)ledBrightness / 255;
float orangeFactor = orangeLimitAmount / halfNumOfSegments;
ledFactor_div_numOfSegments = ledFactor / numOfSegments;
stripOverflowColor = strip.Color(min(255, 255 * ledFactor * 1.5), 0, 0);
stripMiddleColor = strip.Color(0, 0, 255 * ledFactor);
stripColor[0] = strip.Color(0, 255 * ledFactor, 0);
for (i = 1; i <= numOfSegments; i++) {
if (i <= halfNumOfSegments)
orangeLimit = (i * orangeFactor);
else
orangeLimit = ((numOfSegments – i) * orangeFactor);
stripColor[i] = strip.Color((255 * i * ledFactor_div_numOfSegments), ((255 –
orangeLimit) * (numOfSegments – i) * ledFactor_div_numOfSegments), 0);
}
stripHoldColor = stripColor[numOfSegments];
}
void startupAnimation() {
for (j = 0; j < 2; j++) {
for (i = 0; i <= numOfSegments; i++) {
strip.setPixelColor(stripMiddle – i, stripColor[i]);
strip.setPixelColor(stripMiddle + i, stripColor[i]);
strip.show();
delay(startupAnimationDelay);
}
for (i = 0; i <= numOfSegments; i++) {
strip.setPixelColor(stripMiddle + i, 0);
strip.setPixelColor(stripMiddle – i, 0);
strip.show();
delay(startupAnimationDelay);
}
}
}
38
SITE -UL WEB AL PROIECTULUI
Autorul prezintă în ac eastă anexă (opțională) site -ul web asociat proiectului său.
39
C. CD / DVD
Autorul atașează în această anexă obligatorie , versiunea electronică a aplicației, a acestei
lucrări, precum și prezentarea finală a tezei .
40
INDEX
B
Bibliografie ………………………….. …………………….. 18
C
CUPRINSUL ………………………….. …………………… xi
F
Figuri ………………………….. ………………………….. ….. 4 L
LISTA FIGURILOR ………………………….. ………… xii
LISTA TABELELOR ………………………….. ……… xiii
R
Referințe web ………………………….. ………………….. 19
T
Tabele ………………………….. ………………………….. …. 5
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Bolea Alexandru Ionut Ism 2020 [608361] (ID: 608361)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
