Progetto bilancia

Salve

Vorrei progettare con arduino una piccola bilancia dalla pesata di 50 g. massimo (a me servirebbero 30 g.)
in modo che raggiunto quel peso si attivasse un rele' e si azzerasse la pesata.

Non so da che parte cominciare.......(Conosco un po' arduino con il quale ho gia' fatto piccole cose )

Se qualcuno puo' aiutarmi lo ringrazio anticipatamente.

Ti devi munire di una cella di carico ed un modulo amplificatore.

Salve

Bene e questo e' gia' un buon inizio.

Sono andato ai riferimenti che hai postato e mi sono accorto che nella cella di carico escono 4 fili i cui colori (nero,bianco,rosso,verde) vengono ripresi dall'amplificatore che pero' ne riceve anche un altro di colore giallo.
La situazione non mi e' chiara.

Ho notato che la cella di carico ha 4 fori filettati e non so se servono per fissarla ad un sostegno o altro...
Per il codice te la senti di parlarne...

Ti ringrazio delle informazioni.
Saluti

Ciao

in questo documento di Sparkfun dice che il filo giallo solitamente non è collegato al ponte che fa da sensore all'interno della cella ma è un collegamento di terra aggiuntivo per ridurre le interferenze elettromagnetiche (EMI). Io almeno ho capito questo ma magari è meglio attendere le opinioni di qualcuno più esperto in queste cose.

Per quanto riguarda il codice, chiedi pure e ne parliamo.

ciao
Vittorio

Leggiti la Hookup Guide contenuta nel secondo link.

Il pin denominato YLW (yellow) sulla scheda è una ulteriore massa per ridurre le eventuali interferenze elettromagnetiche (EMI): per il momento puoi ignorarlo.

Sempre nella Hookup Guide ci sono delle foto esplicative relative al montaggio di una cella di carico di tipo a barra.

O.K.

Se siete daccordo potremo
procedere passo passo in modo da portare a termine il progetto.
Come dalle figure segnalate sul modulo "amplificatore" vengono messi i due "ponticelli" che accolgono i fili
da una parte quelli della cella mentre dall'altra, nella posizione VCC, ci sara' il positivo che andra' ad arduino
GND alla massa di arduino pero' il DAT e CLK non so cosa siano....
Ho guardato il posizionamento della cella e mi sembra di aver capito che un foro filettato serve per fermare la cella stessa ad un piano di riferimento (probabilmente con una vite anche se non vedo un contro dado)
l'altro rivolto in su tiene salda una piccola piattaforma anche qui con una vite.
Su questa dovrebbe essere messo un raccoglitore di cio' che si vuole determinare il peso tenendo conto anche del suo peso.Cio' che si deve pesare dovrebbe essere messo forse in corrispondenza del foro in modo di averlo sull'asse di pesata.

Saluti

Ho visto che esistono diversi tipi di celle di carico. Se quella di cui disponi (o che intendi acquistare) è quella linkata da cyberhs credo tu debba montarla in questo modo:

Quindi proprio come dici tu. Ho anche letto che in questa configurazione, non è importante in quale punto del piatto viene appoggiato l'oggetto da pesare.

I piedini DAT e CLK sono quelli che trasporteranno i dati in formato digitale dal modulo amplificatore all'arduino. Li potrai collegare a due piedini digitali qualsiasi come si evince dal seguente frammento di codice estratto (bada bene...) da un esempio riportato proprio nella Hookup Guide cui faceva riferimento cyberhs nel suo ultimo post

#include "HX711.h"

#define DOUT  3
#define CLK  2

HX711 scale(DOUT, CLK);

In pratica usi la libreria fornita da Sparkfun e quando istanzi l'oggetto gli passi i due piedini ai quali hai collegato i segnali DAT e CLK provenienti dal modulo amplificatore.

Ciao.
Vittorio.

Forse mi conviene acquistare una bilancina al supermercato ,smontarla e inviare i fili della cella al modulo
amplificatore.Certo se si potesse recuperare la finestrella dove compare scritta la pesata sarebbe il massimo
magari non so mettendo i fili della cella in parallelo e inviare questi all'amplificatore in modo da avere cosi'
uno e l'altro.
Il vantaggio piu' consistente e' che si avrebbe il piatto gia' in posizione.
Mi sembra di capire comunque che in primis bisogna caricare su arduino la libreria che permettera' di scrivere il codice.
Ti chiedo ,se riesci, di indicarmi o linkarmi il download della stessa perche' non riesco a trovarla.

Ti saluto e ringrazio.

QUI trovi tutta la documentazione della schedina Sparkfun segnalata da cyberhs.

Nei commenti degli esempi c'è scritto che la libreria utilizzata la trovi QUI.

Ciao.
Vittorio

Ciao

Ho caricato la libreria come cartella sul dekstop (HX711-master) ho cercato di inserirla nelle librerie di arduino e aprendola compare con questa scritta (#include <HX711.h>)senza caricare il codice.
Ho provato anche con HX711.h serial pur essendo presente nell'elenco librerie di arduino ma anche questo non da risultati.

Hai qualche suggerimento?

va bene così... quando aggiungi una libreria ad un tuo progetto, non viene aperto il codice sorgente della libreria stessa ma viene soltanto aggiunto all'inizio del file la relativa istruzione #include.

Usa pure la libreria nel tuo codice guardando gli esempi e compila. Andrà tutto bene.

Ciao.
Vittorio.

Con copia e incolla ho portato questo esempio e salvato in arduino.
Il codice e' questo:
Modificandolo si arriva a poter pesare 30 g.?
Francamente non lo capisco, se vuoi potresti aiutarmi a compilarlo in base alle mie esigenze?
Se non te la senti lascio perdere tutto.....

#include "HX711.h"

// HX711.DOUT - pin #A1
// HX711.PD_SCK - pin #A0

HX711 scale(A1, A0);//

void setup() {
Serial.begin(38400);
Serial.println("HX711 Demo");

Serial.println("Before setting up the scale:");
Serial.print("read: \t\t");
Serial.println(scale.read()); // print a raw reading from the ADC

Serial.print("read average: \t\t");
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC

Serial.print("get value: \t\t");
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet)

Serial.print("get units: \t\t");
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided
// by the SCALE parameter (not set yet)

scale.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare(); // reset the scale to 0

Serial.println("After setting up the scale:");

Serial.print("read: \t\t");
Serial.println(scale.read()); // print a raw reading from the ADC

Serial.print("read average: \t\t");
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC

Serial.print("get value: \t\t");
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare()

Serial.print("get units: \t\t");
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided
// by the SCALE parameter set with set_scale

Serial.println("Readings:");
}

void loop() {
Serial.print("one reading:\t");
Serial.print(scale.get_units(), 1);
Serial.print("\t| average:\t");
Serial.println(scale.get_units(10), 1);

scale.power_down(); // put the ADC in sleep mode
delay(5000);
scale.power_up();
}

Un saluto

La cella di carico di cui stiamo parlando arriva a pesare 100gr quindi non dovresti avere problemi a pesarne un massimo di 30.

Hai compilato e caricato il codice su arduino? Funziona?

Il codice che hai postato (ma che dovresti sempre postare usando la funzione </>) è tutto commentato. In pratica nel setup sta calibrando la bilancia impostando un fattore di compensazione (quel 2280 che trovi come parametro della set_scale);

Utilizzando dei pesi noti dovresti modificare questo valore fino ad ottenere delle pesate precise.

In sequenza il codice fa questo:

  • scale.read: restituisce un singolo valore di peso
  • scale.read_average: restituisce la media di un certo numero di pesate (si fa per minimizzare l'errore)
  • scale.get_value: restituisce la media di un certo numero di pesate meno la tara
  • scale.get_units: restituisce la stessa cosa ma tenendo conto del fattore di calibrazione impostato
  • scale.set_scale: imposta il fattore di calibrazione
  • scale.tare: azzera virtualmente la lettura; in pratica se appoggi sulla bilancia un contenitore e invochi questo metodo stai eliminando il peso del contenitore

Poi ripete le stesse operazioni. Dovrebbe cambiare solo il valore della get_units che stavolta terrà conto del fattore di calibrazione impostato.

A questo punto il programma entra nella loop dove effettua una pesata (e nota che usa appunto la get_units leggendo un solo valore o facendo la media di 5 letture) tenendo conto del fattore di calibrazione impostato.

Spero di averti chiarito un po' le idee, altrimenti spiega meglio cosa ti succede e fai delle domande precise.

Ciao.
Vittorio

Quello che ho in mente e' di fare un bilancino dove ci sara' una tara fissa (raccoglitore) nel quale verrebbe immessa della polvere alimentare fino al raggiungimento dei 30 g.A questo punto dovrebbe attivarsi un rele'
che spegnerebbe la riempitrice.Il piano della bilancia si ribalterebbe versando la polvere in un inbuto che a sua volta la indirizzerebbe in una bustina.
Per cio' che riguarda la sequenza delle operazioni non ci sono problemi con arduino (almeno spero).
Quello che non ho mai fatto e' proprio l'utilizzo della bilancia.
Mi ricordo che ho fatto un progettino dove veniva utilizzata come interruttore una fotoresistenza e
nel monitor seriale comparivano dei valori dei quali quelli che mi interessavano per attivare l'interruttore
erano ripresi dal codice
tipo: if ((sensorValue<300)and(sister==0))ecc....accadeva qualche cosa nei pin.

Ora e' un po' diverso per la bilancia e procederei se sei daccordo un passo alla volta.
Fino adesso ho compilato lo sketch con il codice che ho postato preso con copia e incolla dalla libreria.
Non ho ancora acquistato ne' la bilancia da cucina per smontarla e ricavare la cella ne' il modulo amplificatore.
Preferirei capire il codice prima e di questo ti ringrazio per la collaborazione.

Potremo cominciare con le prime righe.

#include "HX711.h" Questo e' il riferimento alla libreria da cui il modello del codice

// HX711.DOUT - pin #A1 DOUT e PD_SCK dovrebbero essere le due posizioni dell'amplificatore
intermedie a quella di massa e del + da cui partono i due fili che vanno
in questo caso ai pin analogici A1 e A0
// HX711.PD_SCK - pin #A0

HX711 scale(A1, A0);// Questo e' dichiarato prima del setup ed e' la prima riga del codice

void setup() {
Serial.begin(38400); Io conoscevo il valore 9800
Serial.println("HX711 Demo");

Scusami per quanto ho scritto che per te sono senza dubbio delle banalita' ma io le incontro per la prima volta.

Se va bene procedo.....
Ciao

Reprep:
... della polvere alimentare fino al raggiungimento dei 30 g.A questo punto dovrebbe attivarsi un rele' che spegnerebbe la riempitrice.Il piano della bilancia si ribalterebbe versando la polvere in un inbuto che a sua volta la indirizzerebbe in una bustina.
...

... non e' che la polvere e' bianca e fine ? ... :stuck_out_tongue:

(scusa, non ho resistito :smiley: :smiley: :D)

... non e' che la polvere e' bianca e fine ?

@Etemenanki: mi era venuto in mente di mettere la foto della bustina del borotalco... poi ho pensato che potesse essere vietato fare pubblicità :slight_smile: :slight_smile: :slight_smile:

Ma veniamo alle cose serie... Intanto, prima che passi un moderatore, ti invito ancora una volta ad utilizzare l'apposito tag per pubblicare il codice. Si tratta del primo pulsante in alto a sinistra quello con l'icona </>. In questo modo la pubblicazione risulta più leggibile e non c'è rischio che parte del codice venga interpretato come tag.

Serial.begin(38400); Io conoscevo il valore 9800

Immagino 9600... quella è la velocità di comunicazione della seriale. Il valore tipico è proprio il 9600 (bit al secondo) che ricordi tu. Ma puoi impostare anche valori più elevati tipo 19200, 38400, 57600, 115200.

Per quanto riguarda quello che vuoi fare ti propongo un esempio di pseudocodice da completare e verificare:

#include "HX711.h"

enum machineState
{
	START,
	WEIGHING,
	EMPTYING
};

// HX711.DOUT   - pin #A1
// HX711.PD_SCK   - pin #A0

HX711 scale(A1, A0);//  

byte stato;

void setup() 
{
   // inserisci un opportuno valore di calibrazione al posto di 2280
   // determinalo empiricamente facendo qualche prova con un peso noto
   // fino ad ottenere una misura precisa
   scale.set_scale(2280.f);

   stato = START;
}

void loop() 
{
   switch (stato)
   {
      case START:
         // accendi la riempitrice (probabilmente userai una digitalWrite per attivare il relè)
         stato = WEIGHING;
         break;
      case WEIGHING:
          // probabilmente il valore non sarà 30
          // non conosco la scala dello strumento
          // sostituisci tu il valore corrispondente a 30 gr.

         if (scale.get_units(10), 1) > 30)
         {
             // spegni la riempitrice (ancora con la digitalWrite)
             // ribalta il contenitore (dipende come farai la movimentazione...)
             stato = EMPTYING;
         }
         break;
       case EMPTYING:
          // qui forse dovrai aspettare un certo tempo
          // per consentire alla polvere di cadere nell'imbuto
          // non usare una delay ma piuttosto una millis (se vuoi magari vediamo insieme...)
          if (il tempo è scaduto...)
          {
               // riporta il contenitore in posizione (dipende sempre dalla movimentazione)
               stato = START;
          }
          break;
   }
}

Pensa un po' al concetto e poi ne riparliamo.

Ciao.
Vittorio.

Potresti guidarmi nella calibrazione dal punto di vista operativo?
Come ti scrivevo non ho ancora acquistato ne' la cella ne' il modulo,pensi sia meglio una bilancina gia' pronta da cui estrarre piatto e cella o costruirla ex novo?
Come gia' sai e' la prima volta che mi avvicino al progetto bilancia e gia' leggere "calibrazione" mi crea riflessione.

Grazie

Io personalmente acquisterei la cella e l'amplificatore consigliati da cyberhs e monterei da solo il piatto. Questo per due motivi. Il primo è che quando vai a smontare una bilancina commerciale può succedere che dentro trovi qualcosa che non riesci facilmente a riutilizzare per i motivi più disparati. Il secondo motivo è che potresti aver bisogno di montare le cose in maniera diversa. Anche dal punto di vista del costo la cosa non mi pare proibitiva. Cella e amplificatore costeranno una 20ina di euro; la bilancina forse un po' meno ma parliamo di una differenza non sostanziale.

Per quanto riguarda la calibrazione penso ti stai spaventando inutilmente: è molto semplice.

Costruisci innanzitutto la tua bilancia per essere pronto a pesare.

A questo punto carica su arduino lo sketch di esempio ossia quello con il scale.set_scale(2280).

Metti sul piatto della bilancia un peso noto, per esempio 100 gr. Qui sarebbe importante che il peso noto fosse il più preciso possibile, non 102 o 98 grammi ma veramente 100gr. Nel caso puoi anche utilizzare una bilancia di riferimento che usi per pesare l'oggetto che userai per le prove. Per semplicità supponiamo che pesi davvero 100gr esatti.

Leggi il valore pesato dalla bilancia e supponiamo che sia, per esempio, 97gr.

Modifica allora il valore passato alla set_scale: per esempio metti 2100. Ricompila e ricarica lo sketch su arduino.

Pesa nuovamente l'oggetto da 100gr. Se leggi 94 allora hai peggiorato le cose e devi modificare il parametro nell'altra direzione, devi cioè aumentarlo invece di diminuirlo. Se invece leggi 105 allora hai esagerato. Modifica quindi nuovamente il parametro e ricomincia.

Dopo un po' di prove arriverai a leggere 100gr e ti fermerai. Il valore passato adesso alla set_scale è quello corretto per il tuo hardware e potrai usarlo nello sketch definitivo.

Immagino che una volta effettuata questa operazione non sarà più necessario ripeterla perché non credo sia soggetta a cambiare nel tempo. Se invece dovessi notare che nel tempo la lettura tende a diventare imprecisa (rimetti il peso da 100gr e vedi una lettura scorretta) allora vuol dire che ci sono fattori variabili che influenzano la misura (non credo, sto solo facendo tutte le ipotesi...).

In questo caso dovrai prevedere una procedura di calibrazione per esempio attraverso un menu. Ma di questo parleremo in seguito, per ora non preoccupartene e procedi su questo primo step.

Ciao.
Vittorio

O.K.

Provvedo all'acquisto della cella e del modulo.
Appena arrivano collego il tutto e ti faccio sapere.....
Grazie ancora.

Un'altra cosa:
Se dovessi acquistare una cella con un carico piu' elevato es 1 chilo o 5 chili sarebbe difficoltoso procedere con i 30 g.? Il modulo amplificatore sarebbe lo stesso?

Puoi consigliarmi dove acquistare?

Un saluto