Sincronizzare la swRTC tramite USB

In allegato un semplice programma per pc che consente di sincronizzare la libreria swRTC con l'orario del pc tramite porta USB.
Il funzionamento è molto semplice, prima collegate Arduino alla porta USB, lanciate il programma swRTC.exe, selezionate la porta COM a cui è collegato Arduino e vistate il campo "Open", dopo circa 500 ms vedrete comparire sul terzo campo, inizialmente vuoto, ora e data attuali della swRTC.
Se il terzo campo rimane vuoto vuol dire che l'aggiornamento non è andato a buon fine, ripetere l'operazione.
Premendo il tasto "Arduino Reset" viene effettuato un reset hardware della scheda con conseguente risincronizzazione.
Il tasto "CFG" apre il pannello di controllo parametri della porta seriale, di default è settata 19200,n,8,1 , in modo da poterne variare la configurazione se necessario.
Il tasto "I" visualizza la versione del programma e le informazioni sulla licenza d'uso (freeware).
Nei primi due campi sono visualizzate data e ora del pc con aggiornamento ad ogni secondo.

Per poter utilizzare questo programma è necessario aggiungere al vostro sketch una funzione denominata "swRTC_Time_Update()", va invocata come prima cosa dopo aver inizializzato la libreria swRTC oppure ogni volta che si desidera aggiornare l'orario della libreria con quello del pc, si presuppone che Arduino sia collegato alla USB e che il programma swRTC.exe sia attivo.
La funzione swRTC ritorna un valore TRUE in caso di aggiornamento effettuato con successo e un valore FALSE in caso di aggiornamento non riuscito, potete usare questo valore per verificare se l'operazione è andata a buon fine ed eventualmente ripeterla in caso di errore.
Dentro il file .rar trovate un semplice sketch di esempio dell'uso della funzione "swRTC_Time_Update()", si limita ad aggiornare data e ora della swRTC ad ogni reset di Arduino.
La funzione swRTC apre la porta seriale a 19200 bps, se dovete utilizzare la seriale nel vostro sketch con una velocità diversa basta che la reinizializzate subito dopo avere usato questa funzione, vedere l'esempio dove la seriale viene riaperta a 9600 bps.

Il dialogo tra sketch e programma sul pc è molto semplice e minimale, lo sketch invia il carattere "@" per richiedere l'invio di ora e data e attende 300 ms prima di leggere il suo buffer della seriale, nel frattempo il programma sul pc ha inviato in formato ASCII i dati richiesti aggiungendo un carattere "@" dopo l'orario e la data.
La funzione "swRTC_Time_Update()" dopo il delay verifica la presenza di 20 caratteri esatti nel buffer della seriale, in caso contrario viene ritornato un FALSE, dopo di che verifica che al carattere 9 e 20 sia presente la "@", se la condizione è soddisfatta si procede all'aggiornamento di ora e data ritornando un TRUE, in caso contrario viene ritornato un FALSE.

edit: aggiornato l'allegato
edit 2 : aggiunti i sorgenti C++ del programma per pc, per ricompilare serve il cBuilder Borland.

C++_Source_v1.0.0.rar (153 KB)

SwSync.rar (427 KB)

la faccia mia sotto i piedi vostri :slight_smile:

testo e riporto

Funge,

ci sono un paio di errori nello sketch, manca un puntovirgola, ed il nome della swRTC non e' quello standard.
lo allego corretto e con estensione .ino (conviene metterli entrambi nel download per chi usa 1.0 e 0.23)

continuo a testare

swRTC_sync.ino (2.03 KB)

Testato:
ci sono un paio di errori nello sketch, manca un puntovirgola, ed il nome della swRTC non e' quello standard.

Si hai ragione, manca un punto e virgola, e non so come sia successo perché lo sketch l'ho straprovato prima di allegarlo, mentre il nome della libreria è quello della versione che ho io presa direttamente dal relativo topic, però è sicuramente vecchia e non aggiornata.

Ho aggiornato l'allegato del post principale.

il maledetto autoreset sull'apèertura della seriale non permette di visualizzare l'orario corretto su serial monitor
perche' giustamente aprendolo arduino si resetta.
Ho letto spesso che si puo' disabilitare in vari modi il reset automatico, pero' al tuo sw serve proprio il reset per aggiornare l'ora.

Se credi cosa buona e' giusta rilasciare open il sw mi farebbe piacere studiarmelo, in modo da copiarlo in processing :slight_smile:

Ieri ho usato Simplewrite e simpleread di processing e mi sembrava essere un mago, accendere un led con il mouse e' la prima volta per me :slight_smile:

Testato:
pero' al tuo sw serve proprio il reset per aggiornare l'ora.

No al mio software non serve il reset per aggiornare l'ora, gli basta ricevere il carattere "@" per effettuare l'operazione, il giochetto del reset lo uso nell'esempio per farlo in automatico all'avvio.
In pratica basta che avvii il programma sul pc e ogni volta che dal tuo sketch chiami la funzione "swRTC_Time_Update();" l'orario del RTC viene sincronizzato con quello del pc senza bisogno di nessun reset.
Il limite della swRTC è che ti perdi l'orario ogni volta che spegni/resetti Arduino, aprendo il serial monitor automaticamente resetti Arduino e di conseguenza anche l'orario giusto.

Testato:
Se credi cosa buona e' giusta rilasciare open il sw mi farebbe piacere studiarmelo, in modo da copiarlo in processing :slight_smile:

Ho aggiunto il sorgente al post originale.

santo subito :slight_smile:
tento di capirci qualcosa, visto che io non ne so niente di queste cose, potresti dirmi i sw che hai usato ? o un link a una guida che mi faccia capire come passare dal tuo sorgente al tuo eseguibile ?

una cosa bella di processing che ho vsto e' che con un click si crea l'eseguibile win32-win64-linux32-linux64-mac32 e si interfaccia con l'adk di Android, quindi credo anche APK ma non ho provato ancora questa cosa

Con una semplice modifica puoi aprire la seriale senza resettare Arduino: devi disabilitare il segnale DTR.
--> http://arduino.cc/forum/index.php/topic,95684.0.html

Testato:
tento di capirci qualcosa, visto che io non ne so niente di queste cose, potresti dirmi i sw che hai usato ? o un link a una guida che mi faccia capire come passare dal tuo sorgente al tuo eseguibile ?

Il programma è scritto in C++ e compilabile direttamente tramite il cBuilder Borland, versione minima 5.0, dato che è allegato anche il file del progetto.

una cosa bella di processing che ho vsto e' che con un click si crea l'eseguibile win32-win64-linux32-linux64-mac32

Processing è java, in realtà crei un compilato che deve essere usato con la jvm, senza questa non funziona.
Io con il cBuilder posso creare sia degli eseguibili molto piccoli, poche decine di k, che però richiedono moltissimi mega di runtime da installare, oppure eseguibili compatti, pochi mega, che non richiedono nulla per poter girare, non vanno installati e non tocca installare nessuna runtime o macchina virtuale.
Un mio programma gira senza problemi anche su un vecchio pc, volendo pure un vecchio 386 con Windows 95, basta che lo compilo attivando le necessarie compatibilità, prova a installare la jvm su una macchina di questo tipo e far girare una applicazione processing che poi ci facciamo due risate assieme :smiley:

PaoloP:
Con una semplice modifica puoi aprire la seriale senza resettare Arduino: devi disabilitare il segnale DTR.
--> http://arduino.cc/forum/index.php/topic,95684.0.html

Peccato che questa modifica non è applicabile al serial monitor di Arduino.

astrobeed:

PaoloP:
Con una semplice modifica puoi aprire la seriale senza resettare Arduino: devi disabilitare il segnale DTR.
--> http://arduino.cc/forum/index.php/topic,95684.0.html

Peccato che questa modifica non è applicabile al serial monitor di Arduino.

Visto che stanno lavorando sulla beta 1.0.1 si potrebbe chiedere di aggiungere un flag che abilita o disabilità il DTR della seriale. :wink: :wink:
Però poi... chi se li spupazza i 10'000 utenti che non riusciranno più a fare l'upload degli sketch perchè non hanno flaggato l'opzione?? ]:smiley: ]:smiley:

Pero' non capisco il perche' di questa scelta ? capisco l'utilita' dell'autoreset durante il caricamento di sketch, ma perche' attivarlo durante il serial monitor ?
Secondo voi e' una scelta del team arduino, e quindi ci deve essere una ragione, oppure e' un bug mai risolto ?
Basta lasciare attivo l'automatismo solo sul caricamento sketch

Oppure lasciare il serial monitor senza autoreset e aggiungere un pulsante reset nell'interfaccia. :wink:

PaoloP:
Visto che stanno lavorando sulla beta 1.0.1 si potrebbe chiedere di aggiungere un flag che abilita o disabilità il DTR della seriale. :wink: :wink:

Loro usano una libreria java esterna a processing per dialogare tramite la seriale, la RXTXcomm, e non mi pare che permetta di disabilitare il segnale DTR.
Ti dirò di più, anche usando le recenti API 3.x di Java non mi risulta che sia possibile disabilitare i vari segnali di controllo della seriale, puoi solo leggerli, settarli e decidere come la seriale li prende in considerazione.

Testato:
Pero' non capisco il perche' di questa scelta ? capisco l'utilita' dell'autoreset durante il caricamento di sketch, ma perche' attivarlo durante il serial monitor

L'Arduino Team a suo tempo ha preso una decisione che si è rivelata un'arma a doppio taglio, il segnale DTR viene gestito in automatico dall'hardware della seriale, o dal driver software per seriale virtuale, non è il tuo software che deve gestirlo.
In pratica ogni volta che apri la porta seriale DTR passa dallo stato logico 1 a quello 0 e vi rimane fino a che la seriale non viene chiusa, questo segnale fa parte del sistema di handshake hardware per la gestione del flusso dati e viene cambiato di stato indipendentemente dal fatto che la seriale usa tale modalità oppure no.
Questo problema io l'ho risolto sulla Luigino 328 intercettando gli impulsi di reset con una piccola mcu aggiuntiva, un PIC12675, li blocco nel caso di normale dialogo sulla seriale e li faccio passare solo nel caso di reset reale dovuto alla fase di upload, in questo caso arriva una ben precisa sequenza di impulsi su DTR.
In teoria con la UNO, tutte le versioni, potevano facilmente risolvere il problema dell'autoreset indesiderato in due modi, quello semplicissimo prevedendo un banale jumper con cavallotto sulla linea del reset, c'è solo quello a saldare, oppure gestendo l'autoreset a livello del 8u2 tramite un apposito comando software inviato dall'IDE.
Chissa se nella UNO r4 ci arriveranno ad implementare questi semplici accorgimenti.

io testo, ho trovato il primo bug :slight_smile: (se si conferma rientro nei ringraziamenti :))

Nel setup tu per prima cosa richiami la funzione update sincronizzi l'orario, e poi ributti l'orario corretto verso il sw lato pc display in basso.

pero' subito dopo riresetti l'orario

swRTC_Time_Update();  // legge ora e data dal pc

    rtc.stopRTC(); //stop the RTC
    rtc.setTime(0,0,0); //set the time here
    rtc.setDate(01,01,2012); //set the date here
    rtc.startRTC(); //start the RTC
  
}

allo sketch vero e proprio non fornisci l'aggiornamento, il tuo e' un sw egoista, l'aggiornamento se lo tiene per se :slight_smile:

Hho provato quindi a sostituire il setup con questo, che mi sembrava logico, ma non funziona:

rtc.stopRTC(); //stop the RTC
    swRTC_Time_Update();  // legge ora e data dal pc
    rtc.startRTC(); //start the RTC

Testato:
io testo, ho trovato il primo bug :slight_smile: (se si conferma rientro nei ringraziamenti :))

Infatti hai ragione, per distrazione nello sketch ho inserito la sincronizzazione prima dell'inizializzazione della libreria, se riscarichi il pacchetto aggiornato ora è corretto.

dai ti sto' ripagando in natura :slight_smile:

piccolo problema, sempre legato all'autoreset.
sia facendo partire swsync, ma questo non sarebbe u problema, ma purtroppo anche semplicemente spegnendolo (sia fisicamente con il tasto X rosso, sia solo deselezionando il flag OPEN), sulla seriale arriva il reset.

Questo rende inutilizzabile il tutto, cioe' anche mettendo una batteria ad arduino, esso si resetta.
Secondo te staccando fisicamente la usb prima di chiudere swsync, arduino si resetta (su batteria logicamente) ?