Capteur de température I2C TMP102 sous OpenWrt / Bifferboard Dual USB


Cette page aborde le raccordement d'un capteur de température TMP102 sur une Bifferboard Dual USB.
Plus bas, le code pour lire le capteur et stocker la valeur dans une base Sqlite est disponible.



1) Désactiver le jtag :

Sur la Bifferboard Dual USB, quatre GPIO sont disponible sur le port JTAG (TMS/TDI/TDO/TCK).
Pour pouvoir y accéder, il faut au préalable désactiver le port JTAG en supprimant deux résistances R37 et R38.


Réf : http://groups.google.com/group/bifferboard/browse_thread/thread/4f1a838e07fa7a89.



2) Raccordement du module TMP102
:

Le raccordement s'effectue comme sur l'image, ne pas oublier de raccorder la pin AD0 pour adresser le capteur en 0x48.
Dans le schéma ci-dessous, j'utilise le GPIO 11 pour SDA et 12 pour SCL.





3) Compilation OpenWrt :

Le plus simple pour commencer est de compiler son image OpenWrt.

On récupère la version r22299 (Bug de l'interface Ethernet sur la version trunk : https://dev.openwrt.org/ticket/8505) : https://dev.openwrt.org/changeset/27876
On récupère le trunk d'OpenWrt.

# svn co svn://svn.openwrt.org/openwrt/trunk/

Suivit d'un make menuconfig pour configurer la plateforme et l'image:
Target System (RDC 321x)
Target Profile (Bifferboard)
Target Images  --->
    [ ] ramdisk 
    --- Root filesystem archives
    [ ] cpio.gz
    
[ ] tar.gz
    --- Root filesystem images
    [ ] ext2
    [*] jffs2
    [ ] squashfs
    --- Image Options

On n'oublie pas de sélectionner les modules i2c, et surtout i2c-gpio-custom :
Kernel modules  --->
    I2C support  --->
        --- kmod-i2c-core................................................ I2C support
        ---   kmod-i2c-algo-bit............................. I2C bit-banging interfaces
        < >   kmod-i2c-algo-pca................................ I2C PCA 9564 interfaces
        < >   kmod-i2c-algo-pcf................................ I2C PCF 8584 interfaces
        ---   kmod-i2c-gpio.................................. GPIO-based bitbanging I2C
        <*> kmod-i2c-gpio-custom........................ Custom GPIO-based I2C device

De même pour le package i2c-tools qui nous permettra de manipuler le bus i2c :
# ./scripts/feeds install i2c-tools
Puis :
Utilities  --->
    <*> i2c-tools............................................ I2C tools for Linux

On compile le tout avec un make V=99.
Une fois fini, vous devriez avoir dans le répertoire bin/rdc une image openwrt-rdc-jffs2-64k-bifferboard.img.



4) Flash Bifferboard avec OpenWrt :

Une fois l'image générée, il vous faudra récupérer un script python disponible sur le site de Bifferboard pour flasher votre carte : http://bifferboard.svn.sourceforge.net/viewvc/bifferboard/utils/bb_eth_upload8.py

Et le lancer comme suit ( l'adresse mac est collé sur la carte cpu ) :
python bb_eth_upload8.py eth0 00:B3:F6:XX:XX:XX bin/rdc/openwrt-rdc-jffs2-64k-bifferboard.img

Puis sous 10 secondes, mettre sous tension la Bifferboard.



5) Configuration i2c-gpio-custom :

Ce module va nous servir à créer un bus i2c à partir de deux GPIO.

Dans un shell, la commande suivante, va créer le bus i2c en prenant les GPIO 11 et 12 pour SDA et SCL :
root@OpenWrt:~# insmod i2c-gpio-custom bus0=0,11,12
root@OpenWrt:~# dmesg | grep -i i2c
i2c /dev entries driver
Custom GPIO-based I2C driver version 0.1.1
i2c-gpio i2c-gpio.0: using pins 11 (SDA) and 12 (SCL)

Dans le répertoire /dev, nous retrouvons notre bus :
root@OpenWrt:~# ls /dev/ | grep i2c
i2c-0

Pour vérifier le tout, nous allons utiliser l'outil i2cdetect, du package i2c-tools pour retrouver notre capteur TMP102 :
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:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --       

Et pour que ce bus soit créé au démarrage du système, il nous faut créer un fichier dans le répertoire /etc/modules.d
root@OpenWrt:~# echo "i2c-gpio-custom bus0=0,11,12" > /etc/modules.d/58-i2c-gpio-custom



6) Lecture du capteur TMP102 en C :

Le code disponible en bas de page va nous permettre de lire la température du capteur, et de pouvoir l'enregistrer dans une base Sqlite à intervalle régulier.
Il utilise, pour intéragir avec le bus i2c, l'header i2c-dev.h fournit par i2ctools (http://www.lm-sensors.org/wiki/I2CTools).

Pour créer le package, il faut dans un premier temps extraire l'archive dans le répertoire package.
Puis, le faire apparaitre dans le menu de configuration grâce aux commandes :
# ./scripts/feeds update
# ./scripts/feeds install libsqlite3
# ./scripts/feeds install tmp102

Maintenant, via la commande make menuconfig, nous pouvons sélectionner le package tmp102 :
Utilities  --->
    <M> tmp102........................................... TMP102 sensor utilities

Et compiler seulement le package, disponible par la suite dans bin/rdc/packages/
# make package/tmp102/compile V=99

Il ne reste plus qu'à installer les packages libpthread, libsqlite3 et tmp102 sur la Bifferboard grâce à opkg.



7) Utilisation :

L'utilisation de l'outil est possible de deux façons.
Soit avec l'option -r, qui permet de lire la température :
root@OpenWrt:~# tmp102 -r
19.4375
root@OpenWrt:~# tmp102 -v -r
Word 0x00 = 0x7013 = 0x130 or 0x7 = 0x137 = 311 = 19.437500 C
19.4375
root@OpenWrt:~#

Soit avec l'option -f, qui en spécifiant un fichier, va créer une base Sqlite et enregistrer à intervalle régulier (1800 secondes par défaut) la température :
root@OpenWrt:~# tmp102 -v -f /root/tmp102.db
Word 0x00 = 0x8013 = 0x130 or 0x8 = 0x138 = 312 = 19.500000 C
SQL request : INSERT INTO tmp_data VALUES (19.5000)
Word 0x00 = 0x7013 = 0x130 or 0x7 = 0x137 = 311 = 19.437500 C
SQL request : INSERT INTO tmp_data VALUES (19.4375)
Word 0x00 = 0x6013 = 0x130 or 0x6 = 0x136 = 310 = 19.375000 C
SQL request : INSERT INTO tmp_data VALUES (19.3750)
...

Pour finir, un fichier init tmp102 est disponible dans /etc/init.d, pour lancer la collecte au démarrage du système, modifier le chemin de la base de données dans le fichier init, puis lancer la commande :
root@OpenWrt:~# /etc/init.d/tmp102 enable
Č
ċ
tmp102.tar.gz
(5k)
Nicolas Le Falher,
8 juin 2012 10:32
Comments