Anda di halaman 1dari 15

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 website / blog, printare,
sau orice alt mijloc), atat timp cat nu aduci nici un fel de modificari acestuia. Codul sursa din acest document
poate fi utilizat in orice fel de scop, de natura comerciala sau nu, fara nici un fel de limitari.
RaspberryPI si ADXL345
ADXL345 este un accelerometru de dimensiuni mici, are un consum redus de energie iar
masuratorile efectuate pe cele 3 axe au o rezolutie mare (13 iti!" #oate masura pana la 1$g, iar
datele sunt reprezentate in format digital, la alegere, prin interfata %#& sau &'C"
ADXL345 este foarte potri(it pentru masuratori ale acceleratiei statice a gra(itatiei in
aplicatii care sesizeaza ascularea, dar si acceleratia dinamica rezultata din miscare sau socuri"
Accelerometrul are o rezolutie mare (4 mg)L%*! si permite masurarea sc+imarilor de inclinatie
mai mici de 1,,-"
.ai multe functii de sesizare speciale sunt furnizate" %esizarea acti(itatii si inacti(itatii
depisteaza prezenta sau lipsa miscarii si daca acceleratia pe oricare axa excede un ni(el setat de
catre utilizator" %esizarea atailor usoare depisteaza ataile simple sau dule" %esizarea caderii
liere depisteaza daca senzorul se afla se afla in cadere" Aceste functii pot fi mapate pe unul din doi
pini de iesire de intrerupere" /n uffer first in, first out (0&01! cu 3' de ni(ele integra poate fi
folosit pentru a stoca datele pentru a minimiza inter(entia procesorului cu care comunica senzorul"
%enzorul poate functiona si in moduri cu consum redus de energie"
+ttp2))333"roofun"ro)forum
&n acest tutorial (ei programa placa 4asperr5 #& sa afiseze pe un s+ield LCD ',x4
acceleratiile corespunzatoare celor 3 axe"
6ei a(ea ne(oie de urmatoarele componente2
1 placa 4asperr5 #&"
/n s+ield LCD ',x4 pentru 4asperr5 #&"
/n senzor ADXL345"
0ire pentru conexiuni"
*readoard"
1 sursa de alimentare pentru 4asperr5 #& (56!

Cum conectez shield-ul LCD si senzorul ADXL345
1" Conecteaza s+ield7ul la portul 8#&1 al placii 4asperr5 #&" %+ield7ul poate fi infipt
direct in portul 8#&1 sau il poti conecta prin intermediul panglicii de tip coler"
'" Asigura7te ca areta mama 'x13 este lipita pe s+ield, altfel nu poti conecta senzorul
ADXL345" La ac+izitionarea s+ield7ului poti opta pentru s+ield cu areta lipita"
3" Conecteaza accelerometrul la placa 4asperr5 #& conform taelului urmator2
Raspberry PI 3.3V ADXL345 VCC
Raspberry PI 3.3V ADXL345 CS
Raspberry PI GND ADXL345 GND
Raspberry PI GND ADXL345 SDO
Raspberry PI SDA ADXL345 SDA
Raspberry PI SCL ADXL345 SCL
4" 0oloseste, ca referinta, sc+ema portului 8#&1 si sc+ema electronica de mai 9os2
+ttp2))333"roofun"ro)forum
Dupa realizarea conexiunilor, (ei otine urmatoarea imagine"
+ttp2))333"roofun"ro)forum
Cum pro!ramez placuta Raspberry PI
.ai 9os sunt listate ' programe, dintre care, primul se executa cu #5t+on si se ocupa cu
initializarea afisa9ului LCD si afisarea acceleratiilor pe fiecare rand iar cel de7al doilea program este
scris in lima9ul C si se ocupa cu initializarea interfetei &'C a senzorului si citirea acceleratiilor din
el" &n mod normal (ei executa doar programul scris in C, deoarece acesta realizeaza apel automat
catre programul #5t+on"
Codul sursa este listat mai 9os si il poti copia cu cop5)paste, dar inainte de asta sunt necesare
cate(a configurari2
1" Desc+ide urmatorul fisier si asigurate ca ai cele ' linii2
sudo nano /et/!odu"es
Liniile2
+ttp2))333"roofun"ro)forum
#$%b!$&'(
#$%de)
'" :xecuta o restartare cu2
sudo reboot
3" Dupa restartare, executa cele ' comenzi2
sudo apt%*et #nsta"" pyt+on%s!bus
sudo apt%*et #nsta"" #$%too"s
4" Desc+ide fisierul cu urmatoarea comanda si asigura7te ca este prezent cate un ; pe
fiecare linie2
sudo nano /et/!odprobe.d/rasp#%b"a,"#st.on-
5" 6erifica daca senzorul este detectat corect prin comanda2
sudo #$detet %y .
Comanda returneaza toate adresele detectate" Daca senzorul este detectat corect, atunci el (a
+ttp2))333"roofun"ro)forum
raporta adresa ,x53"
$" Descarca si instaleaza pac+etul p5t+on 4#i"8#&1 ,"4"1a" #rogramul #5t+on depinde
de acest pac+et"
sudo /*et
+ttps0//pyp#.pyt+on.or*/pa,a*es/soure/R/RP#.GPIO/RP#.GPIO%
'.4..a.tar.*1
<" Dezar+i(eaza7l prin comanda2
sudo tar %2)- Rp#.GPIO%'.4..a.tar.*1
=" %c+ima locatia in noul fisier2
d Rp#.GPIO%'.4..a
>" :xecuta instalarea2
sudo pyt+on setup.py #nsta""
Codul sursa
1" Creeaza un fisier cu editorul nano si copiaza codul #5t+on" &nc+ide editorul si
sal(eaza7l cu CT4L X si ?"
sudo nano "d.py
'" Creeaza un fisier cu acelasi editor si copiaza codul in lima9ul C" &nc+ide editorul in
aceeasi maniera2
sudo nano read#n*ADXL345.
3" Compileaza programul C cu comanda2
* %o read3ad2" read#n*ADXL345.
4" Dupa compilare (ei otine un executail denumit read@adxl"
+ttp2))333"roofun"ro)forum
5" #orneste programul care citeste si afiseaza senzorul prin comanda2
./read3ad2"
6ei otine urmatoarele imagini2
+ttp2))333"roofun"ro)forum
Pro!ramul Python"
-ro! datet#!e #!port datet#!e
#!port RP#.GPIO as GPIO
#!port t#!e
#!port os
#!port subproess
#!port sys
LCD3RS 4 $5
LCD35 4 $4
LCD3D4 4 $3
LCD3D5 4 .&
LCD3D6 4 .(
LCD3D& 4 $$
L5D3ON 4 .5
+ttp2))333"roofun"ro)forum
LCD37ID89 4 $'
LCD3C9R 4 8rue
LCD3C:D 4 ;a"se
LCD3LIN53. 4 '2('
LCD3LIN53$ 4 '2C'
LCD3LIN533 4 '2<4
LCD3LIN534 4 '2D4
53P=LS5 4 '.''''5
53D5LA> 4 '.''''5
de- !a#n?@0
te2tL#ne8/o 4 AACC5L X0 A B str?#nt?-"oat?sys.ar*)C.D@@@
te2tL#ne8+ree 4 AACC5L >0 A B str?#nt?-"oat?sys.ar*)C$D@@@
te2tL#ne;our 4 AACC5L E0 A B str?#nt?-"oat?sys.ar*)C3D@@@
"d3#n#t?@
"d3byte?LCD3LIN53.F LCD3C:D@
"d3str#n*?ARp# and ADXL345AF$@
"d3byte?LCD3LIN53$F LCD3C:D@
"d3str#n*?te2tL#ne8/oF.@
"d3byte?LCD3LIN533F LCD3C:D@
"d3str#n*?te2tL#ne8+reeF.@
"d3byte?LCD3LIN534F LCD3C:D@
"d3str#n*?te2tL#ne;ourF.@

de- "d3#n#t?@0
GPIO.set/arn#n*s?;a"se@
GPIO.set!ode?GPIO.GC:@
GPIO.setup?LCD35F GPIO.O=8@
GPIO.setup?LCD3RSF GPIO.O=8@
GPIO.setup?LCD3D4F GPIO.O=8@
GPIO.setup?LCD3D5F GPIO.O=8@
GPIO.setup?LCD3D6F GPIO.O=8@
GPIO.setup?LCD3D&F GPIO.O=8@
"d3byte?'233FLCD3C:D@
"d3byte?'23$FLCD3C:D@
"d3byte?'2$(FLCD3C:D@
"d3byte?'2'CFLCD3C:D@
"d3byte?'2'6FLCD3C:D@
"d3byte?'2'.FLCD3C:D@
+ttp2))333"roofun"ro)forum
de- "d3str#n*?!essa*eFsty"e@0
H sty"e4. Le-t Iust#-#ed
H sty"e4$ Centred
H sty"e43 R#*+t Iust#-#ed
#- sty"e44.0
!essa*e 4 !essa*e."Iust?LCD37ID89FA A@
e"#- sty"e44$0
!essa*e 4 !essa*e.enter?LCD37ID89FA A@
e"#- sty"e4430
!essa*e 4 !essa*e.rIust?LCD37ID89FA A@
-or # #n ran*e?LCD37ID89@0
"d3byte?ord?!essa*eC#D@FLCD3C9R@
de- "d3byte?b#tsF !ode@0
H Send byte to data p#ns
H b#ts 4 data
H !ode 4 8rue -or +arater
H ;a"se -or o!!and
GPIO.output?LCD3RSF !ode@ H RS
H 9#*+ b#ts
GPIO.output?LCD3D4F ;a"se@
GPIO.output?LCD3D5F ;a"se@
GPIO.output?LCD3D6F ;a"se@
GPIO.output?LCD3D&F ;a"se@
#- b#tsJ'2.'44'2.'0
GPIO.output?LCD3D4F 8rue@
#- b#tsJ'2$'44'2$'0
GPIO.output?LCD3D5F 8rue@
#- b#tsJ'24'44'24'0
GPIO.output?LCD3D6F 8rue@
#- b#tsJ'2('44'2('0
GPIO.output?LCD3D&F 8rue@
+ttp2))333"roofun"ro)forum
H 8o**"e K5nab"eK p#n
t#!e.s"eep?53D5LA>@
GPIO.output?LCD35F 8rue@
t#!e.s"eep?53P=LS5@
GPIO.output?LCD35F ;a"se@
t#!e.s"eep?53D5LA>@
H Lo/ b#ts
GPIO.output?LCD3D4F ;a"se@
GPIO.output?LCD3D5F ;a"se@
GPIO.output?LCD3D6F ;a"se@
GPIO.output?LCD3D&F ;a"se@
#- b#tsJ'2'.44'2'.0
GPIO.output?LCD3D4F 8rue@
#- b#tsJ'2'$44'2'$0
GPIO.output?LCD3D5F 8rue@
#- b#tsJ'2'444'2'40
GPIO.output?LCD3D6F 8rue@
#- b#tsJ'2'(44'2'(0
GPIO.output?LCD3D&F 8rue@
H 8o**"e K5nab"eK p#n
t#!e.s"eep?53D5LA>@
GPIO.output?LCD35F 8rue@
t#!e.s"eep?53P=LS5@
GPIO.output?LCD35F ;a"se@
t#!e.s"eep?53D5LA>@
#- 33na!e33 44 K33!a#n33K0
!a#n?@
Pro!ramul C"
+ttp2))333"roofun"ro)forum
// * %o read3ad2" read#n*ADXL345.
H#n"ude Lstd#o.+M
H#n"ude Lstd"#b.+M
H#n"ude L-nt".+M
H#n"ude Lun#std.+M
H#n"ude Lstr#n*.+M
H#n"ude Lsys/#ot".+M
H#n"ude Lsys/types.+M
H#n"ude Lsys/stat.+M
H#n"ude L"#nu2/#$%de).+M
Hde-#ne ADXL3453I$C3ADDR '253
+ttp2))333"roofun"ro)forum
)o#d se"etDe)#e?#nt -dF #nt addrF +ar N na!e@
O
#- ?#ot"?-dF I$C3SLAV5F addr@ L '@
O
-pr#nt-?stderrF APs not presentQnAF na!e@R
//e2#t?.@R
S
S
)o#d /r#te8oDe)#e?#nt -dF #nt re*F #nt )a"@
O
+ar bu-C$DR
bu-C'D4re*R bu-C.D4)a"R
#- ?/r#te?-dF bu-F $@ T4 $@
O
-pr#nt-?stderrF ACanKt /r#te to ADXL345QnA@R
//e2#t?.@R
S
S
#nt !a#n?#nt ar*F +ar NNar*)@
O
uns#*ned #nt ran*eR
#nt ountF bR
s+ort 2F yF 1R
-"oat 2aF yaF 1aR
#nt -dR
uns#*ned +ar bu-C.6DR
+ar strC('D 4 OSR
+ar syste!3strC$56D 4 OSR
#- ??-d 4 open?A/de)/#$%.AF O3RD7R@@ L '@
O
// Open port -or read#n* and /r#t#n*
-pr#nt-?stderrF A;a#"ed to open #$ busQnA@R
e2#t?.@R
S
/N #n#t#a"#se ADXL345 N/
se"etDe)#e?-dF ADXL3453I$C3ADDRF AADXL345A@R
/r#te8oDe)#e?-dF '2$dF '@R
/r#te8oDe)#e?-dF '2$dF .6@R
/r#te8oDe)#e?-dF '2$dF (@R
/r#te8oDe)#e?-dF '23.F '@R
/r#te8oDe)#e?-dF '23.F ..@R
/+#"e ?.@ O
+ttp2))333"roofun"ro)forum
/N se"et ADXL345 N/
se"etDe)#e?-dF ADXL3453I$C3ADDRF AADXL345A@R
bu-C'D 4 '23$R
#- ??/r#te?-dF bu-F .@@ T4 .@
O
// Send t+e re*#ster to read -ro!
-pr#nt-?stderrF A5rror /r#t#n* to #$ s"a)eQnA@R
//e2#t?.@R
S
#- ?read?-dF bu-F 6@ T4 6@
O
// XF >F E ae"erat#ons
-pr#nt-?stderrF A=nab"e to read -ro! ADXL345QnA@R
//e2#t?.@R
S
e"se
O
2 4 bu-C.DLL(U bu-C'DR
y 4 bu-C3DLL(U bu-C$DR
1 4 bu-C5DLL(U bu-C4DR
2a 4 ?<'.' / $56.'@ N ?-"oat@ 2R
ya 4 ?<'.' / $56.'@ N ?-"oat@ yR
1a 4 ?<'.' / $56.'@ N ?-"oat@ 1R
//pr#nt-?A24PdF y4PdF 14PdQnAF 2F yF 1@R
pr#nt-?AP4.'- P4.'- P4.'-QnAF 2aF yaF 1a@R
//-or ?b4'R bL6R bBB@ pr#nt-?AP'$2 AFbu-CbD@R
pr#nt-?AQnA@R
spr#nt-?syste!3strF Asudo pyt+on "d.py P- P- P-AF 2aF yaF
1a@R
syste!? syste!3str @R
S
// us"eep?<'''@R
S
return 'R
S
+ttp2))333"roofun"ro)forum