Tutoriel : Programmer le RCX 1. Introduction La «brique» Lego RCX est un véritable (très) petit ordinateur fonctionnant sur piles (6 piles type R6-AA 1,5V associées en série). Il se compose d un processeur Hitachi H8 avec 48 KB de mémoire centrale, dont 16 KB de mémoire morte (ROM) comportant une série de fonctions préprogrammées et 32 KB de mémoire vive (RAM). 1 port infrarouge 3 entrées 1 écran LCD 3 sorties 4 touches 1 compartiment piles Cet ordinateur peut communiquer avec le monde extérieur (et le monde extérieur peut communiquer avec lui) par le biais : d un port infrarouge, de 3 entrées (connecteurs gris 1,2,3) sur lesquelles on peut brancher des capteurs (capteur de contact, capteur de lumière ), de 3 sorties (connecteurs noirs A,B,C) sur lesquelles on peut brancher des moteurs, d un écran à cristaux liquides, de 4 boutons, d un haut-parleur interne. Le principe général de la programmation du RCX est le suivant : le(s) programme(s) à exécuter par le RCX doi(ven)t avoir été compilés(s) sur un autre ordinateur, de type PC ; une fois compilé sur un PC, le programme à exécuter est téléchargé dans le RCX par une communication infrarouge entre le PC et le RCX ; pour ce faire, on doit brancher un émetteur infrarouge sur un port USB du PC, aligner l émetteur infrarouge du PC et le récepteur infrarouge du RCX et exécuter - un programme émetteur dans le PC - un programme récepteur dans le RCX ; une fois le programme téléchargé dans la mémoire vive du RCX, son exécution est démarrée à l aide du bouton «Run» du RCX. Remarque technique importante : il faut faire attention, lors de transferts infrarouges, à éviter les interférences avec l éclairage de la pièce ou avec d autres transferts effectués simultanément dans la même pièce! Il existe différentes manières de compiler des programmes pour le RCX, car il existe différents langages de programmation pour lesquels des environnements de développement de programmes RCX sont disponibles. Lego offre même un langage de programmation «visuel», bien adapté aux enfants, mais beaucoup trop rudimentaire pour nos besoins. Nous souhaitons pouvoir écrire des programmes pour le RCX en Java, sur un PC, à l aide de l Interface de Développement Intégré (I.D.E.) BlueJ. Nous souhaitons les compiler (toujours à l aide de BlueJ), puis les télécharger dans le RCX et, enfin, les faire exécuter par le RCX. Page 1/1
Pour que tout ceci soit possible, il faut que la mémoire du RCX contienne un ensemble de programmes auxiliaires (le «firmware») assurant les fonctions nécessaires à l exécution, par le RCX, de programmes Java compilés sur un PC. Ceci n est pas très différent de ce qui se passe lorsque nous exécutons des programmes Java compilés sur un PC par le PC lui-même : SUN Microsystems, la firme qui a inventé Java, met à la disposition des utilisateurs du langage une sorte de firmware pour PC, qui s appelle «Java Runtime Environment» (JRE). Pour le RCX, nous utilisons le firmware LeJos, développé par une bande de joyeux fanas de Lego MindStorms et de Java. Ce firmware doit donc être chargé dans la mémoire du RCX avant qu il soit possible de charger et d exécuter des programmes Java compilés sur un PC. Remarque technique importante : le firmware LeJos reste chargé en mémoire tant que le RCX contient ses piles ; il faut le recharger si l on a ôté les piles (par exemple : pour éviter qu elles se déchargent). Reste encore un problème, qui est de taille : le firmware qui serait nécessaire pour pouvoir exécuter dans le RCX un programme compilé utilisant toutes les possibilités de Java serait largement plus grand que toute la (petite) mémoire disponible dans cette machine! Pour qu il reste quand même un peu de place en mémoire pour les programmes à exécuter, il a donc fallu accepter de restreindre les possibilités du langage utilisé, qui n est donc qu un sous-ensemble de Java (classes de l Application Programming Interface LeJos) et non pas le langage complet disponible lorsqu on exécute des programmes sur un «véritable» ordinateur Pour compiler les programmes Java destinés à être exécutés sur le RCX muni du firmware LeJos, on utilisera le programme BlueJ (I.D.E. Java écrit en Java) avec le plug-in BJMT («BlueJ MindstormsTool»). Le non-respect des quelques limitations du langage est détecté et des messages d erreur sont produits. C est également avec le plug-in BJMT que vous téléchargerez vos programmes compilés (option Download). Pour pouvoir utiliser les différentes classes nécessaires à la programmation du RCX, vos programmes doivent importer les packages appropriés en incluant l instruction suivante : import josx.platform.rcx.* ; Ressources sur le Web : CRILAB : http://crilab44.free.fr JDK Java (SUN) : http://java.sun.com/j2se/1.5.0/download.jsp LeJos : http://lejos.sourceforge.net BlueJ : http://www.bluej.org Le plug-in BJMT : http://ddi.uni-paderborn.de/mindstormstools/bjmt Page 2/2
2. Quelques questions pour commencer. a) Combien de moteurs peuvent être pilotés par la brique lego RCX? b) Quelle est la tension d alimentation de la brique? c) Combien et quels types de capteurs peuvent être connectés sur le RCX? d) Que signifie A.P.I.? Quel est le nom de l A.P.I. java du RCX? e) LEJOS nécessite environ 20 ko de mémoire. Combien reste-t-il de mémoire pour vos programmes? f) Que signifie I.D.E.? Quel I.D.E. utiliserez-vous pour coder vos programmes? g) Sur quels OS peut-on utiliser JAVA, LEJOS, BlueJ : MAC, MS Windows, Linux? Ces deux programmes sont-ils payants? Gratuits? Libres? h) Traduire en français les mots : Behavior, Arbitrator, Array, Forward, Backward, Thread. 3. Prise en main de BlueJ a) Lancer BlueJ et ouvrir le projet Robot1. b) Ouvrir, examiner puis fermer les classes «Robot1», «ToutDroit» et «Collision». c) Compiler la classe Robot1. Vérifier qu il n y a pas d erreurs de compilation. d) Charger le programme Robot1 dans le robot (le RCX doit être sous tension et à proximité de la tour IR) et observer son comportement (touche «RUN»). 4. Étude d un premier programme a) Classe «ToutDroit» (annexe n 2) : expliquer (dans ses grandes lignes) le comportement (=Behavior) «ToutDroit». b) Classe «Collision» (annexe n 3) : expliquer (dans ses grandes lignes) le comportement (=Behavior) «Collision». Comment est réalisée la rotation du robot? c) Classe «Robot1» (annexe n 1) : Lequel des deux comportements «ToutDroit» et «Collision» est prioritaire? Quelle ligne de la classe Robot1 définit la hiérarchie des priorités? d) On souhaite maintenant modifier le comportement «Collision». Proposer un programme pour que le robot n 2 tourne dans le sens opposé à celui du robot n 1 avec un angle deux fois plus grand. e) Proposer une modification originale (faire danser son robot?) pour le comportement «ToutDroit». 5. Votre premier robot! a) Créer un nouveau projet «Robot2» puis Importer les classes «Robot1», «ToutDroit», «Collision». b) Créer une nouvelle classe «Robot2». À l aide d un copier-coller, recopier le code de la classe «Robot1» dans la nouvelle classe «Robot2». c) Fermer la classe «Robot2». Observer le message d erreur puis supprimer la classe «Robot1» d) Compiler la classe «Robot2». La compilation doit échouer. Ouvrir la classe «Robot2» et remplacer Robot1 (3 ème ligne) par Robot2. Compiler la classe. Avez-vous compris l erreur? e) Programmer votre robot et vérifier que votre robot réagit selon le nouveau cahier des charges. Page 3/3
ANNEXE n 1 Robot1.java public class Robot1 public static void main(string [] args) // déclaration des Behaviors = comportements Behavior b1 = new ToutDroit(); Behavior b2 = new Collision(); // hiérarchisation des Behaviors Behavior [] barray = b1, b2; // déclaration du chef d orchestre Arbitrator arbitre = new Arbitrator(bArray); // mise en action arbitre.start(); ANNEXE n 2 ToutDroit.java import josx.platform.rcx.*; public class ToutDroit implements Behavior // déclencheur du comportement ToutDroit public boolean takecontrol() return true; // action du comportement ToutDroit public void action() Motor.A.forward(); Motor.C.forward(); // fin du comportement ToutDroit public void suppress() Page 4/4
ANNEXE n 3 Collision.java import josx.platform.rcx.*; public class Collision implements Behavior // déclencheur du comportement Collision public boolean takecontrol() return Sensor.S2.readBooleanValue(); // action du comportement Collision public void action() // marche arrière Motor.A.backward(); Motor.C.backward(); // durée marche arrière trythread.sleep(1000);catch(exception e) // rotation // durée rotation trythread.sleep(1000);catch(exception e) // fin rotation // fin du comportement Collision public void suppress() Page 5/5