Envoi de commandes directes
Il ya une autre fonctionnalité intéressante sur la communication Bluetooth: le maître peut contrôler directement ses esclaves.
Dans l'exemple suivant, le maître envoie à l'esclave directement les commandes pour jouer des sons et déplacer un moteur, il n'y a pas besoin d'un programme pour l'esclave, puisque c'est le firmware du NXT esclave qui reçoit et gère les messages!
//MAÎTRE
#define BT_CONN 1
#define MOTOR(p,s) RemoteSetOutputState(BT_CONN, p, s, \
OUT_MODE_MOTORON+OUT_MODE_BRAKE+OUT_MODE_REGULATED, \
OUT_REGMODE_SPEED, 0, OUT_RUNSTATE_RUNNING, 0)
sub BTCheck(int conn){
if (!BluetoothStatus(conn)==NO_ERR){
TextOut(5,LCD_LINE2,"Error");
Wait(1000);
Stop(true);
}
}
task main(){
BTCheck(BT_CONN);
RemotePlayTone(BT_CONN, 4000, 100);
until(BluetoothStatus(BT_CONN)==NO_ERR);
Wait(110);
RemotePlaySoundFile(BT_CONN, "! Click.rso", false);
until(BluetoothStatus(BT_CONN)==NO_ERR);
//Wait(500);
RemoteResetMotorPosition(BT_CONN,OUT_A,true);
until(BluetoothStatus(BT_CONN)==NO_ERR);
MOTOR(OUT_A,100);
Wait(1000);
MOTOR(OUT_A,0);
}
Conclusion
Dans ce chapitre, nous avons étudié quelques-uns des aspects fondamentaux de la communication Bluetooth entre robots: connexion de deux NXTs, envoyer et recevoir des chaînes de caractères, des nombres et des accusés de reception. Ce dernier aspect est très important quand un protocole de communication sécurisé est nécessaire.
Comme fonction supplémentaire, vous avez également appris à envoyer des commandes directement à une brique esclave.
Plus de commandes
Le NXC a un certain nombre de commandes supplémentaires. Dans ce chapitre, nous allons discuter de trois types : l'utilisation de la minuterie, les commandes pour contrôler l'affichage et l'utilisation du système de fichiers NXT.
Temporisateurs
Le NXT a une minuterie qui fonctionne en permanence. Cette minuterie tiques par incrémentations de 1 / 1000 de seconde. Vous pouvez obtenir la valeur actuelle de la minuterie avecCurrentTick(). Voici un exemple de l'utilisation d'une minuterie. Le programme suivant permet de bouger aléatoirement pendant 10 secondes.
task main()
{
long t0, time;
t0 = CurrentTick();
do
{
time = CurrentTick()-t0;
OnFwd(OUT_AC, 75);
Wait(Random(1000));
OnRev(OUT_C, 75);
Wait(Random(1000));
}
while (time<10000);
Off(OUT_AC);
}
Vous pouvez comparer ce programme avec celui donné dans le chapitre IV qui fait exactement la même tâche. Celle avec une minuterie est nettement plus simple.
Les Timers sont très utiles en remplacement du Wait(). Vous pouvez endormir votre programme pour un temps donné en attendant qu'elle atteigne une valeur particulière. Mais vous pouvez aussi réagir sur d'autres événements (par exemple des capteurs) en attendant. Le programme suivant en est un exemple simple. Il permet au robot d'avancer jusqu'à ce que 10 secondes soient passées, ou que le capteur tactile touche quelque chose.
task main()
{
long t3;
SetSensor(IN_1,SENSOR_TOUCH);
t3 = CurrentTick();
OnFwd(OUT_AC, 75);
until ((SENSOR_1 == 1) || ((CurrentTick()-t3) > 10000));
Off(OUT_AC);
}
N'oubliez pas que comme la fonction Wait, les timers fonctionnent à la milliseconde.
Dostları ilə paylaş: |