Déc 08

Application Android pour contrôler un robot Lego

Quelle ne fut pas ma joie de découvrir, au détour d’une page web, l’existence d’une application Android permettant de contrôler la brique Lego Mindstorms NXT par Bluetooth ! Cette application, Minddroid, disponible dans le Android Market, permet de diriger un robot Lego à partir des accéléromètres du mobile.

En dirigeant l’extrémité du mobile vers le bas, le robot va vers l’avant. En le dirigeant vers le haut, il recule. La gauche et la droite le font tourner dans la direction correspondante. Simple. Et magique à la fois.

Que demander de plus ? Que l’application soit open source. Et là … c’est le cas. Pardonnez mes larmes, c’est l’émotion.

La news sur le site Lego et le repository GIT http://github.com/NXT/LEGO-MINDSTORMS-MINDdroid

Nov 08

Lego Mindstorm animé par du Java

J’ai eu l’occasion récente d’acquérir le fabuleux set de Lego « Mindstorm NXT 2 ».

Pour ceux qui ne le savent pas, il s’agit d’un coffret de Lego Technic contenant un bloc programmable, des moteurs (trois éléments qui peuvent tourner, afin d’animer roues, bras et autres), et des capteurs (deux de toucher, un de distance et un de lumière).

Rien de mieux pour réveiller en moi les joies de la construction improbable et de pouvoir leur donner vie !

Les avantages du Lego Mindstorms NXT sont nombreux : c’est un kit d’apprentissage à la robotique à moindre frais (~300€), il est fait en Lego (donc très simple pour l’assemblage, et la nostalgie empêche de baisser les bras trop vite), mais surtout, on peut faire du développement en Java !

Pour cela, il existe une API très bien faite, dénommé « LeJOS« , et qui fonctione de la manière suivante :

  • En premier lieu, on flashe le bloc programmable avec les outils fournis. Cela passe par un outil très simple qui prend toute l’opération en charge.
  • Ensuite, il suffit de développer une application avec les JAR fournis avec l’API (qui regroupe une JVM simplifiée et l’API d’accès aux moteurs et capteurs).
  • Il n’y a plus qu’à compiler avec les outils donnés et à faire le push du programme sur le bloc programmable.

L’API est très bien documentée, ainsi que tous les outils de compilation / publication.

Pour vous montrer la simplicité du développement, voilà un exemple de code avec la machine qui va avec :

La machine :

Deux moteurs sont utilisés pour l’avancement de la voiture, et le troisième est utilisé pour la direction des roues avant. Le capteur d’ultrason est mis à l’avant de la voiture pour éviter les colisions sur les murs et les objets.

Pour activer cette petite voiture, un programme simple va la faire avancer, sauf si il y a un objet devant, auquel cas elle va reculer et changer de direction.

Le code pour cela est le suivant :

import lejos.nxt.Button;
import lejos.nxt.Motor;
import lejos.nxt.MotorPort;
import lejos.nxt.SensorPort;
import lejos.nxt.UltrasonicSensor;

/** Programme pour la voiture Lego. */
public class Car {

  //Les deux moteurs pour les roues arrières.
  private static Motor back1 = new Motor(MotorPort.A);
  private static Motor back2 = new Motor(MotorPort.B);

  //Le moteur utilisé pour la direction avant.
  private static Motor direction = new Motor(MotorPort.C);

  //Le capteur d'ultrason.
  private static UltrasonicSensor sonic = new UltrasonicSensor(SensorPort.S1);

  //La boucle principale.
  public static void main(String[] args) throws Exception {

    //Boucle jusqu'à ce qu'on presse le bouton d'échappement.
    while (!Button.ESCAPE.isPressed()) {
      //Récupère la distance en CM.
      int distance = sonic.getDistance();
      if (distance <10) {
        changeDirection();
      } else {
        moveForward();
      }
    }
  }

  //Fait tourner les roues avant et recule.
  private static void changeDirection() {
    direction.rotate(35, false);
    moveBackward();
    direction.rotate(-35, false);
  }

  //Avance.
  private static void moveForward() {
    back1.rotate(360, true);
    back2.rotate(360, true);
  }

  //Recule.
  private static void moveBackward() {
    back1.rotate(-360, true);
    back2.rotate(-360, true);
  }
}