Primjer 3

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.

 

vrh stranice