Textul si imaginile din acest document sunt licentiate Attribution-NonCommercial-NoDerivs CC BY-NC-ND Codul sursa din acest document este licentiat Public-Domain Esti liber sa distribui acest document prin orice mijloace consideri (email publicare pe !ebsite " blog printare sau orice alt mijloc# atat timp cat nu aduci nici un $el de modi$icari acestuia% Codul sursa din acest document poate $i utili&at in orice $el de scop de natura comerciala sau nu $ara nici un $el de limitari% http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica
MP3 Player Shield '(ield-ul )P* Pla+er contine c(ip-ul ,'-./*b capabil sa decode&e stream-uri )P* 011 ,orbis AAC 2)A )3D3 si de asemenea contine si un slot de card micro'D pentru incarcarea $isierelor audio% '(ield-ul mai contine si un conector pentru casti sau boxe audio ast$el ca in $inal ceea ce obtii este un pla+er )P* complet% Ce ai tu de $acut este sa citesti in$ormatia stocata pe 'D card si sa o trimiti catre c(ip-ul )P* atunci cand acesta o solicitia% 'una complicat in teorie dar din $ericire exista deja mai multe librarii care $ac asta in locul tau% Cea mai interesanta este libraria disponibila ca do!nload la adresa (ttp4""!!!%robo$un%ro"mp*5pla+er5s(ield (lin6-ul 78ibrarie pentru Arduino7#% 9isierul %&ip pe care il descarci contine atat libraria )P* cat si libraria pentru 'D card% ,a trebui sa le copie&i pe ambele in directorul 7libraries7 din mediul tau de de&voltare Arduino% Codul sursa este relativ simplu de inteles toata partea complexa este ascunsa de librarie% #include <SPI.h> #include <SdFat.h> #include <SdFatUtil.h> #include <SFEMP3Shield.h> SFEMP3Shield MP3player; byte temp; byte result; char title[3!; char artist[3!; char album[3!; "#id setup$% & Serial.be'in$(()*%;
1 http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica "#id l##p$% & result + MP3player.playMP3$.mel#die(.mp3.%; delay$3%; i, $MP3player.isPlayin'$%%& MP3player.st#p2rac6$%; 1
1 Avem posibilitatea de a porni redarea unui $isier mp* la alegere putem veri$ica daca s-a terminat intre timp redarea audio (daca s-a terminat $isierul# sau putem opri redarea intr-un moment ales de noi% 'pre exemplu in codul sursa de mai sus pornim redarea pentru $isierul 7melodie-%mp*7 si daca dupa * secunda $isierul inca nu s-a terminat atunci il oprim noi $ortat% 8ibraria mai permite sa $acem $ast9or!ard pe un $isier pana la o anume po&itie $olosind 7)P*pla+er%s6ipTo(:po&itie3n'ecunde;#<7 si putem determina po&itia curenta (7)P*pla+er%currentPosition(#<7#% 'pre exemplu 7)P*pla+er%s6ipTo(*....#<7 va derula mp*-ul curent pana la secunda *. iar 7int po&itie = )P*pla+er%currentPosition(#<7 va incarca in variabila 7po&itie7 timpul in milisecunde de la inceperea redarii% Pinii ocupati de acest s(ield sunt > * ? @ A B C -- -> -* (aproape toti pentru Arduino DN0#% Daca ai nevoie de mai multi pini poti $olosi Arduino )ega in locul lui Arduino DN0 sau poti sc(imba )P* Pla+er '(ield-ul cu un )P* Trigger (care are nevoie de mult mai putini pini#% MP3 Trigger )P* Trigger este varianta mult imbunatatita a lui s(ield-ului )P* Pla+er pre&entat in sectiunea anterioara% Pe langa c(ip-ul capabil sa redea )P*-uri 'D Card-ul deja pre&ent pe placa )P* Trigger-ul are in plus si un microcontroller pre-programat% Ast$el numarul de pini necesari pentru inter$atarea cu Arduino scade drastic (doar doi pini sunt necesari# si in plus )P* Trigger-ul poate $unctiona c(iar si standalone $ara Arduino% Dat $iind ca este cel mai simplu sa incepem cu acest mod de $unctionare% )P* Trigger-ul o$era -B pini $iecare dintre ei declansand redarea melodiei al carei nume incepe cu numarul asociat pinului% Ast$el spre exemplu atunci cand pinul * este conectat la pinul 1ND este redata melodia al carei nume incepe cu 7..*7 (un exemplu de nume valid este 7..* Avion cu )otor%mp*7%#% 0 sc(ema de conectare $olosind butoane bric6 este mai jos% Am pus in sc(ema doar doua butoane pentru exempli$icare% Evident ca tu poti conecta cate ai nevoie maxim -B butoane% http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica Buton 1 VCC MP3 Trigger TRIG18 (pinul din interior) Buton 1 OUT MP3 Trigger TRIG18 (pinul din exterior) Buton 2 VCC MP3 Trigger TRIG9 (pinul din interior) Buton 2 OUT MP3 Trigger TRIG9 (pinul din exterior) Pinii din interior marcati 7TE31NN7 sunt conectati la microcontroller-ul placii si atunci cand unul dintre acesti pini este conectat la 1ND incepe redarea melodiei corespun&atoare de pe 'D Card% 3n mod convenabil toti pinii din sirul exterior sunt conectati deja la pinul 1ND% Tot ce ai tu de $acut atunci cand vrei sa porneasca redarea unei melodii este sa $aci contact intre pinul din interior si pinul din exterior% Butonul bric6 in conectarea de mai sus conectea&a pinul din exterior (1ND# cu pinul din interior (TE31NN# atunci cand este apasat% Acest mod de utili&are este $oarte util pentru situatiile cand ai nevoie sa pornesti redarea unei melodii )P* ca raspuns la un stimul extern situatie in care nu mai ai nevoie de Arduino% Pentru situatiile mai complexe )P* Trigger-ul o$era un AP3 elaborat accesibil peste un protocol serial TT8 $olosind Arduino% 'c(ema de conectare este cea de mai jos% rduino !V MP3 Trigger U"BVCC rduino G#$ MP3 Trigger G#$ rduino $igit%l & MP3 Trigger T' rduino $igit%l 8 MP3 Trigger R' http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica )ai departe tot ce ai de $acut este sa $olosesti libraria 'o$t!are'erial pe pinii A si B si sa-i trimiti placii )P* Trigger comen&i peste conexiunea seriala% Cele mai des $olosite comen&i sunt disponibile mai jos% Comanda4 'tart"'top Numar de b+tes4 - B+te de comanda4 F0G 9unctionare4 Daca exista o melodie care este redata la momentul primirii comen&ii se opreste redarea% Alt$el incepe redarea% Comanda4 3nainte Numar de b+tes4 - B+te de comanda4 F9G 9unctionare 4 Drmatoarea melodie )P* este redata% Comanda4 3napoi Numar de b+tes4 - B+te de comanda4 FEG 9unctionare4 )elodia precedenta )P* este redata% Comanda4 Trigger (binar+# Numar de b+tes4 > B+te de comanda4 FtG B+te de date4 n = - to >// 9unctionare4 Daca exista melodia cu numele HNNNxxxx%)P*I este redata unde NNN is ec(ivalentul A'C33 al bitului de comanda% Comanda4 Pla+ (binar+# Numar de b+tes4 > B+te de comanda4 FpG B+te de date4 n = . to >// 9unctionare4 Daca exista melodia numarul n va $i redata% http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica Comanda4 'et ,olume (binar+# Numar de b+tes4 > B+te de comanda4 FvG B+te de date4 n = . to >// Comments4 ,olumul va $i setat la valoarea n% ,olumul maxim se obtine cu valoarea 7.7 iar volumul minim in jur de -..% Toata gama de comen&i suportata este pre&entata pe larg in manual de utili&are al placii disponibil la adresa (ttp4""!!!%robo$un%ro"mp*5trigger5v> Music Instrument Shield )usic 3nstrument '(ield este capabil sa genere&e note mu&icale con$orm standardului )3D3% '(ield-ul comunica serial cu Arduino pe pinii digitali > si * pinul ? digital $unctionand drept pin de reset% Controlul s(ield-ului se $ace trimitand comen&i pe inter$ata seriala $ormata din pinii > si *% Comen&ile seriale de control nu sunt $oarte simple (lucru care se datorea&a protocolului )3D3 care in opinia mea este destul de incurcat#% '(ield-ul este capabil sa redea >?B de instrumente de la cele mai comune (pian (arpa acordeon c(itara# pana la unele destul de ciudate (latrat de caine impuscatura elicopter#% 3nstrumentele sunt organi&ate in * 7ban6- uri7% http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica Cea mai simpla abordare pentru a intelege modul cum se $oloseste acest s(ield este sa urmarim mai jos un exemplu de program scris de Nat(an 'eidle de la 'par6$un program care generea&a cate &ece note pentru $iecare instrument inclus% 78 *9(*9*(( Spar6 Fun Electr#nics *(( :athan Seidle
2his c#de is public d#main but y#u buy me a beer i, y#u use this and 0e meet s#meday $;eer0are license%.
2his c#de 0#r6s 0ith the <S()3 ;rea6#ut ;#ard and c#ntr#ls the <S()3 in 0hat is called 4eal 2ime MI5I m#de. 2# 'et the <S()3 int# 42 MI5I m#de= p#0er up the <S()3 brea6#ut b#ard 0ith >PI? tied l#0= >PI?( tied hi'h.
I use the :e0S#,tSerial library t# send #ut the MI5I serial at 3(*)bps. 2his all#0s me t# print re'ular messa'es ,#r debu''in' t# the terminal 0ind#0. 2his helped me #ut a t#n.
3ttach a headph#ne brea6#ut b#ard t# the <S()3/ <S()3 CEF2 / 2SD http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica <S()3 4I>D2 / 4SD <S()3 >;UF / >:5
Ehen in the drum ban6 $FGH%= there are n#t di,,erent instruments= #nly di,,erent n#tes. 2# play the di,,erent s#unds= select an instrument # li6e )= then play n#tes *G t# HG.
77:#te #n channel ( $FI%= s#me n#te "alue $n#te%= middle "el#city $FB)%/ n#te?n$= n#te= J%; delay$)%; 772urn #,, the n#te 0ith a 'i"en #,,7release "el#city n#te?,,$= n#te= J%; delay$)%; 1 delay$(%; 775elay bet0een instruments 1 87 1 77Send a MI5I n#te9#n messa'e. Ci6e pressin' a pian# 6ey 77channel ran'es ,r#m 9() "#id n#te?n$byte channel= byte n#te= byte attac6O"el#city% & tal6MI5I$ $FI P channel%= n#te= attac6O"el#city%; 1 77Send a MI5I n#te9#,, messa'e. Ci6e releasin' a pian# 6ey "#id n#te?,,$byte channel= byte n#te= byte releaseO"el#city% & tal6MI5I$ $FH P channel%= n#te= releaseO"el#city%; 1 77Plays a MI5I n#te. 5#esnKt chec6 t# see that cmd is 'reater than (*G= #r 77 that data "alues are less than (*G "#id tal6MI5I$byte cmd= byte data(= byte data*% & di'italErite$ledPin= DI>D%; http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica mySerial.0rite$cmd%; mySerial.0rite$data(%; 77S#me c#mmands #nly ha"e #ne data byte. 3ll cmds less than F;n ha"e * 77data bytes 77$s#rt #,/ http/77*)3.ccarh.#r'7hand#ut7midipr#t#c#l7% i,$ $cmd Q FF% <+ F;% mySerial.0rite$data*%; di'italErite$ledPin= C?E%; 1 Primul lucru la care merita sa ne oprim este declaratia conexiunii seriale de tip so$!are pe pinii > si * 4 7SoftwareSerial mySerial(2, 3);7% ,om $olosi aceasta conexiune seriala pentru a trimite date catre s(ield% Eata de trans$er pentru aceasta conexiune seriala (rata presetata in s(ield# este de *->/. bps (motiv pentru care avem in setup linia mySerial.begin(31250)#. Tot in setup dam o comanda de reset s(ield-ului ($olosim pinul ? digital care este conectat la pinul de reset al s(ield-ului pin pe care il coboram in 802 si apoi il ridicam in J31J dupa -.. de milisecunde#% Prima instructiune din loop este talkMIDI(0!0, 00", 120) care setea&a volumul s(ield-ului la valoarea ->. (sunt posibile ->A de valori intre . si ->A#% Codul este apoi structurat in * sectiuni (7Demo !a#i$ MIDI in#tr%ment#7 7Demo &M2 ' (an$y #o%n)#7 si 7Demo Melo)i$7#. 8a inceputul $iecarei sectiuni avem cate o comanda care setea&a 7ban6-ul7 (una dintre cele trei categorii de instrumente#% Ast$el la inceputul primei sectiune avem comanda 7talkMIDI(0!0, 0, 000)7 care setea&a ban6-ul de instrumente )3D3 clasice apoi la inceputul celei de-a doua sectiuni avem 7talkMIDI(0!0, 0, 0"*)7 care setea&a ban6-ul cu instrumente de percutie iar apoi in cea de-a treia sectiune avem 7talkMIDI(0!0, 0, 0"+)7 care setea&a ban6-ul de instrumente melodice% 3n prima sectiune avem doua instructiuni for% Prima instructiune for ciclea&a printre cele ->B de instrumente disponibile in acest ban6 iar cel de-al doilea for generea&a -. note mu&icale pentru $iecare instrument% Comanda interesanta in aceasta sectiune este 7talkMIDI(0,0, in#tr%ment, 0)7 care setea&a instrumentul care va reda notele mu&icale% Pentru ban6-ul .K.. (setat anterior prin comanda talkMIDI(0!0, 0, 000) avem ->B de instrumente posibile intre . si ->B% Cel de-al doilea for generea&a &ece note pentru $iecare instrument% Eedarea unui note mu&icale este pornita cu 7note-n(0, note, .0)7 si este oprita cu 7note-ff(0, note, .0)7. Cea de-a doua sectiune (7Demo &M2 ' (an$y #o%n)#7# este ceva mai speciala decat celelalte doua% Acest lucru se intampla din cau&a protocolului )3D3 care speci$ica $aptul ca atunci cand este selectat ban6-ul cu instrumente de percutie comanda care setea&a instrumentul nu mai are nici un e$ect ci $iecare instrument este de $apt o nota% Alt mod de a spune acelasi lucru este ca in ban6-ul cu instrumente de percutie este un singur instrument cu $oarte http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica multe note iar $iecare nota de $apt reda un alt instrument% Prima comanda din aceasta sectiune selectea&a ban6-ul cu instrumente de percutie (7talkMIDI(0!0, 0, 0"*)7#% Drmatoarea instructiune for va $ace exact un singur ciclu (pentru ca asa cum am spus mai sus instrumentul nu contea&a in ca&ul ban6-ului cu instrumente de percutie% A doua instructiune for din aceasta sectiune ciclea&a intre >A si BA cele @. de instrumente disponibile pentru ban6-ul de percutie% 3nstructiunea 7note-n(0, note, .0)7 generea&a o nota pe cate unul dintre cele @. de instrumente% Cea de-a treia sectiune este per$ect similara cu prima sectiune doar ca in ban6-ul cu instrumente melodice instrumentele sunt intre >A si BA% 'a anali&am acum mai atent $unctia note-n care generea&a o anumita nota mu&icala% 9unctia note-n primeste trei parametri% Cel de-al doilea parametru este nota mu&icala iar ultimul parametru repre&inta cat de 7puternic7 este generata nota (daca ne gandim ca $olosim un pian atunci ultimul parametru repre&inta cat de puternic apasam pe clapa pianului#% 3n re&umat 4 * ban6-uri cu instrumente talkMIDI(0!0, 0, 000) / selectea&a ban6-ul cu instrumente clasice talkMIDI(0!0, 0, 0"*) L selectea&a ban6-ul cu instrumente de percutie tal6)3D3(.xB. . .xAC# L selectea&a ban6-ul cu instrumente melodice note-n(0, note, 120) L reda nota mu&icala note; pentru ban6-ul .xAB valoarea lui note selectea&a si instrumentul mu&ical (pentru ban6-ul .xAB valorile posibile pentru note sunt intre >A si BA#% note-ff(0, note, 120) L opreste redarea notei mu&icala note< talkMIDI(0!0, 00", 0ol%m) L stabileste volumul instrumentului< valoarea pentru 0ol%m este intre . si ->A% talkMIDI(0,0, in#tr%ment, 0) L stabileste instrumentul care va reda notele mu&icale< acest lucru este valabil doar pentru ban6-urile .K.. si .KAC< pentru ban6-ul .KAB aceasta comanda nu are nici un e$ect% http://www.robofun.ro/forum http://www.robofun.ro Curs Gratuit Arduino si Robotica Aceasta a fost lectia 11. In final, as vrea sa te rog sa ne oferi feedback asupra acestei lectii, pentru a ne permite sa le facem mai bune pe urmatoarele. Este vorba despre un sondaj cu 4 intrebari (oricare este optionala), pe care il poti accesa dand click aici. au ne poti contacta direct prin email la contact!robofun.ro . Iti multumim, Ec"ipa #obofun.#$ http://www.robofun.ro/forum