arduino matlab serial port control servo motor with serial port
DESCRIPTION
Control servo motor with arduino and matlab GUI.TRANSCRIPT
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.
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
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.
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
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.
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.
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.
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 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
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.
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
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
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. 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.
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