HX711 ADC 24 bits

Objetivos

 

  • Vamos a montar una bascula con ESP32 y HX711.
  • Montaremos un servidor web.
  • Usaremos el servidor para publicar el peso.
  • Haremos algunas pruebas[/three-fourth] [clear/]
  •  

    Material requerido.

     

     Convertidor HX711 HX711 ADC 24 bits
     vista lateral del esp32 Un ESP32
     cables M-F 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:

  • Galgas y celulas de carga
  • Balanza con célula de carga
  • Balanza HX711: Programa final
  • Balanza WIFI con ESP32.
  •  

     

    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.

  • Dicho así, parece algo muy raro, pero simplemente significa, que como esperamos que la señal de entrada sea muy pequeña, como corresponde a las minúsculas variaciones de resistencia en unas galgas de un puente, lo que hacemos es amplificar la señal antes de medirla.
  • Los PGA son muy típicos de este tipo de circuitos, porque nos permiten multiplicar el valor de la señal por N, en este caso 128 o 64 veces, para que cuando vayamos a medir la señal con el convertidor, esta se acerque al máximo al fondo de escala del ADC, en este caso 5V. [/fancy-ul] [/three-fourth]
  •  

    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

  • Convertidor ADC de 24 bits.
  • Dos canales diferenciales de entrada seleccionables .
  • Amplificador PGA de entrada, con ganancia programable de 32, 64 y 128
  • Fuente de alimentación incluida para células de carga
  • Oscilador interno. No necesita otro reloj.
  • Control digital simple mediante pines de control
  • Rango de voltajes de entrada : : 2.6 ~ 5.5V
  • Temperaturas de trabajo: : -40 ~ +85℃
  •  

    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

    Esquema de conexion

     

    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:

    Leyendo 1000 muestras

    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:

    Muestreo del ESP32

    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):

    Leyendo el canal B de un HX711 con ESP32

    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:

    Imagen de variaciones de tension

    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.

     

    IMAGEN DE MARCA

     


    Deja una respuesta