Introduction

Dans ce cours on va voir comment utiliser un module RTC ou module d’horloge avec la Beaglebone Black.

Un module RTC permet de conserver l’heure lors que votre Beaglebone Black est hors tension. Il est un composant électronique essentiel dans de nombreuses applications où la gestion précise du temps est cruciale. Ce petit dispositif autonome est doté d’une horloge interne alimentée par une pile bouton, ce qui lui permet de continuer à fonctionner même en l’absence d’alimentation principale.

Le module RTC choisit pour ce cours est le DS1307. Il fonctionne en I2C pour communiquer avec la Beaglebone Black.

Voici le circuit pour connecter le module RTC à la Beaglebone Black :

Comment vérifier si le module RTC est bien connecté ?

Pour vérifier que notre module RTC, on va vérifier si celui-ci est reconnu par l’I2C. Pour cela on tape la commande i2cdetect -y -r 2.

Sur l’image pour voir 68 apparaître, ce qui est l’adresse de notre module RTC.

Lecture heure module rtc

Une fois le module RTC bien connecté, on va voir le programme afin de récupérer et de modifier l’heure venant du module RTC. La première étape est d’installer la librairie smbus qui gère la communication I2C :

sudo apt-get install python3-smbus

Voici le programme pour lire l’heure et la date venant du module RTC :

import smbus
import datetime
import time

# Adresse I2C du module RTC sur la BeagleBone Black
rtc_address = 0x68

# Sélection du bus I2C (0 sur la BeagleBone Black)
i2c_bus = smbus.SMBus(2)

def read_rtc():
    # Lecture de l'heure actuelle à partir du module RTC
    rtc_data = i2c_bus.read_i2c_block_data(rtc_address, 0, 7)

    # Conversion des données lues en objet datetime
    year = rtc_data[6] + 2000
    month, day, hour, minute, second = rtc_data[5], rtc_data[4], rtc_data[2]& 0x3F, rtc_data[1] & 0x3F, rtc_data[0]& 0x3F

    current_time = datetime.datetime(year, month, day, hour, minute, second)
    return current_time

try:
    while True:
        # Lecture et affichage de l'heure actuelle
        current_time = read_rtc()
        print(f"Heure actuelle : {current_time}")

        # Attente d'une seconde avant la prochaine lecture
        time.sleep(1)

except KeyboardInterrupt:
    # Fermeture du programme lorsqu'il est interrompu
    pass

finally:
    # Fermeture du bus I2C à la fin du programme
    i2c_bus.close()

Voici ce que l’on obtient sur Cloudide9 lorsque l’on lance le programme :

Changer heure module rtc

Vous vous êtes surement  rendu dans le programme précédent que l’heure n’était pas exacte. C’est pourquoi on va voir un programme pour modifier celle-ci.

import smbus
import time

# Adresse I2C du module RTC
rtc_address = 0x68

# Numéro du bus I2C sur le BeagleBone Black
i2c_bus = 2

# Création de l'objet SMBus
bus = smbus.SMBus(i2c_bus)

def set_rtc_time():
    try:
        # Lecture de l'heure actuelle depuis le RTC
        current_time = bus.read_i2c_block_data(rtc_address, 0x00, 7)
        # Affichage de l'heure actuelle
        print(f"Heure actuelle: {current_time[2]}:{current_time[1]}:{current_time[0]}")

        # Obtention de la nouvelle heure auprès de l'utilisateur
        new_hour = int(input("Nouvelle heure (format 24 heures): "))
        new_minute = int(input("Nouvelle minute: "))
        new_second = int(input("Nouvelle seconde:"))

        # Conversion de la nouvelle heure en format BCD (Binary-Coded Decimal)
        new_hour_bcd = ((new_hour // 10) << 4) | (new_hour % 10)
        new_minute_bcd = ((new_minute // 10) << 4) | (new_minute % 10)
        new_second_bcd = ((new_second // 10) << 4) | (new_second % 10)

        # Écriture de la nouvelle heure dans le RTC
        bus.write_i2c_block_data(rtc_address, 0x00, [new_second_bcd, new_minute_bcd, new_hour_bcd] + current_time[3:])
        print("Heure mise à jour avec succès!")

    except Exception as e:
        print(f"Une erreur s'est produite: {e}")

if __name__ == "__main__":
    set_rtc_time()

Voici ce qui se passe en lançant le programme :

En relançant le programme précédent on obtient la nouvelle heure :