Outils pour utilisateurs

Outils du site


nslu2:ajouter_un_capteur_de_temperature

Ajouter un capteur de température


pourquoi faire?

Le NSLU2 est placé sans un coin, et il se fait oublier, alors il est intéressant de pouvoir suivre son état en temps réel.

De plus, il dispose d'un port i2c, ceci rend possible l'ajout d'un capteur de température.


le port i2c

on peut trouver des informations sur le branchement du port i2c ici: http://www.nslu2-linux.org/wiki/Info/PinoutOfI2CPort

en fait on se branche sur le X1205 (horloge en temps réel).

le branchement du X1205 est :

X1205
x1205.jpg

on peut utiliser les broches:

signal désignation
VCC tension d'alimentation (3.3V)
VSS 0V
SCL horloge
SDA données (bidirectionnel)

quel capteur?

idéalement, le lm75 est tout indiqué.

Toutefois, j'ai pu obtenir son équivalent, un ds75, compatible électriquement et logiciellement

son brochage:

DS75
ds75.jpg

le ds75 offre en plus la possibilité d'accroître la précision en augmentant la résolution de la conversion.

Et enfin et surtout, il fonctionne directement sous 3.3V!


montage du capteur

j'ai décidé de monter le capteur sur le processeur afin de contrôler sa température.

Afin d'obtenir la meilleure lecture de température possible, il est collé avec une colle thermoconductrice, mais une colle simple fera l'affaire faute de mieux.

Il convient d'attribuer une adresse au chip, les fils d'adresse A0, A1 et A2 sont mis à 0V afin d'adresser le chip à l'adresse $48

Il est possible ainsi de mettre 8 chips en parallèle, avec 8 adresses différentes.

table d'adressage :

A0 A1 A2 adresse
0V 0V 0v $48
VCC 0V 0v $49
0V VCC 0v $4A
VCC VCC 0v $4B
0V 0V VCC $4C
VCC 0V VCC $4D
0V VCC VCC $4E
VCC VCC VCC $4F

raccordement :

signal fil X1205 DS75
VCC fil rouge broche 8 broche 8
VSS fil noir broche 4 broche 4 +5 +6 +7
SCL fil jaune broche 6 broche 2
SDA fil violet broche 5 broche 1

le branchement est effectué à l'aide de fils souples

montage du capteur
ASCII

le capteur est ensuite protégé par un morceau de “scotch” ou autre

ceci permettra à la fois de diminuer l'influence de le température “externe” et d'éviter des court-circuits, par exemple sur la photo avec le module convertisseur RS232 pour le port ttyS0

protection du capteur
ASCII

le logiciel

Afin d'exploiter ce capteur j'ai essayé d'installer le package lm-sensors

root@europe:~# aptitude install lm-sensors

Une fois lm-sensors installe, on lance la détection automatique avec sensors-detecct

malheureusement, le ds75 n'est pas reconnu!

j'installe le module lm75 manuellement

root@europe:~# modprobe lm75

root@europe:~# lsmod
Module                  Size  Used by
lm75                    8400  0
ledtrig_heartbeat       3040  0
ipv6                  269672  25
dm_snapshot            17180  0
dm_mirror              20948  0
dm_mod                 59120  2 dm_snapshot,dm_mirror
rtc_dev                 7432  0
evdev                  10400  0
ixp4xx_mac             19572  0
ixp4xx_beeper           3616  0
ixp4xx_qmgr             8652  5 ixp4xx_mac
ixp4xx_npe             14368  2 ixp4xx_mac
firmware_class         10656  1 ixp4xx_npe
ext3                  137704  1
jbd                    59368  1 ext3
mbcache                 9188  1 ext3
sd_mod                 19248  3
usb_storage            77707  2
scsi_mod              102800  2 sd_mod,usb_storage
ehci_hcd               31240  0
ohci_hcd               17156  0
usbcore               126920  4 usb_storage,ehci_hcd,ohci_hcd

le module est chargé, mais le ds75 n'est toujours pas reconnu

root@europe:~# sensors
No sensors found!
Make sure you loaded all the kernel drivers you need.
Try sensors-detect to find out which these are.
root@europe:~#

afin de passer outre ce problème, je décide d'écrire ce petit programme de lecture.

ce programme sort directement la lecture sur la console, mais un logiciel comme phpsysinfo est capable d'en récupérer la sortie

root@europe:~# cat /home/jj/DS75/ds75.c
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
 
 
#define I2C_SLAVE_FORCE 0x0706
 
void lecture_chip(char *label, int addr)
{
 
#define temperature_reg  0x00;
#define configuration_reg  0x01;
#define configuration_12bits  0xC0;
char buf[10];
int n;
int file;
long valeur;
float temperature;
 
buf[0] = 0x00;
buf[1] = 0x00;
buf[2] = 0x00;
buf[3] = 0x00;
 
if ((file = open("/dev/i2c-0", O_RDWR)) < 0) {
	printf("open error!\n");
	exit(1);
}
 
if (ioctl(file,I2C_SLAVE_FORCE,addr) < 0) {
	printf("address error!\n");
	exit(1);
}
/* selectionne le format */
buf[1] = configuration_reg;
buf[2] = configuration_12bits;
n=write(file,buf,3); 
if (n != 3) {
	printf("addr write error! %d\n",n);
	exit(1);
}
/* selectionne le registre de temperature */
buf[1] = temperature_reg;
n=write(file,buf,2); 
if (n != 2) {
	printf("addr write error! %d\n",n);
	exit(1);
}
n=read(file,buf,2);
if (n != 2) {
	printf("read error! %d\n",n);
	exit(1);
} else {
	valeur = buf[1]+ (256*buf[0]);
	temperature = valeur;
	temperature = temperature / 256;
	printf("%s %2.1f°C\n",label,temperature);
}
 
}
 
 
int main()
{
lecture_chip("CPU Temp:",0x48);
/* ture_chip("MB  Temp:",0x49); */
return(0);
}

compilation du programme:

gcc ds75.c -o ds75

et essai

root@europe:/home/jj/DS75# ds75
CPU Temp: 50.0°C

on l'installe dans /usr/bin

root@europe:/home/jj/DS75# cp ds75 /usr/bin/ds75

Malheureusement, les utilisateurs n'ont pas accès au port i2c et le programme ne fonctionne pas, il faut alors forcer les droits de /dev/i2c-0. Heureusement, udev nous permet cela…

il faut d'abord créer un fichier pour contenir la nouvelle règle : ce fichier va s'appeler local.rules et est placé dans le répertoire /etc/udev

root@europe:/home/jj/DS75# cat /etc/udev/local.rules
# access i2c

SUBSYSTEM=="i2c-dev", KERNEL=="i2c*", MODE="0777"
root@europe:/home/jj/DS75#

ensuite créer un lien dans le répertoire /etc/rules/rules.d

ln -s /etc/udev/local.rules /etc/udev/rules.d/010_local.rules

on lance la commande udevtrigger afin de relancer l'exécution des règles, car le module qui gère l'i2c est intégré au noyau et donc non desinstallable/reinstallable. Ceci evite de rebouter et de remettre à zéro le compteur uptime.

maintenant le programme ds75 peut fonctionner sous n'importe quel profil utilisateur, les droits de /dev/i2c-0 sont modifiés:

root@europe:/home/jj/DS75# ls -l /dev/i2c-0
crwxrwxrwx 1 root root 89, 0 2007-12-08 14:26 /dev/i2c-0

intégration dans PHPSYSINFO

utilisant phpsysinfo, il faut maintenant l'intégrer le programme de lecture.

d'abord, dans config.php, indiquer le nom du programme

sensor_program="ds75"

ceci va faire que phpsysinfo appelle class.ds75.inc.php

il faut donc creer class.ds75.inc.php. je l'ai fait en copiant class.lmsensors.inc.php

cp class.lmsensors.inc.php class.ds75.inc.php

ensuite, apporter une modification afin de faire appel à ds75 au lieu de sensors :

class mbinfo {
  var $lines;

  function mbinfo() {
   $lines = execute_program("ds75");

et voila le résultat!

et, enfin, on peut apprécier le fonctionnement..

Remarquez qu'il est possible d'ajouter d'autres capteurs, moyennant de leur attribuer une adresse différente par le cablage des fils A0-A1-A2

Résultat dans phpsysinfo sous Gnome
ecran_temperature.jpg
nslu2/ajouter_un_capteur_de_temperature.txt · Dernière modification: 2016/01/10 16:03 (modification externe)