Date post: | 03-Feb-2016 |
Category: |
Documents |
Upload: | rene-flores |
View: | 224 times |
Download: | 1 times |
UN SENSOR DE ROTACION
INTRODUCCION
Como su nombre indica, un sensor de rotación nos determinará la velocidad de un giro,
habitualmente de un eje. Si complicamos su construcción (y programación) podemos
además determinar el sentido del giro. Ambas cosas son especialmente útiles para controlar
motores Power Functions (PF) con tu NXT.
Un artilugio en la industria que realiza esta tarea se llama "encoder". Hay mucha
información al respecto en internet. Su funcionamiento es complejo, aunque el principio
básico de funcionamiento es sencillo de entender.
Existen 2 tipos básicos de encoder o sensores de giro: absolutos e incrementales. Los que
explicaremos aquí son de tipo incremental, como los de los motores del NXT.
En pocas palabras, este sensor se basa en leer un disco codificado en colores blanco y
negro con un sensor de luz IR montado en barrera, como el de la imagen de arriba del todo,
el logo.
MATERIAL
Un sensor de corte TCST1103 con salida transistor.
3 resistencias: 220 ohm, 15K y 10K.
Los cables, board, etc habituales.
Un board para pinchar los componentes.
Un eje Technic
Discos codificados según cada diseño concreto.
LOS DISCOS CODIFICADOS
Para construir este sensor, usaremos unos discos codificados. Puedes crearlos tú mism@,
copiarlos de esta página con un pantallazo o usar alguno de los programas que existen por
la red. Te pongo un par de enlaces.
El primero sería este. Hay que descargar un pequeño programa y es el que yo he usado, ya
que te permite crear tus propios códigos a medida. Además, en la página del Codewheel
Generator encontrarás amplia información sobre los encoders y el programa para descargar.
El segundo enlace no necesita ninguna descarga. Es el Optical Encoder y simplemente vas
modificando los datos en pantalla y la página genera el disco.
La impresión sobre un folio no es suficientemente gruesa para activar o desactivar la
detección del sensor. Es necesario imprimir dos imagenes idéntcas del disco, superponerlas
y pegarlas para que sea más opaco.
Una opción más estética es crear una imagen especular del disco y pegarla por detrás. Así,
la cara de detrás no se quedará en blanco. Para eso, simplemente pegas la imagen en un
programa de dibujo tipo Paint y lo giras verticalmente. Esa imagen la podrás superponer
por la parte posterior de la primera.
Incluso tienes la opción de usar como disco codificado una rueda original de LEGO:
A uno y otro lado podrías poner un LDR y un LED. El funcionamiento sería el mismo. Lo
único es que el LDR no tiene una respuesta tan rápida como este sensor, y no se qué tal iría,
pero el principio de funcionamiento es el mismo.
VELOCIDAD DE GIRO DEL EJE
Lo mejor para entenderlo es un ejemplo. Si imprimes la siguiente imagen:
Pinchas por su centro en un eje como en la foto superior y conectas el eje a un motor, lo
pones en marcha y le pones encima un sensor de luz: ¿qué pasará?. El sensor de luz leerá
sucesivamente blanco y negro. En valores "lógicos", leerá ceros y unos. Contando el
número de cambios, sabremos la velocidad de giro. Concretamente con esta rueda, cada 8
cambios de blanco a negro, tendremos que el eje (y el disco) habrá dado 1 vuelta.
Este tipo de sensor de giro se llama "encoder incremental" ya que según va dando vueltas,
va aumentando el contador de las marcas de forma progresiva. Si paras el programa, el
contador se queda a cero y pierde la información de cuánto había avanzado. Los motores
del Mindstorms NXT llevan incorporados sensores de este tipo: el Built-in rotation sensor.
Realmente, no sería necesario imprimir toda la rueda anterior. Una pequeña franja justo por
donde lee el sensor, sería suficiente. La siguiente es la misma rueda pero con 16 rayas
negras.
Para poder hacer pruebas y programar el sensor de rotación, usaré 2 ayudas. La primera es
el motor del NXT en lugar de un motor de PF. Esto es porque al motor del NXT le puedo
decir las vueltas que quiero que gire y comprobar si el sensor ha leido bien. La segunda
ayuda es usar el siguiente disco para poder contar visualmente las vueltas sin volverme
(más) loco:
POSICION
Cuantas más marcas pongas en el diseño del disco, más precisión tendrá. Con nuestro
último ejemplo de 16 marcas, 8 marcas quieren decir "girar el eje 180º" y así puedes parar
el eje en una posición determinada. Sería el equivalente de los "Degrees" del motor del
NXT pero aplicado a un motor PF. En realidad, aplicado a cualquier eje.
ESQUEMA
El sensor que usaremos para leer el disco es el que figura arriba del todo, en la cabecera. Es
un sensor por IR, que monta un emisor y un receptor enfrentados en barrera. Si te fijas,
verás impreso en el sensor unos símbolos para identificar cada pin: +, E y D. En el
esquema siguiente se ven esos pines y sus conexions a los cables del NXT.
MONTAJE
Una vez has imprimido los 2 discos idénticos, los has pegado y los has atravesado con un
eje, ya podemos hacer el montaje. Como habrás visto, el sensor tiene 4 patas. Si lo montas
tal cual en el board, comunicarás directamente los pines del emisor y los del receptor.
Para montarlo adecuadamente, es necesario girarlo un poco de forma que los 2 pines
positivos queden pinchados en la misma columna, y por tanto unidos según el
esquema anterior.
El resto de componentes más el motor NXT para las pruebas montado quedaría más o
menos como sigue. El disco en la ranura del sensor y la placa fijada lo mejor posible con
algunas piezas para evitar movimientos. Como ves, no es muy complejo. Los cables
amarillo y azul no sirven para nada y están pinchados por separado.
Aquí se ve el montaje con el motor del NXT para las pruebas en lugar del motor PF.
En detalle:
Aunque para el montaje final y el video he usado el motor PF, que permite modificar la
velocidad con el mando de IR. La verdad, cuando le das a velocidad máxima parece
mentira que pueda contar las marcas... y lo hace perfectamente.
En la foto se aprecia que no hay conexión entre el motor PF y el NXT, son circuitos
diferenciados. Y de esta forma el NXT leerá la velocidad de un eje "ajeno" a él, incluso a la
velocidad que se ve en el video.
PROGRAMA
Sin duda este programa es el que más quebraderos de cabeza me ha dado. Cuenta el número
de marcas y, dividiendo por 16, el número de vueltas que ha dado. Lo que no detecta es el
sentido de giro. Para eso, tendremos que programar el motor adelante o atrás.
Habitualmente por tanto no hará falta su detección, aunque hablamos de ello más adelante.
Pulsa sobre el icono para descargar el programa. El disco debe tener 16 marcas negras. Si
no, simplemente adapta el final del programa (el último bucle) a tu propio disco. El sensor
no deja de ser un sensor de luz. Si tienes problemas con el funcionamiento (en la
detección), puedes modificar ligeramente los valores de los bloques de comparación.
SENTIDO DEL GIRO: 2 SENSORES
Para saber el sentido de giro se añade una segunda corona de marcas un poco desfasadas
con respecto a la corona que hemos dibujado. También se añade un segundo sensor como el
de antes. Por tanto, será necesario usar un segundo puerto del NXT o abordar el tema con
los circuitos digitales, concretamente el PCF8591. Cada sensor leerá una corona de marcas
(¡qué mareo!).
Fijate que las marcas negras no están alineadas. La marca negra de la corona interior está
justo en el centro de la marca negra que tienen encima.
Hay muchos diseños posibles. Para explicarnos, dibujaré una línea roja sobre el disco desde
el centro hacia un lado a modo de "meta" y sobre esa línea pondremos los dos sensores
alineados.
En esas posiciones hacemos que los sensores vayan midiendo. Los sensores leen blanco o
negro y miden a la vez. Un sensor (el 1) lee la corona de fuera y el otro (el 2) la de dentro.
Imagina ahora que la rueda gira en el sentido de las agujas del reloj.
¿Quién llega antes a la meta (linea roja), la marca negra de la corona externa o la interna? Y
si ahora haces que gire en sentido contrario a las agujas del reloj, ¿qué marca negra llega
antes a la meta?.
Así es como se determina el sentido de giro. Una opción alternativa a esta que puede
facilitar un montaje casero sería separar ambas coronas en 2 discos. Cada disco con solo
una corona. Y que cada sensor leyera uno de los discos.
Con esta opción, podríamos contar las vueltas, determinar la posición y el sentido de giro.
SENTIDO DEL GIRO: 1 SENSOR
Es lógico preguntarse una vez llegados a este punto si es posible determinar el sentido del
giro con solo un sensor. Y se me ocurrió una solución, pero a costa (casi siempre) de algo.
Con esta opción, se puede determinar el sentido del giro y contar el número de revoluciones
dadas por el motor, pero perderemos la información sobre la posición, ya que 3 rayas no
dan para ello.
El disco que he usado para esta opción es el siguiente, incluyendo su imagen especular para
pegarla por la parte posterior:
Este disco surge de eliminar sectores negros en el disco con 8 marcas negras hasta dejarlo
como se ve en la imagen.
La programación (que no he conseguido realizar de forma satisfactoria de momento) nos
indicará si el motor avanza o retrocede. Nos avisará bien por pantalla bien mediante una
salida lógica Si/No.
Mis intentos de programación van en la línea siguiente: el sensor nos da una señal
(pongamos un 1) cuando está sobre el negro y un 0 cuando está sobre el blanco.
El tiempo que el sensor da un 1 es el mismo cada vez, ya que las marcas negras tienen el
mismo "grosor". Sin embargo, el tiempo que el sensor permanece aportando un 0 es distinto
en cada franja blanca. Es decir, el sensor permanece tiempos dstintos en cada una de las
franjas blancas.
Por poner un ejemplo. El sensor tarda 100 ms (valor imaginario) en cruzar la banda blanca
más estrecha. 200 ms en cruzar la intermedia y 500 ms en la más ancha. Estas proporciones
en los tiempos se mantienen independientemente de la velocidad del motor, ya que son
proporcionales a lo ancha que sea la franja blanca.
Cuando gira en sentido horario, los tiempos serán 100, 200, 500, 100, 200, 500, 100, etc. Y
cuando gira al revés, los tiempos serán 100, 500, 200, 100, 500, 200, 100, etc. Y de ahí
podremos determinar el sentido de giro, ya que la secuencia cambia.
Con el NXT-g se me complica tanto que aun no lo he conseguido. Así que si lo sacas, ya
sabes que puedes acudir al foro.
OTROS USOS
Un uso alternativo de este sensor sería el de detección de grosores de papel. Ajustado
convenientemente, este sensor puede determinar el grosor de una hoja. O dicho de otra
forma, puede determinar si hay 1 o 2 hojas.
Como complemento de uso a este sensor, tienes también un proyecto completo (espero que
interesante) para usarlo como Tacómetro y Velocímetro. Incluye allí un video adicional
para que veas su funcionamiento y el programa correspondiente para su uso. Con este
proyecto podrás construir un panel de control completo, como el de un coche real, de
indicadores.
Y como final, otra idea alterntiva para su construcción: un anemómetro. Construyes uno y
usas el encoder para contar las revoluciones y de ahí, la velocidad del viento. Lo que no se
me ocurre es cómo calibrarlo...
CONTADOR DE PULSOS DE ENCODER CON ARDUINO
(Recomiendo conocer primero el funcionamiento de los encoders, pueden ver este link y/o
buscar por otras fuentes)
Los encoders tienen como principio generan señales digitales en respuesta al
movimiento, sea de un disco o cinta perforada.
Éstos se utilizan, en su mayoría de las aplicaciones, para el control de posición y/o
velocidad de un motor. Considerando básicamente el número de pulsos leído y la cantidad
de ranuras que existen en un disco o cinta para controlar una posición específica o una
velocidad.
Sin embargo, este post se centrará en realizar el conteo de pulsos que genera un encoder.
Para ello se necesitará el sensor optoacoplador y el disco o cinta ranurada, resistencias que
se especifican en el circuito más adelante y la placa Arduino.
Recomendación: Si se desea fabricar uno disco recomiendo utilizar programas (como
OPTICAL ENCODER ó CODEWHEEL GENERATOR) que puedan diseñar éstos e
imprimirlos en cartulinas, tres o cuatro y pegarlas; ó pegar una hoja de cartulina impresa en
un cartón. Pero no utilizar plástico a no ser que se pegue una cartulina impresa a cada lado.
Bueno, el sensor optoacoplador generará pulsos de acuerdo a cuantas franjas blancas o
transparentes detectó. Estos pulsos serán contados por Arduino.
Como se sabe la sensibilidad de los sensores, es posible que en algunos casos no esté claro
un pulso y exista errores pequeños que con el tiempo se van haciendo muy notorios y eso
afecta el objetivo final. Razón suficiente para añadir un circuito extra ó un programa
específico. En este caso expongo el primero, añadiendo un disparador Schmitt (74LS14)
previniendo dicho ruido.
Efecto del uso del schmitt trigger
(B) en vez de un comparador (A)
Como se conoce los pulsos tienen únicamente dos respuestas ALTO(1) y BAJO(0), que da
lugar a conectar a una entrada digital del Arduino, como se observa en la imagen.
Toma en cuenta el esquema del CI 74LS14. Para este caso únicamente se utiliza 4 pines de
conexión, puedes considerar cualquier par que te sea más cómodo (Ix y Qx) y los de
alimentación (VCC y GND).
Considerando al optoacoplador:
La configuración de estos sensores puede ser también de la siguiente manera (considerando
que su estructura interna es la misma).
El programa es de la siguiente manera: boolean anterior = 0;
boolean actual = 0;
int contador = 0;
void setup()
{
Serial.begin(9600);
pinMode(2,INPUT);
}
boolean debounce(boolean dato_anterior)
{
boolean dato_actual = digitalRead(2);
if (dato_anterior != dato_actual)
{
delay(10);
dato_actual = digitalRead(2);
}
return dato_actual;
}
void loop()
{
actual = debounce(anterior);
if ( anterior == 0 && actual == 1)
{
contador++;
delay (100);
Serial.println(contador);
}
anterior = actual;
}
De esta manera acoplando un disco o cinta, como se mencionó anteriormente, ó sólo para
hacer la prueba podrían interrumpir con una cartulina o cartón interponiéndolo en el
optoacoplador para observar el conteo de pulsos generado.