Práctica 2 - Motores INTRODUCCIÓN - Motores DC vs Servo motores Un motor de corriente directa cuenta con dos conexiones. La corriente eléctrica es proporcionada a través de estas conexiones, y por dentro fluye por cables que forman un electroimán. Este electroimán genera un campo magnético que reacciona contra imanes permanentes ubicados alrededor del cable logrando que la armadura comience a girar. Por lo tanto, cuando le proporcionamos corriente al motor por una de las dos conexiones, este comienza a girar. La mayoría de los motores DC son bastante rápidos, y giran a razón de 5000 RPM (revoluciones por minuto). Las versiones mostradas en la imagen son motores pequeños, baratos, eficientes, fáciles de usar e ideales para aplicaciones de robótica. Con el tiempo algunos factores pueden afectar en el rendimiento, como la fricción mecánica, que provoca que algo de energía eléctrica se gaste en forma de calor. La velocidad de un motor DC (ó nivel de potencia aplicado) puede ser controlada, esto gracias a una técnica llamada Modulación de longitud de pulso. Esto se logra prendiendo y apagando el motor de forma rápida y repetitivamente, y la clave de esto es el ciclo de trabajo (duty cycle), que es definido por el porcentaje de tiempo encendido contra el porcentaje de tiempo apagado. Por ejemplo, si la corriente es proporcionada solo la mitad del tiempo, entonces el motor gira a sólo el 50% de su operación máxima. Al realizar estos cambios rápidamente el motor aparenta funcionar más lentamente sin detenerse. En esta práctica aprenderemos a utilizar los motores a su máxima capacidad y las opciones que el software IC nos proporciona para diminuir la potencia que el Handy Board le aplica a los motores conectados. El Handy Board proporciona salidas para 4 motores de corriente directa, las cuales se numeran de la 0 a la 3, y cada salida cuenta con un par de leds, uno verde y uno rojo para indicar la dirección del motor. Cabe mencionar que para cada motor hay tres pines, de los cuales solo se utilizan los extremos (el del centro no esta conectado a nada).
Los servomotores operan de manera diferente. Un servomotor consta de un motor de DC, una unidad de engranaje para reducir la velocidad, un dispositivo para sensar posición (usualmente un potenciómetro) y un circuito de control. La función del servomotor es recibir una señal de control, que representa la posición deseada del servomotor, y el circuito electrónico aplica potencia al motor DC para que gire hacia esa posición. El servomotor no gira libremente, esta limitado a girar 180 grados ó hasta 200 en la mayoría de los casos.
El servomotor tiene tres conexiones: alimentación, tierra y una señal de control. Las señales de alimentación y tierra deben estar presentes todo el tiempo, debido a que el servomotor contiene partes electrónicas que proporcionan corriente para mover el motor. La duración de la señal de control (señal levantada ó 1 lógico) determina la posición del servomotor. Por ejemplo, un pulso con duración de 1.52 milisegundos mueve el motor a la posición central, y un pulso con mayor duración lo mueve más allá de la posición central a favor de las manecillas del reloj: Este pulso de control debe ser repetido automáticamente cada 20 milisegundos con el objetivo de que la posición permanezca igual hasta que le proporcionemos un pulso diferente para cambiarlo de posición. Una herramienta muy útil será la librería con funciones diseñadas para controlar servomotores, ya que ofrece al usuario una forma sencilla de utilizar los servomotores con poco código fácil de entender.
Motores DC El Handy Board proporciona puertos para 4 motores, numerados del 0 al 3. Recuerde que cada conexión para motor consta de 3 pines, de los cuales el que esta en medio no tiene uso. Tenga cuidado al realizar las conexiones y procure no hacer corto circuito. La batería interna del Handy Board es de 9.6 volts y es adecuada para manejar motores de 6 a 12 volts. Conecte el Handy Board a la computadora y corra el IC. Conecte un motor DC en alguno de los puertos de motores del Handy Board. Desde de la línea de comandos del IC verifique el correcto funcionamiento de las siguientes funciones predefinidas y que los 4 puertos para motores estén funcionando correctamente. void fd(int m) - Girar el motor "m" hacia adelante. Ejemplo: fd(0); void bk(int m) - Girar el motor "m" hacia atrás. Ejemplo: bk(1); void off(int m) - Apagar motor "m". Ejemplo: off(1); void alloff() ó void ao() - Apagar todos los motores. "ao" es abreviación de "alloff". void motor(int m, int p) - Girar motor "m" con el nivel de potencia "p". El nivel de potencia va desde 100 para todo hacia adelante hasta -100, para todo hacia atrás. Nunca cambies la dirección de un motor bruscamente; asegúrate de apagar los motores un instante antes de cambiar de dirección. Es preferible no prender más de dos motores al mismo tiempo. Ejercicios Cómo podría un robot con dos motores conectados con engranes a llantas avanzar hacia adelante? Cómo podría el mismo robot dar un giro a la derecha? Suponiendo que contamos con un robot móvil de dos motores, desarrolle una librería de funciones, que contenga una función para ir hacia adelante, otra para ir hacia atrás, otra para girar a la derecha y por último a la izquierda. Las funciones recibirán un parámetro tipo float que representará la duración del movimiento. La función sleep(float x) nos sirve para esperar un determinado tiempo, donde "x" representa los segundos que van a pasar. Las funciones para girar deben utilizar la mitad de la potencia disponible. Cada función debe desplegar en la LCD la dirección que representa. Al finalizar todas las funciones debe cerciorares de apagar todos los motores. Simule un robot bailarín y cantante utilizando las funciones previamente diseñadas y las funciones para generar sonidos [como beep( ) y tone ( x, y) ]. Debe de contar con una función main y un ciclo con llamadas a funciones.
2da parte - Servomotores Necesitamos instalar el Exansion Board del Handy. Gracias al Expansion Board podemos tener salidas para 6 servo-motores. Las tres conexiones necesarias se muestran en el diagrama y son ideales para insertar servomotores con conector de tipo hembra: El Interactive C carga automáticamente las librerías necesarias para utilizar todas las funciones adicionales del Expansion Board. La siguiente función es la que utilizaremos para habilitar y deshabilitar los servomotores: init_expbd_servos(int action) - Si la acción es cero las señales de control de los servos son deshabilitadas; si la acción es diferente de cero las señales de control son habilitadas. Las señales de control se deshabilitan por default cada vez que el Handy Board es reiniciado. Seis variables globales son proporcionadas para controlar la posición de los seis servomores. Estas variables son llamadas servo0, servo1, servo2, servo3, servo4 y servo5, para cada salida de servo respectivamente. Para modificar estas variables simplemente podemos asignarles un valor, por ejemplo: servo3=1500. Los valores que tienen estas variables determinan la longitud del pulso que se le proporciona a cada servo. Los valores validos van de 0 a 6000, dependiendo del servo motor. Un valor más grande sólo causará que el servo quiera llegar a una posición que no puede alcanzar.
Examine y cargue en su Handy Board el siguiente código: void main() { int period=0; /*minimo valor disponible, y el máximo es 6000*/ init_expbd_servos(1); /*habilitar servos*/ while(1) { servo0=period; /*mover servo 0*/ printf("posición= %d\n", period); msleep(200l); period = period + 200; /*aumentar gradualmente la posición*/ if(period>5000) period=0; /*regresar posicion original*/ } /*del while*/ init_expbd_servos(0); /*deshabilitar servos*/ } /*de la funcion*/ Ejercicios 1.- El código anterior nos muestra un aumento gradual en el periodo proporcionado al servomotor. Complemente la función para que ahora al llegar al valor máximo, el servomotor pueda regresarse gradualmente, con la misma razón de cambio, a su posición original, y desplegando de igual manera el periodo actual. 2.- El knob (la perilla giratoria) del Handy Board, es un potenciómetro que por medio de la función knob( ) regresa su posición como un número entero en un rango de 0 a 255. Realice una función que tome en cuenta el valor de la perilla, para proporcionarle la posición al servomotor (si aumento la posición de la perilla, aumenta la posición del servo motor). ************************************************************************ Para obtener más información sobre el Expansion Board visite el siguiente enlace: http://handyboard.com/hbexp30/software.html