PROGRAMA DE INGENIERA MECATRNICA TALLER PROGRAMACIN ARDUINO V DOCENTE: MSC ELKIN YESID VESLIN DAZ TUNJA 12 DE NOVIEMBRE DE 2012
Serial Communication II y Salida Analgica
En la seccin anterior aprendimos a configurar el Microcontrolador ATMEGA para recibir datos de tipo analgico y tomar decisiones a partir de ellos. El Microcontrolador trabaja con seales analgicas en el orden de voltios dentro de un rango de 0V a 5V. Tambin aprendimos a configurar el protocolo de comunicacin serial, el cual sirve para enviar datos provenientes del Microcontrolador a Arduino y visualizarlos en la ventana Serial Monitor. Para ms informacin sobre este aspecto, favor referirse al Taller IV.
En esta seccin se configurar al Microcontrolador para que tome decisiones a partir de datos provenientes del PC.
Incoming Data
Serial Monitor, la pantalla de interaccin de Arduino con el Microcontrolador trabaja con caracteres, es decir en lugar de mostrar en pantalla el nmero 1, lo que en realidad est mostrando es el carcter que representa a un 1.
En el mundo de la informtica, los caracteres del teclado son representados y clasificados a partir del cdigo ASCII, este cdigo permite representar texto no slo en computadores, sino tambin en comunicaciones y otros medios que transmiten y utilizan el texto. La Tabla a continuacin presenta los cdigos ASCII en DECIMAL de algunos caracteres:
Carcter ASCII (DEC) 1 49 2 50 3 51 4 52 5 53 A 65 a 97 B 66 b 98
Tanto los datos que son enviados a Serial Monitor como los provenientes de l, son representados en cdigo ASCII. Arduino a travs del protocolo de comunicacin serial, realiza esta conversin automticamente, lo que muchas veces puede generar dificultades en el momento de disear un programa, ya que al no tener en cuenta este proceso de conversin el programa no funcionar correctamente. Existen otras dificultades que por desconocimiento tambin pueden generar problemas, por ejemplo, en la tabla anterior se muestra que un carcter no tiene el mismo cdigo ASCII si es mayscula o es minscula.
Para enviar datos a travs del Serial Monitor basta con ingresar una ventana y cmo lo presenta la Fig. 1, digitar el texto correspondiente:
Figura 1. Ventana de visualizacin y envio de datos del Serial Monitor Estructura de Programacin Arduino
El siguiente programa usar el Serial Monitor para mostrar el dato en ASCII de la tecla que se oprima. El Microcontrolador se encargar de controlar el protocolo de comunicacin, leyendo el dato que viene del teclado y luego envindolo al PC para mostrarlo en pantalla.
int incomingByte; //Variable que almacenar el dato proveniente del teclado
void setup() { Serial.begin(9600); }
void loop() { if( Serial.available() > 0) //Si existe un dato proveniente del Puerto serial { incomingByte = Serial.read(); //Lee el dato y lo almacena en IncomingByte
Serial.print("Dato en Decimal ="); //Lo enva a pantalla a travs del puerto Serial Serial.println(incomingByte, DEC); // ASCII- decimal Serial.print("Dato en Hexadecimal ="); Serial.println(incomingByte, HEX); // ASCII-hexadecimal Serial.print("Dato en Octal ="); Serial.println(incomingByte, OCT); // ASCII- octal Datos que se enviarn al Microcontrolador Serial.print("Dato en Binario ="); Serial.println(incomingByte, BIN); // ASCII- binario |} }
La estructura de lectura de datos es simple, primero el programa realiza una verificacin del puerto serial, si existe un dato, cualquier que sea, Serial.available() ser mayor que 0, esto da inicio al protocolo de lectura que se ejecuta a travs de Serial.read() quien se encarga de tomar el dato y a travs de una variable lo almacena.
Serial.print y Serial.println, realizan la misma tarea, slo que la segunda funcin genera un cambio de lnea luego de imprimir el dato en pantalla (ln hace referencia a un enter).
Cuando se quiera imprimir una cadena de caracteres para mostrar un mensaje, por ejemplo: leyendo datos del puerto se debe encerrar el texto en comillas dobles: leyendo datos del puerto. Una cadena de caracteres no es lo mismo que un dato en ASCII, cmo su nombre lo indica un texto es una cadena de letras cuyo contenido es enteramente textual, mientras que un dato en ASCII hace referencia a una sola letra o smbolo.
Estructura de Programacin Arduino
El siguiente programa toma un dato proveniente del teclado y de acuerdo con su valor en ASCII realiza una accin en Microcontrolador. Para este ejercicio realice el siguiente diagrama de conexiones en Arduino.
Figura 2. Esquema de conexiones para controlar un led Otra forma de implementar los datos provenientes en ASCII es usando su representacin en carcter, por ejemplo: el nmero 1 en ASCII es 49, sin embargo tambin es '1', las comillas simples indican que el elemento es una variable tipo carcter o texto. Al usar esta representacin nos olvidamos de su valor en ASCII porque internamente el programa ya lo conoce, as que si se usa '1' como variable, se est usando realmente la codificacin ASCII para interpretar este dato. Nota int incomingByte; int led=8;
if (incomingByte == '1') // Si se oprime la tecla 1 { digitalWrite(led, HIGH); Serial.println("Led Encendido "); } if (incomingByte == '2') // Si se oprime la tecla 2 { digitalWrite(led,LOW); Serial.println("Led Apagado."); }
if ((incomingByte != '1') && (incomingByte != '2')) // Si se oprime una tecla diferente a 1 y 2 { Serial.println("Digite otra tecla");
} } }
El anterior programa toma una decisin en funcin del valor proveniente del teclado, en este caso las teclas 1 y 2 controlan el encendido de un led. Como se est trabajando por entorno Serial, se aprovecha esta cualidad para enviar mensajes en pantalla que comuniquen al usuario que est pasando con las acciones realizadas, este mtodo de conversacin es efectivo y muy til para cualquier programa o proyecto controlado desde el PC.
Actividad
Realizar el esquema de control de sentido de Giro para un Motor DC como se presenta a continuacin.
Figura 3. Esquema de conexiones para controlar un motor
Disear un programa que controle la salida del motor de la siguiente forma: d derecha, i izquierda, p parar.
Salidas analgicas
La segunda parte del tutorial tiene como propsito ensear a utilizar las salidas Analgicas del Microcontrolador. Arduino cuenta dentro del mdulo de pines digitales con 5 pines que se pueden configurar como salidas analgicas, estos pines se pueden identificar por tener el smbolo (~) a su lado.
Las salidas Analgicas del dispositivo no tienen el mismo rango de trabajo que las entradas , ellas se pueden configurar de 0 a 255 para que genere una salida proporcional en voltios de 0 a 5 V. Estas salidas analgicas tienen mltiples propsitos, por ejemplo se pueden usar para atenuar el encendido de un led, tambin para variar la velocidad de un motor controlado a travs de un L293D o un optoacoplador, y manejar cualquier otro dispositivo que requiera de control a travs de un voltaje variable.
Estructura de Programacin Arduino
El siguiente programa se encarga de atenuar el encendido de un led.
Las salidas analgicas del microcontrolador se encuentran en los pines 3, 5, 6, 10 y 11 del mdulo digital i/o. Esta seal se puede utilizar para generar PWM, muy til en el control de servomotores. Sin embargo, para estos dispositivos Arduino tiene su propia libreria muy fcil de enteder, que control de una manera muy sencilla la posicin de estos dispositivos. Nota
int ledPin = 11; // led Conectado al Pin 11 int atenuar;
void setup() { // no hay configuracin de salidas analgicas }
void loop() { for(atenuar = 0 ; atenuar <= 255; atenuar +=5) // Genera un conteo incremental de 0 a 255 { analogWrite(ledPin, atenuar); delay(100); } for(atenuar = 255 ; atenuar >= 0; atenuar -=5) //Genera una cuenta regresiva de 255 a 0 { analogWrite(ledPin, atenuar); delay(100); } }
La funcin analogWrite(pin, valor) se encarga de enviar un valor de 0 a 255 definida por el usuario, el programa realiza la conversin y genera en el pin una salida de voltaje proporcional a este valor. for se encarga de incrementar de 5 en 5 la variable atenuar, esta se escribe a atravs de analogWrite, y enviar una seal voltaje a travs del pin que aumentar de 0 a 5 voltios de forma proporcional, una vez termina el primer ciclo, el segundo se encarga del ejercicio contrario, reduciendo el voltaje de salida de 5 a 0 voltios. El resultado visualmente es un led que incrementa su luminosidad y posteriormente la decrementa. Delay permite controlar el tiempo de atenuacin del led
La siguiente actividad permite regular la intensidad de encendido de un led a travs de un potencimetro utlizando analogWrite y analogRead.
El led se encender de manera proporcional al valor del potencimetro. La relacin entre el valor mximo de la entrada anloga (1023) generada por el potencimetro y el valor mximo de la salida anloga (255) es aproximadamente 1:4, por lo que el dato que es ledo a travs de analogRead se reduce a una cuarta parte para que encaje en la proporcionalidad que requiere analogWrite.
ACTIVIDAD
En grupos:
Utilizar las bondades de analogWrite para controlar la velocidad de giro de un motor DC usando un potencimetro para controlar esta variacin. El control de velocidad se realiza a travs de un L293D. Para esto, regule el voltaje de salida de los pines que controlan del sentido de giro. Verifique que estos se encuentren conectados a cualquiera de los pines habilitados para realizar salidas analgicas. Genere una rutina que active y desactive un motor de acuerdo con los datos de la Figura 4. Las rdenes de arranque y parada son dadas a partir del Serial Monitor de Arduino. Adicionar mensajes que indiquen el estado del motor.
Tiempo Voltaje 5v 4v 3s 5s Arranque 0v Tiempo Voltaje 4v 5s Parada 0V
Figura 4. Control de arranque y parada de un motor DC. El motor arranca desde los 0v a 5v en un tiempo de 3 segundos. Posteriormente durante 2 segundos reduce su velocidad y se estaciona en un control permanente de 4 V.
Para detener el motor, reduzca la velocidad controlada y detngalo totalmente en un tiempo de 5 segundos. Al igual que las entradas analigicas, los pines digitales (~) que funcionan como salidas analgicas no requieren configuracin desde el void setup. Nota