You are on page 1of 25

CONTROL DE SERVOMOTORES DESDE

MATLAB CON ARDUINO


TRABAJO DE INVESTIGACIN
ARDUINO

www.arduino.cc/es/
MATHWORKS (MATLAB)

http://www.mathworks.com/

ARDUINO NANO V3.0


Especificaciones
Microcontroladores

Tensin de operacin

Atmel
ATmega168
ATmega328
5V

Tensin de entrada

5V 12V

Pines E/S digitales

14 (de los cuales 6 proveen de


salida PWM

Entradas analgicas

Corriente mx. por cada 40 mA


PIN de E/S
Memoria Flash

16 KB (ATmega168) o 32 KB
(ATmega328) de los cuales 2KB
son usados por el bootloader

SRAM

1 KB (ATmega168) o 2 KB
(ATmega328)

EEPROM

512 bytes (ATmega168) o 1 KB


(ATmega328)

Frecuencia del reloj.

16 MHz

Nota:
Los servos consumen energa considerable, as que
si se necesita para manejar ms de una o dos, es
necesario una fuente independiente (es decir, no el
pin 5 V en la placa Arduino). Asegrese de conectar
las tierras de la Arduino y fuente de alimentacin
externa junta.

MATLAB - ARDUINO
Matlab

ArduinoIO

Arduino

Juntos, le permiten acceder a las propiedades de la tarjeta

Arduino desde la lnea de comandos de MATLAB. Por


ejemplo:
E / S analgicas.
E / S digital.
Operar servomotores.
Leer encoders.
Manejar motores DC y motores paso a paso.

MATLAB
which('arduino.m','-all')

Busca

archivo .m con las


funciones para la interfaz
Arduino-Matlab

Para asignar un puerto a la

comunicacin, se utiliza:

a = arduino (' COM# ');


(Verificar el puerto al que esta

conectada la placa)

MATLAB
FUNCIN
Arduino
pinMod
e
digital

DESCRIPCIN

SINTAXIS

Asignar
a
variable
las a = arduino (' COM# ');
caractersticas de Arduino.
Especificar el modo del pin. a.pinMode (4, 'input');
Input output.
a.pinMode (1, 'output');

E/S digitales.

analog

E/S analgicas.

Servo

Asignar las propiedades


para el control de
servomotores.

Encoder Codificadores

a.digitalRead (4)% lee pin 4


a.digitalWrite (13,0)% escriba 0 al pin 13
a.analogRead (5)% lee pin analgico 5
a.analogWrite (9, 155)% escribir 155 a 9
pin analgico
a.servoAttach (9);% servo en el pin # 9
a.servoWrite (9100);% servo gira en el
pin # 9 a 100 grados
a.encoderRead (0)% leer la posicin

MATLAB
% Asignar las ordenes en la configuracin de Arduino.
% - Especificar el modo de pin
a.pinMode (4, 'input');
a.pinMode (13, 'output');
% - Servos
a.servoAttach (9);% Asignar servo en el pin # 9
a.servoWrite (9,100);% servo gira en el pin # 9 a 100

grados
val = a.servoRead (9);% lee ngulo de servo en pin # 9
a.servoDetach (9);% desprenderse servo del pin # 9

MATLAB
a.servoAttach(5) % Asignar al pin 5 como una salida al

servomotor.
pause(0.0000001);
a.servoAttach(6)
pause(0.0000001);

angulo=[90 90 90 90 90]; %Vector con angulos

servomotores

a.servoWrite(5,angulo(1)); %Enviar el ngulo del servo al

pin 5.
a.servoWrite(6,angulo(2));

COMUNICACIN SERIAL ENTRE ARDUINO Y


MATLAB
Serial significa "uno tras otro".
Comunicacin serie es cuando la transferencia de datos

un bit a la tiempo, una despus de la otra.

La informacin se transmite hacia atrs y adelante entre

el ordenador y Arduino por, esencialmente,


establecimiento de un PIN de alto o bajo.

el

MATLAB puede leer / enviar los datos desde / hacia el

puerto serie del ordenador y procesarla.

COMUNICACIN SERIAL ENTRE ARDUINO Y


MATLAB
BUFFER

Existe una buffer entre los dos eventos de envo y lectura

de los datos.

A continuacin, los datos se almacenan en una lista de lo

que llamamos buffer.

Uno escribe datos en l y otro lo lee, puede ser con

diferentes velocidades.

El buffer es de longitud finita.

COMUNICACIN SERIAL ENTRE ARDUINO Y


MATLAB
BUFFER EN DETALLE

Inicialmente, el buffer est vaco.


Como los valores de datos nuevos vienen en ellos se agrega

al final de la lista (datos ms recientes).


Si el programa lee un valor desde el buffer, este comienza
en la parte superior de la lista (datos ms antiguos).
Una vez que se lee un byte de datos, este ya no est en el
buffer.
Los datos en la segunda posicin en la lista se mueve hacia
arriba a la posicin superior.
Tan pronto como el buffer esta completo y ms datos es
enviado, los datos ms antiguos se descartan para hacer
espacio para nuevos datos.
Hay que ser inteligente no es suficiente para perder datos.

COMUNICACIN SERIAL ENTRE ARDUINO Y


MATLAB
EJEMPLO DEL BUFFER

Hemos creado la comunicacin serial entre Arduino

y el PC con un buffer de longitud 5.


1
2
3
4
5

COMUNICACIN SERIAL ENTRE ARDUINO Y


MATLAB
EJEMPLO DEL BUFFER

El valor de 10 y 6 son transferidos respectivamente al

buffer
1

10

3
4
5

COMUNICACIN SERIAL ENTRE ARDUINO Y


MATLAB
EJEMPLO DEL BUFFER
Un valor es ledo. El valor 10 es el ms viejo. Por eso este

ser ledo de primero.


1

2
3
4
5

Note que le valor de 10 ya no existe en el buffer.

COMUNICACIN SERIAL ENTRE ARDUINO Y


MATLAB
EJEMPLO DEL BUFFER

Ahora si asumimos que le buffer est lleno.


1

COMUNICACIN SERIAL ENTRE ARDUINO Y


MATLAB
EJEMPLO DEL BUFFER
Si escribimos el valor de 12, este nuevo valor se escribe al

final del buffer, pero las casillas se mueven, eliminando


el valor ms antiguo en la lista. El valor de 6 desapareci.

12

Antes

Despus

MATLAB: PUERTO SERIAL


FUNCIN
serial ()
set()

get()
fopen()

DESCRIPCIN
Utilizado para asignar a una variable (s), las
propiedades del puerto serie (BaudRate, Status,
Port).
Utilizado para cambiar el valor de alguna
propiedad del puerto serial.

SINTAXIS
>> s = serial
('COM1');

>> set(s, 'BaudRate',


4800);
>> s.BaudRate =
4800;
Verifica el valor de alguna de as propiedades del >> get(s, 'BaudRate')
puerto serial.
ans = 4800
Abre la comunicacin del puerto serial.
>> fopen(s)
>> s.Status
ans = open
Comando para escribir datos en el puerto serial. >> fwrite(s, 'string');

fwrite()
or
fprintf()
Usado para leer los datos en el puerto serial
fscanf

>> data = fscanf(s);

ARDUINO IO (FUNCIONES servoAttach)


a=arduino('COM5'
);

a.servoAttach(5
)

Lee el puerto
(COM)
Asignar objeto al puerto serial.
a.aser=serial(comPort,'BaudRate',11
5200);
Abre comunicacin serial.
Fopen
Busca la funcin:
function servoAttach(a,pin)
Enva el numero del pin por puerto serie:
fwrite(a.aser,[54 97+pin
48+1],'uchar');

ARDUINO IO (FUNCIONES servoWrite)


a=arduino('COM5'
);

a.servoWrite(5,an(1))
;

Lee el puerto
(COM)
Asignar objeto al puerto serial.
a.aser=serial(comPort,'BaudRate',11
5200);
Abre comunicacin serial.
Fopen
Busca la funcin:
function servoWrite(a,pin,val)
Enva el numero del pin por puerto serie:
fwrite(a.aser,[56 97+pin
val],'uchar');

ARDUINO
Para comenzar se incluye la librera. #include <Servo.h>
La estructura del programa tiene la siguiente forma:
Void setup() {

//Configuracion inicial, Modo de


comunicacin
//serial
}
Void loop(){
// Cdigo que se ejecuta continuamente.
}

los

pines,

ARDUINO COMUNICACIN SERIAL


FUNCIN
Serial.begin()

DESCRIPCIN

Fijar la velocidad de transmisin de


informacin en bits por segundos.
Serial.println() Imprime datos al puerto serie seguido
por un salto de la lnea al final.
Serial.read()
Lee o captura un byte (un carcter)
desde el puerto serie. Devuelve -1 si no
hay ningn carcter en el puerto serie.
Serial.
Devuelve el numero de caracteres
available()
disponibles para leer desde el puerto
serie.

SINTAXIS
Serial.begin(11520
0)
Serial.println(n);
val
Serial.read();
Serial.available()>0

ARDUINO (Setup)
La configuracin de la placa:
void setup() {

int i;
for (i=0;i<20;i++) {
pinMode(i,INPUT); %Cada pin como entrada.
digitalWrite(i,0); %Asignar un estado bajo.
}
Serial.begin(115200);

ARDUINO (LIBRERA SERVO)


FUNCIN

DESCRIPCIN

SINTAXIS

attach ()

Fije la variable Servo para un pin.

write()

Escribe un valor en el servo, controlando el servo.write(angle)


eje en consecuencia. En un servo estndar,
con esto establecer el ngulo del eje (en
grados.
Lea el ngulo actual del servo (el valor que servo . read ()
se pasa a la ltima llamada a WRITE()).

Read()

attached() Comprobar si la
conectado a un pin.
detach()

variable

servo

Separar la variable Servo de su pin.

servo. attach(pin)

est servo.attached()

servo.detach()

ARDUINO (Loop)
Verificar que halla valores para leer:
if (Serial.available() >0) {

Leer operacin:
Val = Serial.read()
54 significa utilizar: Servo.attach()

Leer pin:

Val = Serial.read()

PIN = val-97 = (97-pin)-97


Servo.attach(PIN)

Terminar proceso
Val = Serial.read()

DESDE MATLAB
Enva el numero del pin por puerto
serie:
fwrite(a.aser,[54 97+pin
48+1],'uchar');

BUFFER
54
97+pin
48+1

ARDUINO (Loop)
Verificar que halla valores para leer:
if (Serial.available() >0) {

Leer operacin:
Val = Serial.read()
54 significa utilizar: Servo.write ()

Leer pin:

Val = Serial.read()

PIN = val-97 = (97-pin)-97


PIN

Escribir y guardar valor.


servo[PIN].write(val);

DESDE MATLAB
Enva el numero del pin por puerto serie:
fwrite(a.aser,[56 97+pin
val],'uchar');

BUFFER
56
97+pin
val

You might also like