BricoGeek - Hazte tu propia tecnología!
Add to Technorati Favorites



BricoGeek Noticias

4424
lecturas
 
Me Mola!
Uno de los instrumentos más importante en nuestro laboratorio posiblemente pueda ser el osciloscópio. Quitando una fuente de alimentación regulabre y un bien polímetro, un osciloscopio nos puede ayudar muchisimo a la hora de trabajar con señales digitales pero por desgracia, el precio de un osciloscopio medio suele ser bastante elevado para el aficionado.

La solución? pues muy fácil: Construirse uno casero! y qué mejor sitio que BricoGeek para descubrir cómo podemos hacernos un pequeño y sencillo osciloscopio para nuestro laboratorio al mismo tiempo que aprendemos a medir señales analógica con una placa Arduino, y todo esto con un presupuesto reazonablemente pequeño.



Os dejo a continuación una pequeña guía de cómo hacer un oscilosopio usando una pantalla gráfica LCD a color, una placa Arduino Bare Bone y una photoresistencia LDR para probar el montaje.

Video y explicaciones a continuación...

Publicado el 20/01/2008 en Electrónica | Comentarios (6) Publicalo en meneame! Publicalo en del.icio.us! Publicalo en Digg! Publicalo en Technorati!


Video:


Introducción:
Antes de comenzar, éste pequeño osciloscopio no pretende para nada competir con los reales, pero puede ayudarnos a comprender y sobre todo visualizar todo tipo de señales analógicas de una forma muy sencilla y en apenas 1 hora de trabajo. Luego es cuestión de cada uno de montarselo dentro de una bonita caja y tenerlo listo para funcionar o enseñar a los amiguetes!

Que necesitamos?
Basicamente necesitamos dos cosas: una pantalla gráfica LCD a color de 240x320, la cual puedes conseguir pinchando aqui. Y una placa Arduino que será la encargada de controlar la pantalla y de realizar la medición.
Para las pruebas, he usado una photoresistencia (o LDR) para variar el voltaje de una entrada analógica y visualizar algo en pantalla.

Midiendo señales analógicas
Arduino, que no es más que un AVR ATMega168, dispone de 6 entradas analógica con una resolución de 10bits. Esto quiere decir que la tensión medida en estas patillas, nos devolverá un valor comprendido entre 0 y 1024. La placa, como cualquier circuito con microcontroladores, funciona obiamente con una tensión de alimentación de 5 Voltios con lo que el valor 0 será 0 Voltios y un valor de 1024 serán 5 Voltios. Nuestros pequeño osciloscopio no podrá medir tensiones superiores a 5V aunque es más que suficiente precisamente para medir señales digitales de hasta 5V. Atención: Si se mide una tensión superior, el microcontroladro pasará automaticamente a ser chatarra... asi que cuidado.

Para medir una señal analógica simplemente usamos la función analogRead() que nos devolverá un valor, como hemos dicho, entre 0 y 1024. Y cómo savemos entonces el resultado? Pues muy simple, vamos a convertir lo leido a un valor en voltios de esta manera:

int val_read = ((analogRead(0)*5) / 1024.0)


Éste calculo nos devolverá en la variable val_read, un valor entre 0 y 5 voltios que será la tensión sobre la entrada analógica 0. Teniendo en cuenta que nuestro Arduino tiene una resolución de 10bits, el paso más pequeño, o lo que es lo mismo, la resolución mínima será de 5 / 1024 = 0.0048 voltios por paso. Si analogRead nos devuelve por ejemplo un valor de 537 podemos saver que la tensión resultante es de 537 * 0.0048 = 2.57 Voltios (aproximadamente).

Visualizando los datos:
Ahora que savemos cómo medir el voltaje, debemos mostrarlo por pantalla. La pantalla LCD que he usado es idónea para dicha tarea ya que dispone de su própio controlador y no necesitamos de gran cosa para hacerla funcionar en un instante.
Simplemente he dibujado un lienzo o recuadro donde se mostrará la gráfica resultante de la medición adecuando el resultado a las corrdenadas en pixels del área a pintar.
Basicamente se trata de hacer un "barrido" de izquierda a derecha con un pequeño bucle FOR y luego variar la coordenada Y en función del resultado de la medición. En un primer moment lo he hecho pintando pixels individuales y el resultado fue instantáneo. Sin embargo, al usar este método, cuando entre una medición y otra hay mucha diferencia de voltaje, se aprecia un espacio vacío entre cada punto y no resulta muy bonito (cuantas más variaciones en menor tiempo, más se aprecia éste efecto). Por lo que he decicido pintar lineas entre cada punto de medición. El resultado es perfecto ya que siempre tendremos una linea continua en la pantalla, genial!

Últimas anotaciones
Como veis, es un proyecto muy sencillo que apenas me ha llevado un par de horas en tenerlo funcionando. Lo interesante de la cuestión es que como ya he comentado, la placa Arduino dispone de hasta 5 entradas analógicas con lo que podemos aplicar al mismo sistema en todas y asi tener un mini osciloscopio de 5 canales simultaneamente. Por supuesto, la velocidad de medición disminuye, pero no deja de ser interesante. A continuación os dejo el trozo de código del buble principal que se encarga de hacer la medición y de mostrarla en pantalla:


for (x=2 ; x<239 ; x )
{

OLED_DrawLine(x, 41, x, 280, 0);

// Input 1 (Green)
val_read = ((analogRead(0)*5) / 1024.0) * 48;
//OLED_PutPixel(x, 280-val_read, GetRGB(0, 254, 0));
OLED_DrawLine(x-2, 280-prev_read1, x, 280-val_read, GetRGB(0, 254, 0));

prev_read1 = val_read;
/*
// Input 2 (Red)
val_read = ((analogRead(1)*5) / 1024.0) * 48;
//OLED_PutPixel(x, 280-val_read, GetRGB(0, 254, 0));
OLED_DrawLine(x-1, 280-prev_read2, x, 280-val_read, GetRGB(253, 0, 0));

prev_read2 = val_read;
*/
}


Espero vuestros comentarios!
Comentarios:

Serkeros serkeros(at)teleline(dot)es
Escrito el 29/01/2008

Muy aparente, si señor, te ha quedado muy bien. Sin embargo se me ocurren un par de limitaciones que tiene: en primer lugar, como ya comentas, el límite de 5V de la tensión de entrada. La segunda, que no puede tomar muestras muy rápido debido a que depende de la transmisión serie hacia la pantalla (no he visto el código de las funciones que has hecho, pero supongo que tiran los datos al Tx y Rx del Arduino hacia el procesador de la LCD ¿es así?).
Esto se podría solucionar con un buffer de memoria intermedia, pero ya se complica el tema...
A parte de esto, un proyecto cojonudo. Por cierto, ¿por qué no publicas la libreria de funciones OLED_etc. y así vemos más en profundidad como va el tema entre el Arduino y la Pantalla?
Sigue así.
SRKRS

Oscar G. BricoGeek
Escrito el 29/01/2008

Hola Serkeros,
Efectivamente no es el mejor osciloscopio del mundo ni es muy usable por el momento, pero e sun proyecto divertido y relativamente fácil de hacer.
Como tu bien dices, la limitación de velocidad se encuentra en la transmisión Arduino -> LCD ya que la máxima velocidad es de 115200 bps que es la que uso actualmente. He hecho algunas pruebas con un buffer intermedio para umentar la velocidad de toma de datos en la entrada analógica y la verdad esque ha mejorada bastante. Primero tomo dentro de un bucle unas 300 medicionesy luego las dibujo. Obiamente, se crea un pequeño desfase entre cada 300 mediciones ya que se tarda un tiempo en dibujar en la pantalla, pero por lo menos ahora no consigo ver una onda de más de un flanco al pasar una luz por el sensor!

En breve y una vez las tenga bien pulidas, publicaré unas cuentas librerías para Arduino para hacer funcionar unos cuantos modelos de pantallas OLED y LCD.

Saludos y gracias por tu mensaje!

Oscar G.

teo www.thetroubleshooting.com
Escrito el 31/01/2008

Un poco de esfuerzo para vencer las limitaciones de este util instrumento. Que bueno que existen soluciones para aquellos que no tenemos para comprar un instrumento como este.

JUANMANUEL
Escrito el 15/02/2008

QUE MICROCONTROLADOR, YQ UE COMPILADOR UTILIZASTE

yoyo
Escrito el 03/03/2008

Obviamente el problema más grave que tiene este proyecto es la falta de un prescaler para poder recibir señales débiles y fuertes. Solucionado esto sería muy importante escribir el software directamente en ensamblador, ya que el C es bueno para un prototipo rápido pero no para algo donde la velocidad sea crítica.

Por otro lado, la transmisión al display puede ser lenta pero para el caso de señales periódicas no sería tan grave. Mientras internamente el procesador pueda formar una imágen rápidamente en RAM, la transmisión a la pantalla puede ser más lenta.

Mark
Escrito el 07/07/2008

Muy interesante. ¿Hay alguna posibilidad de que usted podría publicar el interfaz de rutinas que usted utiliza para la pantalla a color? Estos podrían encontrar empleo fuera de este proyecto. Sería muy interesados en ver estas.

Mark.
(Er. .. probablemente adivinado No me hablen español, por lo que esta es una traducción automática y voy a leer tu respuesta de la misma manera!)

Escribe tu comentario:
La dirección de correo es opcional, sin embargo, si la escribes, será modificada para que los bots cojoneros no la vean y no recibas spam ;)
Tambien debes escribir el código de control para saber que no eres un bot... Por ultimo, no me responsabilizo de NADA de lo que pongas aqui y me reservo el derecho de borrar o modificar tu mensaje sin previo aviso si veo que es spam, publicidad o calumnias diversas.

Nombre:
Email/Url: (opcional)
Código antispam: Código antispam
Quieres publicar el comentario? Si No
*Comentario:
(* No escribas código HTML ni JavaScript ya que no funcionará...)
Creative Commons License
Esta obra está bajo una licencia de Creative Commons. www.BricoGeek.com 2005-2008 - Diseño by E-Pulse