Anda di halaman 1dari 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 Atmel ATmega168 ATmega328 5V 5V 12V 14 (de los cuales 6 proveen de salida PWM 8 o

Tensin de operacin
Tensin de entrada Pines E/S digitales

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 1 KB (ATmega168) o 2 KB (ATmega328) 512 bytes (ATmega168) o 1 KB (ATmega328) 16 MHz

SRAM

EEPROM

Frecuencia del reloj.

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


comunicacin, se utiliza:

Para asignar un puerto a la

a = arduino (' COM# '); (Verificar el puerto al que esta

conectada la placa)

MATLAB
FUNCIN Arduino pinMod e digital analog 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.
E/S analgicas.

Servo

Asignar las propiedades para el control de servomotores.

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

Encoder Codificadores

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

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

a.servoWrite (9,100);% servo gira en el pin # 9 a 100

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

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


servomotores

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

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 2 3 4 5 10 6

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 2 3 4 5 6 4 5 9 3

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.
6 4 5 9 3 1 2 3 4 5 4 5 9 3 12

1 2 3 4 5

Antes

Despus

MATLAB: PUERTO SERIAL


FUNCIN serial () set() 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');

get() fopen()

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

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

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

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

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.

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 attach () write() DESCRIPCIN Fije la variable Servo para un pin. SINTAXIS servo. attach(pin)

Read()

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()). variable servo est servo.attached()

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

Separar la variable Servo de su pin.

servo.detach()

ARDUINO (Loop)
Verificar que halla valores para leer: if (Serial.available() >0) {
DESDE MATLAB Enva el numero del pin por puerto serie: fwrite(a.aser,[54 97+pin 48+1],'uchar');

Leer operacin: Val = Serial.read()


54 significa utilizar: Servo.attach()

BUFFER 54 97+pin 48+1

Leer pin:

Val = Serial.read()

PIN = val-97 = (97-pin)-97 Servo.attach(PIN)

Terminar proceso Val = Serial.read()

ARDUINO (Loop)
Verificar que halla valores para leer: if (Serial.available() >0) {
DESDE MATLAB Enva el numero del pin por puerto serie: fwrite(a.aser,[56 97+pin val],'uchar');

Leer operacin: Val = Serial.read()


54 significa utilizar: Servo.write ()

BUFFER 56 97+pin val

Leer pin:

Val = Serial.read()

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

Escribir y guardar valor. servo[PIN].write(val);