Sunteți pe pagina 1din 14

http://www.robofun.

ro

Curs Gratuit Arduino si Robotica

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 #include #include #include <SPI.h> <SdFat.h> <SdFatUtil.h> <SFEMP3Shield.h>

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

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 Buton 1 OUT Buton 2 VCC Buton 2 OUT

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%

rduino !V rduino G#$ rduino $igit%l & rduino $igit%l 8

MP3 Trigger U"BVCC MP3 Trigger G#$ MP3 Trigger T' 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 * 7ban6uri7%

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. )< / <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

Curs Gratuit Arduino si Robotica

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@%;

Curs Gratuit Arduino si Robotica

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

Curs Gratuit Arduino si Robotica

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(%;

Curs Gratuit Arduino si Robotica

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

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, 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

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

S-ar putea să vă placă și