Utilisation du bus i2c sur un Raspberry Pi

26 juillet 2014 - Mots-clés : Linux Raspberry Pi

Autorisez le bus i2c au boot : Ajoutez la ligne suivante au fichier /boot/config.txt :

device_tree_param=i2c_arm=on

Installez les packages nécessaires :

# pacman -S i2c-tools
# modprobe i2c-dev

Chargement du module i2c-dev au démarrage : Créez le fichier /etc/modules-load.d/i2c.conf en ajoutant la ligne suivante :

i2c-dev

Créez un groupe i2c et ajoutez l'utilisateur (franck ici) à ce groupe :

# groupadd i2c
# gpasswd -a franck i2c

Modification des droits des devices i2c : Créez le fichier /etc/udev/rules.d/i2c.rules :

KERNEL=="i2c-[0-9]*", GROUP="i2c"

Rebootez :

# shutdown -r now

Enfin, vous pouvez utiliser les outils i2c pour accéder aux devices en tant que simple user :

[franck@jannequin ~]$ i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
[franck@jannequin ~]$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Vous constatez la présence d'un chip i2c à l'adresse 0x68 (si l'horloge sauvegardée est bien connectée au bus i2c).

Accéder au bus i2c en Python

Le package i2c-tools contient un module Python pour accéder au poirt i2c.

Voir cet article pour voir des exemples.

Mise en oeuvre d'une horloge sauvegardée

Le module en ma possession est à base d'un composant ds3231 qui est compatible avec le ds1307.

Pour indiquer au kernel la disponibilité d'une horloge sauvegardée : Ajoutez la ligne suivante au fichier /boot/config.txt :

dtoverlay=i2c-rtc,ds3231

Chargement du module au démarrage : Ajoutez la ligne suivante au fichier /etc/modules-load.d/i2c.conf :

rtc-ds1307

Rebootez.

Le device /dev/rtc (lien symbolique sur /dev/rtc0) est créé :

# ls -l /dev/rtc*
lrwxrwxrwx 1 root root      4 Jul 23 22:50 /dev/rtc -> rtc0
crw------- 1 root root 254, 0 Jul 23 22:50 /dev/rtc0

Pour un démarrage automatique avec systemd, créez un fichier /usr/lib/systemd/scripts/rtc :

#!/bin/bash
hwclock -s

et le rendre exécutable :

# chmod +x /usr/lib/systemd/scripts/rtc

Créez le fichier de configuration pour systemd /etc/systemd/system/rtc.service :

[Unit]
Description=RTC clock
Before=netctl-auto@wlan0.service
[Type]
Type=oneshot

[Service]
ExecStart=/usr/lib/systemd/scripts/rtc

[Install]
WantedBy=multi-user.target

et testez le :

# systemctl start rtc

en l'absence d'erreur, on l'autorise au démarrage :

# systemctl enable rtc

Lecture directe du matériel :

# hwclock -r
Sat Jul 26 00:56:49 2014  -0.222152 seconds