Arduino Matlab Serial Port Control Servo Motor With Serial Port

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

UNIVERZITET U BIHAU

TEHNIKI FAKULTET
Elektrotehniki odsjek
Smjer Informatika








NAPREDNO PROGRAMIRANJE I
Seminarski rad

Tema: Upravljanje servo motora










Prof. dr. Petar Mari Dalin Reki
Vii asis. mr.Edin Muji Br.indeksa 591

Biha, 2014.
2

SADRAJ

1. UVOD ................................................................................................................................. 3
2. MATLAB ........................................................................................................................... 4
3. UPRAVLJANJE SERVO MOTORA ............................................................................. 6
3.1. Arduino razvojna ploica ............................................................................................. 7
4. IZRADA APLIKACIJE ZA UPRAVLJANJE SERVO MOTORA ............................ 9
5. ZAKLJUAK ................................................................................................................. 18
6. LITERATURA ................................................................................................................ 19























3

1. UVOD

Tema ovog rada je korienjem MATLAB prgramskog jezika izraditi grafiko
suelje za upravljanje servo motora. Pri samoj izradi aplikacije koristie se serial port
za komunikaciju raunara i Arduino razvojne plooce putem koje e se vriti
upravljanje servo motora. Kompletan rad e se sastojati od aplikaciju izraene u
MATLAB-u koja sadri animaciju servo motora kojeg upravljamo i programa
napisanog u Arduino grafickom suelju u kojem se koristi modifikovani C programski
jezik. MATLAB je pogodan za izradu ove aplikacije zbog lake izrade animacije i lake
komunikacije sa serial port-om takoer i Arduino razvojna ploica ima mogunost
komunikacije sa raunarom putem serial port-a putem USB-a ulaza to je puno lake
za razliku od dosadanjeg RS232 prikljuka.



















4

2. MATLAB
MATLAB (Matrix Laboratory) je programski jezik namjenjen za tehnike
proraune. Objedinjava raunanje, vizualizaciju i programiranje u lako uporabljivoj
okolini u kojoj su problem i rjeenje definirani poznatom matematikom notacijom.
Uobiajena je uporaba MATLAB-a za
matematiku i izraune,
razvoj algoritama,
modeliranje, simulaciju, analizu,
analizu i obradu podataka, vizualizaciju,
znanstvenu i inenjersku grafiku,
razvoj aplikacija, ukljuujui i izgradnju GUI.

Slika 2.1 : Programsko suelje
Jedna od jaih strana MATLAB-a je injenica da njegov programski jezik omoguava
izgradnju vlastitih alata za viestruku uporabu. Pisanje samog koda programskog jezika
MATLAB se vri u M-file-u.
.
Naredbe za MATLAB unosimo u komandni prozor, osnovni prozor MATLAB-a. Taj je
prozor neka vrsta terminala operacijskog sustava i u njemu vrijede i osnovne terminalske
5

operacijske komande za manipulaciju datotekama. Trenutni direktorij moemo promijeniti
poznatom naredbom cd, a izvravati moemo funkcije/naredbe koje su u path-u. Pored toga
uz MATLAB novije verzije dolazi i vlastiti editor M-datoteka s debugerom.
Osnovni elementi programskog paketa MATLAB su:
-Razvojna okolina
Skup alata za laku uporabu MATLAB-a i njegovih funkcija. Mnogi od ovih alata (u
verziji 6) su realizirani u grafikom suelju. To su MATLAB desktop, komandni prozor
(engl. Command Window), povijest naredbi (engl. command history), editor i
debuger, te preglednici help-a, radnog prostora (engl. Workplace), datoteka te path-a.

-Biblioteka matematikih funkcija
Ogromna kolekcija raunalnih algoritama.

-Programski jezik
MATLAB programski jezik je jezik visokog stupnja matrino orjentiran, s naredbama
uvjetnih struktura, funkcija, struktuiranim podacima, ulazomizlazom te nekim
svojstvima objektno-orjentiranog programiranja. Ovaj programski jezik omoguava
programiranje na nioj razini (kao npr. za potrebe studenata) ali i za kompleksnije
programe veih razmjera.


-Grafiki alat

MATLAB raspolae velikim mogunostima za grafiki prikaz podataka, vektora i
matrica, kao i notaciju i printanje tih dijagrama. Postoje funkcije visokog stupnja za
2D i 3D vizualizaciju podataka, obradu slike, animaciju. Takoer postoje i funkcije za
izgradnju grafikih suelja za vae MATLAB aplikacije.

-Suelje programskih aplikacija
Biblioteka (engl. Application Program Interface - API) koja vam omoguava razvoj C
i Fortran programa koji mogu biti u interakciji s MATLAB-om.

















6

3. UPRAVLJANJE SERVO MOTORA
Servo motori su u velikoj primjeni danas u izradi raznih maina i robotike, laki su
za upravljanje te ih odlikuje velika snaga i preciznost. Danas su najpopularniji RC
(Radio Control) servo motori. Dobili su naziv po tome to se najvie koriste u
upravljanju raznih maketa putem radio daljiskog upravljaa. Odlikuje ih velika snagat,
mala teina, ne zahtjevaje velika napajanja te su pristupani cijenom. Jedan ovakav
servo motor emo koristiti u izradi ove aplikacije.


Slika 3.1 : RC servo motor MG966R

Sastavni dijelovi servo motora su: potenciometar, DC motor, mehaniki prenos i
operaciono pojaalo. Na ulazu servo motora se nalaze tri ice i to dvoje za dovod napajanja na
servo i trea slui sa dovoenje kontrolnog signala u servo. Servo motor radi na taj nain da
ulazni signal ili kontrolni signal dolazi do ''Error Amplifier'' koji pojaava taj signal i odvodi
ga na motor koji pokree preko mehanikog prenosa potenciometar te podeava otpornost na
njemu sve dok se povradni signal i ulazni signal ne budu jednaki te se ponite na ulazu u
''Error Amplifier''. ematski prikaz unutranjosti servo motora je prikazana na sljedeoj slici.



7


Slika 3.2 : Blokovski prikaz unutranjosti servo motora

3.1. Arduino razvojna ploica

Prva razvojna ploa je razvijena 2005. godine u Italiji za studentske upotrebe. Prvi
model je kotao priblino 100 dolara to zapravo nije bio cilj kreatorima ove razvijne
platforme. Njihov cilj je bio da to vie svoje proizvode priblie studentima i po to
manjoj cijeni jer su i sami bili studenti. Jedan od njih je bio Massimo Banzi te student
iz Kolumbije koji je osmislio osnovni dizajn razvojne ploe Hernando Barragan. Ova
grupa studenata danas su doli do svog cilja to se tie cijene koja je trenutno za
osnovni model oko 30 dolara to je jako pristupana cijena.
Jedni od poznatijih modela su: UNO R3, MEGA, NANO te razne vrste dotaka za
iste, kao to su: Bluetooth, Wifi, LCD, TFT, Ethernet, GSM i razni drugi moduli.
U ovom radu koristie se razvojna ploa Arduino Mega 2560. Odlikuje se kao
najvea trenutno u ponudi jer sadri 54 digitalna pina od kojih je 15 pinova PWM
(Pulse Width Modulation) te 16 analognih ulaza. Takoer moe istovremeno da
komunicira sa 4 serial porta.
8


Slika 3.3 : Arduino Mega 2560

Specifikacija Arduino Mega 2560
Microcontroller ATmega2560
Operating Voltage 5V
Input Voltage (recommended) 7-12V
Input Voltage (limits) 6-20V
Digital I/O Pins 54 (of which 15 provide PWM output)
Analog Input Pins 16
DC Current per I/O Pin 40 mA
DC Current for 3.3V Pin 50 mA
Flash Memory 256 KB of which 8 KB used by bootloader
SRAM 8 KB
EEPROM 4 KB
Clock Speed 16 MHz












9

4. IZRADA APLIKACIJE ZA UPRAVLJANJE SERVO
MOTORA


Izrada u programskom jeziku Matlab se sastoji od slijedei koraka:

1. U Command Window(Komandnom prostoru) napiemo guide, i samim time otvara
se GUIDE Quick Start, kao to je prikazano na slijedeoj slici :


Slika 4.1. Guide Quick Start
U GUIDE Quick Start-u dobijemo nekoliko ponuenih template-a, mi
odaberemo prvi, a to je Blank GUI (Default), jer elimo da dobijemo prazno mjesto
za kreiranje nae aplikacije, kao to je to i prikazano na slijedeoj slici :

Slika 4.2. Blank Gui prostor na koji smjetamo komponente
10

Kao to vidimo sa slike, dobijemo prazan prostor za kreiranje nae aplikacije.
Kreiranje aplikacije se sastoji od niza koraka, koji e biti objanjeni u daljnjem radu.
Prvi korak u izradi grafikog suelja je da dodamo jedan axes, dva button-a te
jedan slider. Grafiko suelje je prikazano na sljedeoj slici.

Slika 4.3. Prikaz grafikog suelja za upravljanje

Axes tag e sluiti za iscrtavanje animacije servo motora, slider za podeavanje
eljenog ugla, button ''Zaponi simulaciju'' slui za pokretanje simulacije i poetak
komunikacije aplikacije sa serial portom takoer button ''Izlaz'' slui za prekid
simuliranja i zatvaranje aplikacije. Takoer grafiko suelje sadri dva text taga koji
slue za prikaz najmanjeg ugla tj. 0 i trenutnog ugla na kojem je slider podeen.
Zadani ugao tj poetni prilikom pokretanja aplikacije je 90 , te je slider pozicioniran u
sredini svog kliznog podruja.
Za crtanje servo motora koristie se patch() metoda, potrebno je nacrtati sljedee
oblike : dva kvadrata, jedan krug i jedan trougao koji simbolizira polugu servo motora.




11

Na sljedeoj slici vidimo pokrenutu aplikaciju za upravljanje servo motora.

Slika 4.4. Izgled pokrenutog grafikog suelja za kontorlu
Suelje za programiranje Arduino ploice je prikazano na slici 4.5. , suelje se sastoji
od prostora za pisanje koda, te komandnog prostora u dnu. Takoer Arduno
programersko suelje sadri i direktan pristup serial portu te se manuelno mogu slati
podaci ka serial portu tj. ka Arduno razvojnoj ploici.

Slika 4.5. Izgled Arduino programerskog suelja
12


Slika 4.6. Shematski prikaz spajanja Arduino ploice sa ostalim komponentama
Kao to vidimo na slici 4.6 shematski prikaz spajanja, shema sadri sljedee
komponente:
- Arduino Mega 2560
- Servo motor MG966R
- LM7805 regulator napona koji nam slui da voltau eksternog napajanja spustimo
na preporienih 5V koji su potrebni za napajanje servo motora te veu struju koju
daje eksterno napajanje
- Eksterno DC napajanje od 6V i maksimalne izlazne struje od 500mA

KOD PROGRAMA:
Matlab:

function varargout = seminarskiArduinoNP(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @seminarskiArduinoNP_OpeningFcn, ...
'gui_OutputFcn', @seminarskiArduinoNP_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end

13

function seminarskiArduinoNP_OpeningFcn(hObject, eventdata, handles,
varargin)


handles.output = hObject;
set(handles.slider1,'Value',90);
axes(handles.axes1);
set(handles.axes1,'XTick',[])
set(handles.axes1,'YTick',[])
axis square;
x=[8 12 12 8];
y=[1 1 8 8];
patch(x,y,([0.8 0.8 0.8]))
hold on
x1=[8.5 11.5 11.5 8.5];
y1=[4.5 4.5 7.5 7.5];
patch(x1,y1,([0.8 0.8 0.8]))
hold on

handles.ugao = 90;
lijevo = handles.ugao + 90;
desno = handles.ugao - 90;
x11 = 0.5*cosd(lijevo)+10;
y11 = 0.5*sind(lijevo)+6;
x12 = 0.5*cosd(desno)+10;
y12 = 0.5*sind(desno)+6;
x13 = 4*cosd(handles.ugao)+10;
y13 = 4*sind(handles.ugao)+6;
x2=[x11 x12 x13];
y2=[y11 y12 y13];
patch(x2,y2,'r')
t = linspace(0,2*pi,1000);
h=10;
k=6;
r=0.5;
X = r*cos(t)+h;
Y = r*sin(t)+k;
patch(X,Y,'r')


guidata(hObject, handles);

function varargout = seminarskiArduinoNP_OutputFcn(hObject, eventdata,
handles)

varargout{1} = handles.output;


% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)

function slider1_CreateFcn(hObject, eventdata, handles)




% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
14

set(hObject,'BackgroundColor',[.9 .9 .9]);
end

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)


global gl
if isempty(gl)
gl = 90;
end
arduino = serial('COM2','BaudRate',9600);
fopen(arduino);
try
while true
pause(1);
bro = 0;
clear bro;
tekst = '';
clear tekst;
granica = '';
dopunska = '';
vrijednost = get(handles.slider1,'Value');
vrijednostINT = int64(vrijednost);
tekst = num2str(vrijednostINT);
bro = 180 - str2num(tekst);
set(handles.text1,'String',num2str(bro));
if bro < 100 && bro > 9
clear tekst;
if gl < 100 && gl > 10
granica = strcat('0',num2str(gl));
end
if gl > 99
granica = num2str(gl);
end
if gl < 10
granica = strcat('00',num2str(gl));
end
dopunska = strcat('0',num2str(bro));
tekst = strcat(dopunska,granica);
fprintf(arduino, '%s', tekst);
fukcijaRotiranja(gl,bro);
end

if bro > 99
clear tekst;
if gl < 100 && gl> 10
granica = strcat('0',num2str(gl));
end
if gl > 99
granica = num2str(gl);
end
if gl < 10
granica = strcat('00',num2str(gl));
end
dopunska = num2str(bro);
tekst = strcat(dopunska,granica);
fprintf(arduino, '%s', tekst);
fukcijaRotiranja(gl,bro);
end
15


if bro < 10
clear tekst;
if gl < 100 && gl> 10
granica = strcat('0',num2str(gl));
end
if gl > 99
granica = num2str(gl);
end
if gl < 10
granica = strcat('00',num2str(gl));
end
dopunska = strcat('00',num2str(bro));
tekst = strcat(dopunska,granica);
fprintf(arduino, '%s', tekst);
fukcijaRotiranja(gl,bro);
end

gl = bro;
end
catch err
fclose(arduino);
clear all
return;
end

function figure1_CloseRequestFcn(hObject, eventdata, handles)
clear all;
close all;
delete(hObject);




% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)

clear all;
close all;

function [] = fukcijaRotiranja(od,do)
if od < do
for i = od : 1 : do
cla;
x=[8 12 12 8];
y=[1 1 8 8];
patch(x,y,([0.8 0.8 0.8]))
hold on
x1=[8.5 11.5 11.5 8.5];
y1=[4.5 4.5 7.5 7.5];
patch(x1,y1,([0.8 0.8 0.8]))
hold on
lijevo = i + 90;
desno = i - 90;
x11 = 0.5*cosd(lijevo)+10;
y11 = 0.5*sind(lijevo)+6;
x12 = 0.5*cosd(desno)+10;
y12 = 0.5*sind(desno)+6;
x13 = 4*cosd(i)+10;
y13 = 4*sind(i)+6;
16

x2=[x11 x12 x13];
y2=[y11 y12 y13];
h = patch(x2,y2,'r');
zdir = [0 0 1];
centar = [10 6 0];
rotate(h, zdir, 1, centar);
t = linspace(0,2*pi,1000);
h=10;
k=6;
r=0.5;
X = r*cos(t)+h;
Y = r*sin(t)+k;
patch(X,Y,'r')
pause(0.00005);


end
else
for i = od : -1 : do
cla;
x=[8 12 12 8];
y=[1 1 8 8];
patch(x,y,([0.8 0.8 0.8]))
hold on
x1=[8.5 11.5 11.5 8.5];
y1=[4.5 4.5 7.5 7.5];
patch(x1,y1,([0.8 0.8 0.8]))
hold on
lijevo = i + 90;
desno = i - 90;
x11 = 0.5*cosd(lijevo)+10;
y11 = 0.5*sind(lijevo)+6;
x12 = 0.5*cosd(desno)+10;
y12 = 0.5*sind(desno)+6;
x13 = 4*cosd(i)+10;
y13 = 4*sind(i)+6;
x2=[x11 x12 x13];
y2=[y11 y12 y13];
h = patch(x2,y2,'r');
zdir = [0 0 1];
centar = [10 6 0];
rotate(h, zdir, 1, centar);
t = linspace(0,2*pi,1000);
h=10;
k=6;
r=0.5;
X = r*cos(t)+h;
Y = r*sin(t)+k;
patch(X,Y,'r')
pause(0.00005);
end
end





17

Arduino:

#include <Servo.h>
Servo servo;
String readString = "";
int motor1;
int motor2;
void setup(){
Serial.begin(9600);
servo.attach(36);
servo.write(90);
}
void loop(){
while (Serial.available() > 0){
delay(10);
if(Serial.available() >0) {
char c = Serial.read(); //gets one byte from serial buffer
readString += c; //makes the string readString
}
else servo.write(90);
}
if (readString.length() == 6){
String m1 = readString.substring(0, 3);
String m2 = readString.substring(3, 6);
char carray1[6]; //magic needed to convert string to a number
char carray2[6];
m1.toCharArray(carray1, sizeof(carray1));
motor1 = atoi(carray1);
m2.toCharArray(carray2, sizeof(carray2));
motor2 = atoi(carray2);
if(motor2 < motor1){
for(int i = motor2; i <= motor1; i++){
servo.write(i);
delay(10);
}}
if(motor2 > motor1){
for(int i = motor2; i>= motor1; i--){
servo.write(i);
delay(10);
}}}
readString = "";}


18

5. ZAKLJUAK

U ovom radu upoznali smo se sa dva programska jezika koja zajedno u
kombinaciji daju korisniku aplikacij mogunost upravljanja neim ili zadavanja nekih
drugih naredbi sa raunara ka nekom vanjiskom elektronskom sklopu van raunara.
Takoer moe se primjetiti da je MATLAB jako koristan u izradi simulacije samog
servo motora u ovom sluaju i da simulacija u istom je skoro pa priblina realnom
rezultatu pomjerenog ugla na servo motoru. Vidjeli smo mogunosti Arduna takoer
da ima veliku iskoristivost u kombinaciji s MATLABOM koji je Arduni blago reeno
mentor u njevom radu i upravljanju servo motor. Naravno ne mora to biti samo servo
motor uz dodatne module kompletna aplikacija se moze proiriti na takav nain da
moe biti simulacija kretanja nekog robota koji sadri u sebi servo motore i naravno
prenos informacija sa raunara ka Arduino ploici moe ak biti i beian tj na daljinu.

















19

6. LITERATURA

[1] http://www.mathworks.com/help/matlab/serial-port-devices.html ,
Pregledano : 04.02.2014.godine
[2] http://arduino.cc/en/reference/servo ,
Pregledano: 04.02.2014.godine
[3] http://www.fairchildsemi.com/ds/LM/LM7805.pdf ,
Pregledano: 04.02.2014.god

[4] http://www.mathworks.com/help/pdf_doc/matlab/buildgui.pdf ,
Pregledano: 04.02.2014.god

You might also like