Pages: [1] 2   Go Down
Author Topic: Orologio siderale  (Read 1560 times)
0 Members and 1 Guest are viewing this topic.
Pistoia (Italy)
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino for astronomy
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,

vorrei costruire un orologio siderale partendo da un movimento per orologio da parete diviso in 24 ore (anziché 12) e controllarne la frequenza con Arduino. Perché un orologio da parete e non un semplice orologio digitale? Beh, è una questione di gusti personali, mi piace l'idea di ricostruirne il quadrante e di modificarlo a mio piacimento. Capisco di avere idee un po' anacronistiche, ma dovete avere pazienza.

Dunque! il meccanismo dell'orologio ce l'ho già ma dovrei utilizzarne solamente gli ingranaggi e posizionare un motore passo-passo sull'asse e pilotarlo con Arduino alla giusta frequenza per il tempo siderale.
L'orologio, poi, lo vorrei rimettere da PC (o direttamente da Arduino) per evitare di utilizzare encoder assoluti portando manualmente le lancette su ore 0. Con un pulsante di start il PC calcolerebbe il numero di passi da fare per rimettere l'ora siderale in base all'ora e alla data del PC o interne a Arduino.

Ma quali schede dovrei usare?

Ho rotto anche troppo, grazie.
Emiliano

  
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io direi che un RTC esterno potrebbe bastare, in pratica è un orologio a se, che ha vita indipendente dall'arduino. Quindi per ora lo programmi una volta da PC, e magari ti fai un programmino che quando accendi il pc aggiorna l'ora, però a parte la prima volta arduino è indipendente.

Poi direi che ci vuole un pulsante di azzeramento e un pulsante di start.

puoi programmare l'rtc per lanciare un interrupt ogni secondo (anche i più economici lo permettono) in modo che eventualmente potrai mettere arduino in sleep profondo quando deciderai di fare un circuito a sè, per risparmiare tantissimo in batterie.

Dicevamo, ogni secondo arriva un iterrupt, arduino si sveglia, e fa scattare la lancetta di un passo. O meglio. se vuoi 24 ore, vuol dire che ti servono 1440 minuti, ovvero 86400 secondi.

Ti serve una buona meccanica per i secondi, ma per i minuti dovresti farcela anche in modo rozzo. In oltre gli stepper hanno un numero di passi ben preciso, quindi per il reset basta tornare indietro dei passi percorsi o completare i passi mancanti (sta a te vedere la soluzione che ti piace di più, io farei la stada "più veloce")

in oltre hai altri 2 interrupt:
1. sul pulsante reset. Disabilita l'allarme che fa generare l'interrupt dall'RTC, dopodichè riporta la lancetta in posizione zero
2. pulsante start: riabilita l'allarme dell'RTC.
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@lesto:
un orologio siderale è un orologio che misura il "tempo delle stelle"  smiley-wink
Rispetto ad un orologio che misura il tempo "ortodosso", l'orologio siderale ha un giorno che dura 23h56m4s, se non ricordo male.

Quindi serve oltre ad un RTC da cui prelevare l'orario, anche un piccolo calcolo sw per accelerare leggermente le lancette durante il giorno, in modo che la mezzanotte arrivi 3m56s prima.
Logged


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6578
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E dopo 6 mesi misurerà la mezzanotte a mezzogiorno.  smiley-sad-blue
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@lesto:
un orologio siderale è un orologio che misura il "tempo delle stelle"  smiley-wink
Rispetto ad un orologio che misura il tempo "ortodosso", l'orologio siderale ha un giorno che dura 23h56m4s, se non ricordo male.

Quindi serve oltre ad un RTC da cui prelevare l'orario, anche un piccolo calcolo sw per accelerare leggermente le lancette durante il giorno, in modo che la mezzanotte arrivi 3m56s prima.

se prendiamo l'interrupt ogni secondo dall'RTC, allora è un problema di meccanica:
un giro anzichè farlo in 86400 step, dovrà farlo in 86400 - 3*60 - 56=86164 step
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, si può rigirare in questo modo il problema, dicendo che ogni secondo invece di far avanzare la lancetta dei secondi di 1 passo, la si deve far avanzare di 1,002731481 passi.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

E dopo 6 mesi misurerà la mezzanotte a mezzogiorno.  smiley-sad-blue
E' un orologio usato in astronomia per i calcoli delle posizioni degli oggetti celesti, non si usa per avere l'ora  smiley-wink
Logged


Pistoia (Italy)
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino for astronomy
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io direi che un RTC esterno potrebbe bastare, in pratica è un orologio a se, che ha vita indipendente dall'arduino. Quindi per ora lo programmi una volta da PC, e magari ti fai un programmino che quando accendi il pc aggiorna l'ora, però a parte la prima volta arduino è indipendente.

Poi direi che ci vuole un pulsante di azzeramento e un pulsante di start.

puoi programmare l'rtc per lanciare un interrupt ogni secondo (anche i più economici lo permettono) in modo che eventualmente potrai mettere arduino in sleep profondo quando deciderai di fare un circuito a sè, per risparmiare tantissimo in batterie.

Dicevamo, ogni secondo arriva un iterrupt, arduino si sveglia, e fa scattare la lancetta di un passo. O meglio. se vuoi 24 ore, vuol dire che ti servono 1440 minuti, ovvero 86400 secondi.

Ti serve una buona meccanica per i secondi, ma per i minuti dovresti farcela anche in modo rozzo. In oltre gli stepper hanno un numero di passi ben preciso, quindi per il reset basta tornare indietro dei passi percorsi o completare i passi mancanti (sta a te vedere la soluzione che ti piace di più, io farei la stada "più veloce")

in oltre hai altri 2 interrupt:
1. sul pulsante reset. Disabilita l'allarme che fa generare l'interrupt dall'RTC, dopodichè riporta la lancetta in posizione zero
2. pulsante start: riabilita l'allarme dell'RTC.

Caspiterina, quante risposte! E tutte molto pertinenti. Veramente bravi tutti.
Ma questo RTC è costituito da uno stepper? Ed è possibile programmarlo in modo che invii l'interrupt ogni 0,9972685... anziché ogni secondo? Ovvero 86400 interrupt in 86164 secondi di tempo (23h 56m 04s)
Per quanto riguarda la meccanica ho già il movimento di un orologio su 24 ore che veniva pilotato da un quarzo.
Mi basterebbe rendere l'asse dello stepper solidale alla lancetta dei secondi, la rotazione della lancetta dei minuti e delle ore avverrebbe meccanicamente.

Cosa intendi quando dici "riporta la lancetta in posizione zero" ?
Io pensavo, ancor più semplicemente di quanto avevo detto, di farmi visualizzare dal PC l'ora siderale, spostare le lancette, compresi i secondi, un po' più avanti e riavviare l'RTC allo scattare di quell'ora sul PC.



Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no, un RTC è un Real Time Counter, ovvero un orologio.
Arduino ha dei timer interni, che però lavorano con un generatore di clock (quarzo o peggio oscillatore) molto impreciso, Leo72 ha provato a creare una libreria orologio usandoli, e l'errore è di molti secondi al giorno, forse anche minuti.

Un RTC invece è un chippino con un quarzo particolare che è fatto apposta per misurare il tempo come lo intendiamo noi (e costicchia, quanto un chip atmega intero, che al suo interno ha un oscillatore...)

poi gli stepper con 86164 o anche 86400non esiste, anche usando i microstep (sconsiglio ai principianti).

un motore stepper da 15/20€ ha circa 400step/rotazione.

86164(step richiesti)/400(step necessari)=215.41

cosa vuol dire? che devi creare una serie di ingranaggi che moltiplicano il movimento di 215.41 volte, ovvero ogni 215.41 rotazioni dello stepper avrai una rotazione completa dell'orologio.

Però quel numero NON è tondo (lo sarebbe stato nel caso di un orologio normale, 216 spaccato), ciò vuol dire che  la lancetta sarà sempre un poco errata.. nulla che un umano possa vedere eh..

il punto è fare un ingranaggio 216:1 (anzi, 215.41:1, ma è impossibile se non usando qualche arcana combinazione, meglio cercare uno stepper che ha un numero di step a rivoluzione che sia divisore di 86164)
ovviemente puoi usare più ingranaggi in cascata

ORA sappi che NON ho mai studiato meccanica. Tutto quello che ti scrivo è basato su pura filosofia fatta al momento e non verificata, quindi magari ho detto boiate pazzesce........ ma dubito (tranne forse quella che NON è impossibile fare 215.41:1)
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

RTC sta per Real-Time Clock, ossia Orologio in Tempo Reale.
E' un piccolo integrato che serve a tenere il tempo.

Siccome a te serve un secondo che duri un po' meno di un secondo, non userei la tecnica dell'interrupt generato dal chip RTC esterno ma piuttosto potresti prendere un timer interno ed impostarlo affinché tu abbia un sistema efficace per calcolarti la durata che ti serve. Va studiato un po' ma non è impossibile. Anche nel caso dell'Arduino, il timer 0 è impostato per generare un interrupt ogni 976  us, quindi dopo 1000 interrupt non è trascorso 1 secondo esatto. Per "addirizzare" lo scorrere del tempo viene usato un piccolo accorgimento software.
Tu dovresti fare lo stesso secondo me. Ed usare l'RTC esterno solo per ricalibrare l'orologio siderale ogni 8/12 ore in modo che l'accumulo dello scarto abbia prodotto una differenza misurabile in secondi, un valore gestibile con l'RTC.
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no, con la riduzione che dico io si può fare, solo che l'orologio ogni secondo "normale" muoverà la lancettadi 1.002739 secondi siderali.

invece se vuoi la precisione di conteggiare il secondo siderale... la cosa si complica.

Quote
Tu dovresti fare lo stesso secondo me. Ed usare l'RTC esterno solo per ricalibrare l'orologio siderale ogni 8/12 ore in modo che l'accumulo dello scarto abbia prodotto una differenza misurabile in secondi, un valore gestibile con l'RTC.

ma a questo punto l'errore accumulato sarebbe probabilmente molto più grande dell'errore di sommare ogni secondo reale 1.002739 ad una variabile float, e stampare quindi il numero troncato. Che poi ripeto, essendo a lancetta (e a 24ore) non si vede nemmeno questo errore, salvo lancetta lunga 1/2metri smiley-wink
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

no, con la riduzione che dico io si può fare, solo che l'orologio ogni secondo "normale" muoverà la lancettadi 1.002739 secondi siderali.
Lesto, come dici tu non può funzionare. Ragiona un attimo.
Un secondo siderale è lungo 0,997261 secondi "legali". Nel modo che dici tu sposti in avanti la lancetta ma non hai il tempo allineato con la vera ora siderale.
Ti faccio un esempio:

00:00 siderali
00:00 "legali"

Dopo 1 secondo "legale", l'orario è:
00:01,002739
00:01

Ma la lancetta non sta sulla tacca di 1 secondo sull'orologio, ma poco avanti.

Invece a 00:01 siderali  io devo avere la lancetta sulla 1a tacca dei secondi dopo appunto 0,997261 secondi "legali".

Cioè, non è solo una questione di spostare le lancette, l'orario siderale è un'orario a tutti gli effetti che misura il tempo in modo diverso e quindi la sua durata è inferiore e come tale va calcolata.
Logged


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6578
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Domanda:
Si può collegare ad un ATmega320 un quarzo da 32KHz, e usarlo per regolare un timer con overflow ogni 997,26 millisecondi. Avresti, come fai nel looper con i secondi "legali", un secondo siderale "vero" con una buona precisione.

EDIT: Ho trovato questo application note --> http://www.atmel.com/Images/doc1259.pdf
E nel datasheet del 328 risulta la possibilita di usare RTC interno con quarzo separato --> http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Summary.pdf

P.S. il nuovo datasheet completo del 328 è di 35MB.  smiley-eek (http://www.atmel.com/devices/atmega328.aspx?tab=documents)
« Last Edit: March 29, 2013, 04:30:51 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Domanda:
Si può collegare ad un ATmega320 un quarzo da 32KHz, e usarlo per regolare un timer con overflow ogni 997,26 millisecondi. Avresti, come fai nel looper con i secondi "legali", un secondo siderale "vero" con una buona precisione.
Il modulo RTC degli Atmega328 può lavorare in modo asincrono con il quarzino suddetto.
Normalmente però ottieni delle frequenze diverse, date dal clock di 32768 Hz diviso per il prescaler.
Per cercare di ottenere qualcosa di diverso, bisogna scrivere una ISR che intercetti l'interrupt dell'overflow e modifichi il registro del timer in modo da provare ad ottenere la frequenza richiesta.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La miglior precisione che si può ottenere è 1,003921569.
In un giorno la differenza diventa di 337s, cioè 5,6 minuti. 2 minuti più del tempo siderale.
Quindi oltre a ciò andrebbe messo un sistema per recuperare questo differenza.
Logged


Pages: [1] 2   Go Up
Jump to: