Conectarea unui RTC I2C la o placă Raspberry Pi
Una din problemele cele mai delicate în utilizate plăcii de dezvoltare Raspberry Pi este contorizarea exactă a trecerii timpului / menținerea orei exacte. Implicit funcționarea plăcii Raspberry Pi pleacă de la presupunerea că există întotdeauna disponibilă o conexiune Internet prin intermediul căreia se va face sincronizarea de timp și astfel se va asigura o contorizare exactă a trecerii timpului. În cazurile în care nu este disponibilă o conexiune Internet, sisteme izolate care funcționează în mod autonom de exemplu, menținerea orei exacte în mod corect este o provocare mai ales după întreruperea alimentării. Cea mai simplă soluție pentru a preveni funcționarea utilizând o referință de timp eronată este adăugarea plăcii Raspberry Pi a unui modul RTC (Real Time Clock).
Un modul RTC este capabil să contorizeze în mod exact trecerea timpului și, mai mult decât atât, este capabil să mențină setările de oră și dată în lipsa alimentării cu energie electrică utilizând o mică baterie de 3V.
În cadrul proiectului de față vom exemplifica utilizarea unui modul RTC cu o placă Raspberry Pi prin două variante de modul RTC:
SparkFun Real Time Clock Module bazat pe circuitul DS1307 – unul dintre cele mai utilizate circuite RTC;
https://www.robofun.ro/module/module-rtc/real_time_clock
Olimex Real Time Clock RTC bazat pe circuitul NXP PCF8563.
https://www.robofun.ro/module/module-rtc/mod-rtc
Ambele module RTC se vor interconecta cu placa Raspberry Pi prin intermediul protocolului serial I2C.
Circuitul DS1307 funcționează la 5V din acest motiv pentru a putea interconecta modulul cu placa de dezvoltare Raspberry Pi (a cărei linii I2C nu acceptă niveluri de tensiune mai mari de 3.3V) este nevoie să dezactivăm rezistențele de pull-up aflate pe PCB-ul modulului și care țin liniile I2C la 5V – comunicația I2C va utiliza rezistențele de pull-up aflate pe placa Raspberry Pi. Dezactivarea se face prin decositorirea unui jumper al modulului (indicat în imaginea următoare). ATENȚIE!!! Este esențială decositorirea corectă, deconectarea sigură a rezistențelor ce țin liniile I2C conectate la 5V altfel este posibilă distrugerea pinilor plăcii Raspberry Pi. Se poate verifica suplimentar, cu ajutorul unui multimetru, rezistența dintre pinii 5V și SDA/SCL. Dacă rezistența este infinită (indicată de obicei de multimetru prin 1) atunci decuplarea este corectă și putem conecta modulul la placa Raspberry Pi. Dacă multimetru indică între 2 și 4Kohm atunci rezistențele nu au fost deconectate corect – se poate încerca răzuirea fină a jumperului cu o lamă.
Modalitatea de conectare a celor două module cu placa de dezvoltare este similară: pinii SDA, SCL ai modulelor se conectează la pinii SDA, SCK ai plăcii Raspberry PI (pinii 3 și 5). Pinul GND se conectează la pinul de GND (pinul 6). Modulul bazat pe DS1307 are conectat pinul de 5V la pinul de 5V al plăcii Raspberry Pi (pinul 4) iar modulul bazat pe PCF8563 are pinul de alimentare conectat la pinut de 3.3V al plăcii Raspberry Pi (pinul 1).
Conectorul modulului RTC bazat pe circuitul PCF8563 este de tip UEXT (specific companiei Olimex – imagine mai jos) iar semnificația pinilor este următoarea: pinul 1 – 3.3V, pinul 2 – GND, pinul 5 – SCL și pinul 6 – SDA.
Pentru menținerea orei și datei ambele module RTC necesită o baterie de 3V. Modulul DS1307 necesită o baterie de 12mm (inclusă în kit), de exemplu CR1225. Modulul PCF8563 necesită o baterie de 20mm (nu este inclusă în kit), de exemplu CR2032.
După conectarea modulului RTC la placa de dezvoltare Raspberry Pi este necesară configurarea sistemului de operare pentru a utiliza această componentă. Succesiunea următoare de comenzi a fost testată pe un sistem Raspbian 8.0 (jessie) cu kernel 4.1.17-v7+. Alte distribuții de Linux specifice plăcii Raspberry Pi este posibil să necesite o altă modalitate de configurare.
Se va instala suportul software pentru comunicația I2C:
sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-tools
Se va activa comunicația I2C utilizând utilitarul raspi-config:
sudo raspi-config
În acest moment putem verifica conexiunea între placa de dezvoltare și componenta RTC prin intermediul comenzii:
sudo i2cdetect -y 1
ce va indica adresa I2C a modulului conectat: 0x68 pentru DS1307 și 0x51 pentru PCF8563.
Dacă conexiunea între modulul RTC și placa de dezvoltare este în regulă putem configura fișierele de inițializare a sistemului de operare pentru a utiliza modulul RTC.
În fișierul /boot/config.txt se adaugă următoarea linie:
dtoverlay=i2c-rtc,ds1307
sau
dtoverlay=i2c-rtc,pcf8663
în funcție de modulul folosit.
Se va înlătura serviciul sistemului de operare ce emulează ceasul hardware:
sudo apt-get -y remove fake-hwclock
sudo update-rc.d -f fake-hwclock remove
iar în fișierul /lib/udev/hwclock-set se vor comenta următoarele linii
#if [ -e /run/systemd/system ] ; then
# exit 0
#fi
și se va reporni sistemul:
sudo reboot
După repornire se poate verifica funcționarea corectă a modulului RTC și a mecanismelor specifice sistemului de operare prin următoarele comenzi:
Prima inițializare a modulului RTC se va face prin intermediul comenzii:
sudo hwclock -D -r
Sincronizarea timpului sistemului cu modulul RTC se va face prin comanda (scrierea datei sistem în memoria modulului RTC):
sudo hwclock -w
Consultarea informațiilor din modulul RTC se va face prin comanda:
sudo hwclock -r
După setarea inițială a modulului RTC sistemul Raspberry Pi se va sincroniza automat la fiecare repornire cu informațiile stocate în memoria internă a modulului RTC – la fiecare repornire ora și data se vor inițializa cu ajutorul modulului RTC care păstrează informațiile și în lipsa alimentării cu energie electrică.