Motore stepper per orologio

Salve, vorrei realizzare un orologio classico a lancette, grande, diciamo circa un metro di diametro.
Ho preso in considerazione una serie di motori stepper e i relativi driver per il loro funzionamento, dopo vari tentativi la scelta del driver è ricaduta sul Easy Driver della Sparkfun, ha la possibilità di lavorare fino ad 1/8 di step e di mettere in sleep il motore quando non è in funzione.

Nei tutorial della Sparkfun si trova il codice per farlo ruotare o a step o a gradi, ma il problema è il motore.
Tipicamente i motori stepper sono 1.8° a step con 200 step per un giro completo. Numeri che non si sposano con un orologio dove ogni lancetta si deve muovere con multipili del 60. Quindi mi gioverebbe un motore da 60 step/giri o suoi multipli.
Ma non ho trovato nulla sul web. Diciamo che potrei avvicinarmi al giro completo, ma avendo sempre o un piccolo ritardo o un anticipo sul giro.

Ho cercato se esistono motori da 1.5° e 240 step, ma a parte un motore trifasico brushless, della Oki non ho trovato nulla. E non saprei neanche chi lo vende.
La mia domanda è qualcuno ha avuto esperienza nel compiere giri completi con i motori stepper per lunghi periodi e riscontrare una precisione da orologio?
Oppure sono costretto ad usare un encoder e resettare il motore ogni n giri?
Con i motori nema 17 standard da 1.8° 200 step dovrei fare per ogni secondo 3,33periodico step al secondo ma questo vuol dire che mi perdo 0,18 step al minuto in un ora diventa un ritardo non accettabile per un orologio sincronizzato con GPS…
Senza parlare che in pratica alimentando con arduino Uno, Easy Driver ed il motore ML17A4 a 12V, il ritardo che si ottiene in un minuto è già sufficiente a mettermi KO!

Aggiungo il codice utilizzato per muovere il motore in gradi e non in step.
Ho tenuto conto che l’ Easy Driver è ad 1/8 di step quindi il motore usa 1600 microstep per un giro completo un microstep ( 360/1600 = 0,225 gradi per microstep)

#define DIR_PIN 2
#define STEP_PIN 3
int SLEEP = 12;      // PIN 12 = SLP

void setup() { 
  pinMode(DIR_PIN, OUTPUT); 
  pinMode(STEP_PIN, OUTPUT); 
  pinMode(SLEEP, OUTPUT);    // set pin 12 to output
} 

void loop(){ 
  digitalWrite(SLEEP, HIGH);  // alimenta il motore stepper. 
   rotateDeg(6, .1);  //      gradi e velocità motore  
   digitalWrite(SLEEP, LOW);           // spegne il motore stepper. 
  delay(1000);   // pausa programma 1000 = 1 secondo
}
void rotateDeg(float deg, float speed){ 
  //rotate un numero specifico di gradi (negitivo per movimento antiorario)
  //speed è un numero da .01 -> 1 con 1 la velocità massima di rotazione
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN,dir); 

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
  } 
}

Grazie!

Ciao refill, io non ho mai usato motori stepper, quindi prendi quello che dico solo come suggerimento. Da quanto ha capito, il problema più grande è la perdita di precisione dovuta alla rotazione inesatta del motore. Ti suggerisco di usare un driver del tipo del DRV8825 della pololu (http://www.pololu.com/product/2133) che, oltre a costare un pochino di meno dell'Easy driver, offre una risoluzione di 1/32 di step (!), cosa che potrebbe ridurre l'errore a valori "ragionevoli". Di nuovo, ti ricordo che non parlo per esperienza personale, quindi non prendere tutto quello che dico come certezza assoluta. dp_1

Accetto il suggerimento, non conoscevo questo driver, in mentre ho comprato pure un Pololu A4988 che ha una risoluzione di 1/16 di step. Come hai ben inteso non faccio altro che allontanare il problema della precisione, ma non lo risolvo. Continuando le ricerche ho visto che esistono motori con risoluzione di 3.6 gradi, ma come al solito trovo il datasheet ma non chi li vende... Io vorrei realizzare un orologio abbastanza preciso che aggiorni l'orario con il GPS , e considerando le dimensioni, se non correggo l'errore si vedrebbero le differenze. Forse l'unica strada è quella di ridurre al massimo l'errore e poi di notte fare il monitoraggio della posizione delle " lancette" ( quella dei secondi sarà 80 cm :) ) e correggere eventuali ritardi....

2 problemi: Una lancetta da 50cm ha un inerzia rotativa tale che un motore piccolo/medio non ce la fa a muoverlo (non ha la coppia necessaria per muoverlo).

Hai capito male la questione riguardante i 200 passi.

Se dai a un motore passo passo da 200 passi per rotazione 200 passi lui si muove per 360° precisi. Il problema é che devi adattare i 200 passi ai 6° che deve fare la lancetta. percui avrai un sfasamento tra posizione teorica della lancetta e pratica. Se usi un motore a 400 Passi o usi un driver microstepping puoi aumentare i passi e percui diminuire la differenza tra la posizione teorica voluta e quella reale.

Risolvi il problema 1) e poi vedi.

Ciao Uwe

Non capisco.... con un solo motore voi fare le 24 ore i 60 minuti e i 60 secondi ? Assurdo, ti servono almeno 2 lancette e di solito si mettono sempre "una dentro l'altra" , se le 2 lancette le comanderai con 2 motori separati allora bastano 4 ingranaggi per adattare gli step sul motore con il numero di tacche per giro, oppure se vuoi usare un solo motore servono altri ingranaggi in più.

Invece che con il gps è più facuile ed economico aggiornarlo con l'orologio atomico di norimbergafrancoforte, e visto che gli stepper sono comandati ad anello aperto sarebbe più facile e preciso sincronizzare se usi 2 motori (ore e minuti) con 2 sensori , piuttosto che un solo motore con 1 sensore

L'idea è quella di usare tre motori, le lancette saranno montate come i tutti gli orologgi su tre alberi con quello delle ore e minuti cavo, il tutto su cuscinetti. Anche le lancette saranno bilanciate al grammo. Il tutto per ridurre l'inerzia rotativa , un motore nema 17 ha tipicamnte coppia di torsione di 1500 g.cm credo più che sufficiente per muovere le lancette. Considerando anche, che in base ai gradi step, del motore definitivo si farà il calcolo degli ingranaggi. Ma il punto è proprio quello, se non parto da un motore che ha passi multilpli di 60 mi trascinerò un errore comunque, per quanto posso ridurre a 1/32 gli step l'errore c'è e andrà corretto. Uwe wrote: Risolvi il problema 1) e poi vedi. La grana è qui se faccio ruotare un motore opportunamente accoppiato a delle ruote per fare i 6° alla lancetta ( qualunque essa sia) aumento la precisione solo se mantengo il motore stepper alimentato, ma se uso la funzione sleep perde molti più passi ad ogni avvio. Ma per il motore delle ore lo muoverei solo di 10° a volta e quindi ogni 20 minuti ( tenerlo alimentato, fermo, per non perdere passi mi sembra uno spreco) .

Per rilevare l'ora UTC preferisco il GPS, di Norimberga non sò nulla. Ho valutato l'ipotesi di utilizzare il modulo DCF77 per sincronizzare l'ora con l'orologio atomico di Mainflingen, ma su questo modulo ho letto non belle cose sul forum. Si sincronizza bene la notte e non sempre. Posseggo un Citizen radiocontrollato sulla frequenza del DCF77 e settimana scorsa ero per lavoro a Francoforte ( 30 km da Mainflingen) Ogni sera l'orologio ha ricevuto il segnale ma :( si è sempre sincronizzato con segnale low... tranne quando lo ho lasciato davanti alla finestra è ho trovato un bel High, preferisco il satellite! Non ho grandi problemi di budget per realizzare l'orologio voglio solo che sia preciso.

Mi viene in mente una soluzione "da hardwarista" :P ... collegare i motori tramite ingranaggi 3:1 (tanto comunque non potresti montare 3 motori "coassiali", dovresti accoppiarli agli alberi coassiali tramite ingranaggi, quindi tanto vale usare coppie di ingranaggi con rapporto di 3 ad 1) ... in questo modo i passi complessivi per far girare di 360 gradi un'asse diventano 600 (200*3), quindi 10 passi per ogni sessantesimo della circonferenza (ed inoltre i motori demoltiplicati 3:1 potrebbero muovere 3 volte il peso dei motori usati direttamente ;) XD)

A proposito, il bilanciamento e' una cosa, l'inerzia e' un'altra ... bilanciare le lancette va benissimo, perche' cosi non tendono a ruotare da sole, ma l'inerzia la riduci solo riducendo il peso ;)

Si infatti, nel calcolo dei passi per la rotazione della lancetta devi anche considerare il rapporto di trasmissione degli ingranaggi. Non avendo problemi di budget consiglio il GPS.

Yes! Hai ragione! anch'io intendevo l'orologio atomico di Francoforte, non non Norimberga :grin:

Etemenanki: Mi viene in mente una soluzione "da hardwarista" :P ... collegare i motori tramite ingranaggi 3:1 (tanto comunque non potresti montare 3 motori "coassiali", dovresti accoppiarli agli alberi coassiali tramite ingranaggi, quindi tanto vale usare coppie di ingranaggi con rapporto di 3 ad 1) ... in questo modo i passi complessivi per far girare di 360 gradi un'asse diventano 600 (200*3), quindi 10 passi per ogni sessantesimo della circonferenza (ed inoltre i motori demoltiplicati 3:1 potrebbero muovere 3 volte il peso dei motori usati direttamente ;) XD)

Il tuo raggionamento non fà una grinza, ma se voglio muovere di 10 passi la demoltiplica che mi suggerisci, comunque devo impartire il comando in step al motore. Quindi sempre 3,3 passi per ottenere poi i 10 .... quindi non posso creare un codice che prende per riferimento il singolo movimento. Devo creare un movimento impercettibile ma continuo del motore, che conclude comunque con 200 step il suo percorso che sia il minuto o l'ora.

Il tuo raggionamento non fà una grinza, ma se voglio muovere di 10 passi la demoltiplica che mi suggerisci, comunque devo impartire il comando in step al motore. Quindi sempre 3,3 passi per ottenere poi i 10 .... quindi non posso creare un codice che prende per riferimento il singolo movimento. Devo creare un movimento impercettibile ma continuo del motore, che conclude comunque con 200 step il suo percorso che sia il minuto o l'ora.

Non ci siamo. allora, perno motore con ingranaggio a 20 denti, perno orologio con ingranaggio a 60 denti (rapporto 3 a 1 come suggerito da Ete), 1 giro perno orologio = 3 giri motore = 600 passi per giro (del perno orologio) = 10 passi per secondo. :) ciao pippp72

Non puoi creare un movimento "continuo" con un motore stepper, per quanto fluido e a "microstep", sara' sempre a saltelli ... a quel punto, dato che avresti 600 step per completare un giro, gli puoi far fare uno step (o mezzo) ogni tot secondi per simulare un movimento "graduale" ...

Ad esempio, hai 600 step per giro, per la lancetta dei minuti questo significa 10 step per ogni minuto (o 20 mezzi step, se piloti i motori in half-step), quindi ti basta dargli uno step ogni 6 secondo (o mezzo ogni 3) per avere comunque un movimento "graduale" senza doverti mettere a dividere minuti e secondi in frazioni ... ... per la lancetta dei secondi e' lo stesso, uno step ogni 6 decimi di secondo (o mezzo ogni 3 decimi) ... e cosi via ...

[/quote] allora, perno motore con ingranaggio a 20 denti, perno orologio con ingranaggio a 60 denti (rapporto 3 a 1 come suggerito da Ete), 1 giro perno orologio = 3 giri motore = 600 passi per giro (del perno orologio) = 10 passi per secondo. :) [/quote]

Non voglio insistere ma il dubbio mi permane. Il completamento dei tre giri del perno motore mi comporta un giro del perno orologio. Consideriamo lancetta dei minuti, ore 00:00, alle ore 00:01 la lancetta si deve spotare di 6 gradi, devo dare un comando ad arduino che lo invia al motore tiipo: if (minute() = last.minute+1 ){ rotate(3.33, .1); // numero step, velocità motore ecc.... Dopo quindici minuti, arduino avrà dato il comando 15 volte ed il perno orologio avra fatto 49,95 step, non 50 e quindi non 150 passi del perno orologio. Credo sia evidente che la lancetta dei minuti cominci a prendere un ritardo. Inoltre come ho già detto, mi sono accorto che non è del tutto preciso il movimento del motore con passi ridotti e con l'utilizzo della funzione sleep. Ma questo ho pensato che se costruisco il castelletto con gli ingranaggi, dimunuisce per attrito la possibile deriva dell'asse del motore.

Ma ... se usi piu passi per tacca, per avere un movimento piu "progressivo", allora devi controllare il valore precedente ... intendo, per muovere i minuti devi contare i 3 o 6 secondi, per muovere i secondi devi contare i decimi di secondo (o decine di millisecondi, se usi millis), ecc ...

Quindi, ad esempio nel caso piu semplice, passi interi, ogni 6 secondi fai fare un passo alla lancetta dei minuti, ogni 60 millisecondi un passo alla lancetta dei secondi, ogni 2 minuti un passo alla lancetta delle ore (le ore hanno un rapporto differente in passi, ogni ora la lancetta si sposta di 5 tacche, quindi 30 passi)

Inoltre, quando fai l'impostazione delle ore, hai bisogno di sensori per la posizione "zero" delle lancette (ci avevi pensato ?), perche' le lancette non ti danno nessun feedback della loro posizione ... dato il tipo di connessione meccanica ed i rapporti, per avere la massima precisione dovresti avere un contatto (o meglio, una forcella ottica con una fessura sottile) su entrambi gli ingranaggi di ogni gruppo (questo moltiplica la precisione)

EDIT: tutto questo, ovviamente, se vuoi usare 3 motori indipendenti, se invece usi una meccanica singola, la potresti muovere con un motore solo (ma poi dov'e' il divertimento ? :P)

Ho anche studiato il movimento discreto dell'orologio, che è in pratica quello che dici tu. Solo che piano piano le lancette non coincideranno con la grafica , e per un orologio di grandi dimensioni si nota. L'idea di un feedback l'ho maturata in questi giorni ed ho pensato ad usare un encoder sull'asse dell'orologio. Ho comprato su E-bay vari modelli, ma non li ho mai usati e devo fare un pò di prove con gli sketch che ho trovato in giro. Sicuramente mi servirà la posizione zero, volendo prelevare l' UTC dal GPS ho pensato che alle 03:00 AM fare un controllo tra UTC ed RTC ( chronodot ) e poi controllare la posizione delle lancette e casomai recuperare i vari ritardi. Se l'orologio è in anticipo prima che trova la posizione zero si fa un bel 360 gradi, per il motore disallineato, tanto di notte chi lo guarda? :sleeping:

Se hai il GPS cosa ti serve l'RTC? Come sistema di riserva? Il tempo lo devi avere a run-time nel micro perché lo devi richiamare ogni secondo, poi ogni tanto lo sincronizzi (ogni ora).

PaoloP: Se hai il GPS cosa ti serve l'RTC? Come sistema di riserva? Il tempo lo devi avere a run-time nel micro perché lo devi richiamare ogni secondo, poi ogni tanto lo sincronizzi (ogni ora).

:~ ma se il gps non riceve il segnale? Ho visto che ci sono dei moduli gps che hanno un rtc a bordo ma quanto precisi? Il Cronodot ho letto al max perde 1 minuto all'anno. Ma se il gps ha un RTC certo ogni ora e ultra sufficiente, ma non ho trovato codice per effettuare l'aggiornamento ma solo per prelevare l'UTC da gps e quindi ho pensato fosse quello che preleva dalla ricezione satellitare.

scusa, ma insisto io... :0

Consideriamo lancetta dei minuti, ore 00:00, alle ore 00:01 la lancetta si deve spotare di 6 gradi

fin qui siamo tutti d'accordo...

devo dare un comando ad arduino che lo invia al motore tiipo: if (minute() = last.minute+1 ){ rotate(3.33, .1); // numero step, velocità motore ecc.... Dopo quindici minuti, arduino avrà dato il comando 15 volte ed il perno orologio avra fatto 49,95 step, non 50 e quindi non 150 passi del perno orologio.

e qui ti sbagli. con un rapporto 3 a 1 ti ci vogliono 10 step per far fare 6 gradi al perno dell'orologio, ovvero 18 gradi del motore quindi il comanda sarà:

if (minute() = last.minute+1 ){
rotate(10, .1);            //    numero step,  velocità motore
ecc....

Spero di essere stao chiaro. :)

Hai fatto bene ad insistere, avevo invertito il rapporto, in effetti così dopo 60 minuti fa 600 step che sono i necessari a completare il giro senza perdite di passo. Adesso mi metto a costruire il castelletto meccanico e lavoro sulle derive dell'asse motore quando non è alimentato. Grazie Pippo72 mi hai convinto ;)

Ma finiscila con quella perdita di passi. :astonished: :astonished:

Se per un giro di 360 il motore deve fare x passi. Dopo X passi é ritornato alla posizione di partenza. La differenza tra x e y passi per giro é che non riesci a avere i passi intermedi precisi ad avere le posizioni che vuoi, ma quello non vuole dire che perdi passi.

Ciao Uwe