In this course we’ll look at how to use an RTC or clock module with the Beaglebone Black.
An RTC module keeps the time when your Beaglebone Black is switched off. It is an essential electronic component in many applications where precise time management is crucial. This small, self-contained device features an internal clock powered by a button cell, enabling it to continue operating even in the absence of a main power supply.
The RTC module chosen for this course is the DS1307. It uses I2C to communicate with the Beaglebone Black.
Here’s the circuit to connect the RTC module to the Beaglebone Black:
To verify that our RTC module, we will check if it is recognized by I2C. To do this, type the command i2cdetect -y -r 2.
In the picture to see 68 appear, which is the address of our RTC module.
Once the RTC module is properly connected, we will see the program in order to retrieve and modify the time coming from the RTC module. The first step is to install the smbus library which manages I2C communication:
sudo apt-get install python3-smbus
Here is the program to read the time and date coming from the RTC module:
import smbus
import datetime
import time
# I2C address of the RTC module on the BeagleBone Black
rtc_address = 0x68
# I2C bus selection (0 on the BeagleBone Black)
i2c_bus = smbus.SMBus(2)
def read_rtc():
# Reading current time from RTC module
rtc_data = i2c_bus.read_i2c_block_data(rtc_address, 0, 7)
# Converting read data to datetime object
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:
# Reading and displaying the current time
current_time = read_rtc()
print(f"Current time: {current_time}")
# Wait 1 second before next reading
time.sleep(1)
except KeyboardInterrupt:
# Closing the program when interrupted
pass
finally:
# Closing the I2C bus at the end of the program
i2c_bus.close()
You probably realized in the previous program that the time was not accurate. This is why we are going to see a program to modify it.
import smbus
import time
# I2C address of the RTC module
rtc_address = 0x68
# I2C bus number on the BeagleBone Black
i2c_bus = 2
# Creation of the SMBus object
bus = smbus.SMBus(i2c_bus)
def set_rtc_time():
try:
# Reading the current time from the RTC
current_time = bus.read_i2c_block_data(rtc_address, 0x00, 7)
# Current time display
print(f"Current time: {current_time[2]}:{current_time[1]}:{current_time[0]}")
# Obtaining the new time from the user
new_hour = int(input("New time (24 hour format): "))
new_minute = int(input("New minute: "))
new_second = int(input("New second:"))
# Converting the new time to BCD (Binary-Coded Decimal) format
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)
# Writing the new time in the RTC
bus.write_i2c_block_data(rtc_address, 0x00, [new_second_bcd, new_minute_bcd, new_hour_bcd] + current_time[3:])
print("Time updated successfully!")
except Exception as e:
print(f"An error has occurred: {e}")
if __name__ == "__main__":
set_rtc_time()