Posizione assoluta asse rotante

Buongiorno a tutti!

Chiedo un consiglio...

Dovrei determinare la posizione assoluta (0-360°) di un asse rotante (precisione entro i 5° va benissimo). Leggendo materiale vario in giro per la rete ho trovato che questo può essere fatto sia utilizzando potenziometri circolari (...esistono senza fine corsa?) oppure con encoder rotativi con le più disparate tecnologie (ottici, magnetici, ecc...).

Dovendo ancora fare l'acquisto, qualcuno mi sa consigliare un articolo specifico che magari ha già utilizzato (anche guardando sui vari siti di elettronica orientarsi non è facile)? L'importante è che, qualunque sia la tecnologia utilizzata, non ci sia nessun tipo di fine corsa, devono quindi essere permesse infinite rotazioni. Ultima cosa: visto che Arduino sarà almeno a 0,5-1,0 m di distanza dal sensore, penso che non si possano utilizzare sensori che utilizzano I2C, giusto?

Grazie mille in anticipo.
Buona domenica, Giuliano.

Un encoder rotativo con canale Z di indice

Porta pazienza...intendi qualcosa tipo questo?

Link_Esempio

Grazie mille.
Ciao, Giuliano.

O come dice icio (con il segnale di marker Z sai dove e', e conti gli impulsi da li), oppure in alternativa, un'ecoder assoluto (che ti da la posizione direttamente, ma richiede piu pin, dipende dalla risoluzione)

Un'encoder con il canale Z e' semplicemente un'encoder incrementale con anche una terza uscita, che da un solo impulso per giro in una posizione che si considera lo "zero", per cui sai, contando dall'impulso "Z", di quanto avanza o arretra ... un'assoluto e' invece un'encoder con un'uscita a piu fili, uno per bit, che ti da la posizione in binario, in base alla risoluzione ... ad esempio, uno da 1024 impulsi ti dara' un "numero" in binario che va da 0 a 1023, in base alla posizione fisica dell'albero ...

Ok ho capito.

Quindi tipo QUESTO

Mi sa che dovrò trovare un'altra soluzione...costano uno sproposito!

Grazie.

Dalla Cina costano di meno, ma i tempi di spedizione sono maggiori ...

EDIT: pero' anche il sistema proposto da icio e' buono, devi semplicemente contare dall'impulso di zero, e di solito gli incrementali costano meno degli assoluti ... l'unico vantaggio degli assoluti e' che anche all'accensione hai la posizione immediata ... intendo dire che con l'incrementale piu uscita Z, devi aspettare almeno di leggere un'impulso sulla Z prima di poter iniziare a contare, mentre con un'assoluto, all'accensione hai immediatamente la posizione dell'asse ... dipende tutto dalla tua applicazione, scegliere l'uno o l'altro dei sistemi ...

Si, il link che ho postato sopra dovrebbe essere un incrementale con segnale Z.
Ho guardato anche su siti cinesi, ma i prezzi seppur più bassi sono sempre nell'ordine dei 30 euro.

E se usassi un sensore Hall tipo MLX90316?

Qualcuno l'ha mai provato?

Ciao.

Azz… mi sa che anche la soluzione con il sensore Hall è da scartare.

Se non ho capito male ti vendono solo il chip non assemblato. Non riuscirò mai a saldare un componente di dimensioni 5x5 mm !!

Cerchiamo dell’altro.

... AS5600 ? ... :wink:

Wow! :slight_smile:

Bello questo! Adesso me lo studio per bene !!! :smiley:

Grazie grazie.

Ciao.

Riavvio questa vecchia discussione sperando che sia ancora attiva.

Anche io sto cercando un sensore di rotazione incrementale con una certa precisione (almeno 1000 CPR) e sto esaminando con curiosità sia il chip MLX90316 che il chip AS5600.

Tuttavia mi pare di capire che in entrambi i casi questi sensori siano da usarsi come equivalenti dei tradizionali potenziometri, ovvero supportano al massimo una rotazione da 0 a 360°.
Ho esaminato entrambi i datasheet e non compare da nessuna parte nessun riferimento al numero max di giri al minuto (rpm).

Forse mi sfugge qualcosa? :roll_eyes:

Nel mio caso devo controllare la rotazione di uno stepper che al massimo farà 100 rpm e che, saltuariamente, viene anche ruotato a mano con un ingranaggio 1:4.

Premesso che dipende principalmente dalla comunicazione (se ad esempio sono I2C, serve prendere in considerazione i tempi di quello specifico protocollo), in genere quei sensori non danno una “velocita’ di rotazione”, ma un tempo di lettura o acquisizione del campo … sempre come esempio l’ACS da 150uS di sampling rate, significa che legge la posizione del magnete ogni 150 microsecondi … in base a quello ed alla velocita’ della comunicazione puoi calcolare il minimo scostamento che puoi leggere per unita’ di tempo in base alla velocita’ del magnete …

A livello di sensore, per dirne una, se ti serve una precisione del grado, al massimo dovrai spostarti di un grado ogni 150uS, cioe’ potrai fare al massimo un giro ogni 54 millisecondi, cioe’ circa 1111RPM … ovviamente se la comunicazione e’ altrettanto veloce … ma anche con una comunicazione piu lenta, direi che in 100RPM dovresti starci dentro … questo a livello di tempi dati dal datasheet, poi se il componente e’ effettivamente in grado di apprezzare tale velocita’ in un’assemblaggio “pratico”, serve provarlo in pratica … :wink:

Considera anche, comunque, che questo e’ valido per la “posizione” dell’albero … se a te serve solo leggere la velocita’ non ti interessa la variazione dei singoli gradi, anche 10 o 20 alla volta, una volta che vedi in che senso gira, ti danno comunque una valida indicazione, quindi sempre in teoria dovresti poterci calcolare anche velocita’ 10 o 20 volte piu alte …

As5600 puoi usarlo come encoder assoluto a 12bit per giro con almeno 10000 letture al secondo, nel caso di un multigiro il software dovra fare lui il calcolo dei giri trascorsi

Grazie per le risposte. Da quanto avete scritto la velocità di acquisizione dovrebber essere più che bastante per le mie esigenze. Lascerò ad arduino il compito di tenere il conteggio degli step effettuati.

Ho acquistato inq uesto momento un paio di schede su Aliexpress per fare dei test. Ma da quanto ho capito queste schede con l'AS5600 hanno solo il protocollo I2C. E' tanto più lento di una lettura incrementale?

https://www.aliexpress.com/item/4000757749339.html?spm=a2g0s.9042311.0.0.275e4c4djAhvHP

Una piccola astuzia:
stavo pensando che in caso di necessità posso sempre acquistare uno stepper "dual-shaft" e collegare il sensore alla parte posteriore dell'asse, a valle di una piccola demoltiplica che riduca il numero di giri.
Tengo questa idea come piano B, ma non credo che ce ne sarà bisogno.

Etemenanki:
Considera anche, comunque, che questo e' valido per la "posizione" dell'albero ... se a te serve solo leggere la velocita' non ti interessa la variazione dei singoli gradi, anche 10 o 20 alla volta, una volta che vedi in che senso gira, ti danno comunque una valida indicazione, quindi sempre in teoria dovresti poterci calcolare anche velocita' 10 o 20 volte piu alte ...

A me la velocità di rotazione non mi interessa, quello che cerco è un modo per ripristinare la posizione originaria se e quando l'asse dello stepper viene ruotato manualmente (con motore stepper preventivamente de-energizzato).

In tal caso, terminato il movimento manuale dell'utente, arduino dovrebbe essere in grado di riportare indietro l'asse alla posizione originaria dietro esplicita richiesta dell'utente stesso; energizzando lo stepper (scheda EasyDriver di Sparkfun) e facendogli fare il numero di giri necessari.
Non è richiesta una precisione spacca-capello, diciamo che un errore di un grado è accettabile.

gimpo:
… Lascerò ad arduino il compito di tenere il conteggio degli step effettuati.

Ma da quanto ho capito queste schede con l’AS5600 hanno solo il protocollo I2C. E’ tanto più lento di una lettura incrementale?

Non devi contare gli impulsi, la quota da 0 a 4095 si legge mediante la IIC a velocità massima di 1MHz, devi contare i giri
Ma non leggi il datasheet ? O deve farlo qualcun altro al posto tuo?

icio:
Ma non leggi il datasheet ? O deve farlo qualcun altro al posto tuo?

Senti signor Saputello, se sei qui per darmi una mano sei il benvenuto; se invece sei qui per dimostrare quanto sono deficienti gli altri allora sei pregato di non intervenire perché non porti alcuna informazioni reale ed utilizzabile a chi, in futuro vorrà rileggere questa discussione.

Non ho mai utilizzato l'AS5600 (ovvero l'MLX90316); l'unica mia esperienza risale ad un rotary encoder incrementale qualche anno fa. Quindi non ho la presunzione di dire "si fa così" oppure "si fa cosà". Non so nemmeno quale protocollo userò (analogico, PWM o I2C) per la comunicazione, devo attendere la consegna delle schedine con l'AS5600 per fare dei test sul campo.

Nella mia applicazione particolare, e solo in alcune circostanze specifiche, mi sarebbe utilissimo accorgermi anche di piccole rotazioni (inferiori al grado) dall'attuale posizione di riposo. In questo senso per me contare l'arrivo di 5 tick/impulsi da un encoder incrementale, ovvero leggere il valore 346 che diventa in 351 da una comunicazione I2C cambia poco la sostanza.

Per me un "tick" è la minima variazione angolare rilevabile dal sensore. Calcolando il numero di "tick" posso sapere se questi hanno superato un certo valore di soglia impostato a programma. Nel mio caso, il "triggering" di questa soglia dovrebbe mandare in esecuzione una particolare parte di codice.

Se la risoluzione del DAC è 4096, ne consegue che la risoluzione angolare di ogni "tick" è 360°/4096 = 0,087°. Il che dovrebbe essere più che sufficiente per i miei (personalissimi) scopi.

Quello che ancora non mi è chiaro, ma che mi riprometto d'approfondire, è l'uso della cosiddetta "isteresi" per evitare che la lettura oscilli tra due valori anche se l'asse è sostanzialmente fermo.

Non ho capito se devo abilitare l'isteresi o meno e quanto questo possa pregiudicare la lettura delle piccola variazioni angolari, che magari sono difficili da distinguere da puri disturbi elettrici:

Hysteresis

To avoid any toggling of the output when the magnet is not
moving, a 1 to 3 LSB hysteresis of the 12-bit resolution can be
enabled with the HYST bits in the CONF register.

Non ho capito, all'atto pratico, cosa succede assegnando a questi bit uno dei quatto valori possibili...

gimpo:
Senti signor Saputello, se sei qui per darmi una mano sei il benvenuto; se invece sei qui per dimostrare quanto sono deficienti gli altri allora sei pregato di non intervenire perché non porti alcuna informazioni reale ed utilizzabile a chi, in futuro vorrà rileggere questa discussione.

... alla prossima uscita come questa, il BAN è assicurato!

icio ti ha solo detto, magari in modo un po' troppo diretto, che ciò che stai chiedendo, è ben specificato nel datasheet, documento che, come ben sai, prima di usare una qualsiasi cosa, sarebbe bene studiare a fondo, quindi ... modera i toni ... che c'è modo e modo di dire le cose!

Guglielmo

Stando a quanto indica la tabella di figura 22, dovrebbe essere il numero di bit ignorati prima che uno spostamento venga considerato come tale … da 0 a 3 bit, secondo il valore che metti in quel registro, quindi il chip considera movimenti validi solo quelli che superano 1,2 o 3 bit del DAC, se lo abiliti … non e’ che li “salta”, li conta lo stesso, ma segnala il movimento variando l’uscita solo se variano piu di quello che indichi tu …

In pratica se lo attivi e, ad esempio, imposti 11, “perdi” i movimenti piu piccoli di 0.087*3 … ma non la posizione, solo il movimento, perche’ quando diventano 4 o piu bit dal punto che il chip ha memorizzato come “fermo”, anche i 3 “ignorati” dall’isteresi vengono calcolati …

E’ vero che a volte i datasheet sono incasinati, ma di solito c’e’ quasi tutto … :wink:

gpb01:
... alla prossima uscita come questa, il BAN è assicurato!

Chiedo venia Guglielmo. Forse ho frainteso le intenzioni di icio.

Per inciso, il datasheet afferma che 1MHz è la frequenza massima di letture supportata dall'integrato senza aggiungere altro. In questo senso l'informazione puntigliosa di icio mi è inutile, ma a questo punto lo ringrazio egualmente.

Giulio