Mostrando entradas con la etiqueta oscilloscope. Mostrar todas las entradas
Mostrando entradas con la etiqueta oscilloscope. Mostrar todas las entradas

domingo, 5 de abril de 2020

Osciloscopio Arduino JAVA - Processing - 183000 M/S


Osciloscopio

Arduino

JAVA - Processing


En uno de mis artículos anteriores había mostrado varios analizadores digitales - analógicos .
Entre ellos mostraba Arduinoscope que era un visualizador de 6 señales analógicas utilizando el arduino.

Era bastante útil para visualizar señales en baja velocidad, pero el arduino podía convertir señales A/D bastante mas rápido.
El programa arduinoscope estaba programado en JAVA utilizando una biblioteca llamada Processing. processing
Processing es un potente software dedicado a la producción de imágenes, animaciones e interactivos.
Processing está compuesto de todo un entorno de programación en JAVA, (muy similar al del arduino), incluidas un montón de librerías para el tratamiento de imágenes.
Se puede descargar de su própia página, y funciona en Windows, Linux y Mac, además de ser Open Source.

Mis conocimientos en JAVA son bastante limitados, y en muchos casos me vuelvo loco utilizando funciones que en C o C++ están permitidas y en JAVA no.
Me puse manos a la obra para transformar el Arduinoscope en un Osciloscopio de un solo canal, pero con muestreo de 180000 m/S.
En varios artículos había realizado un osciloscopio similar realizado en diferentes lenguajes de programación, Gambas, SDL, Xwin, wxwidgets.
Para mi es un reto programar en JAVA, pero los retos me gustan.

Como soy un tanto particular en la programación, he utilizado el editor Geany y la línea de comandos linux (Debian 10) para compilación (copile) y ejecución (run).
También he colocado todos los archivos en un solo directorio, incluidas las fuentes (un formato de fuentes de lo mas particular formato vlw) .
Los purista me meterían a la cárcel, pero bueno soy autodidacta, y se me puede perdonar.
Forma de onda en mi osciloscópio. En un oscilocópio comercial.

Señal de 5000 Hz.

El muestreo máximo que permite el arduino en modo Fast es de 183000 m/S , con una resolución de 8 bits.
A esta velocidad la exactitud de la conversión A/D no es muy precisa, pero suficiente.



Como se puede ver he colocado una resistencia entre la entrada A1 y los 3,3V, y esto tiene un motivo.
Resultaba que al hacer pruebas de medida en DC, las medidas no eran correctas, eran algo inferiores.
Revisando voltajes por el circuito descubrí que la tensión en el arduino nano  no era de 5V , era de 4,7V y alteraba todas las mediciones.
Mirando los esquemas del arduino UNO y el arduino NANO , había diferentes formas de alimentar el micro. El primero utilizaba un transistor sin caída de tensión, y el segundo un diodo que hacia caer la tensión entre 0,3V a 0,7V . Este cambio en la alimentación produce errores de lectura .
Para solucionar este problema, realizo una lectura de referencia de los 3,3V en el pin A1. Con esta lectura de referencia calculo la lectura real de la entrada A0.

Espero que le haya gustado este proyecto.
Ha sido mas una lucha por aprender JAVA que por realizar el osciloscopio.

VIDEO

PROGRAMA

Saludos.
Juan Galaz




Bibliografía:
https://github.com/konsumer/arduinoscope
https://processing.org/download/

miércoles, 18 de marzo de 2020

Nueva versión de osciloscopio con Arduino, portable.

18/03/2020 _ portable
Estaba el otro día viendo este antiguo montaje, y pensando en una mejora, he añadido una nueva opción, cambiar el voltaje de referencia a 1.1V, lo cual produce una ganancia de x4,5.
Además aprovechando la oportunidad he realizado una nueva versión de Linux,  versión portable.
Esta versión funciona tanto en 32bits como en la versión 64bits.
Para entender como se realiza la versión portable, mirar este artículo. wxport.html

Funcionando la versión portable de Linux.

También el programa detecta automáticamente el puerto USB donde está conectado el Arduino.
En algunos Windows, el puerto virtual Serie lo coloca muy alto, me encontrado en algunas ocasiones que estaba en Com23, el programa solo mira si existe entre el Com1 y Com5. Si es vuestro caso deberéis cambiar el lugar  para que este en el rango buscado. Se hace como administrador y en configuración de los puertos serie.
Para esta versión deberéis instalar el programa arduino que viene en el archivo comprimido.

PROGRAMA LINUX -WINDOWS

martes, 5 de junio de 2018

Osciloscopio - Arduino - wxwidgets

Página principal

Osciloscopio
Arduino
wxwidgets

Hace tiempo había realizado un pequeño osciloscopio con un arduino. arosc.html
El programa que manejaba el osciloscopio lo había realizado con las librerías SDL, una librería especializada para juegos. Funciona bien y es multiplataforma, habiendo compilado en Windows y Linux.
Ahora como estaba en la época de la librería wxwidgets, era una buena ocasión de realizar el programa con esta librería.

Programa realizado con la librería wxwidgets.

Se ha mejorado bastantes cosas, una de ellas es la muestra real del voltaje en modo auto.
En el programa que hice bajo SDL la detección de la placa era automática, en este caso solo detecta los posibles puertos serie, nosotros debemos de seleccionar el adecuado. La rutina que me funcionaba en SDL no me funciona bajo wxwidgets, es curioso pero es así, no he querido profundizar de momento.
Otra cosa que me ha ocurrido es la diferencia entre versiones de librerías wxwidgets entre 2.8.12 y 3.1.1. Algunas rutinas funcionan y otras no, por lo que he tenido que retocar el código. Ahora funciona perfectamente en Linux y Windows (librería estatica o DLL), aunque veo que es algo más rápido bajo Linux.


PROGRAMA
Debian 9.4  y windows XP

Hasta pronto.
JUAN GALAZ


Bibliografía:
wxtutor.html
wxtem.html


jueves, 3 de agosto de 2017

OSCILOSCOPIO Arduino Versión 3



OSCILOSCOPIO
Arduino
Versión 3


En mi anterior montaje había realizado un osciloscopio con arduino.
En este montaje lo perfecciono y meto todos los componentes en una pequeña caja de plástico.
En la caja de plástico coloco 4 interruptores  para seleccionar los diferentes tipos de medidas .
Se puede seleccionar entre mediciones DC directas, mediciones de AC, y mediciones de DC con escala de x3.

Esquema electrico del circuito.


Diferentes combinaciones de los micro-interruptores.

Como se puede ver he colocado una resistencia entre la entrada A1 y los 3,3V, y esto tiene un motivo.
Resultaba que al hacer pruebas de medida en DC, las medidas no eran correctas, eran algo inferiores.
Revisando voltajes por el circuito descubrí que la tensión en el arduino nano  no era de 5V , era de 4,7V y alteraba todas las mediciones.
Mirando los esquemas del arduino UNO y el arduino NANO , había diferentes formas de alimentar el micro. El primero utilizaba un transistor sin caída de tensión, y el segundo un diodo que hacia caer la tensión entre 0,3V a 0,7V . Este cambio en la alimentación produce errores de lectura .
Para solucionar este problema, realizo una lectura de referencia de los 3,3V en el pin A1. Con esta lectura de referencia calculo la lectura real de la entrada A0.



Montaje de todos los componentes en la caja de plástico.


Nueva interface

Después de prueba y pruebas, he descubierto que la tasa real  de muestreo es la siguiente:
212.000 m/s
124.000 m/s
66.000 m/s 
35.500 m/s
17.900 m/s
8.880 m/s

PROGRAMA


Para que funcione el programa windows debemos copiar las librerías al directorio donde se encuentra el programa o una sola vez en el directorio system32 del directorio windows.
Librerías necesarias SDL de Windows


Creo que es un buen montaje para todos los que no dispongan de un osciloscopio, y muy barato 3€.
Como medidor de tensión en la escala de x3 podemos medir hasta 15V.

Saludos
Juan Galaz



Bibliografía:
ardu_os.html
http://real2electronics.blogspot.com/2011/09/arduino-adc-muestreo-alta-velocidad.html


sábado, 22 de julio de 2017

OSCILOSCOPIO- Arduino - STM32F103C8T6



OSCILOSCOPIO
Arduino

STM32F103C8T6
640000 muestras segundo
Fast A/D


En mi anterior montaje había realizado un osciloscopio con un arduino. Había conseguido una tasa máxima de muestreo de 250000 muestras por segundo. El programa estaba realizado utilizando la librería SDL en la parte del PC.
Como tenía un arduino basado en un STM32F103C8T6 , un  procesador  bastante mas potente que el ATmega 328 , investigue si podía conseguir una tasa de muestreo algo mas elevada.
Según la tabla de características del  STM32F103xx  performance line devices: 1 μs at 56 MHz (1.17 μs at 72 MHz).
Se raro que indique mas rapidez de conversión a 56 MHz que a 72 MHz , pero el caso es que en teoría podría llegar a una tasa de muestreo de 854000 muestras por segundo.
Mi idea era mantener el interface SDL del anterior montaje y cambiar el programa arduino de obtención de datos en la placa STM32F103, ajustándolo al nuevo procesador.
Lo primero que intente con éxito era cambiar la orden del conversor A/D  y utilice la orden: adc_read(ADC2, 0) , donde el 0 es el pin A0 que corresponde al PA0 en el programa.
El programa funcionaba, pero no se conseguía un aumento significativo en la tasa de conversión.
Mirando por internet encontré una fórmula para cambiar el reloj del conversor A/D con la orden: adc_set_prescaler(ADC_PRE_PCLK2_DIV_4) .
Puede tener tres opciones:
  ADC_PRE_PCLK2_DIV_2
  ADC_PRE_PCLK2_DIV_4
  ADC_PRE_PCLK2_DIV_6
  ADC_PRE_PCLK2_DIV_8

Con este cambio en la frecuencia de reloj, cambiamos la tasa de muestreo.

Clock configuration register (RCC_CFGR)
Address offset: 0x04
Reset value: 0x0000 0000
Access: 0 ≤ wait state ≤ 2, word, half-word and byte access
1 or 2 wait states inserted only if the access occurs during clock source switch.

Bits 15:14 ADCPRE: ADC prescaler
Set and cleared by software to select the frequency of the clock to the ADCs.
00: PCLK2 divided by 2
01: PCLK2 divided by 4
10: PCLK2 divided by 6
11: PCLK2 divided by 8


Pero aún así no llegábamos a la tasa de muestreo que prometían las especificaciones del procesador.
Buscando por internet encontré en un foro http://www.stm32duino.com/viewtopic.php?t=847  la forma de aumentar la tasa de muestreo.
La forma era con el comando: adc_set_sample_rate(ADC2, ADC_SMPR_13_5);
Efectivamente, aumento la tasa de muestreo a mas de 600000 muestras por segundo.
Las opciones posibles son:
    ADC_SMPR_1_5,               /**< 1.5 ADC cycles */
    ADC_SMPR_7_5,               /**< 7.5 ADC cycles */
    ADC_SMPR_13_5,              /**< 13.5 ADC cycles */
    ADC_SMPR_28_5,              /**< 28.5 ADC cycles */
    ADC_SMPR_41_5,              /**< 41.5 ADC cycles */
    ADC_SMPR_55_5,              /**< 55.5 ADC cycles */
    ADC_SMPR_71_5,              /**< 71.5 ADC cycles */
    ADC_SMPR_239_5,             /**< 239.5 ADC cycles */
Aunque no entiendo muy bien lo que realmente hace, el manual del registro dice:
ADC sample time register 2 (ADC_SMPR2)
Address offset: 0x10
Reset value: 0x0000 0000

Bits 29:0 SMPx[2:0]: Channel x Sample time selection
These bits are written by software to select the sample time individually for each channel.
During sample cycles channel selection bits must remain unchanged.

De las prueba realizadas la mejor combinación para dar una tasa de muestreo de 640000 muestras/segundo  es :
adc_set_prescaler(ADC_PRE_PCLK2_DIV_2) ;
adc_set_sample_rate(ADC2, ADC_SMPR_7_5);


Visualización de una frecuencia de 16000Hz . Muestreo de 640000 muestras/seg.

Para poder visualizar y medir mejor las ondas, he incorporado botones de zoom y de desplazamiento de onda.

Visualización de la onda 16KHz con zoom x4 modo puntos.

 
Visualización de la onda 16KHz con zoom x4 modo lineas.

Podemos observar 40 muestreos en un ciclo de onda de 16KHz.
Si calculamos 16000x40=640000 muestras/segundo.



PROGRAMA

Nota:
Debemos tener en cuenta que la máxima tensión de entrada es de 3.3V , que también es la tensión de alimentación del procesador.
La impedancia de entrada es mucho mas baja que en un arduino convencional,  lo que debemos tener en cuenta.
La propia sonda del osciloscopio me producía ruido en el propio chip.



Saludos
Juan Galaz



Bibliografía:
oscisdl.html
http://www.stm32duino.com/viewtopic.php?t=847
https://github.com/leaflabs/leaflabs-docs/blob/master/source/libmaple/overview.rst
https://hackaday.io/project/425-arduino-oscilloscope-688000-samplessec


www.000webhost.com

sábado, 8 de julio de 2017

OSCILOSCOPIO con el arduino Arduino



OSCILOSCOPIO
Arduino



Hace tiempo hice un osciloscopio con arduino en el entorno  de programación Gambas. El entorno gambas es una especie de VB que solo funciona en Linux. El que solo funcione en Linux tiene el inconveniente de eliminar bastantes usuarios que solo usan Windows.
Mi idea era era volver hacer el osciloscopio mejorándolo y que además funcionase  en Windows.
Había dos opciones hacerlo con las librerías SDL o con las librerías wxWidgets. Está claro que hubiese quedado mucho mejor el aspecto con las librerías wxWidgets, pero me decidí por las SDL por un motivo un tanto personal que no viene al caso. Igual en un futuro lo realice en wxWidgets , pero eso es otro proyecto.
Lo que me satisface más, es el poder compilar para las dos plataformas, Linux o Windows, con solo cambiar la directiva YesWindows 0 por #define YesWindows 1 en el fichero define.h.

En lado del arduino la entrada la toma del pin A0 con valores de 0 a 5V.
El arduino lee continuamente el puerto serie esperando ordenes.
En el caso de recibir la cadena "VOL="  , el devuelve una cabecera de 10 bytes "VOL     " + los retornos de carro , 10 valores (0-255) digitalizados de la entrada A0, y 10 bytes con la cadena "FIN     " + los retornos de carro. Un total de 30 bytes.
En caso de recibir "GETUP=" , el devuelve una cabecera de 10 bytes "DAT     " + los retornos de carro , 800 valores (0-255) digitalizados de la entrada A0, y 10 bytes con la cadena "FIN     " + los retornos de carro. Un total de 830 bytes.
En caso de recibir "DIV16" cambia el divisor del convertidor A/D del arduino a 62500 muestras por segundo.

En el lado del PC nos encontramos un entorno en el que podemos representar y controlar los datos que nos envía  el arduino.
Podemos estar en el modo Vol  ( Voltímetro ) , captura continuamente datos digitalizados del pin A0 representándolos en una gráfica continua. Se puede cambiar la velocidad de captura de datos.
El modo de osciloscopio muestra continuamente datos mandados por el arduino, 800 datos digitalizados a una velocidad que podemos modificar a nuestro gusto.

Al iniciar el programa se busca la conexión  del arduino con el programa del osciloscopio en todos los puertos serie que existan en el PC.
Este es el motivo por el cual tarda unos 6 segundos en arrancar

Para calcular la frecuencia de la onda debemos dividir las muestras por segundo entre las muestras de cada onda.
En la imagen siguiente la onda mide alrededor de 200 muestras.
Si estamos en el modo de 125000 muestras por segundo, la frecuencia será 125000/200=625Hz
Este cálculo no es totalmente exacto, pero la mayoría de las veces funciona bien.
En un principio lo incluí en el código, pero después de muchos ensayos lo descarté por no ser totalmente exacto.


Señal de 625Hz


Montaje del circuito.

En las siguientes imágenes se puede comparar entre las de un osciloscopio normal y mi montaje.



Señal de 5000Hz



Señal de 625 Hz

Para medir señales continuas o de niveles positivos se conecta la señal directamente a A0.
Pero si queremos medir corrientes alternas, debemos realizar un adaptador para elevar la señal a mitad de la máxima señal de entrada, 2.5V.
Como no quiero complicar el montaje, utilizo un par de resistencias y un condensador.

Adaptador de AC.

Para los que no disponen de un osciloscopio, este montaje puede ser interesante además de barato.

PROGRAMAS
Librerías necesarias SDL


Nota:
He tenido serios problemas con los diferentes arduinos. Cuando funcionaba bien el programa en una placa arduino clásica, luego al probar el programa en un arduino nano, dejaba de funcionar.  A velocidades de 115200bps no todo se comporta como debería.
He tenido que colocar retardos para que sea lo mas compatible posible.
La compilación en arduino se hizo en la versión 1.0.5 .
También he visto que la velocidad del programa es más rápida en la versión Linux.


Saludos
Juan Galaz



Bibliografía:
ardu_os.html
http://real2electronics.blogspot.com/2011/09/arduino-adc-muestreo-alta-velocidad.html