http://www.x-robotics.com/sensores.htm

Miércoles, 26 de Agosto de 2015
|
![]() |
INFRARROJOS | MECANICOS | MAGNETICOS | ULTRASONIDOS |
IS471F | Bumper | Basico | |
CNY70 | |||
GP2D | |||
LUZ | Temperatura | Humedad | Aceleración / Inclinación |
LDR | LM35 | SHT11 | memsic7202 |
Para dotar al
robot de sensibilidad con el mundo que le rodea, se necesita dotar a este, de
sensores para detectar obstáculos y así poder actuar para esquivarlos o hacer
los movimientos necesarios según la programación que se haga.
![]() ![]()
El uso de luz IR modulada
tiene por objeto hacer al sensor relativamente inmune a las interferencias
causadas por la luz normal de una bombilla o la luz del sol.
![]()
El el
siguiente esquema vemos el simple circuito necesario para hacer funcionar al
sensor.
![]() ![]() ![]()
Todavía
no e probado nada y esto tan solo son ideas pero si alguien lo prueba y
quiere compartir sus experiencias, se lo agradeceríamos todos.
|
|||||||||||||||||||||||||||
![]() ![]()
El
la siguiente figura vemos la disposición interna del CNY70 mirando el
encapsulado desde arriba, así pues tenemos el diodo emisor de infrarrojos a
la izquierda y el fototransistor a la derecha.
![]() ![]() ![]()
La
sensibilidad del circuito es ajustable mediante la resistencia variable de
10k (aconsejo poner una resistencia multivuelta). Para comprobar y
visualizar la señal de salida es posible montar un diodo led en la salida
con su resistencia de polarización a masa, si así lo hacemos veremos que
cuando el sensor detecta una superficie blanca o reflectante el led se
ilumina ya que la salida del
LM358 pasa a nivel alto
y por lo tanto alimenta
al led que tiene su ánodo conectado directamente.
La salida del LM358 varia de 0V
para nivel lógico 0 a unos 3,3V para nivel lógico 1, con lo que puede ser
llevada directamente a un disparador trigger schmitt (p.ej. 74LS14) para
conformar pulsos de niveles TTL de 0 a 5V si fuese necesario.
![]() ![]() |
|||||||||||||||||||||||||||
![]() ![]() ![]() ![]()
En la fotografía siguiente vemos
la disposición de pines en el conector de salida del GP2D02:
1.-GND
2.-Vin
3.-Vcc
4.-Vout
El dispositivo se alimenta
poniendo a +5V el pin VCC y GND a 0V(masa). El pin Vout
es la salida de datos en serie con lógica positiva y niveles TTL.
Vin
es la entrada con la que comandaremos el funcionamiento del sensor, hay que
tener muy en cuenta una característica de este pin y es que la salida es a
drenador abierto y esta prohibido poner esta entrada a una salida TTL o CMOS
ya que esto provocaría la destrucción de la entrada, solo acepta niveles
bajos y por lo tanto para acoplarla a la salida de un microcontrolador es
necesario poner un diodo (p.ej.: 1N4148) tal como se muestra a continuación:
![]()
Una vez tenemos conectado el
sensor nos queda mandarle hacer una captura y leer el resultado, para
conseguir esto hay que seguir unos sencillos pasos:
![]()
Se puede acelerar la medida
comprobando cuando pasa a nivel alto la señal Vout mientras se mantiene a
nivel bajo Vin en los 70mS de inicio de medición aunque recomiendo esperar
los 70mS.
![]() ![]()
Nota: Como puede verse en el
esquema no esta puesto el circuito oscilador de 4 MHz necesario para que
funcione el montaje, no olvidarse de ponerlo! (cristal de 4MHz y
condensadores de 27pF)
Programa en ensamblador para
medidor Gp2d02:
El programa usa una tabla de
conversión calibrada para usar con una cartulina blanca como objeto distante
para la medición y muestra en el LCD la distancia en centímetros
continuamente, para otros objetos de diferente color se puede modificar la
tabla fácilmente.
|
|||||||||||||||||||||||||||
![]() |
MAGNETICOS
|
![]() ![]() ![]() ![]()
El circuito consta de un divisor
de tensión formado por la LDR, una resistencia y un disparador trigger
schmitt inversor modelo
74LS14. Como la LDR varia en función de la luz, la
señal de salida del divisor también lo hará y cuando pase el umbral de
disparo del trigger schmitt este
cambiara el estado de su salida según
corresponda.
Los umbrales de disparo para el
74LS14 son de 0,9 y 1,7 voltios, esto quiere decir que cuando la señal en la
entrada del disparador supere los 1,7 voltios se tomara como un 1 lógico en
la entrada y la salida al ser inversa tomara el nivel lógico bajo o 0
voltios, si el voltaje de entrada baja por debajo de 0,9 voltios se tomara
como un 0 lógico en la entrada con lo que la salida tomara un nivel lógico
1.
El problema que se comentaba en
la explicación del
CNY70 radica en la distancia en voltios entre el umbral
de disparo alto y bajo, que es de 0,8 voltios entonces imaginemos que si la
luz recibida en el sensor va incrementando hasta llegar a los 1,7 voltios y
rebosarlos este será el punto de activación pero no se desactivara al volver
a pasar por este punto, ya que la salida del circuito no se desactivara
hasta que no se baje por debajo del umbral de 0,9 voltios, esto hay que
tenerlo muy en cuenta ya que para algunos casos donde los niveles a detectar
sean muy distantes como por ejemplo detectar niveles de todo o nada o luz y
oscuridad puede dar igual pero si lo que se quiere es activar algún circuito
en un determinado nivel de luz y desactivarlo justo cuando ese nivel ya no
exista, entonces el circuito ya no es valido y será mejor usar el circuito
basado en amplificador operacional en modo comparador de tensiones.
Nota: El circuito
integrado
74LS14 dispone en su interior de 6 puertas inversoras trigger
schmitt, así que hay que tener especial cuidado en no dejar ninguna entrada
no usada al aire, esto es sin conexión alguna ya que la puerta empezara a
oscilar y podría causar la destrucción de dicha puerta, para que esto no
suceda hay que conectar todas las entradas a un nivel lógico estable,
normalmente a GND. las salidas se dejaran como es lógico al aire ya que
tendrán el nivel lógico inverso que en su entrada.
![]() ![]() |
|
![]() |
|
Temperatura | |
![]() ![]()
El sensor se presenta en
diferentes encapsulados pero el mas común es el to-92 de igual forma que un
típico transistor con 3 patas, dos de ellas para alimentarlo y la tercera
nos entrega un valor de tensión proporcional a la temperatura medida por el
dispositivo. Con el LM35 sobre
la mesa las patillas hacia nosotros y las letras del encapsulado hacia
arriba tenemos que de izquierda a derecha los pines son: VCC - Vout - GND.
La salida es lineal y equivale a 10mV/ºC por lo tanto:
![]()
Podemos conectarlo a un
conversor Analógico/Digital y tratar la medida digitalmente, almacenarla o
procesarla con un µControlador o similar.
![]() ![]() ![]()
Para una medida real con el
conversor del Analógico/Digital se ha dispuesto un generador de tensión de
referencia ajustable modelo
LM336
externo al pic, con lo cual la medida de temperatura será simple y fiable.
El rango de medidas que soporta este montaje es solo de temperaturas
positivas y abarca desde 0º a +150ºC.
En el LCD se muestran los 4
canales T1=RA0, T2=RA1, T3=RA2, T4=RA5.
![]()
Nota: Como puede verse en el
esquema no esta puesto el circuito oscilador de 4 MHz necesario para que
funcione el montaje, no olvidarse de ponerlo! (cristal de 4MHz y
condensadores de 27pF). Tampoco olvidar poner condensadores de desacoplo de
100nF entre las patillas de alimentación de cada integrado lo mas cerca
posible de estas para evitar interferencias por la línea de alimentación que
son muy criticas usando el conversor A/D del pic.
![]()
Programa en ensamblador para
termómetro 4 canales:
|
|
![]() |
|
HUMEDAD | |||||||||||||||||||||||||||||
![]() ![]() ![]() ![]()
Como puede verse en el datasheet
del
SHT11, el chip dispone de 10 pines aunque solo se usan 4 de ellos y los
demás se deberán soldar en pads al aire, simplemente para la sujeción del integrado.
El pin DATA corresponde a
la salida/entrada de datos para comandar y leer el sensor y es un pin
triestado por lo que necesita de una resistencia de polarización a Vcc (push-up).
SCK se utiliza para sincronizar la transmisión y no dispone de
frecuencia mínima.
![]()
Transmission Start: Para
comunicarse con el
SHT11 lo primero que hay que hacer es mandar una secuencia de Inicio de
Transmisión "Transmission Start". Esta consiste en poner a cero lógico la
línea de datos mientras SCK esta a uno, seguidamente se genera un pulso bajo
en SCK mientras la línea DATA sigue a cero y para finalizar se pone a 1 DATA
mientras SCK esta a 1, seguidamente se baja a cero también SCK y finaliza la
secuencia dejando la línea de datos y Clock en los estados lógicos por
defecto, DATA en estado alto y SCK en estado bajo.
![]()
Lo siguiente será mandar un
comando de los siguientes que acepta:
El protocolo de transmisión de
comandos esta basado en un byte completo o lo que es lo mismo 8 bits, como
los comandos son de 5 bits tan solo el resto de bits a la izquierda siempre
serán 0. Por lo que se mandaran primero los 3 ceros seguido del comando para
completar el byte.
El
SHT11 indicará una recepción valida con un pulso de ACK en la línea de
datos que es bidireccional (no lo olvidemos) y lo hará en el siguiente pulso
de CLK después de haber completado los 8 bits del comando, por lo tanto acto
seguido después de enviar el comando hay que configurar como entrada el
puerto del microcontrolador conectado a DATA del
SHT11 y generar una señal de CLOCK para que el sensor nos mande su
respuesta ACK y lo hará poniendo la línea a nivel bajo ya que como se dijo
mas arriba la línea de datos esta polarizada a VCC por lo tanto siempre hay
un 1 lógico en ella y lo que hace el SHT11 es forzar a 0 lógico con su
salida a colector abierto.
Secuencia de medida:
Suponiendo que ya sabemos mandar un comando y por ejemplo hemos mandando un
comando "00000101" correspondiente a
"Medida de Humedad", una vez
recibido el ACK desde el sensor hay que esperar a que este complete la
adquisición y nos entregue su medida, esto suele tardar unos 55mS para una
resolución de salida de 12bits o bien, unos 11mS para una resolución de 8
bits. Como este tiempo de adquisición no es muy exacto y puede variar
dependiendo de la alimentación del sensor, y por lo tanto de su oscilador
interno. Para evitar esperas innecesarias el sensor genera un pulso bajo en
la línea de datos y así se sabe que lo siguiente ya serán datos validos,
esto se hace comprobando la línea de datos cada x tiempo hasta que esta pase
a nivel bajo. Si es nivel alto aun no a acabado y cuando recibamos un nivel
bajo será la indicación de adquisición completada y pasaremos a leer la
medida del sensor.
Ahora se generan 8 pulsos de
reloj en la línea CLK y se guarda el estado de cada bit que nos retornara el
sensor. La trama que retorna el sensor se compone de 3 bytes, el primero
corresponde a MSB el segundo a LSB y el tercero es el CRC-8 Checksum para
comprobar que el dato a llegado correcto, pero lo podemos ignorar generando
NACK después de la llegada del segundo byte (LSB). Como puede observarse el
dato de la medida se compone de 2 bytes aunque como mucho el dato valido
será de 12 bits de resolución, pero aunque configuremos el sensor para una
resolución de 8 bits.. siempre leeremos 2 bytes ignorando el MSB en este
caso.
Despues de cada 8 bits recibidos
el microcontrolador a de generar un ACK para que el sensor sepa que ya a
recibido los datos. Esto se hace generando un flanco de subida en CLK
mientras DATA esta a nivel bajo. Después de esto se continua con la lectura
de otro byte.
Para acabar la trama se genera
desde el microcontrolador un NACK (NoACK) esto es lo mismo que el ACK pero
en vez de mantener la linea DATA a nivel bajo la tendremos que poner a 1
generando mientras esto pasa un flanco de subida en CLK igual que antes.
El sensor admite unas dos
adquisiciones o medidas por segundo por lo que no se debe forzar la lectura
con refrescos superiores a este, y ni que decir que una medida de este tipo
no necesita un refresco tan elevado.. lo normal seria una medida cada 5 o 10
segundos o mas incluso.
![]() ![]() ![]()
La medida se muestra por
pantalla representando un porcentaje de humedad relativa y se actualiza cada
2 segundos.
El esquema para el montaje es el
siguiente:
![]()
Nota: No se ha realizado el
circuito impreso debido a la sencillez del montaje, que puede hacerse en
protoboard sin problemas.
|
|||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||
Aceleración / Inclinación | ||||||||||||||||||||||||||||||||||||
MXD7202GL
|
![]() ![]() ![]()
En la figura adjunta se muestra
el encapsulado visto desde arriba y puede observarse la disposición de pines
así como también los ejes de medición correspondientes.
![]()
Como se ha dicho, este sensor es capaz de medir
la fuerza de la gravedad terrestre si se coloca uno de sus ejes
perpendiculares a la superficie de la tierra. Pero la medida de aceleración
no será lineal, ya que será en función del seno del ángulo al que se ponga
el sensor con respecto a la superficie de la tierra.
En el siguiente gráfico puede verse la señal
obtenida con respecto a la inclinación de 0 a 180º.
![]()
Los valores de PWM que da el sensor para el
máximo y mínimo son los siguientes:
+1g = 6,25mS
-1g = 3,75mS
Por lo tanto tenemos un rango total de 6,25 -
3,75 = 2,5mS
esto quiere decir que el ancho de impulso de la
señal que nos dará el sensor variara un máximo de 2,5mS aprox. si lo
tumbamos de un lado a otro, debido a la aceleración de 1g provocada por la
fuerza de la gravedad terrestre.
Cuando la aceleración es nula 0g podemos leer un
duty cycle del 50% que corresponde a 5mS.
Con esto ya tenemos definidos los valores para
-90º, 0º y +90º que serán los siguientes:
-90 = 3,75ms
0º = 5ms
+90º = 6,25ms
Ahora nos faltan todos los demás... para medir
aceleración seria dividir el rango total en la precisión que queramos
obtener ya que es una medida lineal cuando se trata de aceleración, pero para medir inclinación tendremos
que hacer uso de la trigonometría para obtener el valor correcto porque la
aceleración medida en el acelerómetro depende de la inclinación con respecto
al eje del sensor y por tanto será en función del seno de dicha inclinación.
y lo haremos como sigue..
Entre el valor mínimo y el valor máximo queremos
sacar 180 valores intermedios que corresponderán a cada uno de los grados de
arco relativos a la inclinación que queremos obtener y teniendo en cuenta
que el valor obtenido surge en relación al seno del ángulo, tendremos que
diferenciar entre sectores de 90º o cuadrantes.
Si el valor leído es menor de 5mS, en este caso
estamos en el rango de 0º a 90º y si el valor fuese mayor de 5mS estaríamos
en el rango de 90º a 180º, primer y segundo cuadrante respectivamente.
Para linealizar la salida y conseguir un valor
de inclinación real se usaran las siguientes formulas.
De 0º a 90º se usará la siguiente fórmula:
![]()
y de 90º a 180º se usará esta otra:
![]()
Un ejemplo practico:
Imaginemos que leemos un ancho de impulso de
4,12mS. Como es menor de 5mS usaremos la primera formula,
4,12 - 3,75 = 370µS / 1,25mS = 0,296 mS
1 - 0,296 = 0,704
Ahora ya tenemos el coseno del ángulo y tan solo
tenemos que hacer la operación inversa, el arco coseno y obtendremos el
ángulo para dicho coseno.
ArCos( 0,704 ) = 45,25 = 45º
Por lo tanto un valor de 4,12mS corresponderá a
un ángulo de inclinación real de 45º
![]()
El programa contenido en el pic
se dispara a cada flanco de subida de la señal y cuenta pequeños intervalos
incrementando en cada uno de ellos el contador TMR1 hasta el flanco de
bajada de la señal, para saber el ancho del impulso de
la señal PWM y luego pasa los datos del contador de 16bits al PC por medio
de la USART para que el PC calcule y analice las muestras.
Nota: En el esquema anterior falta la
alimentación del pic y del max232, el oscilador del pic y el circuito de
reset, así como también los condensadores de desacoplo de 100nF para cada
integrado.
El código fuente para grabar en el pic es el
siguiente:
![]()
Dentro de cada una de esas ventanas tenemos una
disposición idéntica de controles y visualizadores para ambos ejes.
La primera parte situada arriba a la derecha,
consta de dos medidores de aguja lineales, el medidor de arriba es
directamente el valor del timer expresado en cuentas y su valor directo
puede verse justo debajo además del valor de duty cicle correspondiente
expresado en segundos. Justo debajo esta el medidor lineal de media y puede
ajustarse mediante un scroll horizontal situado al lado que indica cuantas
muestras son necesarias para calcular la media, contra mas muestras pongamos
mas estable será la medida pero mas lento será el refresco al necesitar
esperar mas muestras.
En la parte inferior podemos ver un grafico que
se va pintando al ritmo que entran datos, en este grafico podemos ver la
señal en tiempo real (línea negra) y la media calculada (línea amarilla),
este grafico es muy útil para analizar la señal y ver como afecta la
aceleración lineal a la inclinación. Como podemos observar a cada lado del
grafico tenemos varios scrolls, estos son para el ajuste de fondo de escala
tanto en tiempo como en "g" medidos y el scroll vertical de la derecha es
simplemente para desplazarse por el grafico de arriba a abajo.
La parte mas compleja en cuanto a cálculos se
refiere es la pantalla situada arriba a la izquierda que muestra un reloj
analógico de forma angular. Este medidor muestra la inclinación calculada
respecto a la aceleración de la gravedad terrestre.
![]()
Existen unos scroll deslizantes
con los cuales podemos ajustar cuantas capturas son necesarias para calcular
la media de la señal medida, para evitar oscilaciones debidas a
aceleraciones rapidas.
Además es capaz de mover un
objeto 3d en relación a la inclinación real en la que se coloca el sensor de
entrada, con lo cual podemos mover el objeto 3d en el pc moviendo el sensor
en el mundo real.
![]()
Video demostracion:
|
|||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||
Robotica & µControladores Pic
Daniel C. Martin "ionitron"
··· Barcelona (Spain) ··· 2001-2008
No hay comentarios:
Publicar un comentario