NetLogoLab est l'infrastructure technologique qui relie NetLogo au monde physique (réel). Elle peut être utilisée pour faire de la robotique, des travaux manuels interactifs, pour mener des recherches scientifiques et même pour valider des modèles. Pour en savoir plus, consultez le site NetLogoLab où vous trouverez des documents académiques et des démonstrations.
NetLogoLab se compose des logiciels et matériels suivants :
La carte d'entrées/sorties digitale-analogique préférée de NetLogo est la suivante : GoGo Board — une interface open-source, facile à construire et bon marché conçue à l'origine au Media Lab du MIT par Arnan Sipitakiat. Mais d'autres matériels de robotique peuvent être utilisés avec NetLogo, y compris ceux qui sont disponibles dans le commerce, tels que les capteurs et effecteurs Vernier et Pasco, de même que les kits Phidgets, Lego robotics et VEX — mais des extensions spécifiques doivent encore être développées pour chacune de ces plateformes. Ce qui fait que jusqu'ici, seule l'extension GoGo Board est disponible et utilisable avec la distribution NetLogo standard.
L'extension GoGo Board est un composant logiciel qui permet à l'utilisateur de relier le monde virtuel NetLogo au monde réel (physique) au moyen de capteurs, de moteurs, de sources lumineuses, de LEDs, de relais et de bien d'autres dispositifs encore. L'extension GoGo Board pour NetLogo fournit des primitives simples pour communiquer avec une carte d'interface GoGo.
La carte GoGo est une carte d'interface série, open-source, facile à construire, bon marché et multi-usages, spécialement conçue pour être utilisée dans les écoles et les projets à buts éducatifs. Elle a été créée par Arnan Sipitakiat, en collaboration avec Paulo Blikstein au MIT Media Lab en 2001 et a été activement développée en continu jusqu'à aujourd'hui. Elle est actuellement utilisée dans plus de dix pays, tels que : États-Unis, Chine, Thaïlande, Brésil, Portugal, Mexique, Malaisie et Égypte par exemple.
Il est possible d'y connecter jusqu'à huit capteurs (par exemple de température, de lumière, de pression) et quatre effecteurs (par exemple moteurs, sources de lumière, LED, relais) simultanément. La carte possède aussi un connecteur pour y brancher des instruments supplémentaires (tels qu'un petit écran ou un module de communication sans fil). Couplée avec un boîtier série Bluetooth (tel que les modèles Iogear ou WCSC) plutôt que reliée à l'ordinateur par un câble série, elle peut même être utilisée en tant qu'interface sans fil.
Les modèles NetLogo peuvent interagir avec le monde réel (physique, matériel) de deux manières. Premièrement, ils peuvent recueillir des données provenant de l'environnement. Ces informations peuvent être utilisées par le modèle pour modifier ou adapter son comportement. Ces données sont collectées au moyen de senseurs électroniques capables de mesurer toute une série de phénomènes : température, lumière, contact (voir les illustrations ci-dessous), pH, concentrations de produits chimiques divers, pression, etc.
Le second type d'interactions entre NetLogo et le monde réel est le contrôle de dispositifs en sortie, ou effecteurs (actuators) tels que moteurs, sources de lumière, LED ou encore de dispositifs plus complexes qui réunissent ces effecteurs en une seule machine tels que des jouets, des véhicules télécommandés, des appareils électriques et des équipements de laboratoires automatisés.
Les enseignants et éducateurs qui veulent se lancer dans des projets de robotique ou de collecte de données environnementales doivent prendre en compte quelques paramètres importantes concernant le type exact des capteurs et effecteurs à utiliser — par exemple leur solidité, leur fiabilité, leur "versatilité" (openness) et leur coût. Le prix et la complexité de ces dispositifs varient fortement. Par exemple, pour la plupart des projets éducatifs, les capteurs génériques bon marchés d'usage général peuvent être utilisés avec des résultats très fiables. Un capteur de température générique ayant une précision de ± 0.5 °C ne coûte pas plus de quelques francs chez la plupart des revendeurs de matériel électronique. L'utilisation de capteurs générique bon marchés ne demande que des connaissances de base en électronique. Par exemple, des notions de base en soudure sont nécessaires pour fixer un bout de fil électrique à un capteur. Bien que ce soit réalisable dans les écoles et ait été testé dans de nombreux établissements éducatifs, certains enseignants préfèrent acheter des capteurs et des effecteurs de marque, qui sont déjà tout assemblés et prêts à l'emploi. Certaines sociétés vendent des systèmes de marque spécialisés pour l'éducation qui sont nettement plus solides et plus fiables que les systèmes génériques, mais qui coûtent aussi beaucoup plus chers. En comparaison, un capteur de température de marque peut coûter jusqu'à 50 US$. Les effecteurs suivent la même règle : par exemple, un moteur générique peut coûter de 3 à 10 US$ alors que la version de marque est vendue pour 30 ou 40 US$.
Les senseurs et les effecteurs peuvent être achetés en ligne chez les commerçants suivants (aux USA) : Digikey, Mouser, Phidgets, Spark Fun et Solarbotics. Des informations supplémentaires sur la manière de faire des capteurs peuvent être trouvées sur la page "How to Make Sensors" du site web de la carte GoGo.
Pour pouvoir utiliser l'extension GoGo Board et le logiciel NetLogoLab, les utilisateurs doivent créer des modèles NetLogo qui utilisent les primitives spéciales mises à disposition par l'extension. Nous fournirons plus loin dans ce document quelques exemples de modèles qui montrent comment y parvenir.
La carte GoGo n'est pas un produit commercial et, de ce fait, ne peut être achetée dans le commerce. Pour avoir une carte GoGo, vous devez la construire vous-même ou demander à quelqu'un de le faire pour vous. Plusieurs sociétés peuvent construire de telles cartes, mais elles demandent en général d'en construire une quantité minimale qui peut aller de 5 à 50. La carte GoGo a été spécialement conçue pour être bon marché et facile à construire, même si vous n'êtes pas un as en électronique. La principale ressource pour ce qui concerne la carte GoGo est le site web www.gogoboard.org où vous trouverez des instructions détaillées vous indiquant pas à pas comment acheter les composants, dessiner et construire la carte du circuit électronique et assembler le tout. La liste de diffusion de la carte GoGo est gogoboard@yahoogroups.com, liste que vous pouvez rejoindre via le groupe Yahoo gogoboard. Le wiki de la carte GoGo se trouve à l'adresse www.edudesign.org/gogowiki
Il faut bien que la carte GoGo communique avec l'ordinateur, et pour ce faire, elle utilise le port série. Le choix de ce port plutôt que d'un port USB a été motivé par le principe d'une carte à bas coûts : les composants nécessaires à la construction d'une carte compatible USB sont nettement plus onéreux. Si votre ordinateur n'a pas de port série, il vous faut acheter un adaptateur USB-série, que l'on trouve facilement dans les magasins de matériel informatique pour un prix allant de 15 à 30 US$ (si vous avez un Mac ou une machine Linux, assurez-vous que l'adaptateur est compatible avec votre machine). Le modèle Keyspan (USA-19HS) est un adaptateur qui fonctionne normalement relativement bien avec toutes les plates-formes, mais c'est aussi l'un des plus cher.
Si vous envisagez d'utiliser un adaptateur série-USB, vous devez vous assurer que les pilotes adéquats sont installés avant de commencer. En général, l'adaptateur est livré avec un CD qui contient les pilotes appropriés; si ce n'est pas le cas, il vous faut les télécharger à partir du site du constructeur de l'adaptateur. Commencez par connecter l'adaptateur à l'ordinateur et à la carte GoGo. Enclenchez ensuite la carte GoGo en utilisant le commutateur placé derrière la prise d'alimentation. La carte GoGo émet un bip et la lumière rouge s'allume.
L'extension GoGo ne demande aucune autre installation spéciale avec Windows.
Il y a un bug, soit dans Mac OSX, soit dans le bibliothèque RXTX que nous utilisons pour la connexion sérielle, qui vous oblige à entrer les commandes suivantes dans l'application Terminal (/Applications/Utilities/Terminal.app) avant de pourvoir travailler avec la carte GoGo :
sudo mkdir /var/lock sudo chmod 1777 /var/lock sudo rm /var/spool/uucp/*
Une fois ces commandes passées, vous pouvez démarrer NetLogo. Ouvrez l'exemple GoGoMonitor et pressez le bouton "setup". Une boîte de dialogue s'ouvre et vous propose une liste des ports disponibles. Sélectionnez le port auquel la carte GoGo est reliée. Il devrait s'appeler quelque chose comme :
/dev/tty.KeySerial1
où les mots suivant /dev/tty. devraient être quelque chose en rapport avec le type d'adaptateur que vous possédez et inclure le mot serial. Si vous n'arrivez pas à savoir quel est le bon port, vous pouvez le trouver dans l'application "Informations Système" que vous ouvrez en sélectionnant "A propos de ce Mac" dans le menu "Pomme" ("Apple") puis en cliquant "Plus d'infos…" dans le fenêtre qui s'ouvre.
Après l'initialisation (setup), pressez le bouton "ping". Devrait alors s'afficher le message true dans le Centre de commande. Vous devriez aussi voir des valeurs qui fluctuent légèrement dans les moniteurs des senseurs.
Si cela ne fonctionne pas, contactez-nous à l'adresse bugs@ccl.northwestern.edu.
Vous aurez besoin de pouvoir écrire dans les périphériques série, normalement /dev/ttyS*. Dans la plupart des distributions Linux, cela peut être spécifié via le "User Manager".
L'extension GoGo est installée automatiquement quand vous téléchargez et installez NetLogo. Pour utiliser l'extension dans votre modèle, ajoutez la ligne suivante au tout début du code dans le panneau "Procedures" :
extensions [gogo]
Si le modèle fait déjà appel à d'autres extensions, la ligne extensions est déjà présente dans le code. Il suffit alors d'ajouter gogo dans la liste des extensions.
Après chargement de l'extension, voyez quels ports sont disponibles en tapant la commande suivante dans le Centre de commande :
print gogo:ports
Vous devez ouvrir le port série auquel la carte GoGo est connectée de manière à ce que NetLogo puisse commencer à envoyer des commandes à la carte au moyen de la commande gogo:open. Pour être sûr que la carte est connectée correctement, testez si elle répond au reporter ping. Notez que pour être en mesure de communiquer avec la carte, vous avez besoin de savoir à quel port elle est connectée. Si vous n'êtes pas sûr du port utilisé, vous pouvez vous servir de la primitive gogo:ports (voir ci-dessous), mais vous pouvez aussi le trouvez en utilisant le "Device manager" sur un ordinateur Windows (cliquez l'icône Système dans le Panneau de contrôle) ou les "Informations Système" sur Mac OS X (voir ci-dessus).
Avec Windows :
gogo:open "COM1" print gogo:ping
Avec Linux :
gogo:open "/dev/ttyS01" print gogo:ping
Avec Mac :
gogo:open "/dev/tty.KeySerial1" print gogo:ping
Pour en savoir plus sur les extensions NetLogo, consultez le Guides des extensions.
Les modèles sauvegardés sous formes d'applets (au moyen de la commande "Save as Applet" du menu "File") ne peuvent utiliser l'extension GoGo. Les applets ne peuvent utiliser ni des extensions qui font appel à des bibliothèques additionnelles, ni accéder à des appareils périphériques. Pour voir des exemples de modèles qui utilisent l'extension GoGo, consultez la section "Robotics/NetLogoLab" dans le répertoire "Sample Models" de la Bibliothèques des modèles (encore inexistant dans la version NetLogo 4.0.4).
Le premier pas à faire quand on veut créer un modèle NetLogoLab est d'ajouter la commande extensions dans le panneau des procédures de NetLogo. Allez dans le panneau "Procedures" et ajoutez la ligne suivante :
extensions [gogo]
Le second pas consiste à créer un bouton pour connecter NetLogo à la carte GoGo au moyen du port série adéquat de votre système d'exploitation comme décrit ci-dessus.
gogo:open "COM1" ;; (pour les machines tournant sous Windows)
Une fois le bouton créé, la boîte de dialogue d'édition de bouton "Button" devrait ressembler à :
Commençons maintenant la construction du modèle proprement dit. Imaginez que nous voulions piloter une voiture à quatre roues propulsée par deux moteurs reliés aux roues arrières. Nous supposons que vous avez construit une tel véhicule et connecté les moteurs aux port de sortie "a" et "b" de la carte GoGo. Une approche très simple consisterait à créer deux boutons pour chaque moteur, "on" et "off" :
Le code associé à ces boutons est très simple : pour le bouton "on", nous pouvons simplement avoir :
gogo:talk-to-output-ports ["a"] gogo:output-port-on
Pour le bouton "off", le code sera très semblable :
gogo:talk-to-output-ports ["a"] gogo:output-port-off
Les boutons "on" et "off" de l'autre ensemble, utilisés pour contrôler le second moteur, auront un code similaire, sauf que nous devons nous adresser au second port de sortie ("b"), de la manière suivante :
gogo:talk-to-output-ports ["b"]
Nous pouvons rendre notre modèle plus intéressant en ajoutant un « inverseur de direction ». Ajoutez un bouton avec le code suivant qui inversera le sens de rotation des moteurs "a" et "b" :
gogo:talk-to-output-ports ["a" "b"] gogo:output-port-reverse
Pour créer un projet de capteur simple, nous supposerons que vous avez ajouté l'extension GoGo à votre modèle et ouvert avec succès une connexion avec la carte GoGo, c'est-à-dire ajouté la commande extensions dans le panneau "Procedures" et un bouton "setup" comme décrit précédemment. Pour ce projet de capteur, nul besoin de moteurs, nous avons besoin d'un autre pèriphérique, un capteur de température (Cliquez pour avoir plus d'information sur un capteur de température type sur le site de Digikey). Pour savoir où acheter et comment assembler un capteur de température, lisez le tutoriel "Making Sensors" sur le site web de la carte GoGo. Voilà à quoi ressemble un capteur de température une fois qu'il a été construit :
La manière la plus simple d'utiliser un capteur de température est évidemment d'afficher la température mesurée. Nous pouvons y parvenir en ajoutant un moniteur dans l'interface de NetLogo et en lui fournissant le code suivant :
gogo:sensor 1
Les valeurs fournies par le capteur sont des nombres arbitraires appartenant à un certain ensemble donné et doivent être converties en véritables unités de température telles que les degrés Celsius, Fahrenheit ou même, pourquoi pas en Kelvin. Pour tous les capteurs, la carte GoGo retourne des valeurs allant de 0 à 1023. Tous les capteurs sont livrés avec une documentation contenant soit une formule de conversion, soit une table de conversion permettant de transformer l'ensemble de valeurs arbitraire 0-1023 en valeurs exprimées en véritables unités physiques. Supposons que la documentation de notre capteur de température contienne une formule de conversion du genre degrés = valeur arbitraire / 30. La commande placée dans le moniteur de l'interface NetLogo pourra être transformée en :
gogo:sensor 1 / 30
La valeur retournée par le capteur pourrait aussi être utilisée pour piloter des objets sur l'écran, tels que des tortues. Créons par exemple deux boutons : un bouton appelé "create one turtle" (créer une tortue) qui efface le monde et crée une tortue et un bouton "forever" "move with heat" (déplace avec la température) qui fait avancer la tortue en fonction de la température lue par le capteur. Le code pourrait ressembler à :
to create-one-turtle clear-all create-turtle end to move-with-heat if gogo:sensor 1 < 500 [ forward 1 ] end
Si le bouton forever "move with heat" est activé et que l'utilisateur chauffe le capteur (en le frottant ou en approchant lentement une flamme), le seuil de température sera dépassé (< 500) et la tortue avancera. (Notez que nous utilisons un type de capteur de température dans lequel la résistance diminue avec la température, ce qui fait que les valeurs fournies par le capteur diminuent quand nous le réchauffons. Il s'agit d'un capteur très répandu et bon-marché).
Une utilisation plus sophistiquée de cet appareillage de mesure serait de commander des matériels périphérique tels que des moteurs. L'utilisateur pourrait, par exemple, enclencher un moteur quand la valeur fournie par le capteur de température atteint 500, au moyen du code suivant :
to turn-motor-on-with-heat if gogo:sensor 1 < 500 [ gogo:talk-to-output-ports ["a"] gogo:output-port-on ] end
Une autre utilisation possible des résultats retournés par les primitives des capteurs serait de collecter ces données et de les transcrire en graphiques. La collecte peut se révéler utile pour une analyse ultérieure plus élaborée des données et pour faire des comparaisons. Cette collecte peut être exécutée par les commandes NetLogo dédiés aux listes. Par exemple, si l'utilisateur veut enregistrer les valeurs mesurées par le capteur 1 toutes les 0.5 secondes, le code pourrait ressembler à :
to log-data-from-sensor set data-vector lput (gogo:sensor 1) data-vector wait 0.5 end
Finalement, la représentation graphique des données est on ne peut plus directe. Le code suivant, par exemple, fera dessiner un graphique avec les données fournies par le capteur 1 :
plot (gogo:sensor 1)
Pour de plus amples informations concernant les fonctionnalités et les primitives de l'extension GoGo, étudiez les deux exemples de modèles "GoGoMonitor.nlogo" et "GoGoMonitorSimple.nlogo".
Ferme la connexion établie avec la carte GoGo.
Voir aussi gogo:open et gogo:open?
Ouvre une connexion avec la carte GoGo reliée au port série nommé port-name. Voir la primitive gogo:ports pour plus d'informations au sujet des noms des ports.
Si la carte GoGo ne répond pas, ou si vous essayez d'ouvrir un port auquel aucune carte GoGo n'est connectée, NetLogo génère une erreur.
Exemple :
gogo:open "COM1"
Voir aussi gogo:open? et gogo:close
Retourne true (vrai) si une connexion avec une carte GoGo est ouverte, sinon retourne false (faux).
Retourne une liste contenant les noms des ports série auxquels une carte GoGo pourrait être connectée. Avec certains ordinateurs, vous pouvez obtenir une liste comprenant deux ou trois ports série différents. Dans ce cas, essayez de les ouvrir les uns après les autres jusqu'à ce que vous obteniez une connexion utilisable.
Coupe l'alimentation des ports actifs. Si des moteurs y sont connectés, aucune force de freinage n'est appliquée, contrairement à ce que fait la primitive gogo:output-port-off. Il s'ensuit que le moteur ralentit peu à peu jusqu'à l'arrêt complet. Avec la majorité des effecteurs périphériques autres que les moteurs, cette primitive produit le même effet que gogo:output-port-off. Les ports de sortie affectés par cette commande sont spécifiés par la commande gogo:talk-to-output-ports.
Le code suivant active le port de sortie "a" pendant une seconde puis arrête le moteur graduellement :
gogo:talk-to-output-ports ["a"] gogo:output-port-on wait 1 gogo:output-port-coast
Coupe l'alimentation des ports de sortie. Si l'on utilise des moteurs, une force de freinage est appliquée. Les ports de sortie affectés par cette commande sont spécifiés par la commande gogo:talk-to-output-ports.
Active et alimente les ports de sortie. Les ports de sortie affectés par cette commande sont spécifiés par la commande gogo:talk-to-output-ports.
Inverse le sens des ports de sortie. Les ports de sortie affectés par cette commande sont spécifiés par la commande gogo:talk-to-output-ports.
Alimente le port de sortie dans un sens donné. Les ports de sortie peuvent être alimentés dans deux sens, arbitrairement appelés thisway et thatway. Les ports de sortie affectés par cette commande sont spécifiés par la commande gogo:talk-to-output-ports. Notez que cette commande est différente de la commande gogo:output-port-reverse car thisway et thatway auront toujours le même sens à condition que la polarité du connecteur ne change pas.
Cette commande active les ports de sortie spécifiés dans l'entrée output-portlist. Ces ports pourront alors être commandés par des primitives telles que gogo:output-port-on et gogo:output-port-off. L'utilisateur peut « parler » à un ou plusieurs ports en même temps. Les ports de sorties sont généralement connectés à des moteurs, mais vous pouvez aussi leur connecter des sources de lumière, des LED et des relais. Les ports de sorties sont identifiés par l'une des lettres "a", "b", "c" et "d".
Exemples :
;; activer tous les ports de sortie gogo:talk-to-output-ports [ "a" "b" "c" "d" ] ;; alimenter tous les ports de sortie gogo:output-port-on
;; activer les ports de sortie A et D gogo:talk-to-output-ports [ "a" "d" ] ;; désactiver les ports de sortie A et D, ;; les autres ports de sortie conservent ;; leur état actuel gogo:output-port-off
gogo:talk-to-output-ports [ "c" "b" ] ;; désactiver les autres ports de sortie gogo:output-port-off
Teste l'état de la carte GoGo. Cette commande est principalement utilisée pour s'assurer que la carte est connectée au bon port série. Elle retourne true (vrai) si la carte GoGo répond au message de diagnostique qui lui a été envoyé et false autrement.
Exemple :
print gogo:ping
Retourne la valeur numérique du capteur nommé sensor. Les capteurs sont identifiés par les nombres de 1 à 8. Les valeurs retournées vont de 0 à 1023. 1023 est retourné quand aucun capteur n'est relié au port correspondant (résistance maximale), ou quand le capteur est dans un état "ouvert". La valeur 0 est retournée quand le capteur est court-circuité (résistance nulle).
Exemples :
print gogo:sensor 1 ;; affiche la valeur du capteur 1
foreach [ 1 2 3 4 5 6 7 8 ] [print (word "Sensor " ? " = " gogo:sensor ?)] ;; affiche la valeur de tous les capteurs
if gogo:sensor 1 < 500 [ ask turtles [ fd 10 ] ] ;; fait avancer toutes les tortues de dix pas ;; si la valeur du capteur 1 est inférieure à 500
loop [if gogo:sensor 1 < 500 [ ask turtles [ fd 10 ] ] ] ;; teste continuellement la valeur du capteur 1 et ;; déplace toutes les tortues de 10 pas chaque fois ;; que la valeur du capteur est inférieure à 500.
Spécifie le niveau de puissance des ports de sortie actifs. L'entrée power-level doit être un nombre compris entre 0 (off) et 7 (pleine puissance). Les ports de sortie concernés par cette commande sont spécifiés par la commande gogo:talk-to-output-ports Notez que pour de nombreuses applications réelles, il est plus efficace d'utiliser des appareillages mécaniques, tels que des engrenages et des poulies pour contrôler le couple des moteurs.
Exemple :
gogo:talk-to-motors ["a" "b" "c" "d"] gogo:set-motor-power 4 ;; abaisse la puissance de tous les ports de ;; sortie à la moitié de la puissance maximale.