MATLAB - CRIANDO INTERFACE GRÁFICA (Prof.: Michael Klug) GUI - Graphical User Interface EXEMPLO: Controle de Servo-Motor com uma interface gráfica em Matlab + Arduino PASSO 1: Criando uma nova interface gráfica Digitar "guide" no workspace
PASSO 2: Inserir os elementos desejados Arrastar os elementos necessários a aplicação que se deseja efetuar Dimensionar e ajustar a propriedade de cada elemento OBS: a propriedade "TAG" de cada elemento deve ser memorizada para a posterior programação (para facilitar devem ser utilizadas nomenclaturas que lembrem a função de cada objeto: ex: botao_on, lista_dados,...); Para alterar as propriedades de um elemento basta dar dois cliques sobre o mesmo. Para o Exemplo em questão: i) Inserir o elemento Static Text: - altere a propriedade "string" para "Controle Servo-Motor"; - altere a propriedade "fontsize" para "20" e redimensione o elemento; ii) Clique sobre o elemento "slider" e o adicione a tela com a dimensão desejada: - altere a propriedade "tag" para "angulo_servo";
- altere a propriedade "min" para "0" e "max" para "180"; - altere a propriedade "value" para "90". iii) Adicione dois Static Texts: - acima do slider com a string "Angulo Desejado"; - abaixo do slider com a string "90" e tag "string_angulo". Pronto: uma vez construída a interface gráfica é possível passar a fase de programação: PROGRAMAÇÃO: PASSO 1: Baixe o pacote para manipulação do arduino via Matlab: Opção 1: URL:http://www.mathworks.com/matlabcentral/fileexchange/32374-legacy-matlaband-simulink-support-for-arduino OBS: após efetuar o download e descompactar, efetuar a instalação a partir do arquivo "install_arduino.m" diretamente do workspace do matlab. Opção 2: para versões mais recentes do Matlab: URL: http://www.mathworks.com/hardware-support/arduino-matlab.html PASSO 2: Conecte o arduino e identifique a porta utilizada (ver primeira figura abaixo). Carregue o arduino com o firmware "adioes.pde" (localizado na pasta pde/adioes) usando a sua IDE (ver segunda figura abaixo).
Pronto, o arduino está apto a ser controlado através do ambiente Matlab!!! Comandos típicos: % connect the board a=arduino('com5') % specify pin mode for pins 4, 13 and 5 pinmode(a,4,'input'); pinmode(a,13,'output'); pinmode(a,5,'output'); % read digital input from pin 4 dv=digitalread(a,4); % output the digital value (0 or 1) to pin 13 digitalwrite(a,13,dv); % read analog input from analog pin 5 (physically!= from digital pin 5) av=analogread(a,5); % normalize av from 0:1023 to 0:254 av=(av/1023)*254; % ouptput value on digital (pwm) pin 5 (again, different from digital pin 5) analogwrite(a,5,round(av)) % change reference voltage for analog pins to external analogreference(a,'external'); % change it back to default analogreference(a,'default');
% gets the name of the serial port to which the arduino is connected to serial(a) % flushes the PC's serial input buffer (just in case) flush(a); % sends number 42 to the arduino and back (to see if it's still there) roundtrip(a,42) % attach servo on pin #9 servoattach(a,9); % return the status of all servos servostatus(a); % rotates servo on pin #9 to 100 degrees servowrite(a,9,100); % reads angle from servo on pin #9 val=servoread(a,9) % detach servo from pin #9 servodetach(a,9); % attach encoder #0 on pins 3 (pin A) and 2 (pin B) encoderattach(a,0,3,2) % read the encoder position encoderread(a,0) % attach encoder #2 on pins 18 (pin A) and 21 (pin B) encoderattach(a,2,18,21) % sets debouncing delay to 17 (~1.7ms) for encoder #2 encoderdebounce(a,2,17) % read position or encoder #2 encoderread(a,2) % reset position of encoder #2 encoderreset(a,2) % get status of all three encoders encoderstatus(a); % detach encoder #0 encoderdetach(a,0); % close session delete(a) PASSO 3: Efetuar a programação para manipulação do servo no Matlab: i) com um clique direito no slider, vá para "View Callback" - "Callback"
Insira o seguinte código: global a valor_angulo=round(get(handles.angulo_servo,'value')); % Le valor do Slider set(handles.string_angulo,'string',num2str(valor_angulo)); % Atualiza Label do Angulo a.servowrite(4,valor_angulo); PASSO 4: Adicione as configurações iniciais (logo após a primeira "function"), conforme abaixo descrito: clear a delete(instrfind({'port'},{'com6'})); warning off; clc; global a a=arduino('com6'); a.servoattach(4); a.servowrite(4,90); OBS: Obviamente os códigos acima devem ser alterados convenientemente conforme a porta de comunicação e pinagem utilizadas. PASSO 5: Conecte o servo motor em um pino apropriado e teste o código implementado: