Utilisation du bus I2C sur RaspberryPi

Dans la suite de l’article je présente l’activation puis l’utilisation du bus I2C sur la carte RaspberryPI (ou tout autre carte qui supporte un bus I2C : Olimex A13 ou iMX233, Beagle/PandaBoard de TI, TQ6410, etc…). L’interrogation des esclaves connectés au bus I2C peut se faire sans aucune programmation ! Cela permet de valider rapidement l’écriture ou la lecture des registres d’un esclave I2C. On peut alors passer à la programmation en C/C++ avec des valeurs validées.

Ressources internet

Une fois n’est pas coutume, je commence par les ressources Internet :

Brochage du connecteur

Vous trouverez sur Internet de nombreux exemples du brochage du connecteur du RaspberryPI. J’en ai choisi deux parmi d’autres:

GPIO_Officielgpio-ladyada

Les broches qui nous intéressent ici (pour la V2 revB) :

  • GPIO0 (SDA) : broche 3 du connecteur,
  • GPIO1 (SCL) : broche 5 du connecteur,
  • la masse (GROUND) : broche 6 du connecteur,
  • l’alimentation (on prendra des esclaves I2C qui fonctionnent en 3,3V) : broche 1 du connecteur

Utilisation de l’I2C sur le RaspberryPI

Activation de l’I2C

Il faut tout d’abord être « root » pour réaliser les commandes suivantes : sudo su. Il faut éditer le fichier « /etc/modprobe.d/raspi-blacklist.conf » avec l’éditeur nano puis commenter (mettre le caractère #) la ligne « blacklist i2c-bcm2708 ».
Puis rajouter la ligne « i2c-dev » dans le fichier « /etc/modules ». Redémarrez le RaspberryPI avec la commande « reboot ».
Pour vérifier que le pilote de l’I2C est bien chargé, tapez ces deux commandes:

  • dmesg | grep i2c : permet de visualiser les messages du noyau se rapportant au bus i2c,
  • ls /dev/i2c* : cette commande permet de savoir si le bus i2c est bien accessible depuis « l’espace utilisateur » donc depuis vos programmes.

Voici le résultat de ces deux commandes :

On remarque qu’il y a deux bus i2c reconnus sur la carte. La vitesse de ces bus est ici de 100kHz (mode basse vitesse du bus i2c). Ces deux bus sont accessibles par i2c-0 et i2c-1. En fait un seul bus est disponible sur le connecteur.

Installation des outils I2C

Pour tester si le bus I2C est fonctionnel on connecte une platine avec deux circuits :

  • un capteur de température DS1631,
  • une horloge temps réel DS3231.

Schéma électrique de la platine  et typon (échelle 2) :

schema-electrique-carte-ds1631-ds3231-sur-bus-i2c typon-carte-ds1631-ds3231-sur-bus-i2c

Il faut ensuite installer les outils nécessaires pour dialoguer sur le bus i2c sans programmer. En tant qu’utilisateur root, tapez la commande suivante:

L’utilitaire i2cdetect permet de parcourir le bus i2c pour détecter des esclaves reliés à ce bus. Les commandes suivantes permettent de parcourir le bus i2c-0 : raspberry V2revA ou le bus i2c-1 : raspberry V2revB.

On remarque que sur le bus i2c-1 il y a deux esclaves i2c :

  • adresse 0x48 : capteur DS1631 dont les lignes d’adresses A2, A1 et A0 sont reliées à la masse. L’adresse de ce composant est donné dans la documentation : 0b1001A2A1A0 donc 0b1001000 donc en hexadécimal 0x48.
  • adresse 0x68 : horloge RTC. Dans la documentation on trouve l’adresse suivante : 0b1101000 soit 0x68.

Le résultat du parcours du bus est donc concluant.

Utilitaires d’interrogation du bus i2c

Nous allons commencer à interroger le capteur de température de l’horloge temps réel. Le résultat de la conversion de température est accessible à l’adresse 0x11 sur deux octets (voir extrait de la documentation ci-dessous ) :

registre-temp-ds3231Vous disposez de deux utilitaires pour cela : i2cset et i2cget. Ci-dessous vous trouverez ce que renvoie ces commandes lorsqu’on les lance sans paramètres :

En gros on remarque qu’il faut spécifier :

  • le numéro du bus i2c,
  • l’adresse de l’esclave,
  • la ou les registres à écrire/lire.

Dans l’exemple qui suit, on lit la température fourni par l’horloge temps réél : adresse 0x68, registres 0x11 et lecture d’un mot (2 octets) :

On obtient la valeur hexadécimal 0x4013. La valeur 0x13 correspond au contenu du registre 0x11 (partie entière de la température). La valeur 0x40 correspond à la valeur du registre 0x12 (partie fractionnaire de la température) dont seul les bits B7 B6 nous intéresse. On obtient donc la température suivante : 0x13 = 19 et 0x40 => B7=0 et B6=1. B7 représente 2^-1=0,5°C et B6 représente 2^-2=0,25°C. La température finale est donc de 19,25°C.

Pour initialiser correctement la RTC, il faut écrire la valeur 0x04 dans le registre 0x0E (registre de « control ») et 0x08 dans le registre 0x0F (registre de « status »). Pour la signification de ces valeurs reportez-vous à la documentation officielle. Cela se traduit par les commandes suivantes :

Vous pouvez maintenant lire les secondes, minutes, heures, jour du mois, mois et année. Exemple avec la lecture des secondes et de l’année :

On obtient donc pour les secondes : 0x41 => 4 x 10s + 1 x 1s = 41s. Pour les années 0 ! La RTC n’est donc pas réglé. Je vous invite à chercher par vous même les commandes pour mettre à l’heure votre horloge RTC.

Bonus : installer une RTC sur le Raspberry

Par défaut, le raspberryPi n’a pas d’horloge RTC. Il récupère la date et l’heure au démarrage à condition d’avoir une connexion Internet. Pour pallier ce défaut on peut connecter au bus i2c une horloge.
Vous trouverez ci-dessous les pilotes gérés par le noyau Linux de la raspberry:

Une des plus répandues de ces horloges est certainement la DS1307. Cependant la DS3231 est compatible au niveau des registres de date et d »heure d’une DS1307, elle est plus chère mais aussi beaucoup plus précise. Les commandes suivantes permettent de régler la RTC à partir de l’heure récupérer sur Internet.

Si l’on détaille les lignes précédentes:

  1. déclaration d’un nouvel esclave sur le bus i2c : son type (ds1307) et son adresse (0x68),
  2. lecture de la date dans la RTC : ici la RTC n’est pas à l’heure,
  3. vérification de l’heure système avec la commande date,
  4. transfert de l’heure système dans la RTC : paramètre -w de la commande hwclock,
  5. vérification de l’heure de la RTC.

Pour que l’heure de la RTC soit appliquée au système au démarrage, il faut rajouter les lignes suivantes à la fin du fichier « /etc/rc.local » avant la ligne « exit 0 » :

  1. « echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device »,
  2. « sudo hwclock -s ».

3 réflexions au sujet de « Utilisation du bus I2C sur RaspberryPi »

  1. Ping : Electronique Innovante » Horloge RTC gérée par le noyau Linux sur RaspberryPi

  2. Ping : Electronique Innovante » RaspberryPi à tout faire…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *