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.