I2C sur le Raspberry Pi

13 septembre 2012

... et avec une manette Wii.

 Pré-requis

Nous avons eu besoin :

  • D’un Raspberry Pi
  • D’une manette de Wii (nunchuck ou Wii classic controler)
  • D’un câble maison

Pour relier la manette au Raspberry Pi, nous réalisons un câble maison à l’aide de barrettes sécables. Des barrettes sécables mâles coté manette et femelle coté Raspberry Pi. Pour le brochage, nous nous servons de la page du wiki Raspberry Pi et d’un schéma glanné sur internet.


Connecteur Wii, vu de face

Connecteur du Raspberry Pi

Coté Raspberry Pi, il faut un noyau Linux un peu plus récent que celui présent dans la distribution de juin 2012. Ce nouveau noyau a besoin d’un nouveau firmware, ça à l’air compliqué à résoudre, mais non. Les détails sont ici !

À la fin de la manipulation, les ports I2C doivent apparaître dans /sys/class/i2c-adapter

Mise à jour : La manipulation de mise à jour du noyau n’est plus nécessaire sur un noyau récent. Si la version de votre noyau est égale ou supérieure à 3.2, vous n’avez pas besoin de le mettre à jour.

Par contre, les modules sont peut-être désactivés. Si vous n’avez rien dans /sys/class/i2c-adapter, commentez la ligne "blacklist i2c-bcm2708" du fichier /etc/modprobe.d/raspi-blacklist.conf.

Pour connaitre la version de votre noyau Linux, tapez la commande suivante :

uname -r

 Détection de la manette

Il faut charger le pilote I2C avec :

sudo modprobe i2c-dev
Il est possible de lancer une détection automatique des périphériques I2C branchés avec i2cdetect. i2cdetect n’étant pas installé sur le Raspberry Pi, la méthode simple pour l’utiliser est d’installer le paquet i2c-tools :

sudo apt-get install i2c-tools
Nous lançons ensuite la détection sur le port i2c 0 :

Utilisation d'i2cdetectpoivron@rapsberry:~$ sudo i2cdetect 0 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-0. I will probe address range 0x03-0x77. Continue? [Y/n] Y 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: 03 04 05 06 07 -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- 52 -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Les huit premières adresses sont réservées et ne doivent pas être utilisée. On remarque la manette à l’adresse 0x52 (c’est bien de l’hexadécimal). A partir de la, nous avons résolu tous les problèmes propres aux Raspberry Pi. Nous pouvons utiliser l’I2C sous Linux comme nous l’avons vu dans l’article précédent.

On note l’utilisation de "sudo" à chaque opération concernant l’i2c. Un utilisateur normal n’a pas les droits pour utiliser l’i2c. Si votre programme ne semble pas marcher parce qu’il n’arrive pas à ouvrir un fichier (/dev/i2c-0 par exemple) c’est que vous avez probablement un problème de droit. Réessayez avec les droit d’administrateur (sudo ou su root ou su pi).

 Récupération des informations de la manette

Avant de pouvoir se servir de la manette, il faut l’initialiser de manière a faire sauter un chiffrage des données. Nous envoyons à la manette successivement les chaines 0xF0, 0x55 et 0xFB, 0x00. Impossible à l’heure actuelle de retrouver la page ou nous avons trouvé ces informations.

Les informations de la manette sont contenues sur 6 octets. Le codage des valeurs se trouve notamment sur le site wiibrew. La manette se lit en 2 étapes, comme une EPROM. D’abord nous lui envoyons l’adresse que nous souhaitons lire (0x00 dans notre cas) puis on envoie une demande de lecture suivie de la lecture de nos 6 octets.

Nous mettons à dispositions les codes source qui nous ont servi pour nos tests. Ils contiennent une bibliothèque maison pour accéder au Wii Classic Controleur. Nous les compilons sur le Raspberry Pi avec :

Compilation gcc i2c_master.c WCC.c -o WCC
Le programme affiche l’état de tous les boutons, joystick en temps réel dans la console. Un Ctrl-C est nécessaire pour arrêter le programme.

Video : 720p | 30 Mo

Commentaires

Luj, le 28/06/2012

Bonjour et bravo. Pour les octets de la Wii, on en parlait ici : http://www.pobot.org/Controle-par-Nunchuck-sans-fil.html et c’est le site Windmeadow qui a expliqué en premier comment hacker le nunchuck

attafr, le 25/09/2012

Je ne sais pas si je suis au bon endroit.... J’ai une question concernant la manette classic wii et le programme que vous avez écrit...
Dois-je continuer ici ?

Keuronde, le 25/09/2012

Attafr,

Tes questions sont les bienvenues ici !

En espérant pouvoir y répondre...

ecah, le 15/10/2012

Salut, j’ai essayé de jouer avec l’I2C, mais j’ai un soucis : j’ai installé le rpi-update de hexxeh pour mettre à jour mon firmware, et mon install de Debian est assez récente (noyau 3.2.27+), pourtant la commande i2c-detect est not found, et je n’ai rien du tout dans /sys/classi2c-adapter. Je précise que pour le moment je n’ai rien branché, mais les résultats que j’obtiens me paraisse louche. Une idée ?

Keuronde, le 15/10/2012

As-tu installé i2c-tools ?

ecah, le 18/10/2012

Oui, ça me surprend d’autant plus...

Keuronde, le 18/10/2012

Tant que tu n’as rien dans /sys/class/i2c-adapter, c’est que le noyau ne voit pas les périphériques I2C.

Il est probable que ton noyau n’ait pas les pilotes I2C pour le Rasberry Pi. Peux-tu indiquer précisément où tu as attrapé ce noyau ?

J’utilisais le noyau de bootc.net...

Keuronde, le 18/10/2012

Le noyau est peut-être bon, je viens de lire ici que tu dois supprimer ou commenter la ligne "blacklist i2c-bcm2708" du fichier /etc/modprobe.d/raspi-blacklist.conf

Bon courage !

ecah, le 18/10/2012

J’ai installé la 2012-09-18-wheezy-raspbian choppé sur http://www.raspberrypi.org/downloads...
Je tenterais bien la manip pour recupéré le noyau de bootc, mais faire un retrofit ça me parait chelou. A moins que le noyau de bootc ne soit en fait qu’un module supplémentaire ?

Keuronde, le 18/10/2012

Le noyau de bootc était adapté au Raspberry Pi et contenait un patch pour l’I2C. Ce patch ne pouvait pas s’appliquer facilement aux noyaux inférieur à la version 3.2. Maintenant que les distributions sont passées à des versions plus récentes, le patch I2C est appliqué par défaut. Bref, revenir à une version précédente n’est pas une bonne idée.

Il est probable que le soucis I2C puisse être réglé en touchant au fichier blacklist indiqué au dessus.

J’ai quelques soucis lors de la validation des messages sur ce site... Les dates indique les date de rédaction et non de publication... Désolé.

ecah, le 19/10/2012

Pas grave pour les dates, je suis les réponses avec les flux RSS (très bonne idée ce truc) donc j’ai eu les réponses dans l’ordre. Je vais essayé le deblacklist ce soir. Merci pour cette première piste, je te tiens au jus.

ecah, le 19/10/2012

Nickel, je vais creuser un peu le topic pour voir les histoires de modprobe au démarrage et compagnie. Et concernant la commande detect, elle s’écrit sans ’-’ entre i2c et detect. Pour ça que mon CC ne marchait pas. Merci pour le coup de main en tout cas.

Keuronde, le 19/10/2012

Il y a bel et bien une erreur dans l’article, c’est maintenant corrigé.

Merci ecah !

Ajouter un commentaire

Pseudo :
Mail :

Texte :

Copyright "POIVRON" 2011-2023, tous droits réservés
Administration du site