Programmer le robot lego mindstorms EV3 en PHP sous linux

Attention, article pour geek

Numéro 1 est en pleine période "lego technic" et depuis l'année dernière, il a le robot EV3, acheté d'occasion comme il se doit :



Le truc est livré avec un boîtier de commande sur lequel on peut brancher différents capteurs et outils. Il y a un capteur infrarouge, un capteur de pression, un capteur de couleur, des moteurs... le set de base permet déjà pas mal de choses, et l'on peut trouver dans le commerce d'autres éléments comme un capteur de température...

Le gros défaut du bidule jusque là était l'obligation d'utiliser Windows (ou Mac) pour le programmer, car l'interface de programmation (au demeurant assez intuitive et bien foutue, même si un peu lourdingue pour un développeur un peu habitué) n'est disponible que sur ces systèmes. Mais Lego a ouvert les spécifications de son matériel, si bien que des barbus mangeurs de pizza ont conçu une distribution linux exprès pour la brique EV3, basée sur Debian.

Le site de ce projet (ev3dev) est une mine d'or, et c'est là-bas que j'ai pu télécharger le firmware qui va bien, je l'ai collé sur une Micro-SD et l'ai placé dans la brique EV3. L'opération est sans danger puisque la brique EV3 boote sur la MicroSD sans écraser son propre firmware, il suffit de retirer la carte pour démarrer comme avant sur le firmware d'origine. J'ai suivi à la lettre la procédure et tout s'est bien passé.

Une fois le système lancé sur la brique, je l'ai branché via USB sur mon XUbuntu, ce qui m'a permis d'accéder à internet depuis la brique Lego et de lancer un SSH pour accéder au système comme si c'était un ordinateur classique sous linux.
J'ai installé PHP sur ce système (apt-get install php5), et j'ai pu commencer à programmer la brique en PHP.

Concrètement, il "suffit" d'aller lire et écrire dans les bons fichiers pour piloter les capteurs et moteurs reliés à la brique. C'est relativement simple pour quelqu'un qui a déjà mis un peu les mains dans le cambouis. Même moi qui ne suis pas trop familiarisé avec la programmation bas-niveau est capable de le comprendre. Par exemple, pour lire la valeur donnée par le capteur de proximité infrarouge, il suffit de lire le contenu du fichier : /sys/class/lego-sensor/sensor0/value0 À partir du moment où l'on sait manipuler les fichiers en PHP, lire et écrire dedans, on peut potentiellement tout faire.

Voici par exemple mon premier programme qui lance un moteur et compte jusqu'à trois avant de l'arrêter :

<?php
        system("espeak -p 100 -a 200 -s 130 -v french --stdout 'Attention jallume le moteur' | aplay -q");
        $f=fopen("/sys/class/tacho-motor/motor0/duty_cycle_sp","w");
        fputs($f,"25"); // définit la vitesse du moteur (en pourcent)
        fclose($f);
        $f=fopen("/sys/class/tacho-motor/motor0/command","w");
        fputs($f,"run-forever"); // Lance le moteur à la vitesse définie ci-dessus
        for($i=1;$i<4;$i++)
                system("espeak -p 100 -a 200 -s 130 -v french --stdout ".$i." | aplay -q");
        system("espeak -p 100 -a 200 -s 130 -v french --stdout 'Jéteins le moteur' | aplay -q");
        fputs($f,"stop"); // Stoppe le moteur
        fclose($f);
?>

Autre exemple qui fait tourner un moteur en fonction de la distance mesurée par le capteur de proximité (infrarouge)

<?php
  $fin=false;
  // Lance le moteur à la vitesse spécifiée dans le fichier duty_cycle
  file_put_contents("/sys/class/tacho-motor/motor0/command","run-direct");
  while(!$fin)
  {
    // Récupère la valeur du capteur de proximité (Capteur infrarouge)
    $s=file_get_contents("/sys/class/lego-sensor/sensor0/value0");
    // Détermine la vitesse de rotation du moteur en fonction de la distance mesurée
    if($s!="")
      file_put_contents("/sys/class/tacho-motor/motor0/duty_cycle_sp",$s);
    // Si la distance mesurée est inférieure à 3 on quitte la boucle
    if($s<3 && $s!="")
      $fin=true;
  }
  // Arrête le moteur
  file_put_contents("/sys/class/tacho-motor/motor0/command","stop");
 ?>

Rien de sorcier comme vous le voyez, mais les potentiels sont assez gigantesques. On peut piloter ainsi les leds, l'écran (je n'ai pas encore essayé mais ça m'a l'air un poil plus complexe) et combiner le tout, seule l'imagination peut-être un frein.
N'hésitez pas à poser des questions si vous en avez...

Commentaires

1. Le samedi, 26 décembre 2015, 11:04 par etheriel

Les mecs qui n'ouvrent/ferment pas des {} quand il n'y a qu'une instruction dans leur "if" méritent la déchéance de nationalité :o

2. Le dimanche, 27 décembre 2015, 11:44 par Merome

@etheriel : C'est sûr que c'est un peu plus compliqué à lire pour les newbies qui ne sont pas dans le top 50 de coding game... Mais à part toi, il n'y en a pas sur ce blog :)

3. Le lundi, 28 décembre 2015, 15:16 par marzi

C'est parti pour les ...

4. Le lundi, 28 décembre 2015, 18:19 par Merome

@marzi : very private joke... Mais je m'en souviens toujours aussi :)

5. Le mardi, 29 décembre 2015, 12:10 par Calcoran

Et en C ça donne quoi?

6. Le mercredi, 30 décembre 2015, 10:11 par Merome

@Calcoran : Comme tu le vois, je ne fais qu'écrire et lire dans des fichiers en PHP. Il suffit de faire la même chose en C avec les fonctions C dédiées à ça (fscanf(), fprintf()...)

7. Le dimanche, 10 janvier 2016, 14:29 par Tim

Merci d'avoir partager ce tuto.
Mon souci est que pour " $f=fopen("/sys/class/tacho-motor/motor0/duty_cycle_sp","w");"
L'utilisateur "www-data" (apache) n'a pas le droit d'écrire.
Quel est votre stratégie ? un changement de proprio des fichiers ? ou un acces exclusif à www-data ?

8. Le dimanche, 10 janvier 2016, 14:38 par Tim

C'est good, j'ai trouvé :
sudo usermod -a -G ev3dev www-data

9. Le dimanche, 10 janvier 2016, 14:55 par Merome

@Tim : je lance le script PHP en tant que root en ligne de commande

10. Le dimanche, 10 janvier 2016, 16:46 par Tim

@Merome : D'accord, ok.
De mon coté, je viens d'y arriver en faisant :
sudo adduser www-data ev3dev // pour l'accès aux devices
sudo adduser www-data audio // pour le espeak
et un petit restart d'apache.
En tout cas, pour ma part qui suis du monde PHP, c'est génial.
Manque que les triggers des sensors... à suivre

11. Le mercredi, 18 mai 2016, 19:20 par neuronix

Existe-t-il un programme permettant de programmer directement sur la brique? Car l'interface déjà présente sur la brique ne présente pas tout les commandes du logiciel sur ordi :(

12. Le vendredi, 20 mai 2016, 09:15 par Merome

@neuronix : avec ev3dev, la brique devient une machine linux, donc on a un terminal accessible, et simplement en branchant un clavier USB sur la brique, on peut lancer un éditeur de texte et coder directement sur la brique.
Bon, il faut avoir des bons yeux...

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

La discussion continue ailleurs

URL de rétrolien : https://merome.net/blog/index.php?trackback/1088