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 <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$(()*%;

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

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

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$(%;
1
"#id l##p$% &
tal6MI5I$F;= FG= (*%; 77F; is channel messa'e= set channel "#lume
t# near maF $(*G%
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 Curs Gratuit Arduino si Robotica
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= %; 77Set instrument number. F@ is a (
data byte c#mmand
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 Curs Gratuit Arduino si Robotica
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= %; 77Set instrument number. F@ is a (
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
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

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