UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
5.
RECEPCION DE SEÑALES A TRAVÉS MATLAB MEDIANTE UNA INTERFAZ CON EL MICROCONTROLADOR ARDUINO UNO.
5.1 MICROCONTROLADOR ARDUINO En estas clases siguientes intentaremos una forma de acercarnos al diseño y desarrollo de proyectos basados en Arduino. Dado que tenemos los conocimientos adecuados en electrónica y programación, para hacerlo fácil, se he pensado en que nos centremos en los aspectos más básicos de las características y la programación de Arduino. Otro de los objetivos de estas clases es organizar un poco la gran cantidad de información sobre este tema existente en la red. Para ello casi toda la información se ha obtenido a través de la fuente http://www.arduino.cc o de manuales basados en ella pero algo más estructurados. Por último, las clases están pensadas como soporte para la realización de nuestro proyecto final que es el control de un brazo mecánico. me cánico. Qué es ARDUINO?
Arduino es una plataforma de prototipos electrónica de código abierto (open-source) basada en hardware y software flexibles y fáciles de usar. Está pensado para artistas, diseñadores, como hobby y para cualquiera interesado en crear objetos o entornos interactivos.
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
Arduino puede sentir el entorno mediante la recepción de entradas desde una variedad de sensores y puede afectar a su alrededor mediante el control de luces, motores y otros artefactos. El microcontrolador de la placa se programa usando el Arduino Programming Language (basado en Wiring1) y el Arduino Development Environment (basado en Processing2). Los proyectos de Arduino pueden ser autónomos o se pueden comunicar con software en ejecución en un ordenador, en nuestro caso Matlab y Simulink. Hay muchos otros microcontroladores y plataformas microcontroladoras disponibles para computación física. Parallax Basic Stamp, Netmedia's BX-24, Phidgets, MIT's Handyboard, y muchas otras ofertas de funcionalidad similar. Todas estas herramientas toman los desordenados detalles de la programación de microcontrolador y la encierran en un paquete fácil de usar. Arduino también simplica el proceso de trabajo con microcontroladores, pero ofrece algunas ventajas para profesores, estudiantes y aficionados interesados sobre otros sistemas:
Barato
Multiplataforma
Entorno de programación simple y claro
Código abierto y software extensible
Código abierto y hardware extensible
Hay múltiples versiones de la placa Arduino. La mayoría usan el ATmega168 de Atmel, mientras que las placas más antiguas usan el ATmega8. En nuestro caso nos dedicaremos exclusivamente al trabjo con Arduino Uno. Arduino Uno es una tarjeta basada en el microcontrolador ATmega328 (datasheet). Tiene 14 entradas/salidas digitales, de las cuales 6 pueden ser utilizadas como salidas PWM, 6 entradas análogas, un cristal oscilador de 16Mhz, conexión USB, conector de alimentación, conector ICSP y botón de reset. Contiene todo lo necesario para hacer funcionar al microcontrolador, simplemente se conecta al PC con un cable USB o se alimenta con una fuente AC/DC o una batería de 9VDC.
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
La nueva Arduino UNO. Adicional a todas las características de su predecesora Arduino Duemilanove, UNO ahora utiliza un microcontrolador ATMega8U2 en vez del chip FTDI. Esto permite mayores velocidades de transmisión por su puerto USB y no requiere drivers para Linux o MAC (archivo inf es necesario para Windows) además ahora cuenta con la capacidad de ser reconocido por el PC como un teclado, mouse, joystick, etc.
5.2 INSTALAR EL SOFTWARE ARDUINO. Esta sección explica como instalar el software Arduino en un computador que ejecute Windows. Estos son los pasos para instalar los controladores o drivers de Arduino UNO.
Lo primero que debemos hacer es descargar el entorno de desarrollo y los drivers del Arduino, lo puedes bajar de la página http://arduino.cc/es/Main/Software.
Conecta la board y espera a que windows inicie el proceso de instalación, después de unos minutos este fallará.
Haz Click en Menu Inicio, posiciona el mouse en equipo y presiona click derecho, eligiendo la opción de propiedades.
Ahora elije la opción de administrador de dispositivos, mira debajo de los puertos (COM & LPT) o en otros dispositivos, debe aparecer Arduino UNO.
Da Click derecho en "Arduino UNO " y elije la opción de actualizar software del controlador.
Después elije la opción buscar software de controlador en el equipo y selecciona la carpeta donde descargaste Arduino UNO o superior.
Busca la carpeta drivers y selecciónala (sólo la carpeta drivers no la FTDI QUE SE ENCUENTRA INTERNA), sigue la instalación de manera normal.
Ahora ya está listo el PC para trabajar con la board Arduino UNO.
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
5.3 INICIANDONOS EN ARDUINO. Esquema:
En la figura, podemos observar resaltadas las partes que es necesario conocer para el correcto conexionado de la tarjeta. 1. Línea de comunicaciones pines 0 y 1 no se usan. Entradas/salidas digitales pines del 2 al 13. 2. Botón “reset” de la tarjeta (Permite el re-inicio de la misma).
3. Línea de Entradas analógicas (De la A0 a la A5). 4. Línea de alimentación. En estos pines podemos encontrar Vin, GND, 5V, 3.3V y reset. 5. Plug de alimentación de la tarjeta (Para voltajes entre 7 a 12 volts máximo). 6. Regulador de voltaje. 7. Conector USB.
Una vez instalado el paquete programa con sus drivers, en Windows 7, vamos a ejecutar la aplicación y después seleccionaremos el tipo de placa que tenemos y el puerto COM por el que se van a enviar los datos, para ello hacemos doble click sobre el fichero con nombre arduino y se abrirá la aplicación. Nos encontraremos con una ventana como la mostrada en la página siguiente.
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
Como se puede ver, en la parte superior hay una serie de menús, si pinchamos en tools podemos ver que tenemos disponibles las opciones "Board" y "Serial Port", en board seleccionamos nuestro tipo de placa y en serial port el puerto de comunicaciones donde se encuentra nuestro Arduino, puedes comprobar como se ha instalado si buscas en el Administrador de Dispositivos de Windows en la
pestaña
"Puertos
(COM
yLPT)"
el
dispositivo con nombre "USB Serial Port (COMx)".
Ahora nos podríamos preguntar el por que de que se llame "USB serial Port" y por que transferir archivos por puerto COM si nuestro Arduino está conectado por USB, la respuesta es fácil, el arduino en realidad se comunica por puerto COM y en su placa lo que tiene es un convertidor de puerto Serie a USB para que así podamos usarlo por USB que es mucho mas cómodo y esta más extendido que el COM. Una vez que tenemos nuestro Arduino conectado y configurado podemos cargar un programa de ejemplo para comprobar su funcionamiento, en el paquete que nos hemos descargado tenemos una serie de ejemplo que podemos subir. Para esto pulsamos en el botón File -> Examples -
> 1.Basics -> Blink con esto cargamos un pequeño código que hará que un led conectado a la salida 13 se encienda y se apague con una frecuencia de un segundo.
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
Como eso es muy sencillo y poco atractivo, lo podemos modificar ligeramente para que cuando el led del terminal illa 13 este encendido, el del terminal 12 este apagado y justo lo contrario así conseguimos que parpadee uno si y uno no, copie, analice y ejecute el código siguiente: void setup() { pinMode(13, OUTPUT); // Inicializa pin 13 como salida pinMode(12, OUTPUT); // Inicializa pin 12 como salida } void loop() { digitalWrite(13, HIGH); // LED on digitalWrite(12, LOW); // LED off delay(1000); // Tiempo de espera digitalWrite(13, LOW); // LED off digitalWrite(12, HIGH); // LED on delay(1000); // Tiempo de espera }
PRACTICAS PROPUESTAS (ENTRADAS/SALIDAS DIGITALES) PRACTICA No. 1 (Secuencia de 3 LED´s) int LED1 = 4; //Se asigna a una variable el pin int LED2 = 5; int LED3 = 6; void setup() //Función donde se definen como funcionaran los pines o comunicaciones { pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); pinMode(LED3,OUTPUT); } void loop() //Función donde se ejecuta el programa { digitalWrite(LED1,1); delay(100); digitalWrite(LED1,0); digitalWrite(LED2,1); delay(100); digitalWrite(LED2,0); digitalWrite(LED3,1); delay(100); digitalWrite(LED3,0); }
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
PRACTICA No. 2 (ENTRADAS ANALÓGICAS)
La tarjeta Arduino UNO posee 6 entradas analógicas, que pueden ser leídas a partir de una tensión de entrada de 0 volts hasta 5 volts. La resolución del convertidor analógico/digital es de 8 bits. La resolución del convertidor puede ser modificada a través de la tensión de referencia denominada Vref en el placa Arduino. int valor; //Inicialización de la variable que representara el valor del potenciómetro int led=4; //Asignación del pin void setup() { Serial.begin(9600); pinMode(led,OUTPUT); } void loop() { valor=analogRead(A0); Serial.println(valor,DEC); delay(400); if(valor < 500) digitalWrite(led,0); if(valor >= 500) digitalWrite(led,1); }
PRACTICA No. 3 (Control de Luminosidad Por Ancho de Pulsos) En las prácticas anteriores se ha aprendido a leer valores digitales y analógicos, asignar variables e imprimir valores con Arduino. En esta práctica trata de leer un valor analógico y este convertirlo a una salida PWM con el fin de controlar la intensidad luminosa de un led. int pwm; //Variable para el valor del PWM int led=5; //Pin 5 int valor; //Variable para la lectura analogica void setup() {
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
Serial.begin(9600); //Comunicacion serial arduino pinMode(led,OUTPUT); //asignacion de salida al pin led(5) } void loop() { valor=analogRead(A0); //Lectura analogica pwm=(valor*255)/1023; //Conversion de bits a PWM Serial.print("Analogico - "); Serial.println(valor,DEC); //Impresion del valor analogico delay(100); Serial.println(); Serial.print("PWM - "); Serial.println(pwm,DEC); //impresion del valor PWM delay(200); analogWrite(led,pwm); //enviar PWM a pin led }
PRACTICA No. 4 (Manejo de Motores CC)
Existen varios tipos de motores (servos, Motores de paso..), el motor que usaremos será un motor DC. Son los motores que encontramos en juguetes, DVD's, etc. Al aplicarle un voltaje el motor gira y al quitarlo se detiene. Para cambiar la dirección solo hay que cambiar su polaridad. Para controlarlo necesitamos más componentes: un transistor de potencia TIP120 y un Diodo 1N4002. En este montaje untilizamos el pin digital PWM (modulación de Ancho de Pulso). Necesitamos una fuente de alimentación externa, en este montaje una pila de 9 Voltios. El diodo nos sirve de protección para el Arduino que se alimenta con 5 Voltios, dejando que la corriente de 9 Voltios sólo circule para alimentar al motor. En cambio la Tierra debe estar conectada a la Tierra del Arduino, pues si no el circuito se desestabiliza. Esto es una regla en todos los montajes: las tierras o masas deben estar siempre conectadas.
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
El transistor además está protegiendo el Arduino, funcionando como interruptor para este circuito. También se utiliza una resistencia para protegerlo. Para enviar un pulso al motor se utiliza la instrucción analogWrite(pin, pulso); Los valores serán de 0 a 255, ya que PWM es una "simulación" de analógico, en la que O es 0 Voltios y 255, 5 Voltios. En este programa enviamos un pulso al Motor que lo hace es ir de velocidad o a las máximas revolución:
int pulso = 0; // variable donde almacenamos el valor del pulso int pinMotor = 4; // Pin 4 que puede generar PWM void setup() { // No tenemos que declarar que es una salida analógica } void loop() { for(pulso = 0 ; pulso <= 255; pulso ++) // ciclo para ir subiendo el voltaje desde 0 a 5 { analogWrite(pinMotor, pulso); // enviamos el pulso al motor vía PWM delay(15); } delay(600); }
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
5.4 MATLAB COMO RECEPTOR DE DATOS. Para su instalación, usted puede descargar el código de control Arduino-Matlab de https://javalmuusc.wikispaces.com . Esto le permite controlar su placa Arduino a través de USB desde una sesión de MATLAB, en Windows y crear un objeto de MATLAB. MATLAB es un paquete de apoyo para Arduino (también conocido como ARDUINO IO). Este paquete permite el uso de un Arduino conectado a la computadora para llevar a cabo tareas de entrada analógica y digital y de salida de MATLAB. Asegúrese de que la tarjeta se conecte al computador a través del puerto USB y el puerto corresponda. No abra el puerto para que Matlab lo pueda utilizar. >> c: \ arduinoIO >>Install_arduino >> Savepath >> A = arduino ('COM?'); //? Es el puerto a utilizar Desde MATLAB, lanzar la orden a=arduino("puerto"), donde "puerto" es el Puerto COM al que está conectado a Arduino, por ejemplo, "COM5" o "COM8" en Windows. A continuación, utilizaremos los comandos a.pinMode, (para cambiar el modo de cada pin entre la entrada y salida) a.digitalRead, a.digitalWrite, a.analogRead, y a.analogWrite, para realizar la entrada digital, salida digital, entrada analógica y salida analógica. Un ejemplo es:
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
No olvide utilizar el comando a.delete para eliminar Arduino, (y liberar el número serie del puerto), cuando la sesión ha terminado.
PRACTICA No. 1 (Lector analógico con potenciómetros)
Uno de los ejemplos más básicos consiste en leer datos de un sensor conectado al Arduino y transmitirlos al PC mediante comunicación serie. El objetivo será pues leer una señal analógica de dos (extensible fácilmente a más) sensores (en este caso potenciómetros) y transmitirla a Matlab, a fin de poder trabajar con ella. En primer lugar, vamos a preparar el Arduino. Conectamos los potenciómetros entre los pines de +5V y Gnd (neutro) y sus pines centrales (que por tanto presentarán un voltaje entre +5V y 0V) a las entradas analógicas A0 y A1 del Arduino, como se muestra a la derecha. Por supuesto, cualquier otro sensor analógico sirve exactamente igual para este ejemplo. A continuación, hemos de programar el Arduino, para que recoja la información de A0 y A1 y la envíe via serie; el formato del envío consiste en: valor de A0, coma, valor de A1 y retorno de carro + línea nueva (debido a que se usa la función Serial.println() al final) Configuración de Arduino: // definir variables int out1 = 0;
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
int out2 = 0; void setup() { // inicializar puerto serie Serial.begin(9600); } void loop() { // leer pines out1 = analogRead(A0); out2 = analogRead(A1); // enviar Serial.print(out1); Serial.print(","); Serial.println(out2); // esperar delay(20);
Configuración de Matlab:
El siguiente paso es preparar la medida, ajustando dos parámetros: el tiempo total de medida, y la velocidad de capturas por segundo. Éste último parámetro hay que estimarlo, pero haremos que que el programa nos devuelva el valor real, con lo que si éste se aleja de lo estimado será inmediato corregirlo. % parámetros de medidas tmax = 10; % tiempo de captura en s rate = 33; % resultado experimental (comprobar) % preparar la figura f = figure('Name','Captura'); a = axes('XLim',[0 tmax],'YLim',[0 5.1]); l1 = line(nan,nan,'Color','r','LineWidth',2); l2 = line(nan,nan,'Color','b','LineWidth',2); xlabel('Tiempo (s)') ylabel('Voltaje (V)') title('Captura de voltaje en tiempo real con Arduino') grid on hold on % inicializar v1 = zeros(1,tmax*rate); v2 = zeros(1,tmax*rate); i = 1; t = 0; % ejecutar bucle cronometrado tic while t
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
v1(i)=a(1)*5/1024; v2(i)=a(2)*5/1024; % dibujar en la figura x = linspace(0,i/rate,i); set(l1,'YData',v1(1:i),'XData',x); set(l2,'YData',v2(1:i),'XData',x); drawnow % seguir i = i+1; end % resultado del cronometro clc; fprintf('%g s de captura a %g cap/s \n',t,i/ t); savefigure('captura_multi','s',[4.5 3],'po','-dpdf') %% Limpiar la escena del crimen fclose(s); delete(s); clear s;
PRACTICA No. 2 (Lector analógico infrarrojo)
Con el fin de poder leer un sensor infrarrojo del tipo diodo (aunque realmente es un transistor con una base fotosensible) de manera digital, usted debe realizar el siguiente montaje para ser leído a través de matlab. El diodo LED de infrarrojos (el de la izquierda) está en serie con una resistencia de 100 ohms, y la luz es recibida mediante rebote por el sensor de la derecha. El puerto analógico convierte el voltaje en el punto medio en un valor de 10 bits (0-1024). Si en el emisor se sustituye la resistencia por una de 50 ohms conseguiremos que detecte objetos más lejanos.
UNIVERSIDAD SANTIAGO DE CALI FACULTAD INGENIERIAS PROGRAMA DE INGENIERIA ELECTRONICA CONTROLES II Profesor: MSc. JAVIER A. MURILLO M.
PRACTICA No. 3 (Receptor múltiple) Desarrolle un módulo de Adquisición de datos que maneje por lo menos tres entradas analógicas, a una de las cuales está conectado un sensor de temperatura ambiente, la otra conectada a un sensor de luminosidad y la última conectada a un detector de presencia. La señales deben ser detectadas a través de matlab.