Librairie bcm2835 Cette librairie en langage C propose des fonctions pour accéder aux GPIOs de la Raspberry Pi. Installation Cette librairie n’est pas disponible dans les dépôts logiciels de Raspberry Pi OS et ne peut donc pas être installée avec apt get install …. Se rendre sur C library for Broadcom BCM 2835 as used in Raspberry Pi pour récupérer dans la description de la librairie le lien de téléchargement de son code source (quelque chose comme http://www.airspayce.com/mikem/bcm2835/bcm2835-1.xx.tar.gz où “xx” correspond au n° de version) Procéder au téléchargement sur la Raspberry Pi soit directement depuis le navigateur web soit depuis la ligne de commande : Exemple wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.69.tar.gz Suite au téléchargement, suivre la procédure indiquée sur le site à savoir : # download the latest version of the library, say bcm2835-1.xx.tar.gz, then: tar zxvf bcm2835-1.xx.tar.gz cd bcm2835-1.xx ./configure make sudo make check sudo make install Si tout s’est bien déroulé, la librairie doit alors être présente dans le répertoire /usr/local/lib/ sous le nom libbcm2835.a. Après l’installation et si vous utilisez un environnement de cross-compilation ne pas oublier de synchroniser les systèmes de fichiers entre la Raspberry Pi et l’environnement de cross-compilation. Exemple $ rsync -avz pi@rpi-defrance.local:/usr/local sysroot/usr (1) 1 Commande a exécuter sur le PC de développement → permet de récupérer les fichiers bcm2835.h et libbcm2835.a sur l’environnement de cross-compilation. Utilisation Un programme utilisant cette librairie devra obligatoirement être exécuté en tant qu’utilisateur root — sous peine d’obtenir une erreur Segmentation fault — s’il accède à d’autre broches que les entrées/sorties en “Tout ou Rien” et notamment aux bus I2C et SPI. Principes généraux Inclure l’entête de la librairie avec : #include <bcm2835.h> Initialiser impérativement mais une seule fois la librairie en appelant bcm2835_init() Utiliser les fonctions de la librairie pour accéder aux GPIOs Fermer la librairie en appelant bcm2835_close() Compiler le programme en le linkant avec la librairie grâce à l’option -l bcm2835 Exemple avec gcc: $ gcc -o prog prog.c -l bcm2835 Dans Qt, l’ajout d’une librairie pour l’édition de liens s’effectue de manière graphique depuis Qt Creator Exécuter le programme : $ sudo prog Dans Qt Creator, on peut exécuter un programme en tant que root en appliquant la configuration suivante : Exemple n°1 La librairie bcm2835 est livrée avec un programme d’exemple qui illustre comment accéder au bus I2C avec les fonctions qu’elle met à disposition. Son source est visualisable depuis la documentation de la librairie à l’adresse https://www.airspayce.com/mikem/bcm2835/i2c_8c-example.html Outre le fait que cet exemple montre comment utiliser les fonctions de la librairie, il peut aussi permettre de tester rapidement la communication avec un périphérique I2C. Utilisation de l’exemple fourni pour communiquer avec un capteur SHT20 pi@rpi-defrance:~ $ sudo ./bcm2835-i2c-test -c2500 -s64 -dw -ib 1 243 (1) Running ... Clock divider set to: 2500 len set to: 1 Slave address set to: 64 Write Result = 0 ... done! pi@rpi-defrance:~ $ sudo ./bcm2835-i2c-test -c2500 -s64 -dr -ib 3 (2) Running ... Clock divider set to: 2500 len set to: 3 Slave address set to: 64 Read Result = 0 Read Buf[0] = 63 Read Buf[1] = a0 Read Buf[2] = 84 ... done! 1 On exécute le programme d’exemple pour écrire (→ -dw) 1 octet 243 = 0xF3 sur le capteur à l’adresse 64 = 0x40 (→ -s64) à une fréquence de 100kHz (→ -c2500) après avoir initialisé le transfert (→ -ib). L’octet envoyé correspond à une demande d’acquisition de la température sur le capteur. 2 On exécute à nouveau le programme pour lire (→ -dr) 3 octets sur le même capteur à la même fréquence. Ces 3 octets correspondent à la température pour les 2 premiers octets et un checksum pour le 3ème. Selon la datasheet, cela correspond à une température de ((0x63a0 & 0xfffc) / 65536) * 175.72 - 46.85 = 21.53°C Exemple n°2 L’objectif de cet exemple est de montrer comment utiliser la librairie bcm2835 depuis une application Qt en faisant en sorte de l’intégrer dans un cadre de développement C++ alors que la librairie est, elle-même, codée en langage C. L’application consiste à afficher toutes les 2s la température relevée sur un capteur de température sur bus I2C (réf. SHT21). Le code source de cette application est fournie dans cette archive . L’application fournie est configurée (→ fichier .pro) pour être compilée dans un environnement de cross-compilation. Il faudra donc l’adapter pour correspondre à votre environnement de développement. D’autres notions, que l’appel aux fonctions de la librairie bcm2835 pour lire la valeur de la température sur le capteur, sont abordées dans cet exemple : le codage d’un Wrapper le codage du patron de conception “Singleton” Un Wrapper est simplement une interface vers une librairie existante visant à : permettre à plusieurs codes de fonctionner ensemble malgré certaines incompatibilités (ex. : formats de données) redéfinir l’API (→ Application Program Interface) d’une librairie existante parce qu’elle vous semble mal conçue ou trop compliquée. permettre l’interopérabilité avec d’autres langages ou environnements d’exécution (ex. : utiliser une librairie C/C++ depuis Python). Un Singleton est simplement le nom d’une “recette de programmation” qui permet d’interdire l’instanciation multiple d’une classe C++. Dans notre cas, ceci permettra d’initialiser 1 et 1 seule fois la librairie avec bcm2835_init() quel que soit le nombre d’objets faisant appel à la classe Bcm2835Wrapper. Dans l’exemple fourni, les objectifs du Wrapper Singleton (→ classe Bcm2835Wrapper) sont donc de : simplifier l’interface de la librairie bcm2835 en n’y intégrant que les fonctions dont on se sert vraiment proposer une solution qui permettra d’initialiser 1 et 1 seule fois la librairie avec bcm2835_init() quel que soit le nombre d’objets faisant appel à la classe Bcm2835Wrapper (→ appel de cette fonction depuis le constructeur) Références Documentation de la livrairie bcm2835 Groupe de discussion de la librairie bcm2835 🞄 🞄 🞄 Astuces système d’exploitation Écran tactile 7"