Documente Academic
Documente Profesional
Documente Cultură
ro
http://www.robofun.ro/forum
http://www.robofun.ro
SFEMP3Shield MP3player; byte temp; byte result; char title[3 !; char artist[3 !; char album[3 !; "#id setup$% & Serial.be'in$(()* %;
result + MP3player.be'in$%; i,$result -+ % & Serial.print$.Err#r c#de/ .%; Serial.print$result%; Serial.println$. 0hen tryin' t# start MP3 player.%; 1 Serial.println$.S2342E5.%; 1
http://www.robofun.ro/forum
http://www.robofun.ro
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
MP3 Trigger TRIG18 (pinul din interior) MP3 Trigger TRIG18 (pinul din exterior) MP3 Trigger TRIG9 (pinul din interior) 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%
MP3 Trigger U"BVCC MP3 Trigger G#$ MP3 Trigger T' MP3 Trigger R'
http://www.robofun.ro/forum
http://www.robofun.ro
)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
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>
http://www.robofun.ro/forum
http://www.robofun.ro
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. )< / <S( )3 <@@ >:5 / <S( )3 >:5 53 $S#,tSerial 2A% / <S( )3 4A 5B / <S( )3 4ESE2 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
<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. 2# play .Stic6s. $3(%/ tal6MI5I$ F; = = FGH%; 77;an6 select/ drums tal6MI5I$ F@ = )= %; 77Set instrument number 77Play n#te #n channel ( $ FI %= s#me n#te "alue $n#te%= middle "el#city $J %/ n#te?n$ = 3(= J %; 87 #include <S#,t0areSerial.h> S#,t0areSerial mySerial$*= 3%; 77S#,t 2A #n 3= 0e d#nKt use 4A in this c#de byte n#te + ; 772he MI5I n#te "alue t# be played byte resetMI5I + B; 772ied t# <S( )3 4eset line byte ledPin + (3; 77MI5I tra,,ic inidicat#r int instrument + ; "#id setup$% & Serial.be'in$)GJ %;
77Setup s#,t serial ,#r MI5I c#ntr#l mySerial.be'in$3(*) %; 774eset the <S( )3 pinM#de$resetMI5I= ?U2PU2%; di'italErite$resetMI5I= C?E%; delay$( %; di'italErite$resetMI5I= DI>D%; delay$( %;
"#id l##p$% & tal6MI5I$ F; = F G= (* %; 77 F; t# near maF $(*G% is channel messa'e= set channel "#lume
78
775em# ;asic MI5I instruments= >M( 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Serial.println$.;asic Instruments.%; tal6MI5I$ F; = = F %; 775e,ault ban6 >M( 77@han'e t# di,,erent instrument ,#r$instrument + ; instrument < (*G ; instrumentLL% & Serial.print$. Instrument/ .%; Serial.println$instrument= 5E@%; tal6MI5I$ F@ = instrument= %; 77Set instrument number. F@ is a (
http://www.robofun.ro/forum
http://www.robofun.ro
data byte c#mmand 77Play n#tes ,r#m F#9 $3 % t# F#9) $I %/ ,#r $n#te + 3 ; n#te < B ; n#teLL% & Serial.print$.:/.%; Serial.println$n#te= 5E@%;
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 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
87
775em# >M* 7 Fancy s#unds 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Serial.println$.5em# Fancy S#unds.%; tal6MI5I$ F; = = FGH%; 77;an6 select drums 77F#r this ban6 FGH= the instrument d#es n#t matter= #nly the n#te ,#r$instrument + 3 ; instrument < 3( ; instrumentLL% & Serial.print$. Instrument/ .%; Serial.println$instrument= 5E@%; tal6MI5I$ F@ = instrument= data byte c#mmand %; 77Set instrument number. F@ is a (
77Play ,ancy s#unds ,r#m KDi'h MK t# K?pen Surd# [EA@ J!K ,#r $n#te + *G ; n#te < HG ; n#teLL% & Serial.print$.:/.%; Serial.println$n#te= 5E@%; 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
http://www.robofun.ro/forum
http://www.robofun.ro
1
78 775em# Mel#dic 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Serial.println$.5em# Mel#dicN S#unds.%; tal6MI5I$ F; = = FGI%; 77;an6 select Mel#dic 772hese d#nKt s#und di,,erent ,r#m the main ban6 t# me 77@han'e t# di,,erent instrument ,#r$instrument + *G ; instrument < HG ; instrumentLL% & Serial.print$. Instrument/ .%; Serial.println$instrument= 5E@%; tal6MI5I$ F@ = instrument= data byte c#mmand %; 77Set instrument number. F@ is a (
77Play n#tes ,r#m F#9 $3 % t# F#9) $I %/ ,#r $n#te + 3 ; n#te < B ; n#teLL% & Serial.print$.:/.%; Serial.println$n#te= 5E@%; 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 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%; delay$( %; 775elay bet0een instruments
http://www.robofun.ro/forum
http://www.robofun.ro
mySerial.0rite$cmd%; mySerial.0rite$data(%;
77S#me c#mmands #nly ha"e #ne data byte. 3ll cmds less than 77data bytes 77$s#rt #,/ http/77*)3.ccarh.#r'7hand#ut7midipr#t#c#l7% i,$ $cmd Q FF % <+ F; % mySerial.0rite$data*%; 1 di'italErite$ledPin= C?E%;
F;n ha"e *
Primul lucru la care merita sa ne oprim este declaratia conexiunii seriale de tip so$!are pe pinii > si * 4 7 SoftwareSerial 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, 0 0", 120) care setea&a volumul s(ield-ului la valoarea ->. (sunt posibile ->A de valori intre . si ->A#% Codul este apoi structurat in * sectiuni (7 Demo !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, 0 00)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 7 talkMIDI(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, 0 00) 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 7 note-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
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, 0 00) / 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, 0 0", 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
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