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 Vii asis. mr.Edin Muji Biha, 2014.

Dalin Reki Br.indeksa 591

SADRAJ

1. 2. 3.

UVOD ................................................................................................................................. 3 MATLAB ........................................................................................................................... 4 UPRAVLJANJE SERVO MOTORA ............................................................................. 6 3.1. Arduino razvojna ploica............................................................................................. 7

4. 5. 6.

IZRADA APLIKACIJE ZA UPRAVLJANJE SERVO MOTORA ............................ 9 ZAKLJUAK ................................................................................................................. 18 LITERATURA ................................................................................................................ 19

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.

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
4

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.

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.

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.

Slika 3.3 : Arduino Mega 2560

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

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 9

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 pozici oniran 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.

10

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 11

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

12

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'))

13

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

14

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;

15

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

16

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 = "";}

17

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.

18

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

[2]

[3]

[4]

19

You might also like