#Real Time Clock PCF8523 su CM3 Panel
<abstract>
Appunti collegamento modulo Real Time Clock (PCF8523) su CM3 Panel Acme Systems
</abstract>
### Testato su Raspbian GNU/Linux 9.4 (stretch) Kernel 4.14.34-v7+
Installazione dei pacchetti necessari:
<pre class="terminal">
$ sudo apt-get install python-smbus i2c-tools
</pre>
Modificare il file config.txt :
<pre class="terminal">
$ sudo nano /boot/config.txt
</pre>
Aggiungere alla fine del file:
<pre class="terminal">
# RTC PCF8523 GPIO 28 - GPIO 29 (i2c1 utilizzato dal touch screen)
dtoverlay=i2c0-bcm2708,sda0_pin=28,scl0_pin=29,pin_func=6
dtoverlay=i2c0-rtc,pcf8523
</pre>
Lanciare in sequenza i seguenti comandi
<pre class="terminal">
$ sudo apt-get -y remove fake-hwclock
$ sudo update-rc.d -f fake-hwclock remove
$ sudo systemctl disable fake-hwclock
</pre>
Editare il file /lib/udev/hwclock-set e commentare le linee seguenti:
<pre class="terminal">
$ sudo nano /lib/udev/hwclock-set
</pre>
<pre class="terminal">
#if [ -e /run/systemd/system ] ; then
# exit 0
#fi
</pre>
Modificare il file /etc/modules:
<pre class="terminal">
$ sudo nano /etc/modules
</pre>
<pre class="terminal">
# /etc/modules: kernel modules to load at boot time.
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
snd-bcm2835
spi-bcm2708
i2c-bcm2708
i2c-dev
rtc-8523
</pre>
Modificare il file /etc/rc.local ed inserire prima della riga dove scritto exit 0 le seguenti istruzioni:
<pre class="terminal">
$ sudo nano /etc/rc.local
</pre>
<pre class="terminal">
# PCF8523
echo pcf8523 0x68 > /sys/class/i2c-adapter/i2c-0/new_device
exit 0
</pre>
Effettuare il reboot della scheda.
<pre class="terminal">
$ sudo reboot
</pre>
Dopo il reboot lanciare il comando :
<pre class="terminal">
sudo i2cdetect -y 0
</pre>
Sotto il risultato da ottenere, significa che l'indirizzo corrispondente è 0x68, esattamente quello che abbiamo inserito in precedenza nel file /etc/rc.local
<pre class="terminal">
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
</pre>
Il comando seguente permette di vedere l'indirizzo utilizzato dal touch screen (i2c-1), ecco il motivo delle modifiche eseguite rispetto alla procedura trovata sul sito.
<pre class="terminal">
sudo i2cdetect -y 1
</pre>
Ora lanciare il comando seguente:
<pre class="terminal">
sudo hwclock -D -r
</pre>
Verifica con comando dmesg, devono risultare le righe indicate di seguito.
<pre class="terminal">
dmesg
[ 12.149577] i2c i2c-0: new_device: Instantiated device pcf8523 at 0x68
[ 12.177994] rtc-pcf8523 0-0068: rtc core: registered rtc-pcf8523 as rtc0
</pre>
### Questa la parte dei collegamenti tra il modulo RTC e la scheda Acme CM3 Panel:
Connettore espansione EXP2
<img src="./EXP2b.jpg" class="img-responsive left-block" width="30%" />
Connettore PCF8523
<img src="./RTC8523.jpg" class="img-responsive left-block" width="20%" />
Tabella riepilogativa collegamenti tra i pin del modulo RTC e quelli del connettore EXP2 della CM3 Panel.
<img src="./Connessioni.jpg" class="img-responsive left-block" />
<div class="alert alert-warning">
<strong>Attenzione !</strong><br>
<font color="red">
Ora faccio un test sullo scarto di precisione del modulo RTC, ho una CM3 Panel-U collegata alla rete internet ed un altra CM3 Panel-W alla quale è collegato il modulo RTC. La CM3 Panel-W è stata spenta dalle ore 18:00 del giorno precedente e riaccesa il giorno successivo alle ore 08:00 senza connessione alla rete internet.
Verificando attraverso il sito: http://www.oraesattaitalia.it/ c'è uno scarto di +2 secondi, viene effettuato lo stesso test sulla CM3 Panel-U, in questo caso lo scarto è di +1 secondo.
</font>
</div>
Sulla CM3 Panel-U lancio il seguente comando:
<pre class="terminal">
$ sudo ntpdate ntp1.inrim.it
16 May 08:14:44 ntpdate[1575]: adjust time server 193.204.114.232 offset -0.000823 sec
</pre>
<div align="justify">
Provo a rifare lo stesso test sulla CM3 Panel-W, questa volta collegata alla rete WiFi, ma all'accensione mi accorgo che il clock è sincronizzato. Occorre che ripeto il test perchè avevo dimenticato che all'accensione la scheda c'è impostato il cron per la sincronizzazione dell'orario.
</div>
<pre class="terminal">
# Cronjob
@reboot sudo ntpdate ntp1.inrim.it
</pre>
Lanciando il comando sulla scheda con RTC ottengo:
<pre class="terminal">
$ sudo hwclock -D -r
hwclock from util-linux 2.29.2
Using the /dev interface to the clock.
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
/dev/rtc does not have interrupt functions. Waiting in loop for time from /dev/rtc to change
...got clock tick
Time read from Hardware Clock: 2019/05/16 06:38:53
Hw clock time : 2019/05/16 06:38:53 = 1557988733 seconds since 1969
Time since last adjustment is 1557988733 seconds
Calculated Hardware Clock drift is 0.000000 seconds
2019-05-16 08:38:52.386158+0200
</pre>
<div align="justify"><font color="blue">
Ora sulla CM3 Panel-W con modulo RTC disattivo l'aggiornamento dell'orario al reboot e procedo alla sincronizzazione dell'orario di sistema (NTP server Italiano ntp1.inrim.it) attraverso il comando seguente:
</font></div>
<pre class="terminal">
$ sudo ntpdate ntp1.inrim.it
</pre>
<div align="justify"><font color="blue">
Ora scrivo l'orario di sistema su quello hardware.
</font></div>
<pre class="terminal">
$ sudo hwclock -w # Set the hardware clock from the current system time
</pre>
<div align="justify"><font color="blue">
Esempi.
</font></div>
<pre class="terminal">
$ sudo hwclock -r # Read hardware clock and print result
$ date # Read system clock and print result
</pre>
### Esito test di verifica sulla scheda con modulo RTC
La scheda è stata spenta alle ore 10:00 il giorno precedente e riaccesa alle ore 11:30 del giorno successivo. La stessa una a volta avviata non ha effettuato <b>volutamente</b> nessuna sincronizzazione tramite server NTP server italiano.
Una volta lanciato il comando seguente di sincronizzazione con lo stesso server NTP, il risultato è il seguente (offset 0.000914 sec).
<pre class="terminal">
$ sudo ntpdate ntp1.inrim.it
# Risultato
17 May 11:39:35 ntpdate[1301]: adjust time server 193.204.114.232 offset 0.000914 sec
</pre>
### Datasheet
<a href="./PCF8523.pdf">Modulo RTC PCF 8523</a>
### Links
* CM3-PANEL - Panel PC based on Raspberry Compute Module 3 lite <https://www.acmesystems.it/CM3-PANEL>
* Set Up & Test I2C | Adding a Real Time Clock to Raspberry Pi | Adafruit Learning System <https://learn.adafruit.com/adding-a-real-time-clock-to-raspberry-pi/set-up-and-test-i2c>
@include='bio_mauro_tocci'
2018 Ⓒ TanzoLab