Fallas con HX711 y celda de carga en arranque u operación

Estoy trabajando con alguien en un proyecto de una máquina que incluye varios elementos pero uno de los mas importantes es una balanza de 2.5kg que mide el llenado de una bolsa plástica con un elemento solido, que puede ser harina, pueden ser semillas, o cosas pequeñas que no llegan al gramo.
El elemento a medir cae desde una tolva y lo hace mediante un vibrador.
El llenado es muy parejo y se ve una progresión pareja cuando todo funciona bien.

Como toda balanza usando un HX711 y una celda de carga de 4 hilos, se hace una calibración previa. El dato ronda aproximadamente un valor de 1250 aunque no es del todo importante lo señalo para que les sirva de elemento para entender el problema.
Todos sabemos que el HX711 es un ADC de 24 bits de bajo precio.
Estamos usando la librería HX711_ADC de Olkal disponible en el Administrador de Librerías del IDE. La librería es fácil de usar y trabaja bien. Dispone de ejemplos simples.

El código se usa en base a uno de dichos ejemplos en los que no se dispone de la interrupción pero si de millis() cada X tiempo lo que permite que se atienda otras cosas.

Este es el ejemplo en el que me basé:

/*
   -------------------------------------------------------------------------------------
   HX711_ADC
   Arduino library for HX711 24-Bit Analog-to-Digital Converter for Weight Scales
   Olav Kallhovd sept2017
*/

#include <HX711_ADC.h>
#include <EEPROM.h>

//pins:
const int HX711_dout = 5; //mcu > HX711 dout pin
const int HX711_sck   = 4; //mcu > HX711 sck pin

//HX711 constructor:
HX711_ADC LoadCell(HX711_dout, HX711_sck);

const int calVal_eepromAdress = 0;
unsigned long t = 0;

void setup() {
  Serial.begin(9600); delay(10);
  Serial.println();
  Serial.println("Starting...");

  LoadCell.begin();
  float calibrationValue; // calibration value (see example file "Calibration.ino")
  //calibrationValue = 696.0; // uncomment this if you want to set the calibration value in the sketch
  EEPROM.get(calVal_eepromAdress, calibrationValue); // uncomment this if you want to fetch the calibration value from eeprom

  unsigned long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time
  boolean _tare = true; //set this to false if you don't want tare to be performed in the next step
  LoadCell.start(stabilizingtime, _tare);
  if (LoadCell.getTareTimeoutFlag()) {
    Serial.println("Timeout, check MCU>HX711 wiring and pin designations");
    while (1);
  }
  else {
    LoadCell.setCalFactor(calibrationValue); // set calibration value (float)
    Serial.println("Startup is complete");
  }
}

void loop() {
  static boolean newDataReady = 0;
  const int serialPrintInterval = 0; //increase value to slow down serial print activity

  // check for new data/start next conversion:
  if (LoadCell.update()) newDataReady = true;

  // get smoothed value from the dataset:
  if (newDataReady) {
    if (millis() > t + serialPrintInterval) {
      float i = LoadCell.getData();
      Serial.print("Load_cell output val: ");
      Serial.println(i);
      newDataReady = 0;
      t = millis();
    }
  }

  // receive command from serial terminal, send 't' to initiate tare operation:
  if (Serial.available() > 0) {
    char inByte = Serial.read();
    if (inByte == 't') LoadCell.tareNoDelay();
  }

  // check if last tare operation is complete:
  if (LoadCell.getTareStatus() == true) {
    Serial.println("Tare complete");
  }
}

Bueno, la cosa es que la balanza lee 30 bolsas ( un ejemplo) sin problemas y luego tiene comportamientos alocados.
un ejemplo es que no llega a cero luego de retirada la bolsa, se queda con un valor fantasma, como si la variable no fuera actualizada por el HX711.
Otras es que comienza a dar valores sin sentido.

Aporto datos del hardware: cables y demás.

  • El HX711 esta próximo a un MEGA
  • Los cables desde el HX711 a la celda estan apantallados. La malla esta conectada a tierra.
  • En el lugar la máquina falla con o sin máquiinas funcionando.
  • Se probó cubrir el HX711 en una jaula de Faraday sin resultados positivos. Las fallas permanecían.

Por supuesto, GND VCC SCK y Data del HX711 estan conectados al MEGA. El HX711 se alimenta con los 5V del MEGA, todos sabemos que consume muy poco.

  • Se ha reemplazado el módulo HX711 por otros 3 y lo mismo con las celdas de carga y siempre ocurre lo mismo.
    Se consideró cambiar de 1 a 4 celdas de carga pero eso implica cambios de la balanza que ahora no son posibles.

  • Se reemplazó la dirección original de calibración de 0 a 20 y continúa el problema.

Creo haber explicado casi todos los elementos y pruebas que he sugerido y si estoy consultando es porque conozco poco al HX711 y esto que ocurre me tiene muy sorprendido.

  • La longitud de los cables a la balanza creo que es de 50 cm. Luego confirmo. Cable apantallado tmb. Si no lo dije ya lo repito.

Hola:
¿A que nivel tienes el pin 15 del chip?. Si lo tienes en alto considera la posíbilidad de ponerlo en bajo y probar.
Por cierto ¿Que modulo y celda estas usando?.
Saludos.

Por cierto ¿Que modulo y celda estas usando?.

Módulo HX711
Celda de 2.5Kg
Ya informé esos datos. Necesitas datos mas precisos. No los tengo.

¿A que nivel tienes el pin 15 del chip?

Como viene por defecto. Rate a GND o sea 10Hz

Si ya informasre, se me paso lo de los 4 cables de la celda, o sea que es de las que lleva el puente de resistencias dentro,
Lo del pin mejor asi ya que a mayor rate de sampleo el propio datasheet dice que puede dar problemas, asi que

Suponiendo que la parte "mecanica" esta bien montada, lo siento chico pero me sorprende lo mismo que a ti
y no se me ocurre nada que ya no hallas probado.

Saludos.

Bueno, voy a actualizar la información porque ayer tuve un momento de lucidez y creo haber dado con la tecla.
El código que no posteé tal vez tenia un pequeño error en una variable y no cualquier variable, justamente la que levanta el valor de la calibración.
COmo nunca habia trabajado con el HX711 hice lo que siempre propongo, leí tutoriales, hoja de datos, Luis Llamas. Nadie tuvo problemas y salvo que se requiera una alta tasa de refrezcos el HX711 funciona bien.
Entonces me di cuenta que tenia una variable local que cambiaba de nombre (por usar varios tutoriales). Solo se me ocurrió sin mucho análisis unificar el nombre y hacerla global. La misma que se lee al arrancar el Arduino MEGA y consultar el estado de la configuración desde la EEPROM, pues bien, todo mejoró, y ya ho hizo cosas raras.
Claro que es una máquina y podía tener otros vicios ocultos. Asi que tras 350 ciclos exitosos concluimos que esta mejor que antes y que el problema del HX711 parece estar solucionado.

En lo personal la declaración de variables locales no es de mi agrado y este ha sido un claro ejemplo de ello.
Menos aún que conforme el código avance se vayan declarando variables en la rutina o función. Bueno, la mezcla de estas cosas que yo tomé de un tutorial y que claramente no cuestioné era el responsable del problema hasta hoy.

Digo hasta hoy porque se requiere mas tiempo para asegurarse que algo funciona OK.

Gracias @gonpezzi por tu interes.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.