Primjer
3.
Elektronička libela.
Sad, kad znamo kako očitati pomak modula po određenoj osi, pokušajmo taj
pomak i prikazati pomoću svjetlećih dioda. Izradit ćemo model elektroničke
libele. Libela ili razulja je naprava kojom se ispituje okomitost ili
vodoravnost neke površine. Sastoji se od ravnog stalka s ugrađenom blago
zavijenom prozirnom cijevi, koja je ispunjena tekućinom tako da sadrži i
mjehurić plina. Postavi li se libela na vodoravnu ili okomitu ravninu, mjehurić
će se nalaziti u sredini cijevi, a eventualni nagib očitovat će se u otklonu
mjehurića od srednjega položaja. Libela se često upotrebljava u građevinarstvu
radi utvrđivanja horizontalnih linija.
Naš zadatak je, kao što je u uvodu i rečeno, izraditi model elektroničke
libele. Naravno, za očitanje vodoravnog otklona
ćemo upotrijebiti MPU6050 modul koji ćemo postaviti na eksperimentalnu pločicu.
Za prikaz otklona koristit ćemo svjetleće diode, 7 njih, jednu zelenu i 6
crvenih. Svjetleće diode ćemo postaviti na eksperimentalnu pločicu u niz s tim
da zelena bude u sredini, a sa svake strane zelene ćemo postaviti po 3 crvene
svjetleće diode. Zelena dioda nam pokazuje vodoravnost neke površine, a otklon
u jednu ili drugu stranu ćemo prikazivati crvenim svjetlećim diodama i to tako
da će pri manjem otklonu u neku stranu svijetliti samo jedna crvena dioda s te
strane, pri većem otklonu dvije, a pri najvećem sve tri. Isto tako i prilikom
otklona u drugu stranu. Prilikom otklona od vodoravnog položaja zelena
svjetleća dioda bi trebala biti ugašena. Slika 2 prikazuje montažnu shemu naše
elektroničke libele.
Slika2. Montažna shema modela elektroničke libele
Sada je sve spremno za pisanje našeg koda.
Slijedi poznati početak:
#include
<GY6050.h> //biblioteka za žiroskop
#include
<Wire.h> //biblioteka za I2C komunikaciju
Sada definiramo sve potrebne varijable, varijablu 'Y' za prikaz podataka sa
MPU6050 module te varijable za svih sedam svjetlećih dioda.
int
lc1 = 7;
int
lc2 = 8;
int
lc3 = 9;
int
lz1 = 10;
int
lc4 = 11;
int
lc5 = 12;
int
lc6 = 13;
int Y
= 0;
Zatim definiramo objekt (mojziro) za pohranjivanje podataka sa senzora i
adresu (0x68) za I2C komunikaciju:
GY6050
mojziro(0x68);
U setup() dijelu programa određujemo način rada izvoda na koje su spojene
svjetleće diode:
pinMode(lc1,
OUTPUT);
pinMode(lc2,
OUTPUT);
pinMode(lc3,
OUTPUT);
pinMode(lz1,
OUTPUT);
pinMode(lc4,
OUTPUT);
pinMode(lc5,
OUTPUT);
pinMode(lc6,
OUTPUT);
U ovom dijelu programa možemo postaviti i kontrolu svih svjetlećih dioda na
način da se prilikom pokretanja programa sve upale na jednu sekundu te se zatim
sve i ugase. Tako ćemo vrlo lako vidjeti jesu li sve diode ispravno spojene i
rade li sve:
digitalWrite(lc1,
HIGH);
digitalWrite(lc2,
HIGH);
digitalWrite(lc3,
HIGH);
digitalWrite(lz1,
HIGH);
digitalWrite(lc4,
HIGH);
digitalWrite(lc5,
HIGH);
digitalWrite(lc6,
HIGH);
delay(1000);
digitalWrite(lc1,
LOW);
digitalWrite(lc2,
LOW);
digitalWrite(lc3,
LOW);
digitalWrite(lz1,
LOW);
digitalWrite(lc4,
LOW);
digitalWrite(lc5,
LOW);
digitalWrite(lc6,
LOW);
Uspostavljamo komunikaciju sa serijskim monitorom, I2C komunikaciju i
komunikaciju sa MPU6050 modulom:
Serial.begin(9600);
Wire.begin();
mojziro.initialisation(); //inicijalizacija žiroskopa
I, na kraju stavljamo kratku pauzu:
delay(100);
Sada je sve spremno za glavnu petlju programa.
Najprije očitavamo vrijednost sa senzora (odmak od vodoravnog položaja po
osi Y):
Y = mojziro.refresh('A', 'Y'); // očitavamo podatke sa y osi (uzdužna os
modula MPU60650)
Vrijednosti koje
očitavamo trebale bi biti od -90 do 90, a vrijednost koja nam označava
vodoravnost je 0. Dakle, ako nam senzor očitava vrijednost „0“, to znači da je
modul u potpuno vodoravnom položaje i u tom slučaju svijetlit će samo zelena
svjetleća dioda…
if (Y==0){
digitalWrite(lc3,LOW);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,HIGH);
digitalWrite(lc4,LOW);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);
}
Ako se senzor odigne
u jednu ili drugu stranu po osi Y, zelena bi se svjetleća dioda trebala
ugasiti, a crvene diode s te strane bi se trebale redom paliti kako se modul
odiže ili gasiti kako se spušta…
if ((Y>0) && (Y<15)){
digitalWrite(lc3,HIGH);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,LOW);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);
}
if
((Y>15) && (Y<30)){
digitalWrite(lc3,HIGH);
digitalWrite(lc2,HIGH);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,LOW);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);}
if
(Y>30){
digitalWrite(lc3,HIGH);
digitalWrite(lc2,HIGH);
digitalWrite(lc1,HIGH);
digitalWrite(lz1,LOW);
digitalWrite(lc4,LOW);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);}
if
((Y<0) && (Y>-15)){
digitalWrite(lc3,LOW);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,HIGH);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);
}
if
((Y<-15) && (Y>-30)){
digitalWrite(lc3,LOW);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,HIGH);
digitalWrite(lc5,HIGH);
digitalWrite(lc6,LOW);}
if
(Y<-30){
digitalWrite(lc3,LOW);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,HIGH);
digitalWrite(lc5,HIGH);
digitalWrite(lc6,HIGH);}
Vrijednosti koje
su postavljene kao granične za pojedine svjetleće diode su proizvoljne…
Možemo ih
postaviti prema tome koliko precizno očitanje želimo.
Želimo li vidjeti
koje vrijednosti se očitavaju možemo ih odmah nakon očitavanja na početku
glavne petlje programa prikazati i na serijskom monitoru:
Y = mojziro.refresh('A', 'Y');
Serial.println(Y);
Pokrenemo li
program, na serijskom monitoru bismo trebali dobiti očitavanja sa MPU6050 modula,
a svjetleće diode bi nam trebale pokazati vodoravan položaj ili otklon u jednu
ili drugu stranu…
Eto i koda:
#include
<GY6050.h> //biblioteka za žiroskop
#include
<Wire.h> //biblioteka za I2C komunikaciju
int lc1 = 7;
int lc2 = 8;
int lc3 = 9;
int lz1 = 10;
int lc4 = 11;
int lc5 = 12;
int lc6 = 13;
int Y = 0;
GY6050
mojziro(0x68); // pohranjivanje podataka sa žiroskopa
void setup() {
pinMode(lc1, OUTPUT);
pinMode(lc2, OUTPUT);
pinMode(lc3, OUTPUT);
pinMode(lz1, OUTPUT);
pinMode(lc4, OUTPUT);
pinMode(lc5, OUTPUT);
pinMode(lc6, OUTPUT);
digitalWrite(lc1, HIGH);
digitalWrite(lc2, HIGH);
digitalWrite(lc3, HIGH);
digitalWrite(lz1, HIGH);
digitalWrite(lc4, HIGH);
digitalWrite(lc5, HIGH);
digitalWrite(lc6, HIGH);
delay(1000);
digitalWrite(lc1, LOW);
digitalWrite(lc2, LOW);
digitalWrite(lc3, LOW);
digitalWrite(lz1, LOW);
digitalWrite(lc4, LOW);
digitalWrite(lc5, LOW);
digitalWrite(lc6, LOW);
Serial.begin(9600);
Wire.begin();
mojziro.initialisation(); //inicijalizacija žiroskopa
delay(100);
}
void loop() {
Y = mojziro.refresh('A', 'Y');
Serial.println(Y);
if (Y==0){
digitalWrite(lc3,LOW);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,HIGH);
digitalWrite(lc4,LOW);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);
}
if ((Y>0) && (Y<15)){
digitalWrite(lc3,HIGH);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,LOW);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);
}
if ((Y>15) && (Y<30)){
digitalWrite(lc3,HIGH);
digitalWrite(lc2,HIGH);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,LOW);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);}
if (Y>30){
digitalWrite(lc3,HIGH);
digitalWrite(lc2,HIGH);
digitalWrite(lc1,HIGH);
digitalWrite(lz1,LOW);
digitalWrite(lc4,LOW);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);}
if ((Y<0) && (Y>-15)){
digitalWrite(lc3,LOW);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,HIGH);
digitalWrite(lc5,LOW);
digitalWrite(lc6,LOW);
}
if ((Y<-15) && (Y>-30)){
digitalWrite(lc3,LOW);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,HIGH);
digitalWrite(lc5,HIGH);
digitalWrite(lc6,LOW);}
if (Y<-30){
digitalWrite(lc3,LOW);
digitalWrite(lc2,LOW);
digitalWrite(lc1,LOW);
digitalWrite(lz1,LOW);
digitalWrite(lc4,HIGH);
digitalWrite(lc5,HIGH);
digitalWrite(lc6,HIGH);}
}
I, na kraju, u
programu su korištene if funkcije. Za vježbu pokušajte iskoristiti neke druge
načine za kontrolu svjetlećih dioda (možda SWITCH CASE…) kako biste vidjeli
razliku u veličini i preglednosti količini koda.