Primjer 4

Primjer 3.

Pozicioniranje servomotora pomoću MPU6050 modula.

Kroz prošle primjere naučili smo očitavati podatke s MPU6050 modula te pomoću tih podataka kontrolirati rad svjetlećih dioda.

Vrijeme je za korak dalje, za upravljanje radom servomotora zavisno od položaja MPU6050 modula.

Standardni servomotori imaju pomak od otprilike 180 stupnjeva, od 0 do 180, a srednji položaj je na 90 stupnjeva. To znači da se poluga servomotora može od srednjeg položaja okrenuti u jednu ili drugu stranu za po 90 stupnjeva.

Naredbe za upravljanje servomotorima nisu standardni dio Arduino IDE sučelja pa ih je potrebno dodatno ugraditi u naš program. To se, naravno,  radi uključivanjem biblioteke za rad servomotora, „Servo.h“, na početku programa.

Istovremeno možemo upravljati s više motora s tim da svaki mora imati svoje ime, npr servo1, servo2, servolijevo, servonaprijed i slično.

Servomotori se definiraju u početnom dijelu programa, nakon uključivanja svih potrebnih biblioteka, npr :

Servo.mojservo;

Servo.servo2;

Servo.servodolje;

Nakon toga, u setup dijelu programa moramo definirati izvod na koji je pojedini servomotor spojen, npr:

mojservo.attach(6);

servo2.attach(5);

servodolje.attach(3);

itd…

Slijedi glavna petlja programa u kojoj ćemo očitavati podatke sa senzora i zavisno od njih, postavljati polugu servomotora u određeni položaj.

I sad nailazimo na manji problem. Podaci koje ćemo očitavati sa senzora su u rasponu od -90 do 90. Naš servomotor radi s podacima od 0 do 180, ne može raditi s negativnim brojevima. Ako mu kao poziciju zadamo negativni broj, servomotor će polugu pozicionirati u krajnji položaj i pokušavat će ju pomaknuti i dalje, a to ne može. Što znači da bi naš servomotor mogao reagirati samo na vodoravni odmak u pozitivnom rasponu.

Kako riješiti ovaj problem?

Budući da servomotor ima raspon od 0 do 180, a podaci sa senzora bi trebali biti od -90 do 90, mogli bismo jednostavno na očitani podatak dodati 90. Na primjer, ako senzor očita stanje 90, možemo na to dodati 90 i dobit ćemo kao krajnji rezultat 180, što je podatak s kojim servomotor može raditi. Ako očitamo -50 i na to dodamo 90, krajnji rezultat će biti 40 i to je opet upotrebljiva vrijednost. Ako pak senzor očita -90 pa mi na tu vrijednost dodamo 90, dobit ćemo 0 a to je opet podatak s kojim servomotor može funkcionirati.

No, za to postoji funkcija koja se zove map. Ta funkcija pretvara jedan raspon vrijednosti u drugi. Pa ako naprimjer imamo podatke 1,2,3,4 i 5 možemo ih pretvoriti u 22, 23, 24, 25 i 26:

X=map(y, 1, 0, 22, 26);

U ovom primjeru će funkcija map pretvoriti vrijednost 1 u 22, 2 u 23, 3 u 24 i tako redom.

Ali, rasponi „ulaznih“ i „izlaznih“ podataka ne moraju biti isti:

X=map(y, -50, 0, 100, 300);

U ovom primjeru vrijednost raspon ulaznih podataka je 50, a izlaznih 200 pa će funkcija ravnomjerno raspodijeliti ulaznih 50 vrijednosti u isto tako 50 izlaznih vrijednosti, ali će koraci u izlaznim vrijednostima biti veći. No, o tome vodi računa sama funkcija, nama je bitno samo da znamo koji je raspon ulaznih podataka i koji raspon izlaznih podataka želimo.

Evo jedne usporedbe raspona izlaznih podataka:

Y=map(mojziro.refresh('A','Y'), -90, 90, 80, 100);

U ovom primjeru će se poluga servomotora zakretati samo za maksimalno 20 stupnjeva.

Y=map(mojziro.refresh('A','Y'), -90, 90, 0, 180);

Sad će se pak poluga servomotora zakretati za 180 stupnjeva.

Vidimo da su podaci očitani sa senzora u oba primjera u istom rasponu, ali izlazni podaci su u različitim rasponima pa se zato i servomotor ponaša potpuno drugačije.

Da zaključimo, funkcija map će nam biti od izuzetne pomoći, a i program će biti pregledniji.

OK, sad idemo konačno na naš program…

Na slici 3 je prikazana montažna shema:

[if !vml]

Slika 3, montažna shema spajanja servomotora i MPU6050 modula

Definirat ćemo sve potrebne biblioteke i varijable, inicijalizirati sve potrebne uređaje i napisati program koji će zavisno od vodoravnog odmaka MPU6050 modula u jednu ili drugu stranu zakretati polugu servomotora od središnjeg položaja u jednu ili drugu stranu.

#include "GY6050.h"

#include "Wire.h"

#include "Servo.h"

 GY6050 mojziro(0x68);

Servo mojservo;

 int Y;

 

void setup() {

  Serial.begin(9600);

  Wire.begin();

  mojziro.initialisation();

  mojservo.attach(6);

  mojservo.write(90);  //ponekad je poželjno pri pokretanju programa postaviti servomotore u središnji položaj

}

void loop() {

  Y=map(mojziro.refresh('A','Y'), -90, 90, 0, 180);

  Serial.println(Y);

  mojservo.write(Y);

}

I, kada pokrenemo program, servomotor bi trebao zakretati polugu u jednu ili drugu stranu ovisno o vodoravnom odmaku MPU6050 modula po osi y. 

vrh stranice