Bilancia di precisione 10g +-0,002 - lettura valori

Ciao ragazzi,

sto cercando di realizzare un progetto per la pesatura e separazione automatica di oggetti... ma non sto a dilungarmi molto su come funziona, cosa farà ecc ecc...

in breve:

ho una bilancia di precisione centesimale (cinese) che funziona davvero bene con una cella di carico da 10g e precisione -+ 0,002 gr da cui vorrei estrapolare le letture.

un volta smembrata la bilancia,fatti i collegamenti con i 4 fili ad un load cell amp (HX711), ho realizzato (cercando qua e la) uno sketch per leggere le pesate e fin qui tutto bene.

il mio primo scoglio è la sensibilità della cella di carico o meglio, la cella deve essere in grado di leggere valori centesimali e lo fa, ma gli ultimi due valori (es. 0,5XX g) ballano troppo, li legge ma continuano a variare.
questi due valori sono fondamentali per stabilire delle logiche.

1 - c'è un modo per far si che siano più stabili?
2 - c'è la possibilità di leggere i valori dal display o dalla scheda integrata prendendo da questa il segnale?
3- c'è la possibilità di leggere i valori con una microcamera puntata sul display?

metto lo sketch che ho usato,lo schema ed alcune foto....
(la libreria HX711.h ho dovuto rinominarla in HX711_MCC.h in quanto andava in conflitto con quelli installati di arduino, non chiedetemi come mai perchè non lo so ancora)

/*
 * 04 Aprile 2020 
 * 10 gr Load Cell HX711 Module Interface with Arduino to measure weight in gr
 * Arduino  
 * HX711 --- Pin 2 -> CLK --- Pin 3 -> DOUT --- 5V -> VCC --- GND -> GND
 * Lcd I2C --- Pin A4 -> SDA --- Pin A5 -> SCL --- 5V -> VCC --- GND -> GND
 * JOYSTICK --- Pin 4 -> SW --- 5V -> VCC --- GND -> GND
*/

#include "HX711_MCC.h"  
#define DOUT  3
#define CLK  2

HX711 scale(DOUT, CLK);
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>

LiquidCrystal_PCF8574 lcd(0x27);
float calibration_factor = -40217; // -38000 valore ottenuto con il programma 000_calcolo parametro
float zero_factor = 91300;
const int SW = 4; // pin del pulsante per azzerare la lettura
void setup() 
{
  Wire.begin();
  Wire.beginTransmission(0x27);
  pinMode(SW, INPUT_PULLUP);
  lcd.setBacklight(200); // retroilluminazine schermo
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("Salmi 10g. Cell");
  lcd.setCursor(0,1);
  lcd.print("Premi per tarare");
  scale.set_scale(-40280); // -40132.90 inserire 10 avviare lo sketch, leggere il valore e inserirlo 
  scale.tare();
  delay (2000);           
}
void loop() 
{
  lcd.setCursor(0,1);
  lcd.print("Peso  ");
  lcd.setCursor(6,1);
  lcd.print(scale.get_units(),3); // valori decimali dopo la virgola
  lcd.println(" gr.   ");
  int x = digitalRead(SW);
  if(x == LOW)
  {
      scale.tare();  
  }
}

Grazie a tutti per l'aiuto

qui allego library e altre foto

HX711_MCC.zip (12.1 KB)

Difficile dire se il fenomeno dipende dalla cella di carico o dai disturbi che i fili possono raccattare in giro. Una volta bilance così sensibili erano racchiuse in campane di vetro per impedire che anche un soffio d'aria alterasse le misure.

Puoi fare una prova. Anziché una sola misura, prova a fare la media di una decina di misure consecutive o intervallate di pochi millisecondi e giudica la stabilità del risultato ogni 300-350 ms (3 risultati al secondo).

Ciao,
P.

Secondo me non se ne parla neanche!
La variazione di peso dipende dalle correnti d'aria, dalla vibrazione del pavimento, del tavolo su cui è poggiata la cella, dai disturbi elettromagnetici, dalle dilatazioni termiche e anche dagli spifferi di vento.
Stiamo parlando di 0,002 grammi !!!!!
Intanto dovrebbe essere poggiata su una base in cemento. Però se sei vicino ad una strada risentirà del passaggio degli automezzi. Poi dovrai assolutamente trovarti a piano terra. e nessuno dovrà camminarti intorno, sia per non muovere aria, sia per non applicare pressioni al pavimento intorno...
E poi dovremmo essere sicuri che non ci sono disturbi elettromagnetici che vanno ad influire nei quattro fili della cella.
E naturalmente fare la media di qualche decina di misurazioni, come ti hanno consigliato.

@Steve-cr
non esageriamo per favore....
il bilancino è preciso semplicemente appoggiandolo su una superficie piana...
si è vero se ci soffio sopra sente la variazione, ma tutte queste pippe no per favore...
una volta azzerato e tarato rimane li bello fermo sullo 0

Se RI peso un'oggetto pesato qualche mese prima e conservato in apposite vaschette la bilancia mi restituisce lo stesso valore con una variazione di +- 0,001gr e gli oggetti che peso sono mediamente di 0,547gr.

@pgiagno
anche secondo me la colpa è dei disturbi infatti se spegno Arduino ma lascio tutti i componenti attaccati, il display della bilancia mi segna un valore (es. 10,000gr), ma nel momento che accendo Arduin questo valore sul display sballa ed arriva a 10,122gr

Posso provare con una lettura media fatta anche nei tre secondi, hai uno sketch?

Grazie

secondo me il bilancino lo vedi stabile come "lettura" del peso perchè fa tutta una serie di azioni sue interne...10-20-30-100 misure; eliminerà la misura più bassa e quella più alta...farà la mdie delle rimanenti etc...ed aggiornerà i display solo se le successive x letture danno come peso letto uno scostamento di un tot %...o cose del genere...che nel tuo programma mancano completamente...fai letture ripetute e le stampi ogni volta.
questo in parte te l'avevano già detto...

tu sai come funziona una cella di carico?
ci provo in parole semplici (dovute alla mia igniranza in materia elettronica)...alla fine è una resistenza che varia a seconda della sua torsione...quindi ha bisogno di una tensione (stabile e conosciuta) di "alimenatzione" per poi tornarti un segnale proporzionato a questa tensione di riferimento.

se non ho visto male hai saldato sui 4 fili originali che collegano la cella al display originale i 4 fili del modulo lettura celle...quindi un'altra tensione di riferimento...ed un "drenaggio" del segnale...secondo me non è cosa buona (ripeto sono ignorante e magari mi correggono)...ma o l'uno o l'altro.

poi...sempre secondo me quelle di Steve non sono pippe...però sei tu che decidi a che "grado di pignoleria" vuoi fermarti.

salmistraro:
@Steve-cr
non esageriamo per favore....
il bilancino è preciso semplicemente appoggiandolo su una superficie piana...
si è vero se ci soffio sopra sente la variazione, ma tutte queste pippe no per favore...
una volta azzerato e tarato rimane li bello fermo sullo 0

Se RI peso un'oggetto pesato qualche mese prima e conservato in apposite vaschette la bilancia mi restituisce lo stesso valore con una variazione di +- 0,001gr e gli oggetti che peso sono mediamente di 0,547gr.

@pgiagno
anche secondo me la colpa è dei disturbi infatti se spegno Arduino ma lascio tutti i componenti attaccati, il display della bilancia mi segna un valore (es. 10,000gr), ma nel momento che accendo Arduin questo valore sul display sballa ed arriva a 10,122gr

Posso provare con una lettura media fatta anche nei tre secondi, hai uno sketch?

Grazie

Per primo @Steve-cr non esagera.

Per secondo, Tu hai messo il HX711 in paralello alla elettronica della bilancia?

Ciao Uwe

allora deduco che il bilancino come dice ORSO2001 fa una serie di calcoli e mi restituisce un valore pulito e lineare e di conseguenza tutte le "variazioni" di peso che leggo sul dispaly di Arduino sono dovute sia alle "interferenze" che a tutti quei fattori che dice Steave... a cui chiedo scusa.

@Uwefed, ho collegato i fili per prendere il segnale dalla cella cosi come vedi in foto. la bilancia la posso anche lasciare spenta per leggere i valori.

Deduco anche che il progetto di leggere dei valori utilizzando il modulo HX711 collegato alla cella SALTA!

  • Eventualmente c'è il modo di far leggere ad Arduino quello che viene riportato sul display della bilancia?
    magari anche mediante telecamerina che legge i numeri che restituisce direttamente la bilancia.

Io non direi che il tuo progetto di leggere i valori SALTA, ma devi avere bene in mente i risultati che vuoi ottenere. Magari a te bastano, magari ti va anche di cu.. di fortuna e il progetto è perfetto, ma lo devi realizzare per bene e facendo una serie di prove lunghe e pallose, però ne varrà la pena.
In fin dei conti stai parlando di pesi moooolto piccoli, dove anche un po' di polvere può influire, però se riescono a fare hard disk da 2 o 3 Terabytes dove un granello di polvere ti porta via almeno 10 Mega, significa che tutto è possibile, no?

Devi lavorare di software, fare molte letture e ottenere una media (è facile, leggi 100 volte e continui a sommare ciò che leggi alla lettura precedente e alla fine dividi per 100) e più letture fai più il tuo peso sarà preciso. Vedere un peso "in tempo reale" non è per niente utile e non serve, oltre a non darti precisione.

salmistraro:
... la bilancia la posso anche lasciare spenta per leggere i valori.
...

Credo che non fosse quello che intendeva uwe ... se tu colleghi il tuo circuito alle celle con un'altro circuito gia connesso, i componenti del circuito originale interferiranno per forza con la lettura ... se poi accendi pure la bilancia, sballa tutto ancora di piu ...

La cella dovrebbe essere collegata "solo" al tuo circuito, o "solo" alla bilancia, mai ad entrambi ...

Se l'Arduino è alimentato da un PC molti disturbi vengono dall'alimentazione.
Prova con un portatile a batteria o, meglio, alimenta Arduino a batteria e usa un display.

Stacca la scheda della bilancia che creava notevoli disturbi, ora e decisamente più lineare ed i valori ottenuti hanno uno scostamento di +- 0,002 gr direi OTTIMO!!

Ora non mi resta che:
1- utilizzare una funzione (array) per far sommare 10 valori letti e restituirmi una media... e lasciarla in visione sul display per 2 secondi.

2- sarebbe bello riuscire ad inserire anche una funzione per azzerare in automatico la bilancia quando non c'è peso

in teoria ci sono, ma in pratica? dove inserisco cosa?

questo il mio codice

/*
 * 04 Aprile 2020 
 * 10 gr Load Cell HX711 Module Interface with Arduino to measure weight in gr
 * Arduino  
 * HX711 --- Pin 2 -> CLK --- Pin 3 -> DOUT --- 5V -> VCC --- GND -> GND
 * Lcd I2C --- Pin A4 -> SDA --- Pin A5 -> SCL --- 5V -> VCC --- GND -> GND
 * JOYSTICK --- Pin 4 -> SW --- 5V -> VCC --- GND -> GND
*/

#include "HX711_MCC.h"  
#define DOUT  3
#define CLK  2

HX711 scale(DOUT, CLK);
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>

LiquidCrystal_PCF8574 lcd(0x27);
float calibration_factor = -40260; // -38000 valore ottenuto con il programma 001_calibrazione
float zero_factor = 91300;
const int SW = 4; // pin del pulsante per azzerare la lettura
void setup() 
{
  Wire.begin();
  Wire.beginTransmission(0x27);
  pinMode(SW, INPUT_PULLUP);
  lcd.setBacklight(200); // retroilluminazine schermo
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("Salmi 10g. Cell");
  lcd.setCursor(0,1);
  lcd.print("Premi per tarare");
  scale.set_scale(-40285); // -40132.90 inserire 10 avviare lo sketch, leggere il valore e inserirlo 
  scale.tare();
  delay (2000);           
}
void loop() 
{
  lcd.setCursor(0,1);
  lcd.print("Peso  ");
  lcd.setCursor(6,1);
  lcd.print(scale.get_units(), 3); // valori decimali dopo la virgola
  lcd.println(" gr.   ");
  int x = digitalRead(SW);
  if(x == LOW)
  {
      scale.tare();  
  }
}

Grazie per l'aiuto che è stato preziosissimo

Io non uso array (a che scopo?). Io uso un normalissimo ciclo for dove sommo continuamente il valore letto a quello letto in precedenza e alla fine lo divido per le volte che lo ho sommato.

oppure ancora più semplice

  assorbimento=assorbimento+analogRead(A0);
  numeroletture ++
 if (numeroletture = 10) assorbimento = assorbimento / 10;