Introduction à la programmation de LEGO MINDSTORMS

Paru le 19 avril 2006

SharpLogic Software

Consultez cet article en anglais Site en Anglais

Code de cet article : C#
Code de cet article : VB
Code de cet article : C++
Code de cet article : J#

Les produits MINDSTORMS sont des produits LEGO incluant tout ce dont un développeur a besoin pour créer et programmer physiquement des robots réels. Le produit MINDSTORMS typique inclut un tableau de blocs, de moteurs, de capteurs, ainsi qu'un contrôleur central, appelé LEGO RCX.

Pour commencer, vous devez télécharger et installer le kit LEGO MINDSTORMS SDK 2.5 gratuit. Cela permettra d'installer les pilotes requis pour envoyer des commandes au LEGO MINDSTORM via la tour infrarouge. Vous devrez également installer un produit Visual Studio 2005, tel que Visual Basic Express Edition 2005.

Programmation de LEGO RCX

LEGO RCX est un composant qui gère le traitement et le routage des commandes pour le fonctionnement du robot MINDSTORMS. Il utilise le jeu d'instructions de l'assembly LEGO (LASM) pour interpréter et exécuter des programmes embarqués et des demandes pilotées par PC. Le code LASM est envoyé au RCX à partir d'un PC via une connexion infrarouge, généralement à partir d'une tour connectée au PC via un câble USB ou RS-232 (série).

Les développeurs qui souhaitent écrire des applications basées sur RCX peuvent choisir entre deux modèles :

  1. Télécharger le code LASM vers le RCX et l'exécuter en tant qu'application complète. Dans ce modèle, le programme entier est envoyé au RCX et il est exécuté indépendamment par le processeur du RCX. Ce scénario est appelé programmation « autonome », car le RCX s'exécute indépendamment du PC.

  2. Envoyer une série de requêtes à partir d'un pilote (généralement un PC) afin d'indiquer au RCX les actions qu'il doit exécuter. Dans ce modèle, la logique s'exécute sur le PC et seules des commandes impératives sont envoyées au RCX en vue de leur traitement, par exemple les demandes de changement de la vitesse du moteur. Ce scénario est appelé programmation « intégrée », car le RCX peut être intégré facilement à d'autres applications.

Dans les deux modèles, le PC pilote est responsable de l'assemblage du code LASM et de son déploiement sur le RCX. Ce code peut être compilé par n'importe quel modèle (assemblé manuellement ou automatisé via le compilateur), mais il est généralement déployé via l'infrastructure fournie par LEGO.

Pour déployer une liste d'instructions ou de requêtes, un développeur utilise le fichier GhostAPI.dll de LEGO, une DLL Win32 native qui offre un certain nombre de fonctionnalités de bas niveau, conçues pour simplifier le processus de mise en file d'attente et de déploiement des commandes LASM. GhostAPI.dll dépend de l'une des deux DLL LEGO natives pour la communication avec la tour infrarouge : PbkComm32.dll (pour RS-232) ou PbkUsbPort.dll (pour USB). Le protocole de la tour proprement dite est géré via TowerAPI.dll, une autre dépendance GhostAPI.dll requise avec le déploiement. La tour communique directement avec le RCX par infrarouge, allant d'une dizaine de centimètres à plusieurs mètres (environ 4,50 mètres). Lors du déploiement d'applications, prenez soin d'inclure les quatre DLL afin de prendre en charge chaque type de port (GhostAPI.dll, PbkComm32.dll, PbkUsbPort.dll et TowerAPI.dll).

Si LEGO offre plusieurs solutions solides pour le développement d'applications autonomes, le project Interface Microsoft .NET pour LEGO MINDSTORMS a été conçu pour permettre le développement facile d'applications intégrées avec Visual Studio 2005 et le .NET Framework 2.0.

Avec l'interface Microsoft .NET pour LEGO MINDSTORMS, un développeur peut utiliser le langage .NET Framework de son choix pour développer par rapport à une bibliothèque de classes de haut niveau qui ressemble étroitement au modèle physique des robots MINDSTORMS. Il comprend des classes pour le RCX, ainsi que des classes pour les moteurs et les capteurs.

Objectifs de conception

L'interface Microsoft .NET pour LEGO MINDSTORMS a été conçue avec un objectif de simplicité pour le développeur. Avec cette philosophie de conception, n'importe quel développeur doit pouvoir utiliser la bibliothèque de classes afin de développer une application RCX sans aucune connaissance de LASM, ni des API sous-jacentes utilisées pour communiquer avec le périphérique, que ce soit au niveau des couches d'application ou des couches de données.

Vue d'ensemble de la conception

L'interface Microsoft .NET pour LEGO MINDSTORMS encapsule le fichier GhostAPI.dll LEGO et émule un modèle de contrôleur en temps réel. Bien que le RCX proprement dit ne fournisse pas de notifications d'événement au PC pilote, la bibliothèque Interface Microsoft .NET pour LEGO MINDSTORMS simule cette fonctionnalité en interrogeant régulièrement le RCX sur un thread distinct, puis en invoquant des changements via une classe de proxy abstraite. Le résultat est que les développeurs peuvent bénéficier d'une excellente prise en charge .NET, notamment la prise en charge des propriétés et des événements, sans avoir à implémenter les mécanismes d'interopérabilité de bas niveau ou à gérer le timing.

C4F.LegoRcx.dll

Tous les types exposés par l'interface Microsoft .NET pour LEGO MINDSTORMS sont disponibles dans l'assembly C4F.LegoRcx.dll.

La classe GhostApiWrapper

Bien que masquée pour les développeurs qui consomment la bibliothèque, la classe GhostApiWrapper est probablement le type le plus important de l'assembly. Elle expose toutes les fonctionnalités du fichier GhostAPI.dll de LEGO requises pour envoyer des demandes au RCX. Elle est utilisée exclusivement par les classes de l'interface Microsoft .NET pour LEGO MINDSTORMS et n'est pas accessible publiquement par les développeurs.

Pour émuler les événements en temps réel, GhostApiWrapper crée un thread de commande, qui demande les valeurs des capteurs actifs le plus souvent possible et envoie d'autres commandes émises via les classes de niveau supérieur. Bien qu'il ne possède pas de mécanisme de limitation, les commandes infrarouge tendent à être tellement longues que la boucle de commande ne tourne pas trop vite. Le mécanisme de limitation est essentiellement utile lorsque aucun capteur n'est interrogé, afin de garantir que le processeur n'est pas utilisé à 100 % pendant la boucle.

Pour offrir le niveau le plus élevé de performance et de réalisme, GhostApiWrapper n'exécute pas directement les commandes dès réception. Il existe trois moyens d'envoyer les commandes au RCX, selon que le développeur configure les propriétés du moteur, extrait les données ou envoie d'autres commandes. Notez que chaque méthode est transparente pour le développeur, lequel interagit uniquement avec les classes de niveau supérieur.

Configuration des propriétés du moteur

Pour déplacer le RCX, ses moteurs doivent être manipulés via les paramètres de puissance et de direction. Faire cela en série, par exemple en configurant la puissance du moteur A sur 5, puis la puissance du moteur C sur 5, donnerait un mouvement saccadé, qui ne déplacerait pas le RCX en ligne droite (sur la base de la configuration RoverBot standard). Pour atténuer ce problème, la classe GhostApiWrapper n'accepte pas directement les commandes de manipulation des moteurs. C'est un développeur qui change la valeur de la puissance du moteur dans une classe partagée dérivée de RcxBase, que le thread de commande de GhostApiWrapper interroge et met à jour en fonction des besoins lors de l'itération suivante. Cela permet au wrapper de tirer parti de demandes groupées, lorsque plusieurs moteurs peuvent être manipulés avec une commande unique.

Extraction de données

Dans la mesure où une liaison infrarouge est utilisée pour extraire les données du périphérique, cette extraction peut parfois s'avérer lente. Par conséquent, GhostApiWrapper interroge le RCX le plus souvent possible sur son thread de commande et met en cache les résultats dans la classe partagée basée sur RcxBase. L'accès du développeur aux données RCX est ainsi presque immédiat et les résultats sont censés être actuels en quelques centaines de millisecondes, excepté dans le cas de certaines propriétés, telles que le niveau de batterie, interrogé moins fréquemment (toutes les quelques secondes).

Lorsqu'une réponse à une demande de données est reçue du RCX par GhostApiWrapper, ce dernier met à jour la classe RcxBase partagée entre la couche d'encapsulation de l'API Ghost et la couche d'application de la bibliothèque. Certaines valeurs, telles que les valeurs du capteur, déclenchent des événements si la valeur a changé.

Envoi d'autres commandes

Outre la manipulation des moteurs et l'extraction de données, il existe un ensemble de demandes pouvant être envoyées au RCX pour effectuer certaines tâches, telles que la lecture de sons avec le haut-parleur RCX. Lorsque ces demandes sont envoyées à GhostApiWrapper, elles sont mises en file d'attente avec les autres commandes en attente et sont envoyées au thread de commande dans l'ordre dans lequel elles ont été reçues.

Classes publiques

Si de nombreuses classes de C4F.LegoRcx.dll sont utilisées pour l'abstraction de la fonctionnalité de l'API Ghost, les classes publiques de C4F.LegoRcx.dll sont conçues pour offrir une interface transparente pour permettre aux développeurs externes d'interagir avec le RCX proprement dit. Ainsi, seuls quelques types sélectionnés sont exposés publiquement, et même ces types présentent un sous-ensemble de leurs propriétés, méthodes et événements respectifs, disponibles pour utilisation. La limitation de la surface de programmation permet aux développeurs de comprendre et d'implémenter les applications plus rapidement et plus facilement via l'interface.

Rcx

La classe flagship, Rcx, offre plusieurs méthodes utilisées pour manipuler certaines propriétés du RCX, telles que le temps avant mise hors tension, l'affichage ou le haut-parleur, ainsi que des propriétés RcxMotor qui représentent chaque moteur et des propriétés RcxSensor pour chaque capteur. Lors de sa création, la classe Rcx tente automatiquement de se connecter au périphérique via USB, puis via RS-232. Si les deux tentatives échouent, le constructeur réussit, mais le développeur doit connecter une tour et appeler la méthode Connect.

Voici quelques exemples de l'utilisation de la fonctionnalité Rcx :

          ' Create a new Rcx to play with
          Me._rcx = new Rcx()

          ' Play a low C note for 200 ms (these two are functionally equivalent)
          Me._rcx.PlayTone(33, 20)
          Me._rcx.PlayTone(RcxNote.C1, 20)

          ' Set the RCX display to show "99"
          Me._rcx.SetDisplay(99)

          ' Send the message "47" to other RCX devices via our RCX device
          Me._rcx.SendMessage(47)
        

RcxMotor

La classe RcxMotor est conçue pour émuler un moteur RCX physique. Pour faciliter le travail du développeur, il n'existe que deux moyens de manipuler le moteur : via la propriété Power et via la méthode Off. La configuration de la propriété Power sur une valeur positive ou négative garantit que le moteur est sous tension et configure sa direction respectivement vers l'avant ou vers l'arrière. La configuration de Power sur 0 place le moteur en mode flottant, c'est-à-dire qu'il n'est pas verrouillé, mais qu'il n'est pas alimenté. L'appel de la méthode Off définit Power sur 0 et verrouille le moteur dans l'état désactivé.

Tout accès aux objets RcxMotor doit passer par une classe Rcx. Voici quelques exemples de l'utilisation de RcxMotor :

          ' Full speed ahead on motor A
          Me._rcx.MotorA.Power = 8

          ' Back up and to the right (assuming the RoverBot configuration)
          Me._rcx.MotorA.Power = -8
          Me._rcx.MotorC.Power = -4

          ' Turn off all motors
          Me._rcx.MotorA.Power.Off()
          Me._rcx.MotorB.Power.Off()
          Me._rcx.MotorC.Power.Off()
        

RcxSensor

La classe RcxSensor est conçue pour émuler un capteur RCX physique. Par défaut, chaque capteur est configuré sur le type RcxSensorType.None. Pour utiliser le capteur, configurez-le sur le type approprié, tel que RcxSensorType.Touch pour un capteur de toucher. La configuration du type sur une valeur autre que Aucun indique qu'un capteur actif est associé au port, ce qui informe la couche du wrappeur Ghost API qu'elle peut interroger le capteur afin de connaître sa dernière valeur. La valeur actuelle d'un RcxSensor peut être lue à partir de sa propriété Value, et un développeur peut s'abonner à l'événement ValueChanged afin de recevoir des notifications en temps réel lorsque la valeur change.

Tout accès aux objets RcxSensor doit passer par une classe Rcx. Voici un exemple de configuration d'un capteur de toucher et de gestion de son événement :

          ' Configure our sensor 1 as a Touch sensor
          Me._rcx.Sensor1.SensorType = RcxSensorType.Touch

          ' Set up Sensor1_ValueChanged as the event handler for this sensor
          AddHandler Me._rcx.Sensor1.ValueChanged, AddressOf Sensor1_ValueChanged

          ' Handles value changes for sensor 1
          Private Sub Sensor1_ValueChanged(ByVal sender As Object, _
          ByVal e As RcxSensorValueChangedEventArgs)
          Dim pressed As Boolean = (e.Value == 1)
          ' Do something based on whether the sensor is pressed or not
          End Sub
        

Déploiement d'applications

Les applications écrites avec l'interface Microsoft .NET pour LEGO MINDSTORMS présentent tous les avantages de déploiement des applications .NET Framework 2.0. Pour commencer, l'ordinateur cible nécessite que le .NET Framework 2.0 soit installé. Notez que le .NET Framework 2.0 est installé automatiquement par Visual Studio 2005. En outre, l'ordinateur cible nécessite également que le kit LEGO MINDSTORMS SDK 2.5 soit installé.

Une fois que l'ordinateur cible a été configuré, le moyen le plus simple de déployer ces applications consiste à copier les fichiers exécutables et les fichiers de ressource, ainsi que les DLL requises, vers un dossier sur l'ordinateur cible. Si les fichiers exécutables et les fichiers de ressource dépendent de votre application particulière, le répertoire exécutable doit toujours contenir C4F.LegoRcx.dll. En outre, ce dossier nécessite également GhostApi.dll, ainsi que PbkUsbPort.dll (pour les tours USB) ou PbkComm32.dll (pour les tours série), lesquels se trouvent dans [Program Files]\LEGO Software\LEGO Mindstorms SDK\Bin\GhostAPI sur l'ordinateur cible après l'installation du kit LEGO MINDSTORMS SDK

Exemples d'applications

L'interface Microsoft .NET pour LEGO MINDSTORMS est livrée avec trois exemples d'applications, chacune disponible en Visual Basic, Visual C#, C++ géré et Visual J#. Ces applications sont les suivantes :"

RemoteControlSample

Illustre l'utilisation de RcxMotors. Notez que cet exemple nécessite la configuration RovertBot de LEGO Constructopedia.

RoverBotSample

Illustre le traitement des événements RcxSensor pour manoeuvrer le RCX autour des obstacles. Notez que cet exemple nécessite la configuration RovertBot de LEGO Constructopedia.

MusicSample

Illustre l'utilisation du haut-parleur du RCX via la méthode PlayTone.

Les téléchargements de code dans les différents langages incluent une copie de l'interface Microsoft .NET pour LEGO MINDSTORMS en tant qu'assembly compilé. Le téléchargement en C++ géré inclut également le code source du projet pour C4F.LegoRcx.dll.

Résumé

L'interface Microsoft .NET pour LEGO MINDSTORMS offre suffisamment de fonctionnalités pour permettre aux amateurs et aux étudiants de commencer à expérimenter l'utilisation de la robotique, et a été conçue avec la simplicité comme principal objectif. Un certain nombre d'exemples d'applications ont été développés pour illustrer les fonctionnalités de la bibliothèque et pour permettre aux programmeurs de démarrer rapidement. Il existe plusieurs moyens d'utiliser cette bibliothèque pour créer de nouvelles utilisations pour vos kits LEGO MINDSTORMS en les contrôlant avec une application Microsoft .NET. Par exemple, vous pouvez programmer plusieurs MINDSTORMS afin qu'ils « collaborent » et partagent des informations sur un labyrinthe. Ou vous pouvez recréer le fameux outil de résolution du Rubik's Cube de LEGO MINDSTORMS. Ou encore créer des interfaces de services Web afin de contrôler un LEGO MINDSTORM en déplacement ? Les possibilités sont infinies. Nous avons hâte de voir ce que vous allez créer.