Piloter une carte IO i2c en PHP

Petit nouveau ! | 3 Messages

19 oct. 2015, 09:35

Bonjour,
Sur le port i2c du gpio d'un raspberry 2, j'ai connecter un mcp23017 qui étend le nombre d'entrée sortie.
Grâce à la console, je configure et commande les ports du mpc23017.

exemple de commande :
i2cset -y 1 0x20 0x01 0x00 // configuration de port B en sortie
i2cset -y 1 0x20 0x15 0x01 // mise à l'état de la broche 0 du port B

Ces deux commandes fonctionnent en mode console mais en PHP :
shell_exec(' /usr/sbin sudo i2cset -y 1 0x20 0x01 0x00');
shell_exec(' /usr/sbin sudo i2cset -y 1 0x20 0x15 0x01');
aucune réaction du mpc23017.

le fichier index.php (où se trouve les commandes en question) est lancé par le rasberry (configuré en serveur) lors d'une requette http .
En fouillant sur le net, je trouve des info sur les droits de l'utilisateur "www-data" mais ça reste trés confus (du moins dans mon esprit ....)
je me suis inspiré de ça : http://domoraspi.leotic.fr/2014_05_01_archive.html
Je recherche donc de l'aide ....
Merci à tous

Petit nouveau ! | 3 Messages

19 oct. 2015, 14:03

je continue mes investigations :

j'ai exécuté : visudo
# User privilege specification
root ALL=(ALL:ALL) ALL
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ i2cset <---- ligne que j'ai ajouté
j'ai ajouté cette ligne afin que l'utilisateur www-data puisse exécuter la commande i2cset.
Je ne suis pas sur de la syntaxe ni de la pertinence de cette ligne....
Malgré cette ligne, la commande i2cset ne fonctionne qu'avec la console et en Root.....
Toute aide sera la bienvenue !!
Merci

ViPHP
ViPHP | 928 Messages

19 oct. 2015, 16:44

Tu es sur que c'est ça ta commande, car elle me paraît pas valide là :

Code : Tout sélectionner

/usr/sbin sudo i2cset -y 1 0x20 0x01 0x00
Et le sudo ne me paraît pas faisable comme ça, je ne suis pas sur que PHP s’exécute dans la même session utilisateur que lorsque tu te connectes.

Petit nouveau ! | 3 Messages

20 oct. 2015, 18:51

Merci de ta réponse Genova, j'ai un peu avancé

Effectivement l'utilisateur est www-data.
D'où un Nouveau test :
function impulsion ($port){
	system("gpio mode ".$port." out");
	system("gpio write ".$port." 1");
	sleep (1);
	system("gpio write ".$port." 0");
	
	system("i2cset -y 1 0x20 0x01 0x00");
	system("i2cset -y 1 0x20 0x15 0x01");
	sleep (1);
	system("i2cset -y 1 0x20 0x15 0x00");
	}
Avec un autre ordi et avec mozilla j'appelle le Rpi grâce à son adresse qui lance index.php où se trouve la fonction ci-dessus. J'ai pris soin de brancher une led sur le gpio 0 du Rpi et une led sur gpb 0 du 23017.
La première led s'allume pendant une seconde (fonctionnement attendu !) l'autre reste inactive !!!!
donc
system("gpio write ".$port." 1"); fonctionne avec l'utilisateur www-data :)
et
system("i2cset -y 1 0x20 0x15 0x01"); ne fonctionne pas avec l'utilisateur www-data :( PB de syntaxe ????

De plus j'ai vérifié que les commande gpio..... et i2cset.... fonctionnent sur la console.
Je me retrouve toujours dans la même impasse..... A l'aide...Merci

J'oriente ma recherche vers la bibliothèque GPIO pour voir si elle a des fonctionnalités i2c......
Mais si c'est juste un PB de syntaxe, je suis preneur de toute correction....
https://learn.adafruit.com/mcp230xx-gpi … mais mon anglais reste insuffisant