Bonjour à tous,
Pour un besoin très particulier (donner l’heure à des dongles OTT dans un réseau multicast sans accès à un quelconque autre réseau), j’ai eut besoin d’un serveur NTP dans mon réseau interne.
Je me suis naturellement tourné vers un Raspberry, malheureusement j’avais un peu oublié le fait que le raspberry était dépourvu de hardware clock, mais pas de soucis, j’en avais un ou deux en rab pour mes projets Arduino.
J’avais donc en stock un DS3231 mais ce tuto est le meme pour le module DS1307 (suffit juste de changer le nom aux bons endroits).
Si vous voulez directement commander le meme, voici ou vous pourrez le trouver :
Aliexpress pour 60 centimes environs (Si vous n’etes pas pressé, ça prends entre deux semaines et deux mois)
Amazon pour un peu moins de 6 euros (Mais avec la livraison en un jour ouvré)
-Première étape, installation et paramétrage du module RTC.
La première étape consiste donc à connecter le module RTC à notre Raspberry grace aux GPIO.
Nous allons donc connecter GND et 5v pour l’alimentation du module et les pates SDA et SCL pour la communication i2c entre le RPI et le module RTC
Voici ce que donne le schémas de câblage à partir d’un Raspberry Rev 2 (Pour le plus vieux, les pins SDA et SCL diffèrent, reportez vous au schémas des pins GPIO de votre modèle de RPI pour être sur du câblage):
RPI Pin |
RTC Pin |
Pin 4 (5V) |
VCC |
Pin 6 (GND) |
GND |
Pin 3 (SDA) |
SDA |
Pin 5 (SCL) |
SCL |
Et voici le schémas des GPIO du Raspberry B :
Une fois le module correctement cablé, nous allons passer au paramétrage du système :
Dans Raspbian, l’i2c est désactivé par défaut, nous allons donc l’activer via un terminal :
sudo raspi-config
Via le menu qui s’affiche, sélectionnez Advanced Options puis I2C.
Choisissez Yes, votre interface i2c est maintenant activé.
Nous allons vérifier maintenant que l’ensemble communique bien, pour ce faire, il va falloir installer les packets suivants :
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
Grace à ces outils, nous allons lancer un scan i2c nous permettant de voir que notre module est bien reconnu :
sudo i2cdetect -y 1
Vous devriez voir ceci :
Si vous avez un vieux Raspberry, faites à la place :
sudo i2cdetect -y 0
Notre module RTC est bien présent à l’adresse 68.
Si cela ne fonctionne pas, vous pouvez essayer de charger les modules i2c-dev et i2c-bcm2708 à la main :
sudo modprobe i2c-dev
sudo modprobe i2c-bcm2708
Si cela fonctionne, vous pourrez alors ajouter ces modules dans /etc/modules en exécutant la commande suivante :
sudo nano /etc/modules
Et ajoutez à la fin du fichier les deux lignes suivantes :
i2c-dev
i2c-bcm2708
Au prochain redémarrage, les modules seront automatiquement chargés, et il ne sera pas nécessaire de faire un modprobe.
Nous avons maintenant une Horloge matériel correctement relié à notre Raspberry et bien reconnu.
Nous allons maintenant la déclarer à l’OS pour pouvoir ensuite l’utiliser :
echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
Comme je l’ai précisé plus haut, si vous avez un module DS1307, vous devrez taper ds1307 à la place de ds3231.
Nous pouvons maintenant afficher l’heure enrengistré dans le module RTC :
sudo hwclock
Si c’est la première fois que vous utilisez le module, vous devriez avoir une date au 1er janvier 2000.
Nous allons maintenant définir la date et l’heure au module RTC :
-Définir la date et l’heure du système depuis internet et l’enregistrer dans le module RTC:
Paramétrons les bons fuseaux horaires de l’OS soit par le menu raspi-config soit par :
sudo dpkg-reconfigure tzdata
Choisissez bien le bon continent et la bonne zone.
Vous pouvez maintenant vérifier la date et l’heure du système en tapant dans un terminal :
date
Si vous etes à la bonne date/heure, nous allons maintenant l’écrire dans le module RTC :
sudo hwclock -w
-Définir la date et l’heure du système manuellement et l’enregistrer dans le module RTC:
Si votre Raspberry pi n’a pas accès à internet pour se synchroniser à une horloge précise, vous pouvez toujours utiliser la commande suivante pour définir une date arbitraire (ici le 24 Octobre 2016, à 16h15:00s) :
sudo date -s "Sep 24 2016 16:15:00"
Une fois l’horloge système réglé manuellement, nous allons l’écrire dans le module RTC (l’horloge matériel) :
sudo hwclock -w
-Configuration du système pour utiliser automatiquement le module RTC
Nous avons donc pu définir la date et l’heure de l’horloge matériel, voyons maintenant comment configurer le RPI pour qu’il utilise ce module à chaque démarrage:
Editez le fichier /etc/rc.local via la commande :
sudo nano /etc/rc.local
Et ajoutez les deux lignes suivantes avant la ligne exit 0 :
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 2
hwclock -s
/etc/init.d/ntp start
Nous pouvons maintenant désactiver le service fake-hwclock qui tente de reproduire le fonctionnement d’une horloge temps réel quand on en dispose pas:
sudo update-rc.d fake-hwclock disable
Nous pouvons également désactiver le service NTP qui n’es pas nécessaire :
sudo update-rc.d ntp disable
Si par la suite on souhaite synchroniser la date et l’heure du système avec celle de serveurs de temp, on pourra utiliser la commande suivante :
sudo ntpd -qg
Sans oublier d’écrire ensuite l’heure dans le module RTC :
sudo hwclock -w
Nous avons maintenant un Raspberry Pi avec une Horloge matériel, si la pile bouton que vous avez inséré dans votre module RTC fonctionne, vous pouvez débrancher et rebrancher votre Raspberry, meme sans connexion internet il devrait rester à l’heure !!
-Seconde étape, installation et paramétrage du serveur NTP.
Commençons par installer les paquets nécessaire :
sudo apt-get install ntp ntpdate
On édite ensuite le fichier /etc/ntp.conf:
sudo nano /etc/ntp.conf
Ajoutez au serveur NTP l’accès a l’horloge RTC:
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
Commentez la ligne :
restrict 127.0.0.1
Et ajoutez pour accepter toutes les requêtes NTP : (Si vous voulez vous limiter au réseau ex : 192.168.1.0/24 : restrict 192.168.1.0 mask 255.255.255.0)
restrict 0.0.0.0 mask 0.0.0.0
OPTIONNEL : Si vous voulez diffuser l’heure sur votre adresse réseau de broadcast :
broadcast 192.168.1.255
Vous pouvez maintenant redémarrer votre serveur NTP :
sudo /etc/init.d/ntp restart
Bon courage pour la suite …