domingo, 22 de enero de 2017

Consola Educativa para Processing.

Cuando entramos en contacto con el lenguaje de programación Processing no podemos dejar de quedar cautivados. Han logrado una capa por encima de Java que simplifica notablemente la programación y cuya relación resultados/líneas de código es importante.

Impresiona la capacidad gráfica del lenguaje y especialmente la simplicidad de manejo del IDE. Pero seguramente por muy bueno que sea algo, encontraremos alguna pega.

Como profesor, cuando explico  lenguajes de programación a alumnos/as (bachillerato) me gusta empezar de forma clásica con entradas por el teclado y salidas por la pantalla, para analizar las estructuras clásicas de programación. Y ahí es donde Processing pierde agua o al menos yo no he encontrado una solución aceptable. Tiene un modo REPL e incluso entre las librerías hay una consola...probadas ...y...siguen sin convencerme.

Por ello decidí hacer mi propia consola. Aún está muy verde, ¡pero funciona! Como se me echa el tiempo encima, la publico en estado algo chapucero.

MODO DE EMPLEO.

Aún no la he convertido en librería, por lo que hay que crear un sketch con Processing y darle en el menú a sketch->Añadir Archivo. Debemos añadir el archivo que descargamos a continuación del siguiente enlace que se llama consola.pde

Enlace al Archivo.

ESQUELETO DEL SKETCH PARA USAR LA CONSOLA.

Consola C; //Declaramos la consola de forma global.

void setup()
{
  size(800,600); //Establecemos las dimensiones de la consola.
  C = new Consola(); //Instanciamos la consola con los valorres por defecto.
  thread("programa"); //Llama a la función que contiene el programa a ejecutar en la consola.
}
void draw()
{
C.display(); //bucle display.
}
void keyPressed(){
 C.keyboard(key); //lectura constante del teclado.
}
void programa()
{
  /*
    AQUÍ SE METE EL PROGRAMA QUE QUEREMOS EJECUTAR EN LA CONSOLA
  */
  C.println("Hola Mundo"); //Ejemplo "hola mundo"
}

La parte azul siempre es igual y si quiere se copia tal cual. Los programas que queremos ejecutar en la consola los metemos sustituyendo la parte roja.

COMANDOS INCORPORADOS.

C.printl("texto") Salida por la pantalla. Imprime un texto en la línea SIN RETORNO DE CARRO. Todas las frases escritas con este método saldrán seguidas.

C.println("texto") Salida por la pantalla. Imprime un texto en la línea CON RETORNO DE CARRO. Todas las frases escritas con este método saldrán en líneas distintas.

C.input("texto") Entrada de teclado. Espera a que el usuario teclee un texto, número o similar y cuando le damos a intro el comando devuelve la frase tecleada. Para convertir a número hay que usar la función parseInt() o parseFloat(). El texto que metemos entrecomillado aparece en la pantalla como sugerencia de los datos que debemos introducir.

FUNCIONES DE LA CONSOLA.


  • Si pulsamos la flecha arriba o abajo podemos desplazar y ver los resultados ocultos.
  • Cuando instanciamos la consola en la segunda línea del setup podemos usar:
    •  C = new Consola(tamaño de letra); de este modo podemos ampliar el tamaño de la letra, para personas que no vean bien o para proyectar con un proyector de vídeo.
    • C = new Consola(tamaño de letra, color de fuente, color de fondo); Para además cambiar el color de la fuente y del fondo.

EJEMPLOS.

Descarga un programa que suma dos números pedidos por el teclado.

Enlace.

POR HACER.

  • Cuando estamos haciendo entradas por teclado, la tecla borrar (backspace) no funciona. Arreglar.
PANTALLAZOS.







domingo, 17 de abril de 2016

Problema con los láseres rojos de 5mW.

Realmente no sabía como colocar el título para explicar el comportamiento anecdótico que hemos encontrado en los láseres de rojos de 5mW.

Los láseres rojos de 5mW son unos componentes que podemos encontrar en tiendas españolas o asiáticas y que son interesantes para experimentos ópticos con Arduino y similar. Tienen baja potencia, con lo cual no producen excesivo daño ocular y sirven muy bien para barreras, detección de nivel de partículas y demás.



En algunas tiendas te los venden como "tolerantes" a 5V, incluso los puedes encontrar directamente como Láseres de 5V. Si bien, si los conectas al pin de 5V de Arduino el láser se comporta normalmente..descubrimos que... ¡cuidado con el tiempo que están conectado!.

Teóricamente disponen de una resistencia de protección pero os comento la anécdota que hemos descubierto.

Todo empezó con el montaje de un proyecto para el desafío STEM de telefónica, uno de los proyectos que como profesor dirijo en el colegio Calasancio Hispalense. El proyecto en cuestión es un Arpa Laser con la que pretendemos tocar música interrumpiendo barreras láseres.

Cuando estábamos ultimando pruebas de integración, los/as alumnos/as me avisaron que los láseres brillaban muy poco. Comprobamos la tensión de alimentación (la fuente era USB) y estaba dando sus correctos 5V. Desmontamos algunos y comprobamos su escaso brillo. Al sustituirlos por nuevos, los láseres daban su luz correcta pero al cabo un tiempo volvían a perder intensidad.

El mayor error fue aumentar la tensión de alimentación a 6V, que hizo que el peine de 17 láseres bajara "impresionantemente" de intensidad. Al tacto, los láseres estaban templados...sospechoso.

Mirando bien las especificaciones del láser, comprobé que la tensión de alimentación estaba en la horquilla de 3V a 4,5V. Así que a pesar de sacrificar dos nuevos láseres (todo por la ciencia), fué a mi laboratorio y puse un láser a 5V y otro a 3V. Efectivamente el diodo a 5V comenzó a perder luz con el tiempo. Sometí a 6V el sano y se degradó en cuestión de minutos.

Está muy poco documentado, sólo encontré un artículo en inglés de la degradación de los láseres rojos con la temperatura pero en láseres de potencia.

MORALEJA: ¡Alimenta a los láseres a 3V si no quieres romperlos!

La solución que hemos puesto, es un nuevo sistema de montaje con el cuerpo del láser al aire y así disipe la temperatura por convección natural y un regulador LM1117 que actúe de driver y estabilice la tensión a 3V. Esperamos no "romper más láseres".

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.

jueves, 1 de enero de 2015

Code Blocks y 8051. Conseguir un HEX.

Hay una gran variedad de microcontroladores basados en el núcleo de los clásicos 8051. El juego de instrucciones de esta familia ha sido implementada por muchas casas incluso en dispositivos actuales.
El problema que nos tropezamos los desarrolladores libres y modestos es que los compiladores suelen ser muy caros y no nos podemos permitir el lujo de pagarlos hasta tener una empresa que amorticen dichas inversiones.
Por tanto tenemos que recurrir a herramientas de software libre que aunque potentes, no disponen de suficiente soporte y/o documentación y es por ello que los comentarios como éste se hacen importantes a la hora de solucionar problemas.
Todo surge cuando me propongo a realizar una aplicación para un micricontrolador específico basado en el 8051 y recurro a Code Blocks  (IDE para compilar) y el compilador SDCC.
En las pruebas compruebo que el compilador genera el archivo objeto .o pero no genera el .hex que luego "quemo" en el microcontrolador.
Descubro que SDCC en su última versión ha sustituido los .o por .rel, luego el problema está en que los .o son archivos no soportados por SDCC.
No olvidemos descartar la opción debug del proyecto.

Para activar Code Blocks con la nueva extensión he seguido los siguientes pasos:

Primero Setting->Compiler y elegimos el compilador SDCC.


Picamos en la pestaña que queda oculta en la parte derecha de las ventanas (other settings). Podemos dejarla clara si pinchamos en las flechas que quedan a la derecha de la pestaña.


Picamos en las Opciones Avanzadas...

El siguiente paso no estoy seguro si se puede omitir pero lo dejo por si las moscas, es añadir la extensión rl.


Por último y LO MÁS IMPORTANTE....


La extensión por defecto es o cambiamos a rel...

Miramos en el directorio bin del proyecto y... ¡et voila! tenemos el .hex.






lunes, 25 de marzo de 2013

Hyperterminal para Windows 7.

Estaba realizando pruebas a través del puerto serie...con Arduino claro, cuando fuí a recurrir a esa simple pero útil herramienta que se llamaba Hyperterminal en Windows 3.11, 98, XP...es decir, en casi todos los windows excepto ¡Oh Sorpresa! Windows 7.

Seguro que una herramienta de este tipo está desarrollada en mil versiones bajo licencia GPL.. me dije. Pues la verdad es que no hay mucho y lo que hay funciona mal bajo Windows 7, así que decidí desarrollar mi propio Hyperterminal...¿y quien va a vender un Hyperterminal?, pués aquí tenéis uno desarrollado por mí.

No tiene ningún tipo de licencia, o sea, libre libre. Haz con esto lo que te de la gana, pero si te da la gana mejorarlo y te da la gana compartirlo nos dará la gana agradecértelo.

Está escrito en VB.NET con el entorno de desarrollo Sharp Develop que puedes bajarlo bajo licencia GPL.

Un ojo a su aspecto.



Ya que invertíamos esfuerzo he decidido mejorarlo. Veamos las funciones.


Seleccionamos el puerto, los parámetros de comunicación y le damos al botón abrir. En ese momento entra en comunicación con el dispositivo conectado a ese puerto.
El textbox de la izquierda permite escribir los datos y al darle al botón enviar lanza el contenido por el puerto serie. El de la derecha siempre está a la escucha y coloca los datos recibidos.
Podemos tener algunos comandos habituales guardados  y los disparamos con los textbox de abajo.Lo guardamos y recargamos con los botones inferiores, se guardan en un archivo de texto que se llama config.ini en el mismo directorio de ejecutable.

Si le damos al botón derecho en la zona de envío aparece una lista de comandos habituales, hemos colocado una lista de los comandos AT para MODEMs, esta lista se puede modificar editando el archivo de texto denominado comandos.ini, siendo descripción, una coma,  seguido del comando. Para aceptar el comando hay que hacer doble click encima.

La parte de la derecha pretende ser un filtro de comandos pero aún no está implementada.


Espero que os sirva en vuestros proyectos. No olvidéis que es versión beta y espero vuestros comentarios.

No requiere instalación, simplemente descomprime el zip siguiente y ejecuta el ejecutable o pon un acceso directo.  -PINCHA AQUÍ-

Si quieres los fuentes para modificarlo o aprender algo -DALE CAÑA-

Saludos y buen progreso.