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 :
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.
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 :
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 :