Jump to content
PLC Forum


Wimatech

Arduino e encoder assoluti

Recommended Posts

Wimatech

Ciao a tutti sto progettando un dispositivo che in sostanza è composto da un supporto in grado di ruotare e inclinare su se stesso e monta un distanziometro laser per effettuare delle misurazioni.

il sistema viene movimentato da motori passo passo intendo comandarlo a distanza via radio e il laser comunica in RS232 purtroppo devo eseguire piccolissimi movimenti così ho optato per motori con motoriduttore 100:1 più una coppia di pulegge 3:1 per ottenere un angolo di 0.006 gradi ad ogni step di motore quindi devo per forza montare degli encoder per avere una misurazione precisa della posizione.

pensavo di usare un Arduino comandare i movimenti a distanza usando uno shield radio aggiungere anche lo shield per il Bluetooth per passare poi i valori letti al pc ecc.

sono però in crisi per quanto riguarda la lettura dei valori dagli encoder.

mi hanno proposto i seguenti prodotti lika a 16 bit:

 

HS58S16 encode assoluto monogiro 16 bit con protocollo SSIoppure BUS tipo Profinet, Ethercat
IP58S-H-PROG   encoder incrementale HTL o TTL programmabile fino a 65536 impulsi giro
 
Qualcuno mi sa dare una dritta su quale scegliere e come fare per leggere il valore?
 
grazie

Share this post


Link to post
Share on other sites

Livio Orsini

Scegli un encoder assoluto con interfaccia parallela. Con 16 bits avrai una risoluzione di 0.0055°.

Meglio se usi un arduino mega, così hai il numero di ingressi sufficienti, altrimenti devi usare un espansore di ingressi.

puoi usare anche un encoder incrementale, peròti complichi la vitaper 2 motivi:

  1. Devi prevedere un software per discriminare il senso di rotazione e questo, visto che la velocità di rotazione sarà molto bassa, non è un grosso problema.
  2. Devi effettuare la ricerca del punto di zero meccanico adogni accensione; questo ti complica un poco la programmazione ed anche la meccanica perchèdevi prevedere un fine corsa di zero.

Share this post


Link to post
Share on other sites
Wimatech

Buongiorno, la ringrazio infinitamente per la sua risposta, indubbiamente avevo già deciso di escludere a priori gli incrementali appunto per evitare tutte le relative complicazioni dovute ad azzeramenti e direzioni di moto.

Un paio di domande finali:

Gli encoder ad interfaccia parallela necessitano di shield dedicati per la loro lettura o vanno collegati ad arduino direttamente e dove posso trovare qualche esempio?

Sul mio device ne devo montare due è il caso che metta due mega in rete o ne basta uno solo?

Share this post


Link to post
Share on other sites
Livio Orsini

Arduino accetta segnali a 5V, quindi se trovi encoders con uscita TTL, oppure con uscita Open Collector che accetta 5V  sei a posto; nel caso tu trovassi solo encoders con uscita 24 V saresti obblicato ad interfacciare il tutto con dei riduttori di tensione, è sufficiente un resistore ed un diodo per ogni ingresso.

Se devi usare una risoluzione pari a 16 bits, che è il minimo per avere quello che ti serve, ti servono in totale 32 ingressi, ora non ricordo quanti I/O ha il mega, ma basta prendere le specifiche e fare il conto.

 

Sui 16 fili (più il comune a zero volt) trovi una configurazione in codice, questo corrisponde alla posizione; 0000 0000h corrisponde allo zero dell'encoder, FFFF FFFFh, corrisponde alla 65365a posizione ovvero a 360°. DOvrai fasare meccanicamente gli encoder, quindi dovrai revedere un giunto che ti dia questa possibilità.

Il codice, in genere, non è binario puro ma, solitamente, è GRAY (magari anche riflesso). se fa una ricerca con parole "Codice gray" trovi tutte le spiegazioni.

In pratica dovrai leggere gli ingressi a tempo fisso e tradurre il codice letto in gradi e frazioni di grado rislovendo una semplice proporzione.

Ogni qunato tempo leggere gli gli ingressi? dipende dalla velocità di rotazione massima.

Ad esempio

Se il tuo encoder compie una rivoluzione completa in 60" avrai 60000/65535 = 915.54µs per avere una variazione di 1 bits, quindi dovrai leggere gli ingressi con cadenza <= 458µs per avere la sicurezza di non perderti alcuna vqriazione.

Share this post


Link to post
Share on other sites
Wimatech

Ora mi è tutto più chiaro, si il Gray code ho presente cos’è il mio dubbio era dato dal fatto che guardando l’offerta che mi hanno fatto e i vari cataloghi ho visto che gli encoder più comuni comunicavano in ethercat o ssi o profibus non avevo idea che esistessero anche con le singole uscite per ogni bit.

proveró a chiedere al mio fornitore di darmene uno di quel tipo.

per quanto riguarda la frequenza di lettura non è un problema perché viene fatta molto lentamente 

Share this post


Link to post
Share on other sites
gffbx

bsi e ssi sono le uscite seriali più comuni ..... non saprei come collegarle ad arduino mega (mai fatto) .... tuttavia posso solo aggiungere che con un incrementale avresti solo 6 fili TTL ovvero 12 fili per 2 encoders e il costo di norma è di molto inferiore ... per affidabilità e risparmio ti converrebbe usare un tamagawa .... se passi attraveso siti cinesi lo paghi anche molto poco.

Per il discorso della complessità software .... secondo me puoi copiare snipset direttamente da vari forum ... tuttavia allo spegnimento è sempre possibile memorizzare la posizione (il tuo non è dispositivo pericoloso quindi ...) in più con una riduzione 1:300 mi viene da dire che è quasi impossibile che senza corrente tu possa muovere gli assi a mano. Tuttava esistono motori passo passo con freno e con encoders a bordo. Per una questione di velocità di azzeramento potresti utilizzare un disco forato e prpare non uno ma molti punti di azzeramento "codificati". Così puoi azzerare anche in posizioni molto differenti da quella "principale" a patto ogni volta di aggiungere il corretto offset al sistema.

Ovviamente l'uso degli assoluti rende tutto molto più semplice ....

Share this post


Link to post
Share on other sites
Wimatech

Ciao grazie dell’interve cos’è snipset?

Share this post


Link to post
Share on other sites
Livio Orsini
11 ore fa, gffbx scrisse:

con un incrementale avresti solo 6 fili TTL

 

Come ho scritto da subito (cfr il mio primo messaggio).

Il problema con l'incrementale è che ad ogni accensione, se vuoi la certezza della posizione, devi fare la ricerca di zero, quindi devi avere un FC di zero meccanico.

 

Quote

Per una questione di velocità di azzeramento potresti utilizzare un disco forato e prpare non uno ma molti punti di azzeramento "codificati".

 

L'idea del disco forato non è applicabile, perchè non da comunque la posizione assoluta, ti da solo un punto notevole, ma comunque sconosciuto.

Ci deve essere uno, ed uno solo, riferimento di zero. Che tu lo realizzi con un proximity, con un fine corsa a micro interruttore o con una forcella ottica e disco con un foro, può influire solo sulla tolleranza, ma deve comunque essere una posizione univoca.

Per codificarli dovresti avere varie combinazioni di fori, riducendo la precisione e complicando notevolmente l'operazione.

Vista la frequenza può scegliere un prodotto con uscite Open Collector ed avere solo 3 fili (A, B e marca di zero) più il comune.

 

9 ore fa, Wimatech scrisse:

Ciao grazie dell’interve cos’è snipset?

 

Se si usasse la lingua italiana, visto che siamo italiani, basterebbe dire "funzione".

In rete trovi molti "sketches" (tanto per stare sulle terminologie anglofone) che usano i contatori di arduino per interfacciare un encoder incrementale.

Esiste anche varianti che prevedono un discriminatore Hw di senso di rotazione, che indirizza gli impulsi ad un contatore differente secondo senso.

Vista la frequenza di conteggio che affermi essere molto bassa, cosa che supponevo vista l'applicazione, puoi benissimo usare gli ingressi per discriminare e contare via software gli impulsi.

 

Insomma hai una vasta possibilità di opzioni, ognuna con il suoi pro ed i suoi contro.

 

Personalmente preferirei spendere un poco (o molto) di più ed avere la certezza della posizione in qualsiasi momento ed in qualsiasi condizione. Da quanto scrivi l'applicazione è un sistema di misura, quindi a mio avviso è meglio previlegiare precisione ed affidabilità.

 

Un discorso a parte, poi, è la compatibilità elettromagnetica di arduino, che è praticamente inesistente.

Arduino è un bellisimo oggetto, progettato per costituire un mezzo di sviluppo software a bassissimo costo. Funziona benissimo sino a che lo usi in laboratorio.

Non appena vai sul campo e ci accoppi ingressi ed uscite che interfacciano altri dispositivi come attuatori, relè, motori, etc., incominciano i guai.

 

Quindi ti consiglio di disaccoppiare bene l'alimentazione ad arduino (magari leggi qualche altra discussione in questa sezione dove ho già trattato l'argomento). Anche i segnali da e per il campo vanno trattati con molta cura.

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
Wimatech

Il dispositivo che sto cercando di fare utilizza un radiocomandato per muovere i due motori e posizionare il puntatore laser, quando il laser è sul punto da acquisire verrà premuto un tasto di lettura delle coordinate a quel punto viene effettuata la lettura degli encoder e memorizzato il valore quindi la lettura avverrà solo ogni tanto, sono anch’io d’accordo con lei per restare sugli assoluti nei prossimi giorni farò una ricerca per vedere se ne trovò con uscite ttl

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...