Jouer de la musique
Pour jouer une note, vous pouvez utiliser la commande :
PlayToneEx(frequency, duration, volume, loop?)
Qui possède 4 arguments. Le premier est la fréquence en Hertz, le second est la durée en millisecondes, le troisième est le volume et le dernier pour savoir si la musique tourne en boucle. Voici un tableau des fréquences utiles :
SON
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
SI
|
247
|
494
|
988
|
1976
|
3951
|
7902
|
|
LA#
|
233
|
466
|
932
|
1865
|
3729
|
7458
|
|
LA
|
220
|
440
|
880
|
1760
|
3520
|
7040
|
14080
|
SOL#
|
|
415
|
831
|
1661
|
3322
|
6644
|
13288
|
SOL
|
|
392
|
784
|
1568
|
3136
|
6272
|
12544
|
FA#
|
|
370
|
740
|
1480
|
2960
|
5920
|
11840
|
FA
|
|
349
|
698
|
1397
|
2794
|
5588
|
11176
|
MI
|
|
330
|
659
|
1319
|
2637
|
5274
|
10548
|
RE#
|
|
311
|
622
|
1245
|
2489
|
4978
|
9956
|
RE
|
|
294
|
587
|
1175
|
2349
|
4699
|
9398
|
DO#
|
|
277
|
554
|
1109
|
2217
|
4435
|
8870
|
DO
|
|
262
|
523
|
1047
|
2093
|
4186
|
8372
|
Comme avec la fonction PlayFileEx, le NXT n'attend pas la fin de la note pour passer à autre chose. Donc si vous utilisez plusieurs notes à la suites, vous devrez mettre de l'attente entre les deux comme dans l'exemple suivant :
#define VOL 3
task main()
{
PlayToneEx(262,400,VOL,FALSE); Wait(500);
PlayToneEx(294,400,VOL,FALSE); Wait(500);
PlayToneEx(330,400,VOL,FALSE); Wait(500);
PlayToneEx(294,400,VOL,FALSE); Wait(500);
PlayToneEx(262,1600,VOL,FALSE); Wait(2000);
}
Vous pouvez créer très facilements des morceaux de musique avec les fonctionnalités de BricxCC.
Si vous voulez jouer de la musique tout faisant avancer le robot, la meilleure façon est d'utiliser des tâches distinctes. Ici vous avez un exemple d'un programme plutôt stupide où le robot avance en avant et en arrière, en faisant de la musique.
task music()
{
while (true)
{
PlayTone(262,400); Wait(500);
PlayTone(294,400); Wait(500);
PlayTone(330,400); Wait(500);
PlayTone(294,400); Wait(500);
}
}
task movement()
{
while(true)
{
OnFwd(OUT_AC, 75); Wait(3000);
OnRev(OUT_AC, 75); Wait(3000);
}
}
task main()
{
Precedes(music, movement);
}
Conclusion
Dans ce chapitre, vous avez apprit à faire jouer de la musique au NXT. Vous avez aussi vu comment utiliser une tâche distincte pour jouer de la musique.
Plus sur les moteurs
Il y a beaucoup de fonctions qui vous permettent de contrôler les moteurs plus précisément. Dans ce chapitre, nous allons traiter de ces commandes : ResetTachoCount , Coast( Float ), OnFwdReg, OnRevReg, OnFwdSync, OnRevSync, RotateMotor, RotateMotorEx et les concepts de PID.
Arrêt en douceur
Quand on utilise la fonction Off (), le cerveau moteur s'arrête immédiatement, freinant l'arbre et tenant donc position. Il est aussi possible de stopper les moteurs d'une manière plus douce, sans utiliser le frein. Pour cela il faut utiliser Float() ou Coast(), qui coupe simplement la puissance du moteur. Voici un exemple. Le moteur commence par freiner en utilisant les freins; ensuite sans utiliser les freins. Notez la différence. Actuellement, la différence est extrêmement faible pour ce robot en particulier. Mais cela crée beaucoup de différence pour beaucoup d'autres robots.
task main()
{
OnFwd(OUT_AC, 75);
Wait(500);
Off(OUT_AC);
Wait(1000);
OnFwd(OUT_AC, 75);
Wait(500);
Float(OUT_AC);
}
Les commandes avancées
Les commandes OnFwd() et OnRev() sont de simples routines pour faire bouger les moteurs.
Les servomoteurs du NXT contiennent un encodeur intégré qui vous permet de contrôler précisément la position et la vitesse de l'arbre;
Le firmware du NXT met en oeuvre un PID ( Proportional Integrative Derivative) pour contrôler la position des moteurs et la vitesse des moteurs. Cela permet de contrôler plus précisément la vitesse des moteurs, leur position et de faire des feedback.
Si vous voulez que le robot aille parfaitement droit, vous pouvez utiliser une fonctione de synchronisation qui fait que le couple de moteurs tournent ensemble et s'attendent si l'un ralentit ou est bloqué. D'une façon simple, vous pouvez définir un couple de moteur pour qu'il soient synchronisés. Il y a aussi de nombreuses commandes pour libérer toute la puissance des cerveau-moteurs.
La fonction OnFwdReg(port,speed,regmode) fait avancer le moteur spécifié par port à la vitesse speed en appliquant le mode de régulation regmode spécifié. regmode peut êtreOUT_REGMODE_IDLE, OUT_REGMODE_SPEED ou OUT_REGMODE_SYNC. Si IDLE est sélectionné, il n'y aura pas de régulation PID d'appliqué. Si SPEED est sélectionné, le NXT va réguler LE moteur pour qu'il ai une vitesse constante, même si la charge moteur varie. Pour finir, si SYNC est sélectionné, le couple de moteurs spécifié par port se déplacera synchronisé comme expliqué avant.
La fonction OnRevReg(port,speed,regmode) fait exactement la même chose que la commande précédente mais dans le sens inverse.
task main()
{
OnFwdReg(OUT_AC,50,OUT_REGMODE_IDLE);
Wait(2000);
Off(OUT_AC);
PlayTone(4000,50);
Wait(1000);
ResetTachoCount(OUT_AC);
OnFwdReg(OUT_AC,50,OUT_REGMODE_SPEED);
Wait(2000);
Off(OUT_AC);
PlayTone(4000,50);
Wait(1000);
OnFwdReg(OUT_AC,50,OUT_REGMODE_SYNC);
Wait(2000);
Off(OUT_AC);
}
Ce programme montre très bien les différentes régulation si vous essayez de stopper les roues avec votre main. Pour le premier ( le mode IDLE ), si vous stopper une roue, cela de fera rien sur l'autre. Pour le second ( le mode SPEED ), essayer de ralentir la roue, vous verrez que le NXT augmentera la puissance de son moteur pour contrecarrer votre freinage afin de garder la vitesse constante. Enfin (pour le mode SYNC), arrêter une roue fera arrêter l'autre jusqu'à ce que la première soit débloquée.
La fonction OnFwdSync(port,speed,turnpct) est la même que la fonction OnFwdReg() avec le mode SYNC, mais maintenant vous pouvez spécifier un pourcentage de synchronisation.
La fonction OnRevSync(port,speed,turnpct) est la même que la précédente, mais dans l'autre direction. Le programme suivant fait une démonstration des fonctions : essayez de changer les valeurs pour voir ce qu'il se passe.
task main()
{
PlayTone(5000,30);
OnFwdSync(OUT_AC,50,0);
Wait(1000);
PlayTone(5000,30);
OnFwdSync(OUT_AC,50,20);
Wait(1000);
PlayTone(5000,30);
OnFwdSync(OUT_AC,50,-40);
Wait(1000);
PlayTone(5000,30);
OnRevSync(OUT_AC,50,90);
Wait(1000);
Off(OUT_AC);
}
Pour finir, les moteurs peuvent être configurés pour tourner un nombre défini de degrés ( en se rappelant qu'un tour complet fait 360° ).
Pour chacune des fonctions suivantes, vous pouvez agir sur la direction des moteurs en changeant le signe de la vitesse ou de l'angle. Donc si la vitesse et l'angle on le même signe, le moteur avancera, sinon il reculera.
La fonction RotateMotor(port,speed,degrees) fait tourner le moteur spécifié par port de degrees degrés à une vitesse de speed ( allant de 0 à 100 ).
task main()
{
RotateMotor(OUT_AC, 50,360);
RotateMotor(OUT_C, 50,-360);
}
La fonction RotateMotorEx(port,speed,degrees,turnpct,sync,stop) est une extension de la fonction précédente, ce qui vous permet de synchroniser deux moteurs, de spécifier un facteur turnpct et un booleen pour sync. Cela vous permet aussi de spécifier si le moteur doit freiner apres la rotation de l'angle spécifié en utilisant un dernier booleen.
task main()
{
RotateMotorEx(OUT_AC,50,360,0,true,true);
RotateMotorEx(OUT_AC,50,360,40,true,true);
RotateMotorEx(OUT_AC,50,360,-40,true,true);
RotateMotorEx(OUT_AC,50,360,100,true,true);
}
Dostları ilə paylaş: |