Lego NXT
Des kits de robotique, produits par la fameuse maison danoise.
- Un contrôleur, appelé brick ;
- Des servo-moteurs, jusqu’à trois par brick ;
- Des capteurs, jusqu’à quatre par brick :
- Capteur de contact,
- Capteur de lumière RGB,
- Capteur de distance à ultrasons,
- Capteur de son (arrêté en 2009),
- D’autres capteurs produits par des partenaires ;
- Un protocole de communication entre bricks via bluetooth.
Programmables :
- Par microprogramme, transféré dans la mémoire du brick,
- Contrôle interactif via USB,
- Contrôle interactif via Bluetooth.
Langages pour NXT
Langages pour compilation sur la plateforme :
- NXT-G : IDE de programmation graphique officiel,
- C#, IronPython et VB.NET avec MS Robotics Developer Studio,
- BricxCC, Next Byte Codes, Not eXactly C (NXC),
- NXTGCC,
- Simulink,
- leJOS NXT (Java),
- PyNXC, …
Interfaces interactives :
- MATLAB,
- ruby-nxt,
- C_NXT,
- NXT-Python : notre choix, …
Wikipedia a une liste plus longue.
NXT-Python
import nxt
Connexion à un brick
Une seule fonction : find_one_brick()
.
Renvoie un objet de type brick
b = nxt.find_one_brick()
On peut, par exemple, afficher des informations sur le brick
b.get_device_info()
Nommer les bricks
Pour afficher uniquement le nom du brick (NXT
par défaut) :
print b.get_device_info()[0]
On peut renommer un brick pour un usage futur
b.set_brick_name('NXT-1')
Les fois suivantes, on pourra forcer la connexion au même brick avec
b = nxt.find_one_brick('NXT-1')
Attendre
Ne rien faire pendant x secondes
nxt.time.sleep(0.5)
Éviter que le brick se mette en veille
b.keep_alive()
Synchrone vs asynchrone
Important : NXT-Python est une bibliothèque synchrone :
- Tout appel de fonction bloque l’exécution jusqu’à la fin de l’action.
- Parallélisme possible avec les threads ou autre mécanisme de haut niveau.
Jouer un son
Jouer une note (fréquence, durée en ms)
# Joue un La 440Hz pendant une seconde
b.play_tone_and_wait(440, 1000)
Jouer une note sans attendre la fin (asynchrone)
b.play_tone(440, 1000)
Jouer un fichier enregistré sur le brick (asynchrone)
# Joue 'sound.rso' en boucle pendant une seconde
b.play_sound_file(True, 'sound.rso')
nxt.time.sleep(1000)
b.stop_sound_playback()
Servo-moteurs
Les moteurs sont représentés par des objets de type Motor
.
Paramètres : le brick, le port de connexion.
m = nxt.Motor(b, nxt.PORT_A)
Actionner le moteur (asynchrone) :
m.run()
avec une puissance (entre -127 et 128)
m.run(100)
Arrêter le moteur :
m.brake()
Contrôle des servo-moteurs
Faire tourner un moteur sur une distance fixe
- Puissance : entre -127 et 128
- Degrés : de combien de degrés faire tourner le moteur (suggéré > 50)
m.turn(100, 360)
Connaître l’angle du moteur :
m.get_tacho()
Remettre à zéro l’angle
m.reset_position()
Servo-moteurs synchronisés
Faire tourner deux moteurs de façon synchronisée
m_gauche = nxt.Motor(b, nxt.PORT_A)
m_droite = nxt.Motor(b, nxt.PORT_B)
# Robot avance droit
s = nxt.SynchronizedMotors(m_gauche, m_droite, 1)
s.run()
Faire courber le robot
# Roue gauche tourne 2 fois plus vite
s = nxt.SynchronizedMotors(m_gauche, m_droite, 2)
s.run()
Capteurs
Les capteurs sont représentés par des objets de type Touch
, Light
,
Ultrasonic
ou Sound
(plus d’autres objets pour des capteurs
non-officiels).
t = Touch(b, PORT_1)
l = Light(b, PORT_2)
u = Ultrasonic(b, PORT_3)
s = Sound(b, PORT_4)
Obtenir les valeurs
t.get_sample()
Valeur de retour dépendant du senseur :
- Touch :
True
/False
, - Light : entier (intesité lumineuse),
- Ultrasonic : entier (distance),
- Sound : entier (intensité sonore).
Messages
Protocole d’échange entre bricks (max 1Ko, max 4 connexions)
Écrire. Paramètres :
- Boîte à messages,
- message.
b.message_write(0, 'hello world')
Lire. Paramètres :
- Boîte,
- ??,
- synchrone/asynchrone
boite, msg = b.message_read(0, 0, True)