Objetivos
Material requerido.
HX711 ADC 24 bits | |
Un ESP32 | |
Cables macho-hembra |
Este tutorial e sparte de una serie sobre galgas y células de carga para hacer una balanza. Tal vez te interese revisarlas:
Probando el HX711
Podrías pensar, que después de haber hecho unos cuantos tutoriales sobre como montar una báscula con célula de carga basada y un convertidor ADC HX711, con Arduino UNO y con el ESP32, no parece que quede mucho más que decir. Pero el caso es que casi no hemos hablado del HX711 y eso, como vosotros comprenderéis no puede ser.
La primera vez que jugué con un HX711 no me causo muy buena impresión. Mas que nada, porque por lo que cuesta no podía ser bueno. Y un convertido analógico a digital de nada menos que 24 bits, por menos de lo que vale una revista me hacía dudar bastante de su competencia.
Pero después de haberlo usado en las sesiones previas para leer la deformación de una célula de carga, la opinión que tenia de él ha mejorado bastante, y por eso, creo que sería interesante dedicarle una sesión propia, sin hablar de células de carga o pesajes; simplemente vamos a hablar del convertidor ADC (Analog to digital Converter) y ver sus puntos fuertes y sus debilidades.
Y como tiene que ser , vamos a empezar con una descripción del HX711 porque hasta ahora no hemos visto sus características, y ya va siendo hora.
Convertidor ADC 24 bits HX711
Lo primero, y según el fabricante, el HX711 es un convertidor analógico a digital de precisión, con 24 bits de resolución, pensado para balanzas y aplicaciones industriales, que se puede conectar directamente a un puente de Wheatstone o células de carga. Aquí os dejo la data sheet del fabricante.
Dispone de dos canales de entrada A y B (Dos. Si señor, no solo uno) y un multiplexor de entrada para seleccionar el canal que nos interese. Las señales de entrada pasan por un PGA (Programable Gain Amplifier) de bajo ruido para preservar la señal.
El canal A, puede programarse con una ganancia de 128 0 64, para una escala de fondo de ±20mV o ±40mV, respectivamente.
El canal B tiene una ganancia fija de 32, (Siempre multiplica la señal de entrada por 32 antes de medirla)
Ya comentamos que la medida de una célula de carga es muy sensible a las variaciones de la tensión de excitación y por eso el HX711 incluye una fuente de tensión estable, para evitar tener que incluir una fuente externa. Resumiendo:
Caracteristicas
Un conversor ADC con precisión de 24 bits, tiene que ser relativamente lento (O eso me parece a mí) y por tanto una de las cuestiones es ¿Que tal anda de velocidad? ¿Cuántas muestras de 24 bits puede tomar por segundo?
Para averiguarlo, vamos a usar un ESP32 que es 15 veces más rápido que un Arduino UNO (240 Mhz contra 16Mhz) Vamos a empezar con un programita que nos calcule cuantas muestras puede tomar nuestro HX711 por segundo. Le pedimos que tome mil muestras e imprima el tiempo que ha empleado para ello. La conexion es simple y ya la vimos en las sesiones previas.
ESP32 | GND | 5V | SCK | DT |
---|---|---|---|---|
HX711 | GND | Vcc | 18 | 19 |
Programa para medir la velocidad de muestro
Vamos directamente al programa
#include "HX711.h" HX711 balanza; void setup() { Serial.begin(115200); balanza.begin(19, 18); delay(250); balanza.set_scale(397); balanza.tare(20); // Hacer 20 lecturas, el promedio es la tara Serial.println("................"); }
Hasta ahora nada nuevo, vamos con el loop(). Preparamos un bucle de 1.000 muestras (Samples) del convertidor e imprimimos la diferencia en milisegundos entre el principio y el fin del muestreo:
void loop() { long k =0; long T0 = millis(); for (int i = 0 ; i<1000 ; i++) { long reading = balanza.read(); // Lectura sin tarar ni escalar //Serial.println(i); } Serial.println("................"); Serial.println(millis()- T0); }
Si cargamos el programa obtenemos algo como esto:
Tarda poco más o menos 97 segundos en tomar 1.000 muestras y transmitirlas (Los valores de arriba son en ms). Es decir que no llega a 10 muestras por segundo. Esto no es bueno ni malo. No es importante para una balanza, pero desde luego se queda muy corto si queremos estudiar fenómenos rápidos, como transitorios y cositas así. Por ejemplo, si queremos estudiar las vibraciones de una probeta metálica vibrando con un único apoyo y galgas… tendremos que buscar en otro sitio. El HX711 se queda muy lejos de eso
Podemos hacer esta misma prueba con los ADC internos del ESP32, que son de 12 bits, para ver la diferencia de velocidad. Basta con cambiar la línea:
long reading = balanza.read();
Por esta otra para hacer el mismo ejemplo con el convertidor interno del ESP32
long reading = analogRead(34);
Subiendo el programa, obtenemos enseguida esto:
Es decir que el ESP32 es capaz de hacer 1.000 muestras con un ADC interno en 10 mili segundos, más o menos , contra los 97.000 ms del HX711 (Todo esto sin afinar la velocidad) Es decir es como 10.000 veces más rápido. Quizás sea preciso, pero desde luego… rápido no es.
Leyendo el canal B de un HX711
Podemos hacer un pequeño circuito para leer el segundo canal, con un potenciómetro y una resistencia para crear un divisor de tensión (En lugar de tener que conectar otra vez la célula de carga, que ya huele el tema):
He estado buscando información y ejemplos por Internet, de cómo leer el canal B del HX711 y solo he encontrado un par de oscuras notas al respecto, (Aunque creo que lo he entendido). Parece que si no especificas lo contrario (Como hacíamos con la báscula), se selecciona implícitamente el canal A con una ganancia de 128 por defecto, pero puedes elegir, también, ganancia de 64 en el PGA (Amplificador programable).
Si quieres leer el canal B, basta con que selecciones una ganancia de 32 y sin más, la librería asume el canal B y punto. Mientras que con el canal A puedes seleccionar una ganancia de entrada de 128 o de 64, el canal B solo dispone de ganancia de 32 . En función de la ganancia que elijas, seleccionas el canal correspondiente.
Así pues, para una instancia que podmeos llamar ADC1, del HX711, estas líneas:
ADC1.set_gain(128); // Seleccionar canal A, ganancia 128 long readingA = ADC1.read();
Son completamente equivalentes a esta otra
long readingA = ADC1.read();
Porque selecciona implícitamente el canal A. Si quieres que la ganancia sea de 64, escribes esto
ADC1.set_gain(64); // Leemos canal A long readingA = ADC1.read();
Para leer el canal B:
ADC1.set_gain(32); // Seleccionar canal B long readingB = ADC1.read();
Mientras no vuelvas a hacer un cambio de ganancia seguirás leyendo del último canal seleccionado. Si quieres cambien de canal, simplemente fija la ganancia correspondiente. Puede parecer un lío, pero es bastante sencillo. Podemos usar este programa para leer el resultado de muestrear el canal B del HX711 :
#include "HX711.h" HX711 ADC1; void setup() { Serial.begin(115200); ADC1.begin(19, 18); delay(250); } void loop() { long k =0; long T0 = millis(); ADC1.set_gain(32); //Seleccionamos canal B for (int i = 0 ; i<1000 ; i++) { long readingB = ADC1.read(); Serial.println(readingB ); } }
Como he usado una resistencia de 10k y un potenciómetro del mismo valor, el resultado no es que sea muy fino, pero se aprecian las variaciones, cunado movemos el control del potenciómetro:
Os habréis fijado que he puesto la selección de la ganancia fuera del loop de lectura / Impresión. Eso es porque por lo poco que he podido ver, el cambiar la gancia del Amplificador de entrada, tarda tanto tiempo como el hacer una lectura, y en un módulo ya bastante lento de por si, andar cambiando la ganancia, reduce esa velocidad a prácticamente la mitad.
El resumen final, es que el HX711, dispone de un convertidor analogico a digital de 24 bits, de excelente precisión, pero tan lento que solo le hace útil para balanzas y procesos muy lentos, como leer temperaturas o cosas de variación lenta. Es un convertidor barato y preciso, pero no sirve para medir procesos rápidos. Si necesitas eso, tendrás que buscar en otro sitio.
Como andaba con un proyecto de medición de galgas industriales para un asuntillo (Digo andaba, porque con el virus ya veremos como acaba la cosa), he probado varios otros convertidores ADC que espero sean mas rapidos, y ya os iré contando que mas opciones tenemos en el mercado, que puedan ser interesantes para los que nos gusta de enredar con cositas electronicas.