Arduino Matlab Serial Port Control servo motor MG996r with Arduino Mega 2560 and GUI Matlab...

19
UNIVERZITET U BIHAĆU TEHNIČKI FAKULTET Elektrotehnički odsjek Smjer Informatika NAPREDNO PROGRAMIRANJE I Seminarski rad Tema: Upravljanje servo motora Prof. dr. Petar Marić Dalin Rekić Viši asis. mr.Edin Mujčić Br.indeksa 591 Bihać, 2014.

description

Arduino Matlab Serial Port Control servo motor MG996r with Arduino Mega 2560 and GUI Matlab applicationUSB serial port connection

Transcript of Arduino Matlab Serial Port Control servo motor MG996r with Arduino Mega 2560 and GUI Matlab...

Page 1: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

UNIVERZITET U BIHAĆU

TEHNIČKI FAKULTET

Elektrotehnički odsjek

Smjer Informatika

NAPREDNO PROGRAMIRANJE I

Seminarski rad

Tema: Upravljanje servo motora

Prof. dr. Petar Marić Dalin Rekić

Viši asis. mr.Edin Mujčić Br.indeksa 591

Bihać, 2014.

Page 2: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

2

SADRŽAJ

1. UVOD ................................................................................................................................. 3

2. MATLAB ........................................................................................................................... 4

3. UPRAVLJANJE SERVO MOTORA ............................................................................. 6

3.1. Arduino razvojna pločica ............................................................................................. 7

4. IZRADA APLIKACIJE ZA UPRAVLJANJE SERVO MOTORA ............................ 9

5. ZAKLJUČAK ................................................................................................................. 18

6. LITERATURA ................................................................................................................ 19

Page 3: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

3

1. UVOD

Tema ovog rada je korišćenjem MATLAB prgramskog jezika izraditi grafičko

sučelje za upravljanje servo motora. Pri samoj izradi aplikacije koristiće se serial port

za komunikaciju računara i Arduino razvojne pločoce putem koje će se vršiti

upravljanje servo motora. Kompletan rad će se sastojati od aplikaciju izrađene u

MATLAB-u koja sadrži animaciju servo motora kojeg upravljamo i programa

napisanog u Arduino grafickom sučelju 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 također i Arduino razvojna pločica ima mogućnost

komunikacije sa računarom putem serial port-a putem USB-a ulaza što je puno lakše

za razliku od dosadašnjeg RS232 priključka.

Page 4: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

4

2. MATLAB

MATLAB (Matrix Laboratory) je programski jezik namjenjen za tehničke

proračune. Objedinjava računanje, vizualizaciju i programiranje u lako uporabljivoj

okolini u kojoj su problem i rješenje definirani poznatom matematičkom notacijom.

Uobičajena je uporaba MATLAB-a za

matematiku i izračune,

razvoj algoritama,

modeliranje, simulaciju, analizu,

analizu i obradu podataka, vizualizaciju,

znanstvenu i inženjersku grafiku,

razvoj aplikacija, uključujući i izgradnju GUI.

Slika 2.1 : Programsko sučelje

Jedna od jačih strana MATLAB-a je činjenica da njegov programski jezik omogućava

izgradnju vlastitih alata za višestruku uporabu. Pisanje samog koda programskog jezika

MATLAB se vrši 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

Page 5: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

5

operacijske komande za manipulaciju datotekama. Trenutni direktorij možemo promijeniti

poznatom naredbom cd, a izvršavati možemo 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 lakšu uporabu MATLAB-a i njegovih funkcija. Mnogi od ovih alata (u

verziji 6) su realizirani u grafičkom sučelju. 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 matematičkih funkcija Ogromna kolekcija računalnih algoritama.

-Programski jezik MATLAB programski jezik je jezik visokog stupnja matrično orjentiran, s naredbama

uvjetnih struktura, funkcija, struktuiranim podacima, ulazomizlazom te nekim

svojstvima objektno-orjentiranog programiranja. Ovaj programski jezik omogućava

programiranje na nižoj razini (kao npr. za potrebe studenata) ali i za kompleksnije

programe većih razmjera.

-Grafički alat

MATLAB raspolaže velikim mogućnostima za grafički 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. Također postoje i funkcije za

izgradnju grafičkih sučelja za vaše MATLAB aplikacije.

-Sučelje programskih aplikacija Biblioteka (engl. Application Program Interface - API) koja vam omogućava razvoj C

i Fortran programa koji mogu biti u interakciji s MATLAB-om.

Page 6: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

6

3. UPRAVLJANJE SERVO MOTORA

Servo motori su u velikoj primjeni danas u izradi raznih mašina 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 najviše koriste u

upravljanju raznih maketa putem radio daljiskog upravljača. Odlikuje ih velika snagat,

mala težina, ne zahtjevaje velika napajanja te su pristupačni 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, mehanički prenos i

operaciono pojačalo. Na ulazu servo motora se nalaze tri žice i to dvoje za dovod napajanja na

servo i treća služi sa dovođenje kontrolnog signala u servo. Servo motor radi na taj način da

ulazni signal ili kontrolni signal dolazi do ''Error Amplifier'' koji pojačava taj signal i odvodi

ga na motor koji pokreće preko mehaničkog prenosa potenciometar te podešava otpornost na

njemu sve dok se povradni signal i ulazni signal ne budu jednaki te se ponište na ulazu u

''Error Amplifier''. Šematski prikaz unutrašnjosti servo motora je prikazana na sljedećoj slici.

Page 7: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

7

Slika 3.2 : Blokovski prikaz unutrašnjosti servo motora

3.1. Arduino razvojna pločica

Prva razvojna ploča je razvijena 2005. godine u Italiji za studentske upotrebe. Prvi

model je koštao približno 100 dolara što zapravo nije bio cilj kreatorima ove razvijne

platforme. Njihov cilj je bio da što više svoje proizvode približe 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 ploče Hernando Barragan. Ova

grupa studenata danas su došli do svog cilja što se tiče cijene koja je trenutno za

osnovni model oko 30 dolara što je jako pristupačna 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 koristiće se razvojna ploča Arduino Mega 2560. Odlikuje se kao

najveća trenutno u ponudi jer sadrži 54 digitalna pina od kojih je 15 pinova PWM

(Pulse Width Modulation) te 16 analognih ulaza. Također može istovremeno da

komunicira sa 4 serial porta.

Page 8: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

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

Page 9: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

9

4. IZRADA APLIKACIJE ZA UPRAVLJANJE SERVO

MOTORA

Izrada u programskom jeziku Matlab se sastoji od slijedeći koraka:

1. U Command Window(Komandnom prostoru) napišemo guide, i samim time otvara

se GUIDE Quick Start, kao što je prikazano na slijedećoj slici :

Slika 4.1. Guide Quick Start

U GUIDE Quick Start-u dobijemo nekoliko ponuđenih template-a, mi

odaberemo prvi, a to je Blank GUI (Default), jer želimo da dobijemo prazno mjesto

za kreiranje naše aplikacije, kao što je to i prikazano na slijedećoj slici :

Slika 4.2. Blank Gui – prostor na koji smještamo komponente

Page 10: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

10

Kao što vidimo sa slike, dobijemo prazan prostor za kreiranje naše aplikacije.

Kreiranje aplikacije se sastoji od niza koraka, koji će biti objašnjeni u daljnjem radu.

Prvi korak u izradi grafičkog sučelja je da dodamo jedan axes, dva button-a te

jedan slider. Grafičko sučelje je prikazano na sljedećoj slici.

Slika 4.3. Prikaz grafičkog sučelja za upravljanje

Axes tag će služiti za iscrtavanje animacije servo motora, slider za podešavanje

željenog ugla, button ''Započni simulaciju'' služi za pokretanje simulacije i početak

komunikacije aplikacije sa serial portom također button ''Izlaz'' služi za prekid

simuliranja i zatvaranje aplikacije. Također grafičko sučelje sadrži dva text taga koji

služe za prikaz najmanjeg ugla tj. 0 i trenutnog ugla na kojem je slider podešen.

Zadani ugao tj početni prilikom pokretanja aplikacije je 90º , te je slider pozicioniran u

sredini svog kliznog područja.

Za crtanje servo motora koristiće se patch() metoda, potrebno je nacrtati sljedeće

oblike : dva kvadrata, jedan krug i jedan trougao koji simbolizira polugu servo motora.

Page 11: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

11

Na sljedećoj slici vidimo pokrenutu aplikaciju za upravljanje servo motora.

Slika 4.4. Izgled pokrenutog grafičkog sučelja za kontorlu

Sučelje za programiranje Arduino pločice je prikazano na slici 4.5. , sučelje se sastoji

od prostora za pisanje koda, te komandnog prostora u dnu. Također Arduno

programersko sučelje sadrži i direktan pristup serial portu te se manuelno mogu slati

podaci ka serial portu tj. ka Arduno razvojnoj pločici.

Slika 4.5. Izgled Arduino programerskog sučelja

Page 12: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

12

Slika 4.6. Shematski prikaz spajanja Arduino pločice sa ostalim komponentama

Kao što vidimo na slici 4.6 shematski prikaz spajanja, shema sadrži sljedeće

komponente:

- Arduino Mega 2560

- Servo motor MG966R

- LM7805 regulator napona koji nam služi da voltažu eksternog napajanja spustimo

na preporičenih 5V koji su potrebni za napajanje servo motora te veću 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

Page 13: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

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

Page 14: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

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

Page 15: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

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;

Page 16: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

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

Page 17: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

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

Page 18: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

18

5. ZAKLJUČAK

U ovom radu upoznali smo se sa dva programska jezika koja zajedno u

kombinaciji daju korisniku aplikacij mogućnost upravljanja nečim ili zadavanja nekih

drugih naredbi sa računara ka nekom vanjiskom elektronskom sklopu van računara.

Također može se primjetiti da je MATLAB jako koristan u izradi simulacije samog

servo motora u ovom slučaju i da simulacija u istom je skoro pa približna realnom

rezultatu pomjerenog ugla na servo motoru. Vidjeli smo mogućnosti Arduna također

da ima veliku iskoristivost u kombinaciji s MATLABOM koji je Arduni blago rečeno

mentor u njevom radu i upravljanju servo motor. Naravno ne mora to biti samo servo

motor uz dodatne module kompletna aplikacija se moze proširiti na takav način da

može biti simulacija kretanja nekog robota koji sadrži u sebi servo motore i naravno

prenos informacija sa računara ka Arduino pločici može čak biti i bežičan tj na daljinu.

Page 19: Arduino Matlab Serial Port    Control servo motor MG996r with   Arduino Mega 2560 and GUI Matlab application

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