Vai al contenuto
PLC Forum


Arduino E Cella Di Carico


Jago

Messaggi consigliati

Ciao a tutti, avrei bisogno del vostro prezioso aiuto.

Ho costruito una bilancia utilizzando una cella di carico da 100Kg f.s. , una interfaccia Hx711 ( e un Arduino Uno con LCD. Modificando la libreria, come suggerito, l'ho tarata e tutto funziona benone. Lo sketch da caricare è in effetti molto semplice

https://drive.google.com/file/d/0BxddEF_i_qGGa2tLVXJXQ3huNTQ/view?usp=sharing

A questo punto vorrei fare una modifica per ottenere in realtà quello per cui la bilancia è stata costruita. Vorrei aggiungere un tasto (collegato a una I/O o a un interrupt?) che alla pressione proceda con:

- Azzerare il valore (come fa all'inizio, una sorta di TARA)

- Mandi a livello alto una uscita (per attivare una elettrovalvola che farà lentamente svuotare il contenitore sul piatto)

- Pesi (con numeri negativi ovviamente) il decremento del peso sul piatto fino al raggiungimento di una cifra (es 3000 g.) da impostare come dato nello sketch stesso.

- Al raggiungimento del valore (-3000 g) disattivi la porta preposta chiudendo l'elettrovalvola.

- Dopo un delay di qualche secondo, torni possibilmente alla funzione Peso originale con il nuovo valore efficace.

Una sorta di dipenser che eroga lo stesso quantitativo in peso.

E' fattibile secondo voi senza troppe complicazioni? Suggerimenti? Vorrei capire per imparare…

Grazie 1000, Bye

Link al commento
Condividi su altri siti


Certo che è fattibile...

1) L'apertura e la chiusura dell'elettrovalvola (non alimentata direttamente da arduino) potrebbe essere pilotata da un pin digitale qualsiasi tramite l'istruzione digitalWrite(nr_Pin, HIGH) o digitalWrite(nr_Pin, LOW) -> http://arduino.cc/en/Reference/digitalWrite

2) Per il bottone (pulsante / switch che dir si voglia)...andiamo subito al problema: il debounce (l'anti-rimbalzo), toh leggi -> http://arduino.cc/en/Tutorial/Debounce

3) Se vuoi interrompere il flusso del programma per gestire quanto da te descritto, si dovrebbe utilizzare un interrupt (argomento complesso) -> http://playground.arduino.cc/Code/Interrupts

Io direi di evitare il per il momento il punto 3, magari si potrebbe utilizzare una variabile di stato per modificare il flusso del programma di arduino e gestire con essa la fase di peso e la fase di svuotamento. Questa variabile cambia alla pressione del tuo tasto-bottone-pulsante :smile:

Modificato: da dkmorb
Link al commento
Condividi su altri siti

La fattibilità è semplice.

Ora dipende da te e da quello che vuoi fare e, soprattutto, da come intendi procedere anche per il futuro.

I link che ti ha messo dkmorb portano ad usare arduino sempre come un giocattolo.

Se invece intendi affrontare lo sviluppo in modo più "professionale" dovresti rivedere un po' tutto.

Cominciare con l'idea che i pulsanti son periferiche che si acquiscono a tempi fissi, con bassa priorità, e l'antirimbalzo lo si effettua direttamente all'acquisizione.

Gli interrupts non sono strumenti diabolici e complessi, ma vanno usati solo quando netecessario.

I ritardi bloccanti, ovvero le funzioni delay, non andrebbero ami usate.

I programmi non si mettono assieme aggiungendo pezzi a pezzi, ma si progettano prima, si suddividono in funzioni, poi si scrivono lo funzioni e si assemblano secondo logica.

Link al commento
Condividi su altri siti

puoi usare la macchina a stati finiti , crei i tuoi passi magari in una struttura e con una union li azzeri tutti in un colpo ed eventualmente verifichi se almeno uno e' attivo dal valore dell'intero associato nella union .

Credo che si possa fare tutto , o quasi , l'importante e' conoscere la tecnologia e le tecniche

Poi qua sei in mani sicure , ci sono dei maghi dell'elettronica , intendo qua sopra ;)

Link al commento
Condividi su altri siti

I link che ti ha messo dkmorb portano ad usare arduino sempre come un giocattolo.

Beh, aveva chiesto di capire per imparare...e con un giocattolo come arduino si impara anche così..assemblando i "pezzi" di codice.

Magari lavorando per "successive approssimazioni", si ha anche qualche soddisfazione per quello che si sta realizzando...

Mi sembra, fra l'altro, si stia parlando di un esperimento e non di una imminente commercializzazione di un prodotto finito.

Cominciare con l'idea che i pulsanti son periferiche che si acquiscono a tempi fissi, con bassa priorità, e l'antirimbalzo lo si effettua direttamente all'acquisizione.

Ammetto le mie lacune...che cosa vuol dire?

Ciao,

dkmorb.

Link al commento
Condividi su altri siti

Beh, aveva chiesto di capire per imparare...e con un giocattolo come arduino si impara anche così..assemblando i "pezzi" di codice.

Il mio non voleva essere un appunto ma un chiarimento.

Anche un esperimento hobbistico può essere fatto bene o male.

Farlo bene, nel modo corretto, è sempre più utile che raffazzonare un qualche cosa che gira alla meno peggio, quasi senza sapere bene come, e che rischia di andare a catafascio alla prima necessità di modifica.

Ammetto le mie lacune...che cosa vuol dire?

Senza entrare nelle masturbazioni mentali come propone Walter :smile: (Walter ti fa male studire troppo e tutto assieme :P ) Quando si comincia a fare qualche cosa di più di unpulsante che accende e spegne una lampadina, è meglio cominciare a far le cose per bene.

Credo che ci sia anche uno sketch negli esempi di ardyuino per fare schedulazioni.

Normalmente si usa fare un clock di sistema con il quale schedulare alcuni jobs, anche in modo semplice semplice.

Ad esempio usi un interrupt di TM1 a 10ms (vedi la discussione di Roberto), ad ogni interrupt leggi gli ingressi, li confronti con lo stato precedente e setti un flag qaundo sono coincidenti. In questo modo hai già il tuo filtro antirimbalzo. Nel main loop o nelle funzoni in cui usi gli ingressi verifichi se il flag è alto, se è alto puoi usare lo statomemorizzato dell'ingresso per la tua elaborazione.

Idem, in questo caso, per la lettura del peso puoi leggere ogni 20 ms, o 100 ms, o altro tempo che si ritenga congruo con il processo da controllare.

Quello che ho esposto sopra, in modo sintetico e semplificato, non è altro che il nucleo di una schedulazione di processi.

Vedi il software si può approcciare in molti modi, ma solo uno di questi è corretto.

Il modo corretto prevede lo studio preliminare di cosa dovrà fare il programma. Questa fase si dice analisi del problema. Da questa fase discende l'analisi delle singole funzioni. Una volta che son state analizzate le singole funzioni si procede a specificarle. Solo dopo averle specificate si può iniziare a codificarle.

Più aumenta l'esperienza meno è necesario scrivere funzioni. Per lo più basta scrivere del software per connettere le varie funzioni.

Oltre a risparmiare tempo di codifica e debugging, si aumenta l'affidabilità del software perchè più una funzione è stata impiegata con successo in applicazioni differenti, minori sono le possiiblità che contenga errori.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Livio , fa più male non studiare e non sapere niente e chiedere e soprattutto aspettare che qualcuno ti aiuti sul plcfrum ;)

:D

Le macchine a stati finiti le implemento da circa 15 anni , diciamo quando ero ancora un elettricista

Se si vogliono creare situazioni a catena con scelte ect e' l'unica cosa da fare ,

Setta e resetta , resetta e setta oppure con una variabile int che mantiene lo stato , e' sempre una FSM , s enon sai chiedi pure che dico cosa vuol dire l'acronimo :D

Modificato: da walterword
Link al commento
Condividi su altri siti

Walter stiamo parlando di un giochino con 2-3 I/O non di 200 I/O

Setta e resetta , resetta e setta oppure con una variabile int che mantiene lo stato , e' sempre una FSM , s enon sai chiedi pure che dico cosa vuol dire l'acronimo

Walter non ti hanno mai detto che non si deve cercare di insegnare a gatti come arrampicare? Se va bene ti ridono in faccia, se va male ti graffiano. :lol:

Link al commento
Condividi su altri siti

Se va bene ti ridono in faccia, se va male ti graffiano.

Sarai arrabbiato con me , ma questa Te la ''porto via '' , darò ai miei amici , amanti di battute , il nome del autore , se lo pretendi !

E davvero FORTE ! :thumb_yello:

Link al commento
Condividi su altri siti

darò ai miei amici , amanti di battute , il nome del autore , se lo pretendi

No, quello che scrivo sul forum è di uso pubblico. :lol:

Però per dire tutta la verità, la battuta risale a mio padre che la faceva risalire a suo padre; certamente fa parte del repertorio tipico livornese, ed è anche una delle più.....soffici. Solitamente il livornesa taglia, graffia e poi, per sicurezza, ci sparge anche il sale. :lol:

Link al commento
Condividi su altri siti

Ragazzi siete forti…! :lol:

Grazie per i link e l'incoraggiamento.

Proverò, con l'aiuto di un bel libro a scrivere qualcosa con il sistema: "Se una cosa va quanto basta… non toccarla se no guasta!"

Vi aggiornerò o vi disturberò ancora.

Per ora un sincero augurio di Buon Anno e Felice anno nuovo!!!

Link al commento
Condividi su altri siti

Livio non pensavo tu fossi di origine livornese.

Tra tutti i toscani , i livornesi , sono i miei preferiti ;)

Meglio livornese che rettiliano yankee appartenente al gruppo Bilderberg

Modificato: da walterword
Link al commento
Condividi su altri siti

JAgo , la teoria del " Tuca nient seno' va pu nient " e' la pratica dei falliti .Ho conosciuto molti programmatori ed informatici che parlano sempre in terza persona " Lui adesso non mi vede questo ..."...."ecco vedi adesso lui mi alza l'uscita...." , rivolto al plc , come se il pcl o un pc fossero entità a se stanti che prendono decisioni e si programma da solo come una macchina infernale...assurdo no.

Devi toccare e modificare , e' la vita.Ma lo devi fare solo se in possesso di informazioni e sapere altrimenti si che fai disastri

Un cliente un giorno chiese ad un programmatore collega "Mi scusi potrebbe farmi accendere una lampadina quando c'e 'questo allarme" e il programmatore rispose" Ma non so , meglio di no , lui adesso accende le lampadine cosi ...." ....questo programmatore l'ho cacciato via a calci nel cu*o , chiaro e tondo ho fatto solo una domanda "o rimane lui o vado via io , voglio risposta semplice ed immediata , io non ho tempo da perdere con i dementi" ......e' andato via lui accompagnato dai miei calci , in kulo ovviamente.... ;)

Modificato: da walterword
Link al commento
Condividi su altri siti

Livio non pensavo tu fossi di origine livornese.

Sono nato a Vedano Olona (VA) da madre indigena e padre livornese. Degli 8 bisnonni 4 son o livornesi, 3 varesini ed una cadorina., però la nonna materna è nacque a New york City. :lol:

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Ciao a tutti, dopo prove su prove, Wikipedia, testi scolastici ecc... sono riuscito a fare qualcosa che FUNZIONA!

L'apparecchio avrà questo comportamento e questa procedura di utilizzo:

1) All'accenzione, la cella si resetta portandosi a 0,00 kg (ho provveduto a trasformare i grammi in chili con due sole cifre dopo la virgola per eliminare le fastidiose oscillazioni dei grammi - poco rilevanti su pesate intorno ai 50 kg!)

2) Metto la bombola sulla bilancia e ne peso il totale per una informazione di massima

3) Resetto l'Arduino e al nuovo avvio elimina la tara, riportandosi su 0,00 kg.

4) Tengo premuto il tasto che ho aggiunto al circuito, portando a livello alto il PIN9 che azionerà per mezzo di un fotoaccoppiatore l'elettrovalvola. Contemporaneamente sul display apparirà sulla seconda riga (sotto alla pesata) la parola CARICAMENTO

5) Il peso complessivo a questo punto diminuirà lentamente misurando coi numeri negativi il puro quantitativo sottratto alla pesata.

6) Al raggiungimento del peso desiderato basta ripremere il tasto e l'elettrovalvola si chiuderà eliminando la parola CARICAMENTO dal display.

Sicuramente non sarà una scrittura da manuale, e sicuramente è perfettibile, ma funziona... una sorta di frankeinstein di due sketch con qualche IF di mia invenzione. Potrebbe sembrare una bestemmia informatica, ma non so fare di meglio.

Devo accantonare l'idea di impostare -3,00 kg come dato da confrontare per portare a livello basso il PIN9 perchè occorre una padronanza della sintassi che mi manca.

Per ora sono molto contento e procederò con l'hardware perchè le basette sperimantali mi indispongono e i contatti a volte lasciano a desiderare.

Bye e grazie per i consigli.

// Hx711.DOUT - pin #A1
// Hx711.SCK - pin #A0
// LCD.RS - pin 7
// LCD.En - pin 6
// LCD.D4 - pin 5
// LCD.D5 - pin 4
// LCD.D6 - pin 3
#include <LiquidCrystal.h>
#include <Hx711.h>
const int buttonPin = 8; // the number of the pushbutton pin
const int ledPin = 9; // the number of the LED pin
const int ledPin1 = 10; // the number of the LED pin
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
Hx711 scale(A1, A0);
// Variables will change:
int ledState = LOW; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = HIGH; // the previous reading from the input pin
// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 10; // the debounce time; increase if the output flickers
void setup() {
lcd.begin(16, 2);
scale.setScale(43.5);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
// set initial LED state
digitalWrite(ledPin, ledState);
digitalWrite(ledPin1, ledState);
}
void loop() {
// read the state of the switch into a local variable:
int reading = digitalRead(buttonPin);
// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;
// only toggle the LED if the new button state is HIGH
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
// set the LED:
digitalWrite(ledPin, ledState);
digitalWrite(ledPin1, ledState);
// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonState = reading;
if (ledState == HIGH) {
lcd.setCursor(0, 1);
lcd.print("CARICAMENTO");
}
if (ledState == LOW) {
lcd.setCursor(0, 1);
lcd.print(" ");
}
lcd.setCursor(0, 0);
lcd.print(scale.getGram() / 1000, 2);
lcd.print(" kg");
lcd.print(" ");
delay(10);

}

Link al commento
Condividi su altri siti

FINITO!

Software modificato. Sono riuscito a mandare a livello alto un PIN al valore –3,00 Kg, quindi una volta prelevato il quantitativo di 3 chili parte un buzzer e il display mostra la scritta PIENO.

L'uscita è a transistor e dovrebbe pilotare agilmente solenoidi e o relè allo stato solido in caso volessimo usare la 220 AC.

L'Arduino l'ho integrato sulla scheda.

E' veramente divertente imparare a scrivere gli sketch...

Bye Bye e grazie dei preziosi consigli.

https://drive.google.com/file/d/0BxddEF_i_qGGcVA5MExJVVN0ems/view?usp=sharing

https://drive.google.com/file/d/0BxddEF_i_qGGUjJJeXE3di1JbzQ/view?usp=sharing

Link al commento
Condividi su altri siti

:thumb_yello::clap:

Una curiosità.

per quale ragione hai posizionato il microcontrollore in obliquo sul circuito stampato? E' un vezzo artistico? Ti è uscito così? C'è una ragione particolare?

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Lo so, non è molto elegante, ma in effetti, a cercare in rete, è uno dei pochi modi per riprodurre le esatte dimensioni di un Arduino originale con tutte le uscite funzionanti… nella stessa posizione per eventuali shield.

Il merito non è mio ma di questo signore:

http://vonkonow.com/wordpress/2012/10/nanino-the-diy-friendly-arduino/

Io non ho fatto altro che aggiungere a questo arduino, sulla medesima PCB, la parte di alimentazione (7805 e ciarpame vario), la parte del tasto di destra con la circuiteria per il TIP29C e l'LCD con potenziometro contrasto e resistenza per la retroilluminazione. Il mio solito Frankeinstein, ma è compatto, senza troppi fili e questo mi piace.

Trovo che l'arduino UNO originale vada bene solo per esperimenti e prove su sketch, ma in pratica è scomodissimo messo a dimora dentro ad una scatola, i contatti sono instabili e la parrucca di fili mi indispone...

Sarò strano, ma con 3 euro di Atmega su cui carichi il bootloader, si lavora molto meglio e non hai paura di falsi contatti o di pin che si sfilano ecc.

Non trovi?

Bye

Link al commento
Condividi su altri siti

Trovo che l'arduino UNO originale vada bene solo per esperimenti e prove su sketch, ma in pratica è scomodissimo messo a dimora dentro ad una scatola, i contatti sono instabili e la parrucca di fili mi indispone...

Si hai ragione. Infatti è stato progettato come scheda per lo sviluppo del Sw.

Se ti può interessare esistono delle minishields che adattano i connettori ad innesto in morsettiere.

Tu che tool usi per caricare poi i programmi sul micro che inserisci nella tua scheda?

Link al commento
Condividi su altri siti

Sì Livio, li ho visti su internet e penso che prima o poi me ne costruisco uno, ho lo .sch e il .brd di Eagle e quindi fare uno shield con i morsetti potrebbe venirmi utile. Grazie per il suggerimento.

Per caricare il SW sui micro uso per prima cosa un piccolo shield che ho costruito con il quarzo, i condensatori da 22p e la resistenza del reset per caricare il bootloader sui chip vergini. Installo lo sketch "optiloader" sul mio ArduinoUNO originale e con quello carico il bootloader sul micro.

Poi metto a dimora l'Atmega sul circuito e uso la connessione FDTI (4 pin sotto il tasto del reset in questo caso) e con un cavo USB -> Seriale (TX - RX - 5V - GND) carico gli sketch tramite l'IDE di Arduino. L'unica seccatura è quella di premere il Reset manuale per 3 secondi durante primissima fase di caricamento del file.

Funziona senza diventare matto e poi quando il software va sul chip è già stato collaudato più e più volte su un Arduino originale con USB nativo (sicuramente più pratico).

C'è di buono che con questo sistema il chip non lo estraggo più (col rischio di danneggiarlo nei piedini) e la connessione FDTI mi consente facili aggiornamenti futuri.

Nei casi in cui ho solo l'HEX ma non gli sketch originali, uso "Arduino Builder" che è in grado di caricarli su Arduino (cosa che il suo IDE originale non è in grado di fare!)

Bye

Modificato: da Jago
Link al commento
Condividi su altri siti

  • 3 weeks later...

ciao jago ho comperato anche io un' interfaccia hx711 per celle di carico solo che io sto riscontrando problemi nello sketch con la libreria infatti il programma di arduino me la riconosce compare nelle lista delle librerie ,ma non la include, ho letto che bisogna modificare il programma .h della libreria ,ho guardato e ,se ho capito bene cosa dovevo fare , nella mia versione della libreria era gia a posto, quindi non so cosa fare , mi puoi dare qualche suggerimento?

grazie

un altra cosa come risulta la stabilità del segnale di questo amplificatore? perche io prima avevo fatto esperimenti con un 'ina 125 e una cella da 20 kg ma sono rimasto abbastanza insoddisfatto dell' instabilità del segnale.

ciao

Link al commento
Condividi su altri siti

Accodarsi a discussioni si rischia di far confusione con le risposte, per questo motivo il regolamento lo vieta.

Apri una tua discussione sull'argomento di tuo interesse.

Link al commento
Condividi su altri siti

Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...