5 mai 2007

Un bus i2c pour La Fonera

Tags : , ,

posté dans Embarqué |

Comme je l'ai peut-être dit précédemment, le but des expérimentations sur les GPIO du routeur La Fonera était de pouvoir, à terme, utiliser un bus i2c. C'est finalement chose faite. En utilisant 4 lignes GPIO, un 74LS05 et quelques résistances de 10K Ohms mon routeur est maintenant capable de dialoguer avec un capteur de température DS75.

 

 

J'ai utilisé les quatre lignes les plus facilement accessibles. Celles qui se trouvent sur le connecteur SW1 à côté du connecteur Ethernet à l'arrière du routeur. Les pins 1 et 2 sont dédiées respectivement à l'envoi et la réception des signaux SDA et les pins 5 et 6 pour SCL.

Le 74LS05 est un sextuple inverseur TTL. Il doit également être possible d'utiliser un composant CMOS (74HC05). Le schémas de connexion est donné dans ce PDF. L'avantage du TTL est de considérer comme un 1 logique une tension supérieur à 2 Volts. Ceci nous permet de sécuriser un peu le montage en ajoutant des diodes 1N4148, juste pour être sûr que du 5 Volts ne risque pas de toucher une ligne en sortie.

Côté logiciel, comme le kernel Linux dispose déjà d'un support i2c, il suffisait de développer un pilote pour le nouveau bus en utilisant le bit-banging (tous les signaux sont gérés de manière logicielle). Les algorithmes sont supportés par le pilote i2c-algo-bit qu'il faudra donc activer, tout comme i2c-core, dans le nouveau kernel sous forme de module ou non. L'utilisation de modules est préférable car modulaire mais également parce que le pilote i2c-algo-bit peut prendre en argument des options de test et de débugage très intéressantes.

Mon pilote, nommé i2c_gpio, est disponible ici : http://www.lefinnois.net/fonerai2c/i2c_gpio.tar.gz. Tout est détaillé dans le fichier README présent dans l'archive.

Pour tester le nouveau bus, j'ai utilisé le programme i2cdetect du projet lm-sensors. Il permet de parcourir un bus i2c afin d'y trouver des composants. Une version légèrement adapté est disponible sous la forme d'une archive source pour OpenWRT ici : http://www.lefinnois.net/fonerai2c/i2cdetect.tar.gz.

L'archive contient également le programme ds75ioctl permettant de communiquer avec le capteur de température DS75. Exemple :

insmod i2c_algo_bit i2c_debug=3 bit_test=1
insmod i2c_gpio inverted=1

Dans les logs (dmesg) :

i2c-algo-bit.o: (0) scl=128, sda=16
i2c-algo-bit.o: (1) scl=128, sda=0
i2c-algo-bit.o: (2) scl=128, sda=16
i2c-algo-bit.o: (3) scl=0, sda=16
needed 1 jiffies
i2c-algo-bit.o: (4) scl=128, sda=16
i2c-algo-bit.o: GPIO adapter passed test.
 : hw routines registered.
i2c_adapter i2c-0: adapter GPIO adapter registered
i2c-dev: adapter GPIO adapter registered as minor 0
gpio_i2c: module loaded
gpio_i2c: inverted outputs

On utilise ensuite i2cdetect et ds75ioctl :

root@OpenWrt:/# i2cdetect -l i2c-0   i2c    GPIO adapter  Algorithm unavailable

Notre bus est là. Scannons-le :

root@OpenWrt:/# 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
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          XX XX XX XX XX XX XX XX XX XX XX XX XX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
40: XX XX XX XX XX XX XX XX 48 XX XX XX XX XX XX XX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
70: XX XX XX XX XX XX XX XX

Tiens, il y a quelque chose à l'adresse 0x48. Notre DS75 :

root@OpenWrt:/# i2cdetect -l
i2c-0   i2c    GPIO adapter  Algorithm unavailable

23,81°C, température de saison...

 

 

Article posté on Samedi, 5 mai 2007 à 13:08 dans Embarqué. Vous pouvez suivre les commentaires sur cet article via un feed RSS 2.0. Vous pouvez laisser un commentaire. Le Ping n'est actuellement pas autorisé.

Il y a actuellement 17 réponses pour “Un bus i2c pour La Fonera”

  1. 1 Le 6 mai 2007, Kandy à écrit :

    Hi,
    can you give me some more details how to compile the kernel

    Thank you

  2. 2 Le 7 mai 2007, Lefinnois à écrit :

    Of course, take a look to http://forum.openwrt.org/viewtopic.php?pid=45838

    For the Fonera, choose “Atheros [2.6]” as “Target System” in the interface of “make menuconfig”

    If you want to customize the kernel (adding i2c algo and core support) use : make kernel_menuconfig.

    If you want use i2c GPIO support and testing code, simply untar these files in the package directory and launch make menuconfig again to activate gpio i2c module and i2cdetect (read README file in each tarball).

  3. 3 Le 7 mai 2007, xavier à écrit :

    Hello,
    pourquoi utiliser 4 pins et 1 LS05 plutot que de changer le sens des IO en hard ?
    Merci

  4. 4 Le 8 mai 2007, Lefinnois à écrit :

    Le composant TTL permet aussi et surtout d’adapter les tensions. Sauf erreur de ma part, un bus i2c est en standardisé en 5V or La Fonera est en 3.3 (avec une tolérance au 5V). Pour ce qui est de l’économie des pins, La Fonera est déjà très lente, changer le sens des GPIO risque de ralentir encore davantage les choses. Enfin, rien ne montre que les GPIO du routeur sont à collecteurs ouverts ou peuvent être configurés comme tel (comme sur un microcontrôleur AVR ou autre, tri-state machin-truc). Mais oui, effectivement, il faudrait pousser les recherches dans ce sens. Pouvoir utiliser 2 pins au lieu de 4 est très intéressant vu le nombre réduit d’E/S. On pourrait ainsi avoir deux bus i2c très facilement.

    Enfin, question vitesse, je viens de me rendre compte que les connecteurs sur SW1 disposent de résistances de rappel à la masse et de capa CMS. Le tout formant donc un réseau RC il me semble. Les problèmes de lenteur proviennent sans doute de là. De plus, différentes discussions sur le forum OpenWRT Kamikaze concernant l’utilisation de carte SD/MMC précisent qu’il faut déssouder ces capa et ces résistances… encore une piste à suivre…

  5. 5 Le 13 mai 2007, Kandy à écrit :

    Hi,
    1)
    needed 0 jiffies
    2) I do not have the following line
    i2c-dev: adapter [GPIO adapter] registered as minor 0

    I hope you can help me to solve this problem

  6. 6 Le 29 mai 2007, DaRkYoda à écrit :

    Salut,

    Tout d’abord, bravo pour tes recherches, du tres bon boulot !

    Je suis informaticien en informatique industrielle (donc, je connais les bus, et un peu l’electronique de loin…) mais je suis pas spécialiste du bus I2C, avant de me pencher plus en avant sur ce bus, je voulais savoir s’il est multiesclave et si je peux par exemple brancher 2 ou 3 cartes filles sur le bus i2C et pouvoir piloter ces cartes grâce à des pages web servies par le serveur web de la fonera ?

    Sinon, autre question c’est quoi comme serveur web sur Open-WRT ou DD-WRT ? Apache ?

    Merci d’avance pour toutes les réponses … ;)

  7. 7 Le 7 juin 2007, Pixel du Rezo à écrit :

    Salut,
    Pour répondre à DaRkYoda, le serveur web sur OpenWrt par défaut est celui de busybox.
    J’aimerais de mon coté avoir quelques infos sur ce bus I2C. En effet, j’aimerais me servir de ma Fonera pour réaliser une sorte de programmateur automatique d’arrosage. J’ai donc besoin de pouvoir commander des relais ou des Triac, mais j’aimerais aussi avoir des entrées (notamment pour des capteurs: température, humidité ?, etc..)
    Est ce qu’il est possible d’écrire sur le bus I2C ? Je ne suis pas spécialiste là dedans. mes 1eres recherches me disent que c’est faisable, notamment avec un PCF8574. Est-ce correct ?

    Par ailleurs, je ne comprends pas trop le plan de cablage fourni dans le PDF, il est possible d’avoir de plus amples informations ?

    Merci d’avance !

  8. 8 Le 9 juin 2007, Lefinnois à écrit :

    En effet, c’est le serveur busybox. Pour avoir plus de fonctionnalités, le mieux est d’installer lighttpd. Léger et puissant. BOA est aussi une possibilité mais je ne connais pas l’étendu de ses fonctionnalités.

    Pour ce qui est du contrôle d’opto-triac ou de relais, effectivement c’est le PCF8574 et PCF8574A qu’il faut utiliser. Ce sont des latchs i2c. Leurs adresses sont configurables. De ce fait, on peut avoir sur le bus jusqu’à 16 PCF8574* (8 PCF8574 + 8 PCF8574A). On peut ensuite les piloter avec un CGI en C via lighttpd.

    Enfin pour la partie analogique (capteur d’humidité), le plus simple est d’utiliser un composant ADC (convertisseur analogique/digital) comme un PCF8591 comme détaillé sur http://www.acmesystems.it/?id=10. Mais le problème, à mon avis, n’est pas la conversion mais la détection. Il existe deux solutions : résistif ou capacitif. Et il faut calibrer le montage. Il doit exister des capteurs d’humidité i2c mais le prix doit être relativement important.

  9. 9 Le 9 juin 2007, Pixel du Rezo à écrit :

    Merci beaucoup pour toutes ces infos. Je vais essayer de voir si je peux me bidouiller quelque chose avec cela. Je vais deja essayer de flasher ma Fonera avec la dernière version de Openwrt Kamikaze, et ensuite, je vais voir ce que je peux faire ;)

  10. 10 Le 7 juillet 2007, sam_00 à écrit :

    Une question idiote:

    Utiliser un Bus 1-Wire ne serait-il pas plus simple?

    surtout que les composants sont franchement pas cher puisque disponibles en echantillons gratuits chez maxim, et que la famille 1-Wire est franchement fournie (capteur temperature, comvertisseurs A/N, interface 8 I/O, etc) et le tout facile a interfacer depuis un port serie.

    De plus, le package OWFS devrait vous dispenser de bien des tracas d’implementation me semble-t-il ….

    Mais je peut me tromper
    sam

  11. 11 Le 22 juillet 2007, Pixel du Rezo à écrit :

    Il faudrait que je jete un oeil sur le 1-Wire… J’y avais pensé, mais n’ayant que de vagues notions d’électronique, j’aurai préféré me lancer dans quelque chose qui a déjà été tenté par quelqu’un ;)

  12. 12 Le 17 décembre 2007, Claude Lapointe à écrit :

    J’aimerais avoir un driver I2C modifié pour supporter un capteur d’humidité et de température sensirion SHT11 ou SHT15.

    Merçi

  13. 13 Le 20 décembre 2007, Valise à écrit :

    Ok Claude, je te fais ca tout de suite, si tu as besoin d’autre chose ; n’hesites pas!
    moi je voudrais un oscilloscope à memoire car j’ai des problemes de timing sur mon bus, tu peux m’en envoyer un? merci

  14. 14 Le 26 février 2008, Dan à écrit :

    Bonjour,
    Avez-vous des photos des pins utilisés pour le bus i2c.

    merci

  15. 15 Le 26 février 2008, Lefinnois à écrit :

    Tout est dans le répertoire doc de l’archive i2c_gpio.tar.gz. Une photo, le typon et un schémas (i2c-gpio.pdf).

  16. 16 Le 15 mars 2008, Dan à écrit :

    Bonjour,
    J’ai testé une compilation d’une image rootfs et d’un kernel de l’archive subversion, cela a fonctionné.
    Mais lorsque j’ai rajouté le contenu de i2cdetect.tar.gz dans le répertoire package
    dan@vesta:trunk$ l package/i2cdetect/
    total 16K
    drwxr-xr-x 2 dan dan 4,0K mai 5 2007 doc/
    -rw-r–r– 1 dan dan 798 mar 14 23:54 Makefile
    drwxr-xr-x 2 dan dan 4,0K mai 5 2007 src/

    J’ai cette erreur en lancant un make menuconfig
    ++ mkdir -p /home/dan/tampon/fonera-sdk/kamikaze/trunk/staging_dir/toolchain-mips_gcc4.1.2
    ++ cd /home/dan/tampon/fonera-sdk/kamikaze/trunk/staging_dir/toolchain-mips_gcc4.1.2
    ++ mkdir -p bin lib include stamp
    Collecting package info: package/i2cdetectERROR: please fix package/i2cdetect/Makefile
    Collecting package info: doneing…

    Je ne vois ce qui cloche dans le Makefile.

    La version utilisée est la OpenWrt Kamikaze (r10602)

    une idée ?

  17. 17 Le 18 mars 2008, Dan à écrit :

    Je n’ai pas eu de succés avec ma question ci-dessus mais j’ai réussi néanmoins à compiler avec le SDK un programme test pour le chip DS1621 et cela fonctionne impécablement.

    Merci de partager vos expérimentations.

Laisser un commentaire

*
Pour prouver que vous n'êtes pas un bot, recopiez le code ci-dessous
Anti-Spam Image