martes, 19 de mayo de 2015

Análisis de Sensor de Bajo Coste para evitar obstáculos.

En la entrada anterior hablábamos de como tomar datos con Excel desde el puerto Serie. Aquí tenemos una aplicación práctica. Análisis de un sensor de infrarrojos para evitar obstáculos en robótica.

Este sensor extremadamente barato, consta de un emisor de infrarrojos y un foto detector del mismo espectro. La placa sólo lleva una resistencia para proteger a los LED de las sobre intensidades.

La verdad sea dicha, que cuando me propusieron analizarlo, no daba mucho por el sistema, no porque fuese muy barato, más bien la arquitectura abierta y carente de geometría que me echaba para atrás. Pero no deja de sorprenderte la electrónica. Es evidente que no es el sensor del siglo, pero no es tan inútil como pensaba a priori.
Así que monté el sensor en el Arduino, lo fijé, cogí mi Excel preparada y ¡a realizar pruebas!



EXPERIENCIA 1. ESTABILIDAD Y RUIDO DE LA MEDIDA.
Lo primero que hicimos, fue una prueba de estabilidad. Pretendemos saber cuan de uniforme es la medida, si tiene mucho ruido o no. Así que tomamos varias medidas en un mismo punto y calculamos su dispersión.
El resultado fue la siguiente tabla.











El eje horizontal son las muestras en un mismo punto (9 en total) y en vertical los distintos puntos (en centímetros) en los que se han hecho los ensayos.

En vertical vemos ya la no linealidad del sensor.

CONCLUSIONES DEL PRIMER ENSAYO.

El conversor A/D  va de 0-1024, vemos que el máximo valor es 500 aprox. luego desperdicia la resolución del conversor.
La máxima distancia medible según el experimento está en torno a los 35-40 cm.
Tenemos una resolución teórica de 1mm por unidad de A/D, pero se ve gravemente perjudicada por una dispersión de en algunos casos 7 mm de error, luego veremos que se agrava con las condiciones lumínicas.

EXPERIENCIA 2. VARIACIÓN CON EL ÁNGULO.

En un punto fijo, fuimos variando el ángulo del obstáculo. Tomamos 15 cm. El resultado fue el siguiente.


Apreciamos poca variación con el ángulo. Aunque después en las pruebas prácticas si manifestó mucha sensibilidad.

Hay una ligera asimetría pero creo que es porque los leds están montado en horizontal, pienso que se corrige si se montan en vertical.

EXPERIMENTO 3. CAMBIO DE COLOR.

Usamos tres cajas de 20x30 cm, de color blanca, roja y negra y probamos la linealidad de la medida en los diferentes puntos.


Podemos comprobar que el dispositivo no es nada lineal, por lo que si quisiéramos usarlo como medidor de distancia, habría que corregirle la curva.


Podemos observar que la caja negra con poca reflectancia es un auténtico desastre. Literalmente el sensor NO LA VE.

INFLUENCIA DE LA LUMINOSIDAD AMBIENTE Y LA TEXTURA DE LOS MATERIALES.

Comprobamos que la influencia era bestial. La luz influye positivamente en los objetos blancos ya que es reflejada y afecta al foto-detector, pero de forma independiente a la iluminación del propio led. Es una reflexión de casi-albedo, permitiendo detecciones de unos 50cm . Cuando sometemos al sistema a oscuridad, el sistema apenas detecta a unos 10 cm. 

La textura de los materiales (brillo, color, etc.) es muy importante también. El negro-mate es invisible para el sensor.

El ángulo de reflexión es importante y se agrava con la distancia.

PRUEBAS PRÁCTICAS.

Modificamos el sketch e Arduino y calibramos para que disparase un led cuando la lectura fuese menor que 450. Como en el sitio que me pilló no tenía leds a mano, usé el pin 13 que en la mayoría de las placas suele tener un led de prueba, así que en el vídeo tenemos que fijarnos en el led de la placa.



CONCLUSIONES.

  • Obviamente no es un sensor ideal para medir distancias. Impreciso, no lineal, sensible a un montón de parámetros ambiente.
  • Como sensor de presencia o para evitar colisiones, parece que puede utilizarse, teniendo en cuenta que a oscuras la distancia de medición se reduce a unos 10 cm. En el caso de una pared negra-mate, el sistema se la "pega" seguro.

POSIBLES MEJORAS.
  • Un cinturón de varios sensores montados en vertical y alrededor del objeto, podría evitar el problema de la perpendicularidad.
  • Un fotodetector que capte la luz ambiente podría permitir corregir errores de medida, así podríamos usar una medida diferencial y discriminar la luz ambiente.
  • Usar algún tipo de carcasa de enfoque.
  • Usar un led más potente para iluminar la zona y alcanzar mayores distancias a oscura.





Toma de datos del puerto serie hacia Excel.

En la jornada que tuvimos de espacio-RES, donde nos encontramos un grupo de Arduineros, comenzamos a compartir ideas y trabajos. En ella me comprometí a a analizar un sensor de bajo coste para incorporar en los futuros proyectos.

Como ya sabemos, uno de los vicios de los ingenieros es realizar grandes esfuerzos iniciales para posteriormente disfrutar arrascándose la barriga usando las herramientas que ha desarrollado en trabajos que pueden llegar a ser pesadísimos. Y los que tenemos algo de alma de Open Source, además lo publicamos.

Pues bien, cuando se trata de recopilar datos para posterior análisis quien mejor que excel. Así que me propuse que excel tomara datos de Arduino simplemente pulsando teclas en la hoja de cálculo. Lo mejor es que lo he conseguido y lo peor es que no tan bien como me gustaría.

ANTECEDENTES.

Ya lo había hecho con anterioridad hace ya bastantes años. Se trata de usar el control MSCOMM32.OCX, que me recordó nostálgicamente mis tiempos de Visual Basic 6. Cuál es mi sorpresa cuando descubro que a pesar de que instalo el control, me aparece un problema de licencia (instalar VB6) que aún no he logrado solucionar. Una variante de este control la uso en el hiperterminal que está en este blog pero que no es usable en VBA.

La segunda opción es usar el control ActiveX que incorpora el magnifico terminal REALTERM. Funciona muy bien para mandar datos pero no he encontrado la forma de recibir datos.

Parallax, ofrece un control freeware para hacer loggers en EXCEL, está muy bien pero yo quería algo más simple,

Hay otros objetos ActiveX que controlan los COMs pero pagando, con lo cual lo descartamos.

EL MÉTODO QUE USÉ.

Lo primero generé un SKETCH para Arduino de manera que mandándole un LF, devolvía por el puerto serie el valor del pin analógico A0 que pretendía analizar.

void setup() {
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
  
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read(); 
    if (inChar == '\n') {
      sendSample();
    }
   } 
  
}

void sendSample()
{
  
  int val = analogRead(0);    // read the input pin
  Serial.println(val);             // debug value
  
}

acto seguido, habilité las macros de EXCEL 2013 y traté el puerto COM como si fuese un archivo de lectura escritura.



Public Sub Send_and_Read()

  '--------------------------------------------------------
  cmnd$ = ""        'A string to send
  '--------------------------------------------------------
  
  cmnd$ = cmnd$ + Chr(10)      'add [CR] to command string
  Put #1, , cmnd$              'write string to interface
  '--------------------------------------------------------
  
  answer = ""                  'clear response string
  char = Input(1, #1)          'get first character
  
  While (char <> Chr(10) And char <> "")     'loop until [CR]
    If (char <= 9) Then
      answer = answer + CStr(char)   'add, if printable char
    Else
      ' Do what ever you like
    End If
    
    char = Input(1, #1)        'get the next character
  Wend
  
  '--------------------------------------------------------
  ActiveCell.Value = answer
End Sub

Public Sub close_port()
Close #1
End Sub
Public Sub open_port()
Open "COM6" For Binary Access Read Write As #1
End Sub


Asocié la macro de abrir el puerto con CTRL+o, la de cerrar con CTRL+c (aunque mala idea, por lo de copiar) y CTRL+g para capturar los datos desde el puerto serie.

El puerto COM de Arduino se mira en el monitor o en el Administrador de dispositivos.

Abrimos el puerto serie una vez y cada vez que le demos a CTRL-g aparecerá el dato capturado en la celda activa...muy cómodo ¿verdad?

UN PROBLEMA: Hay que parametrizar el driver con la velocidad y demás parámetros, para ello , antes de capturar debemos realizar un ensayo con el Serial Monitor del IDE de Arduino o REALTERM, con la idea de que el driver tome los valores de comunicación. Esto hay que hacerlo cuando reiniciamos o cambiamos los parámetros.


De este modo, puedo ir tomando apuntes y datos simultáneamente.

Espero que os sirva.


lunes, 4 de mayo de 2015

Theremin MIDI con Arduino

El dispositivo va cobrando forma. Ya tiene su caja hecha y la calidad de sonido es muy buena, pero aún no he sido capaz de interpretar una melodía simple. Los sensores no responde tan bien como esperaba...toca trabajar en este aspecto.
Espero vuestras colaboraciones y comentarios.
En el enlace de abajo podéis acceder a la documentación completa. Ya os colgaré los archivos y presentaciones.
Por lo pronto, os dejo un vídeo rápido de demostración. Preparando vídeos explicativos completos.

Espero tener tiempo ya que me desvío de mis proyectos principales.


Saludos.