ESP-32

La tarjeta de desarollo ESP-32 fue la que quedó como la mejor alternativa a en cuanto a tarjetas con un circuito integrado se refiere. Existen alternativas que son ligeramente más sencillas de conseguir por precios no muy diferentes, sin embargo, la ESP-32 presenta una serie de ventajas que estas alternativas no.

Las tarjetas de Arduino, la Nano y la Uno así como la ESP-8266 fueron también contempladas.

Ninguna de estas tarjetas es tan mala como para quedar inmediatamente descartada pero hay una razón final por la que la ESP-32 quedó como la única tarjeta recomendada para elaborar este osciloscopio (aunque también se podría armar el osciloscopio con cualquierade estas otras tarjetas).

RECOMENDACIÓN

  • La tarjeta ESP-32 tiene una velocidad de reloj de 240MHz, un ADC con resolución de 12 bits (0->4095) y un precio de 160 mxn SandoRobotics.

Las demás tarjetas pueden hacer de un buen sustituto de uno ya contar con alguna de estas tarjetas por algún proyecto previo, sin embargo, de uno comprar uno nuevo, la tarjeta ESP-32 es la que se recomendará en este texto.

ALTERNATIVAS

  1. Arduino Nano: Las dimensiones y los casos de uso son semejantes a las de la ESP-32, el ADC igualmente tiene una resolución de 12-bits, la única diferencia real para el usuario está en la velocidad de reloj. La tarjeta de Arduino Nano tiene una velocidad de reloj de 80MHz mientras que la ESP-32 tiene 240MHz por cada núcleo. No es una mala tarjeta ni una mala alternativa pero de ser posible, es mejor adquirir la ESP-32 por el mismo precio. SandoRobotics

  2. ESP-8266: Es la tarjeta "anterior" en diseño a la ESP-32, en general también es una buena alternativa. Tiene una velocidad de 80MHz, lo que la sitúa en el mismo lugar que la Arduino Nano, sin embargo, su resolución de ADC es de 10 bits en vez de 12 bits. Esto nos daría un cuarto de los valores posibles a adquirir de voltaje si la comparáramos con la ESP-32 o la Arduino Nano, es por eso que, aunque no es mala tarjeta en caso de emergencias, no la podemos recomendar tanto como las otras dos. SandoRobotics

  3. Arduino Uno: De las tres alternativas, esta es la que menos recomendamos ya que tiene una velocidad de reloj de 16MHz, una resolución de 10 bits (y solo en algunos modelos dependiendod el fabricante y la revisión de 12 bits) además de ser por mucho la más cara de las tres tarjetas alternativas. Es por eso que no la podemos recomendar como las otras. Más bien es un "último recurso".

Consideraciones

Para seguir este proceso de diseño se espera un conocimiento de programación moderado así como previa experiencia trabajando con tarjetas de desarollo, haber armado este circuito ya es suficiente fuente de conocimiento.

Dado que el objetivo de nuestro dispositivo es conseguir la mayor cantidad de mediciones por segundo, tenemos que tener un código optimizado para ciclarse lo más rápido posible, sin espacio a repeticiones e intentar pre-calcular la mayor cantidad de valores sin dejar que el compilador de Arduino haga magia detrás.

Se consideró el IDE de Arduino como la herramienta correcta para realizar este proyecto por la facilidad de instalación, compatilibidad en múltiples plataformas y facilidad de uso.

La tarjeta ESP-32 necesita de una biblioteca externa para su compilación, sin embargo, dado que existen mucho fabricantes de tarjetas de desarrollo ESP32-WROOM así como diferentes submodelos y revisiones intentaremos también apegarnos lo más posible a los comandos más utilizados del lenguaje de programación Arduino/C.

Se puede programar la tarjeta haciendo uso de diferentes compiladores así como de su lenguaje ensamblador, sin embargo, como ya se dijo, por facilidad de programación así como la implementación en general esto se tratará hasta el capítulo de diseño para usuario avanzado.

Diseño

Herramientas de depuración

El IDE de Arduino es ya suficientemente amable en el sentido de que ya incluye un visor para el monitor serial. El monitor serial es un canal de comunicación que existe para muchos dispositivos por medio del cual se envían señales (bytes de información) desde un dispositivo externo hacia la computadora. Estos bytes se envían uno tras otro (en serie) de ahí el nombre "serial". En el monitor serial de Arduino podemos visualizar texto así como el texto interpretado como un número (i.e. un String a un Entero).

Ojo, no podemos interpretar diréctamente el valor de los bytes enviados en el IDE de Arduino sino que necesitaremos una herramienta adicional para visualizar los valores que se envíen. Existen muchas herramientas por medio de las cuales se pueden visualizar los valores entrantes en el monitor serial así como muchos otros que permiten la comunicación en ambos sentidos.

ATENCIÓN: Los siguientes programas utilizados son únicamente una recomendación, ambas aplicaciones las he usado sin ningún problema aparente en cuanto seguridad. Mi recomendación es únicamente basada en la experiencia.

Para Linux y Windows, por mucho la mejor herramienta que encontré fue HTerm por su estabilidad y facilidad de visualización.

Para Mac CoolTerm fue la mejor alternativa.

Código

Todos los programas de Arduino comienzan con la plantilla siguiente


void setup() {
}

void loop() {
}

En el espacio de código previo el método "setup" generalmente se usa para la definición de variables globales y constantes (las cuales usaremos bastante), en la sección de "setup" irá el código necesario para inicializar nuestras variables, establecer funcionalidad de los pines de nuestra ESP-32 y demás configuraciones iniciales.

En "loop" estará el grueso de nuestro código, aquí es donde tendremos que tener suma precaución al momento de programar ya que este es el código que se ejecutará de manera cíclica una y otra vez.

Hay que recordar, la ESP-32 únicamente la usaremos como un medio de comunicación entre los convertidores analógico-digitales (ADC) a la computadora (en la aplicación de Java). Es por esto que en realidad el código será bastante conciso.

Un pseudocódigo más o menos funcional que represente lo que buscamos hacer sería:

int lectura_ADC_A
int lectura_ADC_B
int pin_ADC_A
int pin_ADC_B

int resta_ADC_AB

inicializa(){

    //De este valor dependerá la velocidad de operación de la ESP32
    configurar_reloj_ESP32                              
    
    //De este valor dependerá nuestra velocidad de envío
    configurar_tasa_baudios_monitor_serial(máximo_valor_estable)    
    
    //De este valor dependerá nuestra calidad de lectura
    configurar_resolución_ADC(máximo_valor_estable)     

}

ciclo(){

    //Leemos los valores de las terminal positiva (A) y la terminal negativa (B) 
    lectura_ADC_A = leer(pin_ADC_A)
    lectura_ADC_B = leer(pin_ADC_B)

    //Al valor de la terminal positiva restarle el valor de la terminal negativa
    resta_ADC_AB = lectura_ADC_A - lectura_ADC_B

    //Mandamos el valor a la computadora
    mandar_serial(resta_ADC_AB)
}

Este pseudocódigo describe mayormente el funcionamiento del código final. En realidad, este fue el primer código que se utilizó para intentar hacer funcionar el osciloscopio. Hay ciertos detalles que hacen que sea ineficiente, lento, variable y poco predecible. Es por eso que se tuvieron que realizar bastantes cambios a este código.

El osciloscopio con este código puede obtener aproximadamente doscientas muestras por segundo pero es muy variable y poco confiable. Es por ello que se requirieron de múltiples optimizaciones en el código para lograr un desempeño mejor del dispositivo. Ya con las mejoras en este código se pueden lograr mucho mayores frecuencias de muestreo. En las últimas pruebas realizadas antes de la elaboración de este manual se lograron velocidades de muestreo de 8kHz; lo que significa que podremos obtener un muestreo más o menos bueno de señales de 4kHz o señales de frecuencia inferior. En realidad, para tener una señal descrita por suficientes puntos como para poderla visualizar correctamente (unos 4 o 5 puntos por cada ciclo) se recomineda leer señales de hasta 1kHz. Sin embargo, en teoría se podrían interpretar señales de hasta 4kHz.

Desafortunadamente, las optimizaciones que se realizaron en este rubro del diseño superan muy rápidamente el nivel básico de usuario por lo que en realidad se recomienda que no se manipule el código a menos que uno realmente sepa lo que está haciendo.

Usuario avanzado: Diseño código Arduino