Go Down

Topic: Progetto Arduino sensore RPM (contagiri) (Read 34785 times) previous topic - next topic

kalo86

Nov 04, 2013, 11:35 am Last Edit: Nov 04, 2013, 12:32 pm by kalo86 Reason: 1
Salve a tutti,
sono un laureando in Ingegneria Meccanica ed in quanto tale premetto che non ho mai avuto un approccio di tipo elettronico/elettrico abbastanza dettagliato.
Il progetto che vorrei realizzare è quello di creare un contagiri per determinare la velocità angolare di una puleggia all'interno di un carter. La posizione ostica e gli ingombri strettissimi tra puleggia e carter adiacente non sono di tanto aiuto, ragion per cui la scelta sul sensore di giri è caduta sul sensore ad effetto Hall. Inoltre la puleggia non è attraversata da un cavo di alta tensione, quindi un comune contagiri a scintilla con coccodrillo non è utilizzabile.
La massima velocità angolare con cui ruoterà la puleggia sarà pari a 16000 giri/min (circa).
Il problema generale è schematizzato in due macrogruppi:

1) Interfacciare il sensore ad effetto Hall con Arduino;
2) Creare un file .TXT direttamente su una scheda di memoria SD o microSD dove all'interno ci sia una colonna con i giri/min rilevati.

Prima di procedere nel dettaglio preferirei agire per gradi.
Premetto che non voglio la "pappa pronta", quel che sto per chiedere è principalmente un consiglio su che tipo di scheda Arduino acquistare (ad esempio non so se acquistare Arduino UNO e collegare una shield per la microSD oppure acquistare direttamente una scheda Arduino che sia già provvista di lettore microSD).
Ho la necessità di misurare la velocità angolare della puleggia per circa 15 minuti al massimo ed il motore su cui sto lavorando è già provvisto di una batteria 12V - 4A. Credo che la presenza di una batteria esterna sia già di grande aiuto per alimentare una scheda Arduino in piena mobilità.
Essendo un motore montato su un mezzo 2 ruote, non ho la necessità di vedere i giri/minuto a cui sta ruotando la puleggia di cui sto parlando ma mi piacerebbe avere un file di testo .TXT in una SD che a fine prova/test rimuovo dall'Arduino ed inserisco nel mio PC. Dunque per il momento (almeno nella prima fase) escludo l'utilizzo di un display per visionare l'output del sensore Hall.
Questo nuovo mondo mi piace parecchio e non vedo l'ora di iniziare ad addentrarmi in questa nuova branca dell'elettronica.
Tutti i commenti, pareri e consigli sono ben accetti.
Ringrazio in anticipo tutti coloro i quali parteciperanno a questa discussione.
Saluti,

kalo86


gpb01

Ciao e benvenuto ... come prima cosa ti suggerisco di fare la tua presentazione nell'apposita sezione (QUI) e di dare una letta al regolamento QUI ... così ti eviti l'intervento di qualche mod ;)

Poi ...
... se con google fai una ricerca per "sensore hall arduino", trovi un'infinità di link al riguardo ... e sicuramente trovi degli ottimi spunti ...

Comunque, dicci anche a che velocità massima girerà la tua puleggia ... così ci regoliamo sui tempi e sulla board da consigliarti :)

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP

Ci sono progetti simili sparsi sul forum.
Il più interessante è sicuramente quello di Lucaleo (http://forum.arduino.cc//index.php?topic=157511.0) che ha realizzato una centralina per il controllo dell'accensione di un motore. Sono "appena" 24 pagine.
La parte che ti può interessare è quella della lettura dei giri.

kalo86

#3
Nov 04, 2013, 11:55 am Last Edit: Nov 04, 2013, 11:57 am by kalo86 Reason: 1
Scusatemi per il ritardo ma mi sono precipitato a scrivere dapprima il primo post in questa discussione bypassando la mia presentazione. Comunque ho rimediato presentandomi nell'opportuna sezione.
Grazie per i consigli, vado a dare subito una bella lettura ai link che avete postato.

Per quanto riguarda la massima velocità angolare della puleggia, come limite massimo girerà sui 16.000 giri/min

Saluti!

PaoloP

A 16'000 giri al minuto hai 267 giri in un secondo ovvero un impulso ogni 3,75 millisecondi (3750 microsecondi), si può fare.  ;)

kalo86

Grazie Paolo, che tipo di scheda Arduino mi consigli?
Sarebbe a dir poco stupendo rilevare la velocità angolare dell'albero motore (attualmente rilevata con un contagiri digitale con coccodrillo) e la velocità angolare della puleggia condotta in modo tale da poi analizzare il rendimento della trasmissione a cinghia trapezoidale. Diciamo che il vero obiettivo è proprio questo ma non conosco i limiti di Arduino e quindi in una prima fase mi accontento di determinare la velocità angolare della sola puleggia.
Grazie ancora!

gpb01

Anche se probabilmente ti andrebbe bene un Arduino UNO, io spenderei pochi euro in più e prenderei un Arduino Mega 2560, non fosse altro per il numero maggiore di interrupt gestibili ... (... del resto si sa che ... "l'appetito vien mangiando" ;)) ...

Avendo più interrupt, puoi sicuramente gestire i due contatori che ti serviranno (puleggia, albero motore) in due ISR senza grossi problemi.

Ovviamente il collo di bottiglia è la card SD ...
... ricorda che NON sei su un sistema multithread/multitask e che quindi se Arduino fa una cosa, non ne può fare un'altra e che le scritture su SD sono, dato il tipo di supporto, estremamente lente.

Con che frequenza vorresti scrivere le informazioni sulla SD ???

Guglielmo
Search is Your friend ... or I am Your enemy !

kalo86

Grazie mille Guglielmo, valuterò subito il tuo consiglio.
Mi andrebbe bene una lettura degli RPM ogni 500ms, scendere oltre la soglia del mezzo secondo non so a cosa serva per quello che devo valutare sul mio motore da esperimento.
Poiché si tratta di una trasmissione CVT (Continuously Variable Transmission) con cinghia trapezoidale, nota la velocità angolare con cui ruota l'albero motore, non è possibile stabilire con precisione la velocità angolare con cui ruota l'albero condotto anche se si ha a disposizione il valore del rapporto di trasmissione istantaneo. In poche parole è una trasmissione che istantaneamente varia il rapporto di trasmissione, dunque la fantomatica puleggia avrà una velocità angolare non costante nel tempo.
Sarebbe interessante valutare la fase di transitorio, cioè gli istanti di tempo in cui la trasmissione varia il rapporto di trasmissione man mano che l'albero motore aumenta la sua velocità angolare.
Adesso dò un'occhiata ad Arduino Mega.
Saluti

PaoloP

#8
Nov 04, 2013, 02:21 pm Last Edit: Nov 04, 2013, 02:23 pm by PaoloP Reason: 1

Mi andrebbe bene una lettura degli RPM ogni 500ms, scendere oltre la soglia del mezzo secondo non so a cosa serva per quello che devo valutare sul mio motore da esperimento.


Non funziona così.
Il sensore hall non restituisce una uscita proporzionale al numero dei giri, ma ti dice solo quando hai effettuato un giro.
Il micro dovrà contare quindi tutti i giri effettuati e per fare questo deve eseguire la lettura "ogni  sempre".  :smiley-mr-green:
Ovvero deve essere collegato ad un interrupt esterno che è una "periferica" del micro sempre pronta a ricevere segnali.
Infatti, alla velocità massima avrai impulsi ogni 3,75ms.
Ogni volta che si attiva l'interrupt, ovvero che la ruota compie un giro, incrementi un contatore (ho fratto un giro).
Dopo 1 secondo o mezzo secondo, se vuoi avere maggiori dati, leggi il contatore lo moltiplichi per 60 o 120 e ottieni i giri al minuto, poi azzeri il contatore e aspetti un nuovo secondo o mezzo secondo e così via.
Il sensore deve essere in costante lettura, è il dato dei giri che lo puoi calcolare quando vuoi.

La UNO dispone di solo 2 interrupt esterni quindi potresti collegarci solo 2 sensori Hall.

kalo86

Grazie per la spiegazione ma la mia precedente risposta è stata poco felice: con lettura ogni 500ms intendevo dire la frequenza con cui dico ad Arduino di scrivere sulla SD card in modo tale da avere un output del genere in un file DATALOGGER.TXT come segue:

TIME [seconds]           SPEED [RPM]
0                                      1200
0.5                                   1250
1                                        1345
1,5                                    1382
2                                       1400

Se l'intervallo di tempo tra una scrittura e l'altra si può ridurre, che ben venga! Sarebbe ancora più  preciso ed affidabile ma io non ho le competenze in questo momento per stabilire la frequenza di campionatura degli RPM.
Diciamo che a me andrebbe benissimo la scheda Arduino più economica che sia in grado di tirare fuori gli RPM di un albero motore e della puleggia condotta. Se la presenza di due sensori attenua la precisione sono anche disposto a prendere la scheda superiore ad Arduino UNO.
Nel frattempo continuo a documentarmi  :)

astrobeed


Non funziona così.
Il sensore hall non restituisce una uscita proporzionale al numero dei giri, ma ti dice solo quando hai effettuato un giro.
Il micro dovrà contare quindi tutti i giri effettuati e per fare questo deve eseguire la lettura "ogni  sempre".  :smiley-mr-green:
Ovvero deve essere collegato ad un interrupt esterno che è una "periferica" del micro sempre pronta a ricevere segnali.
Infatti, alla velocità massima avrai impulsi ogni 3,75ms.


Quello che dici che è corretto, però non sei obbligato a leggere sempre il sensore, puoi benissimo attivare il relativo interrupt ogni tot ms, fare la lettura e poi disattivare l'interrupt.
La frequenza è ottenibile anche facendo il reciproco del periodo, ovvero l'intervallo tra due impulsi del sensore, tenuto conto che al massimo sono 266 Hz la risoluzione di 62.5 ns offerta dai timer di Arduino basta per ottenere letture attendibili anche al massimo dei giri, in più hai il vantaggio di poter fare più acquisizioni ogni secondo.
Scientia potentia est

gpb01


... con lettura ogni 500ms intendevo dire la frequenza con cui dico ad Arduino di scrivere sulla SD card in modo tale da avere ...
....
....
Se la presenza di due sensori attenua la precisione sono anche disposto a prendere la scheda superiore ad Arduino UNO.


La presenza di due sensori non "attenua" nulla ... è che la UNO ha SOLO due interrupt esterni (contro i 6 della Mega) e quindi, se un domani vuoi aggiungere una qualsiasi cosa che usa un altro interrupt non puoi.

Non solo, ma da quanto capisco, per velocizzare le cose, dovrai bufferizzare un certo numero di letture e poi scrivere sulla SD ...
... considera che la UNO a solo 2 KBytes di SRAM, contro gli 8 KBytes di SRAM della Mega ;)

Insomma ... per 19 € di differenza ... non so se vale la pena cominciare subito su una cosa che, in un prossimo futuro, ti potrebbe diventare stretta ...  :smiley-roll:

Guglielmo
Search is Your friend ... or I am Your enemy !

kalo86

Ottimo! Allora per il momento trascuro Arduino Mega e butto l'attenzione su Arduino Uno rev3.
Sono intenzionato ad acquistare il Kit Workshop Base con Arduino Uno. E' sprecato oppure potrebbe servirmi?
Data l'elevata frequenza di campionatura che propone Arduino, diciamo che il limite vero e proprio lo impone la velocità di scrittura della SD Card (o della microSD), giusto?

kalo86



... con lettura ogni 500ms intendevo dire la frequenza con cui dico ad Arduino di scrivere sulla SD card in modo tale da avere ...
....
....
Se la presenza di due sensori attenua la precisione sono anche disposto a prendere la scheda superiore ad Arduino UNO.


La presenza di due sensori non "attenua" nulla ... è che la UNO ha SOLO due interrupt esterni (contro i 6 della Mega) e quindi, se un domani vuoi aggiungere una qualsiasi cosa che usa un altro interrupt non puoi.

Non solo, ma da quanto capisco, per velocizzare le cose, dovrai bufferizzare un certo numero di letture e poi scrivere sulla SD ...
... considera che la UNO a solo 2 KBytes di SRAM, contro gli 8 KBytes di SRAM della Mega ;)

Insomma ... per 19 € di differenza ... non so se vale la pena cominciare subito su una cosa che, in un prossimo futuro, ti potrebbe diventare stretta ...  :smiley-roll:

Guglielmo


Guglielmo mi hai convinto! Effettivamente più cerco informazioni e più mi accorgo che Arduino è una fonte senza fine perché si possono aggiungere moltissimi progetti con nuovi sensori... Hai pienamente ragione, si parte da Arduino Mega.
E per quanto riguarda una shield per la microSD o SD card? Consigli?

astrobeed


La presenza di due sensori non "attenua" nulla ... è che la UNO ha SOLO due interrupt esterni (contro i 6 della Mega)


In realtà la UNO, o meglio l'ATmega 328, ha l'interrupt on change su tutti i pin, i relativi vettori sono PCINT0, PCINT1, PCINT2, ognuno abbinato fino ad 8 PCINT corrispondenti ai relativi pin (vedere data sheet).
Scientia potentia est

Go Up