NXT-G, leçon n°4 : Plots et fils de données

Pour expliquer certains fonctionnements, principes et fondements.
Avatar de l’utilisateur
roboleo
Level 8
Level 8
 
Messages: 955
Localisation: Hauts de Seine
expertnxt

Messagepar roboleo » Dim Déc 21, 2008 7:43 pm

NXT-G, Leçon n°4: Plots et Fils de données…

De nombreuses questions posées par les utilisateurs de NXT-G concernent les Plots de Données, et cela avec raison. Les plots de données d'un Bloc peuvent semer la confusion, surtout quand le bloc présente plusieurs options. D'où certaines difficultés pour "tirer" les bons fils et pour assurer des connexions correctes.
Nous allons faire une pose dans l'étude de la programmation des blocs NXT-G, et j'essaierai de vous donner quelques astuces pour mieux utiliser ces spécificités que constituent les Plots et les Fils de données.

Transmettre des informations:
Voici pour commencer un bloc de programmation factice que j'appelle Bloc de FORME.

Image

Ce bloc imaginaire est le plus simple que vous puissiez rencontrer. Il ne contient qu'UNE seule forme: un CUBE. Un cube et rien d'autre, et il n'existe aucun moyen pour changer cette forme.
Mais il y a encore pire, ce bloc ne dispose d'aucun dispositif pour partager cette forme avec un robot. C'est un bloc vraiment stupide, ennuyeux et inutile.

Que pourrait-on faire pour qu'il puisse nous rendre service?
Bien, d'abord le rendre capable de changer de FORME. Celle que je préfère, c'est la SPHERE. Aussi j'aimerai bien qu'il puisse remplacer le CUBE par la SPHERE.
Pour l'instant, je ne souhaite rien faire d'autre que ce changement; ce bloc contiendrait alors ma forme préférée!
La chose qui manque à ce bloc, c'est le moyen de se glisser à l'intérieur et de changer le CUBE en SPHERE. Ce serait bien si je pouvais le faire moi-même, et procéder à ces changements selon mes désirs.
La première chose à faire, c'est de connecter à ce bloc un minuscule clavier pour changer la FORME. Ce clavier très particulier comporterait des touches conçues pour choisir seulement une forme (cube, parallélépipède, sphère, cône, cylindre, anneau, tige, etc…), et rien d'autre. Il n'est pas fabriqué pour taper du texte ou autre chose.
On pourrait l'imaginer ainsi:

Image

Parfait! Maintenant je peux saisir SPHERE. Plus tard, si j'envisageais de remplacer SPHERE par TIGE, je n'aurais qu'à appuyer sur la touche représentative de cette autre forme.
A présent, j'ai la forme SPHERE . En dehors de la visualiser, je ne peux pas en faire grand chose. Tout comme le clavier de forme, je vais raccorder au bloc un petit écran factice capable de puiser l'information et de l'afficher. Cet écran est semblable au clavier; il ne peut afficher que des formes et rien d'autre.
Notre dispositif pourrait ressembler à ceci:

Image

Résumons:
* Le bloc ne peut contenir qu'une seule forme, pas de nombre, ni de jour ni de nom.
* Ensuite, au bloc FORME est raccordé un clavier qui permet de changer seulement et uniquement la forme contenue dans ce bloc.
* Enfin, un écran spécial raccordé au bloc, ne peut afficher que la forme, et rien d'autre; ni un nom, ni des légumes ou ingrédients…!
Et maintenant, quelques questions:
* Si je débranche le clavier, puis-je afficher la forme conservée dans le bloc? Oui, mais à condition que l'écran soit raccordé.
* Si je débranche l'écran, puis-je toujours changer la forme à l'intérieur du bloc? Oui à nouveau, mais à condition que le clavier reste raccordé.
On pourrait aussi définir le bloc de cette façon:
* Le bloc FORME reçoit une Forme comme une ENTREE à partir du clavier.
* Le bloc FORME donne une Forme comme une SORTIE sur l'écran.

Il y a dans cette description 2 termes que vous devez mémoriser: Entrée et Sortie (input & output en anglais).
Chaque fois que vous penserez bloc, rappelez vous toujours qu'une information reçue dans un bloc est une Entrée, et qu'une information donnée (ou partagée) est une Sortie.

Nous allons maintenant travailler sur un bloc offrant quelques options supplémentaires.
Voici un nouveau bloc factice que j'appelle TIROIR. Il est destiné à recevoir des pièces LEGO.

Image

Ce bloc peut contenir 3 sortes d'informations: une forme (type de pièce), le nombre de pièces dans le tiroir,et une réponse OUI si le tiroir est vide ou NON si le tiroir n'est pas vide.
Au lieu de m'encombrer de clavier et d'écran pour les entrées et sorties, j'ai imaginé une représentation plus simple à l'aide d'un "socle" un "HUB" comme disent les anglais.

Image

Vous pouvez voir sur le croquis qu'il y a 3 plots d'entrée à gauche du Hub, et 3 plots de sortie à droite. C'est sur ces plots que se raccorderont le clavier, l'écran et autres dispositifs.
Tout comme le bloc FORME, le bloc TIROIR est très pointilleux quant aux dispositifs qui lui sont raccordés. Pour le plot d'entrée PIECE, je ne peux raccorder que des formes. Nous savons déjà qu'un clavier de forme fonctionne. Je peux donc lui raccorder ce clavier et changer grâce à lui les pièces (formes), remplacer SPHERE par TENON par exemple. Mais il y a mieux!
Rappelez-vous, le bloc FORME dont on a parlé précédemment. Bien, il a lui aussi un Hub de données, mais il était caché, escamoté. Nous allons le déployer pour le rendre visible, et pour cela, nous cliquerons au bas de l'angle gauche du bloc FORME (rappelez-vous, leçon n°2).

Image


Le plot d'entrée à gauche du bloc FORME est la borne de raccordement du clavier qui me permet de changer la forme contenue dans le bloc. Le plot de sortie à droite peut être raccordé à un écran, mais en vérité, il peut-être raccordé à n'importe quel plot d'entrée qui accepte une forme!
Aussi, au lieu de raccorder un clavier au plot d'entrée du bloc TIROIR, j'utilise (je tire) un simple fil reliant le plot de sortie FORME du bloc FORME au plot d'entrée PIECE du bloc TIROIR.

Ouf…! J'espère que vous avez suivi.
Et voilà le résultat:

Image

Je peux aussi raccorder un clavier au bloc TIROIR pour saisir un Nombre (une quantité de pièces). Et si j'emploie ce clavier pour autre chose que taper des valeurs, il refusera systématiquement la saisie.
Je peux aussi raccorder un clavier "logique" à l'entrée Vide.
Un clavier "logique" est un peu spécial: il ne peut fournir qu'UNE des 2 réponses, OUI ou NON. Pas peut-être, ni quelques fois…

Ce que j'aimerais faire avec ce bloc TIROIR, c'est de le raccorder à un écran qui affiche une des deux choses (mais pas les deux):
* Remplir le Tiroir d'un type de pièce en précisant le nombre de pièces,
* Le tiroir n'est pas vide.
Pour réaliser cela, j'utiliserai un écran qui affichera le type de pièce et les quantités qui remplissent le tiroir. Mon dispositif ressemblerait à cela:

Image

Mais, avant d'afficher le type de pièce et la quantité, j'ai besoin d'un bloc spécial, capable d'apprécier le contenu du tiroir et de signaler s'il est vide ou non. Il ne me reste plus qu'à vous révéler ce nouveau bloc que j'ai baptisé INSPECTEUR.
Le bloc INSPECTEUR est très astucieux. Il récupère une réponse OUI ou NON (logique), et selon cette réponse déclenche 2 actions différentes. L'action 1 est prise en compte si la réponse est OUI; l'action 2 si cette réponse est NON (nous verrons cela plus en détail à l'occasion d'une autre leçon).
Je peux utiliser ce bloc pour évaluer le contenu du bloc TIROIR.
J'examinerai d'abord les plots de la rubrique Vide. Si le contenu, les informations ou tout simplement les données (data en anglais) fournies sont OUI, Le bloc INSPECTEUR confirmera un OUI sur l'écran. Si les données sont NON, l'INSPECTEUR confirmera un NON sur l'écran.
La figure ci-après illustre bien la situation quand le programme est exécuté:
L'écran affiche "Remplir Tiroir avec 7 Tenons", parce que l'inspecteur a récupéré en entrée un OUI provenant de la rubrique VIDE. Il donne l'ordre de remplir un tiroir qui est vide.

Image

Je souhaite maintenant, changer la pièce par ROUE, et le nombre par 4. Mais aussi changer la réponse logique par NON.
L'inspecteur ayant récupéré le NON en entrée interdira le remplissage en faisant afficher "Tiroir non vide". Quelle que soit la pièce et la quantité le remplissage du tiroir n'aura pas lieu.
Pour qu'il puisse se faire, il faudra attendre qu'un OUI l'autorise, et dans ce cas, l'écran affichera: "Remplir Tiroir avec 4 Roues".

Je pourrais créer des dizaines de blocs factices, mais j'espère que vous commencez à comprendre comment les blocs peuvent recevoir en entrée et donner en sortie des informations. Ces 2 types de données peuvent-être déterminées par vous ( soit en tapant les informations, soit en les choisissant dans le panneau de configuration des blocs), ou fournies par d'autres blocs en utilisant les fils de données.
Vous devez savoir aussi, que certains blocs ne disposent pas de plots d'entrée, d'autres pas de plots de sortie, rares enfin quelques uns sans aucun plot.

Revenons à la programmation et soyez heureux d'apprendre que parmi toutes ces sortes de données imaginables, seuls trois types sont utilisés par le NXT-G:

* Texte: lettres, mots, phrases et même les nombres quand ils sont considérés comme du texte.

* Nombre: les nombres peuvent-être positifs ou négatifs, et quelquefois limités aux valeurs entières (seulement des nombres comme -3, 0, 4, 8 ou 10 et non pas des nombres décimaux comme 4,3 ou 8,5).

* Logique: ne peut-être que OUI ou NON ( une autre manière de l'exprimer étant VRAI ou FAUX).

Quand vous programmerez vous appliquerez cette règle:
Cinquième règle: les seules données qui peuvent circuler entre les blocs sont du TEXTE, des NOMBRES et du type LOGIQUE - et seulement ces trois.

A suivre…

A+
Roboleo

Avatar de l’utilisateur
roboleo
Level 8
Level 8
 
Messages: 955
Localisation: Hauts de Seine
expertnxt

Messagepar roboleo » Mer Déc 24, 2008 5:49 pm

NXT-G, Leçon n°4: Plots et Fils de données…(suite et fin)

Nous avons vu que les seules données échangées entre les blocs, relèvent de trois types: Texte, Nombre et Logique.
Cela ne signifie aucunement que tous les blocs manipulent en permanence ces trois types. Certains comporteront des plots de texte et logique, mais pas de plot de nombre; d'autres n'auront pas d'entrées, mais peut-être 2 plots de sortie fournissant des données numériques. Tout dépendra des fonctions attribuées à ces blocs.

Il faudra apprendre à tirer des fils de données entre les plots sans commettre d'erreurs. Mais là aussi, tranquillisez-vous, la bonne nouvelle est que NXT-G ne vous laissera pas tirer des fils entre deux plots non compatibles (par exemple d'un plot Texte vers un plot Logique).
Il réagira par une rupture de fil et celui-ci apparaîtra en pointillé sur l'espace de travail, signifiant la rupture donc l'incompatibilité.
Mieux encore, si les liens sont correctement effectués, ils apparaîtrons sous trois couleurs distinctes, permettant de reconnaître le type de données:
* fil jaune pour une donnée numérique,
* fil orange pour une donnée textuelle
* fil vert pour une donnée logique
* Si le fil apparaît en pointillé (grisé), cela signifie qu'il est rompu et que le lien ne fonctionne pas.

Relier les plots par des fils requiert une certaine pratique. Vous constaterez qu'ils prennent parfois des directions inattendues, ou adoptent des trajets bizarres. Il faudra vous entraîner pour les maîtriser correctement.

Bien, il est temps de revenir à nos blocs NXT-G.
Nous travaillerons sur la palette "complète" de blocs

Image

Le bloc MOTEUR a envoyé par ce fil une information logique sur le sens de rotation du moteur (OUI= marche avant; NON= marche arrière), à un bloc VARIABLE configuré en LOGIQUE. Cette information est stockée dans une case mémoire du bloc VARIABLE.

Cet exemple montre la diversité des données qu'un bloc peut manipuler.
Le Hub étant déployé, on remarque la présence des plots de part et d'autre de la "colonne" (figurés sous forme de crochet). Pour chaque entrée correspond généralement une sortie. On remarque également entre les plots une minuscule icône se rapportant à un paramètre du panneau de configuration.
Si l'on survole ces icônes avec la souris, une bulle d'aide précise encore mieux l'information liée aux données. Ces aides facilitent considérablement le travail.
Pour supprimer un fil, il suffit de cliquer sur le plot d'entrée auquel il est raccordé (le curseur prend la forme d'un doigt pointé).
Je vous conseille d'aller faire un tour dans l'aide et support pour Lego Mindstorms NXT, où vous trouverez des explications détaillées sur les différents blocs et leurs plots de données. Exercez-vous à "tirer" des fils et observez leurs couleurs afin de vous familiariser avec l'interface graphique.
Une dernière bonne nouvelle: vous ne risquez pas de détruire votre programme si par hasard certains plots ne sont pas correctement reliés. Il suffit de supprimer les fils incompatibles et de recommencer.

Entrons maintenant un peu plus dans le détail.

Les capteurs:
Vous avez ici la série complète des blocs capteurs, y compris les capteurs intégrés (moteur et minuteurs). Un seul n'y figure pas, c'est le récepteur de message, bloc particulier qui sera traité dans une leçon concernant Bluetooth.

Image

Vous remarquerez d'abord qu'il n'ont pas tous le même nombre de plots. Mais aussi que certains plots ne sont qu'en sortie seulement, signifiant que le capteur peut fournir une donnée interne.
Ils disposent tous d'une sortie logique ( oui/non) signifiant qu'ils peuvent agir différemment selon certaines conditions, propres à chacun.
Un seul dispose d'une entrée/sortie numérique: le minuteur.

Les flux de données
On entend par flux les mouvements d'informations qui circulent soit à l'intérieur des blocs, soit entre blocs.

Image

Comme vous le constatez, les plots sont ici peu nombreux et pour certains, il faut les débusquer.
Les plots des blocs DEPLACER ne sont pas déployés pour la circonstance.

Le bloc ATTENDRE, paramétré sur TEMPS n'a aucun plot; il en est de même pour le bloc ATTENDRE, paramétré sur CAPTEUR.
Le bloc BOUCLE a un plot sortie et un plot entrée à l'intérieur de la boucle, paramétrée à partir de son panneau de configuration. Ce bloc dispose de nombreuses options (il faut cocher la case COMPTEUR pour visualiser le plot sortie). Pour le plot d'entrée, il faut choisir l'option LOGIQUE pour qu'il apparaisse.
Le bloc COMMUTATEUR n'a qu'un plot d'entrée; il est aussi paramétré à partir de son panneau de configuration.
Le bloc ARRETER n'a qu'un plot d'entrée et un de sortie.

Les Données:
Ne pas confondre avec les flux de données.
Ces blocs ne servent qu'à faire des calculs ou stocker des données.

Image

Dans les 4 premiers on observe 2 plots A et B en entrée et sortie de données.
A et B sont des cellules internes qui reçoivent et fournissent des valeurs; des sortes de tiroirs de passage. Ces valeurs proviennent soit d'une saisie manuelle, soit d'un autre bloc par l'intermédiaire d'un fil de données. Le résultat de l'opération est en sortie uniquement (logique, numérique).
Les 2 derniers blocs n'ont qu'une sortie uniquement.

Blocs avancée:
Ils sont donnés ici à titre d'information, à utiliser à bon escient.

Image

Vous connaissez déjà le premier bloc; le deuxième ne s'utilise que pour l'affichage sur écran: il transforme une valeur numérique en texte.
Les autres blocs sont surtout utilisés par les programmeurs confirmés.


Et maintenant, un exemple pour montrer l'utilité des fils de données.
Je souhaite créer un compteur qui à l'aide du capteur tactile, enregistre chaque coup de bouton et affiche sur écran son numéro d'ordre. Pour compliquer un peu plus, je souhaite que ce compteur revienne à zéro, chaque fois que l'on dépasse une valeur plafond.
Pour vous faire une idée, voici à quoi ressemble ce programme:

Image

Nous allons nous intéresser à la boucle intérieure:

Image

Bloc 1: capteur tactile, chaque fois qu'il est activé, il émet un top sonore (bloc 2).
Bloc 3: variable numérique initialisée à la valeur zéro, valeur de départ. dans ce bloc on ne fait que lire le contenu de la variable.
Bloc 4: Math, option pour effectuer une addition. Ce bloc comporte 2 cases A et B. Je tire un fil entre Bloc 3 et A (pour mettre dans A la valeur écrite dans le bloc, c. à d. zéro). Dans B j'écris une valeur +1. Le résultat (#) devient A + B = 1.
Bloc 5: on écrit dans la variable la nouvelle valeur qui devient 1, en tirant un fil entre les plots # des blocs 4 et 5.
Bloc 6: on transforme la valeur numérique en texte pour l'afficher dans le bloc 7. Un fil est tiré du plot # bloc 4 vers plot # bloc 6.
Bloc 7: On tire un fil entre plot T bloc 6 vers plot T bloc 7 qui affiche 1.
Cette boucle vient d'être exécutée une fois. Elle va se répéter plusieurs fois, très exactement 4 fois puisque je l'ai décidé ainsi.

Examinons maintenant le panneau de configuration de la boucle.

Image

Dans la zone CONTROLE, le champ est configuré sur Compter (sous-entendu compter le nombre de répétitions). Ce nombre a été fixé à 5. Notez également que la case compteur est cochée, ce qui permet d'afficher le plot de sortie de la boucle (ici inemployée), donc de récupérer éventuellement cette valeur.
La boucle va donc se répéter 4 fois, et à la 5 ème, la boucle se termine.

Le programme se poursuit dans la boucle extérieure.
On écrit la valeur zéro dans le bloc variable, suivit d'un top sonore différent du premier pour dire qu'on recommence à partir de zéro.
Enfin pour quitter le programme, on appuie à ce moment sur le bouton rouge du NXT.

J'ai à peu près dit l'essentiel sur les fils de données, mais le sujet est vaste et vous vous en rendrez compte.
Exercez-vous, c'est le principal conseil que je vous donne…

A+

Roboleo

cybermaster
Level 11
Level 11
 
Messages: 2205
Localisation: Valence
Âge: 29 ans

Messagepar cybermaster » Sam Déc 27, 2008 2:39 pm

Merci beaucoup sur ces éclaircissements roboleo, il sont très utiles :D

Je vais essayer de faitre le programme sans regarder le tient, comme exercice. :D


Retourner vers De la théorie à la pratique

Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 7 invités

cron