Laboratoire SUPINFO de recherche en robotique

NXT : Distributeur automatique de médicaments

NXT : Distributeur automatique de médicaments

8 avr, 2013

Les médicaments.
Pourquoi en acheter une boite de 20 alors que notre traitement n’en nécessite que 12 ?

C’est à partir de cette question que des élèves du lycée st François de Salle ont créé un prototype de distributeur automatique de médicaments, qui, équipé de recharges sous forme de bandes, distribue le nombre exacte de médicaments nécessaire, suite à la saisie par l’utilisateur de la posologie donnée par le médecin.

Pour ce qui est du programme, ils ont fait appel à un étudiant de Supinfo pour les aider.
Le principe de fonctionnement est simple : La bande contenant les médicaments est de couleur noire, avec entre chacun un trait (assez large) blanc. Ce trait est détecté par un capteur de couleur dirigé vers la bande, qui va permettre au NXT de savoir quand le médicament est sorti. L’utilisation d’un timer aurais été possible, mais la moindre erreur (dérapage du système d’entrainement de la bande par exemple) aurait provoqué des erreurs dans la distribution.
Ce système permet aussi de changer les médicaments distribués, peu importe la longueur du médicament, le point de repère étant la bande blanche. Ce robot est relié par USB a un ordinateur sur lequel l’utilisateur va saisir la posologie.

Tout d’abord, nous allons étudier le programme (utilisable en lignes de commandes uniquement) qui à permis l’envoi de données vers le NTX :

NeXTTool (disponible sous Windows et Mac OSX), dont la documentation est disponoble ici

Nous allons nous intéresser à deux lignes en particulier :

/COM=port : Spécifie le port ciblé par l’action (Nous utilisons le port USB => /COM=USB)

-msg=<string> : Envoie un message au NXT (sous forme de chaîne de caractères, peu importe le contenu)

 

Nous allons voir comment utiliser ce programme simplement :

Créer un fichier texte, puis modifier son extension en « .bat ». Ensuite, clic droit => modifier.

Ecrire « @echo off ». Cette commande va désactiver l’affichage des différentes instructions données et n’en afficher que le résultat. (le symbole « @ » désactiver aussi l’affichage de la commande qui le suit)
Ecrire « :Debut ». Il s’agit d’un label, qui pourra ensuite être ciblé par un goto.
Ecrire « set /p nombre= » suivi d’une phrase de votre choix. Cela affichera la phrase et exécutera une pause dans le programme, laissant l’utilisateur taper quelque chose dans la console, en validant par entrée. La variable « nombre » prendra pour valeur ce  que l’utilisateur a saisi.

Ecrire « cls ». Cela rafraîchira l’écran de la console.

Ecrire « NeXTTool.exe /COM=usb -msg=%nombre% ». L’exécutable NeXTTool.exe devra être présent dans le ou se trouve le fichier batch. %nombre% représente la valeur de la variable. Ici, on retrouve bien le port de destination (USB) et le message, qui sera le contenu de la variable « nombre ».

Ecrire « goto Debut ». Ici, nous allons simplement retourner au label « Debut », créé précédemment.

Sauvegarder, et c’est tout !

Ce programme permettra l’envoi de chaines de caractères au robot.

Il est bien sûr possible de faire un programme bien plus agréable à utiliser (avec une interface graphique) en utilisant des librairies comme QT en C++, par exemple.

Maintenant, nous allons nous intéresser au programme qui est utilisé par le robot. Tout d’abord, voyons en détail les principales briques NXT-G :

L’affichage :

Elle affiche simplement ce qu’on lui demande sur l’écran du NXT. Il est possible d’utiliser des images préenregistrées, des images personnalisées (converties auparavant à l’aide d’un logiciel spécifique disponible ici)

 

Le moteur :

Il permet simplement le contrôle des moteurs connectés au robot. Il est possible de laisser un moteur en roue libre, de le bloquer, ou de l’actionner. il est possible de l’activer en permanence, ou de l’associer à un timer, a un compteur de tours, ou de choisir le degré de rotation voulu. La puissance est modulable.

 

La boucle:

Elle permet l’exécution d’une partie du programme, à la manière d’un DO… WHILE. Elle peut être infinie, afin que le programme se répète, ou attendre un événement particulier (capteur, timer, compteur…) pour s’achever.

Ici, nous allons déjà rencontrer un premier problème : le mode « compteur » ne peut prendre en paramètre qu’une constante : si nous voulons faire une boucle FOR, il va falloir utiliser une variable en plus qui représentera l’état de la condition : vrai (1) ou faux (0). Ensuite, nous dirons a la boucle de s’effectuer tant que la variable est a vrai (1).

 

Le switch :

Il s’agit d’une sorte de IF THEN ELSE.
Le switch prend en paramètre un capteur ou une variable, et à partir d’ici, se divise en deux chemins : le premier pour le THEN, le second pour le ELSE.
Un exemple :

ici, la boucle s’exécutera x fois, x étant la valeur contenue dans la variable.

IF variable=1
THEN afficher « true »

ELSE afficher « false »

 

Le capteur de couleur :

Il renvoie une valeur représentative de la couleur principale qui a été détectée.
Les valeurs renvoyées sont :

  • 1 : Noir
  • 2 : Bleu
  • 3 : Vert
  • 4 : Jaune
  • 5 : Rouge
  • 6 : Blanc

 

Les variables :

Il existe différents types de variables : booléen (0 ou 1), nombre ou chaîne de caractères. Le bloc variable dispose de deux modes. Le mode lecture qui permet simplement la lecture de la valeur contenue dans la variable, et le mode écriture qui peut prendre en paramètre soit une valeur constante, soit la sortie d’un autre bloc (qui devra être de même type que la variable elle même).

 

Il est aussi important de savoir que le NXT dispose d’une prise en charge des threads (3 au maximum).

En effet, en partant du début, il est possible de mettre en parallèle 3 programmes différents.
Exemple:

Ici, le programme affichera « image 1″, puis « image 2″, et enfin « image 3″.

 

Passons maintenant au début du programme : tout d’abord, nous allons faire une grande boucle infinie, afin que lorsque la distribution à été effectuée, le robot soit prêt à effectuer une nouvelle distribution sans avoir à relancer le programme. Le programme du robot se trouvera donc dans cette boucle.

Ensuite, il va falloir créer un état d’attente qui durera jusqu’à ce que le robot reçoive un message (par USB ou Bluetooth) contenant un nombre non nul. Ici déjà  nous rencontrons un premier obstacle : comme nous l’avons vu précédemment  le programme NeXTTool envoie les données sous forme de chaîne de caractère, quel que soit le contenu. Nous devons donc traduire la chaîne de caractère en nombre. Hors, les briques présentes par défaut dans le logiciel ne permettent que la conversion nombre vers chaîne, pas l’inverse. Il vas donc falloir importer un bloc a l’aide de l’assistant d’importation de blocs. Le bloc dont nous avons besoin est disponible ici.

En images :

On lance l’assistant d’importation/exportation de blocs:

On sélectionne le dossier qui contient le bloc a importer:

On selectionne la palette a laquelle on souhaite ajouter le bloc, on clique sur importer, et on retrouve bien le bloc dans l’éditeur !

 

 

Désormais, nous allons pouvoir exploiter les nombres envoyés par l’ordinateur. Nous allons stocker cette valeur dans une variable qui nous servira plus tard. Nous n’avons plus qu’a utiliser cela dans une boucle de laquelle on ne sort que lorsque le message contient un nombre différent de 0.

En images :

Ensuite, il va falloir créer la partie du programme qui vas faire avancer la bande jusqu’au trait blanc, afin de délivrer un médicament, ni plus, ni moins. Pour cela, nous allons utiliser le capteur de couleur.

La valeur renvoyée pouvant ne pas être exactement la bonne, nous allons considérer que en dessous de 3, la couleur captée est le noir, et qu’au dessus (3 y compris), la valeur captée est le blanc.

Ensuite, nous utiliseront un switch afin que si le robot capte du blanc, il s’arrête et sort de la boucle, sinon il continue. Il faut aussi penser à ajouter une rotation du moteur après que la bande blanche ai été captée, afin de dépasser la bande. En effet, sans cela, le robot s’étant arrête avec la bande blanche devant le capteur, lors de la prochaine distribution, le capteur détecterait immédiatement le blanc et la bande ne bougerait pas.

En images :

Nous voulons que le distributeur délivre autant de médicaments que ce qui sera contenu dans le message. Nous allons donc créer une boucle FOR, comme vu précédemment  Dans cette boucle, on devra retrouver une variable qui sera incrémentée a chaque nouveau passage de la boucle, et qui sera comparée a la variable contenant le nombre reçu. Si les deux sont égaux, alors on sort de la boucle, si non on recommence… jusqu’à ce que le nombre de médicaments à distribuer soit atteint ! dans cette boucle, nous utiliseront la partie de programme qui permet la distribution d’un médicament, créée précédemment.

En images :

 

Pour finir, nous allons créer un thread, qui permettra un affichage un peu plus agréable, désignant l’état du robot. Pour cela, rien de plus simple. Nous allons déclarer une variable représentative de l’état du robot : « chargement ». Elle sera passée a 1 lors de la réception du message, et a 0 a la fin de la distribution du dernier médicament. Ensuite, un switch avec un affichage différent selon l’état, le tout placé dans une boucle infinie, et c’est tout ! (nous placeront juste un timer a la fin de la boucle afin d’éviter que le rafraîchissement de l’écran ne s’effectue trop vite) nous connecteront cette partie du programme au début, comme vu précédemment dans la partie traitant des threads.

Et voila, votre robot est enfin prêt !! il ne vous reste plus qu’a vous créer un habillage en LEGO, avec un système d’entrainement pour la bande et vous pourrez vous en servir !

Résultat final :

 

Nous tenons à remercier notre partenaire

 

Génération Robot

Génération Robots

 

, de nous avoir fourni le matériel qui nous à permis de réaliser ce premier Tutoriel sur NXT!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>