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.