Construire son premier robot Vex !

  1. Monter son premier robot
  2. Connecter son cortex et son joystick VEX ensemble
  3. Commencer à programmer son robot Vex avec RobotC

Pour tous les montages décrits implicitement dans ce tutoriel vous avez les schémas de montage dans votre guide de montage après la fin du montage du premier robot.

Branchement du joystick en mode programme et premier programme:

Nous voici donc dans la troisième partie de ce tutoriel sur les technologies VEX et nous allons maintenant voir comment programmer notre robot à partir de notre joystick !
Avant de faire nos propres programmes, commençons par comprendre comment tout cela fonctionne et testez si notre communication wifi est opérationnel.
Nous continuons donc le tutoriel Getting Started de RobotC pour le moment:
Pour cela brancher votre joystick à votre ordinateur via les câbles de programmation :

Sélectionner VEXnet or USB comme indiquer dans getting started dans l’onglet Robot --> Vex Cortex Communication Mode
Nous allons maintenant ouvrir un code déjà existant ! Petit avantage pour contrôler si la communication marche bien et ne pas être perdu entre des erreurs de codage ou des erreurs de communication ou encore pire les deux :0 !

Comme indiqué dans le tutoriel aller dans File --> Open Sample Program
Puis trouvez le dossier Remote Control puis enfin double cliquez sur Dual Joystick Control.c
S’ouvre alors ce qu’on appelle un programme ce qui veut dire une suite d’instructions qui sont ici visibles par des lignes d’écritures que l’on appelle des lignes de code.

En programmation chaque ligne à son importance et je vous expliquerai bientôt tout en détail mais pour le moment intéressons-nous seulement aux deux premières lignes :


#pragma config(Motor,  port2,           rightMotor,    tmotorNormal, openLoop, reversed)

#pragma config(Motor,  port3,           leftMotor,     tmotorNormal, openLoop)

Commençons par le début de la ligne :
#pragma permet de dire au programme que la commande que l’on va lancer à sa suite sera vrai pour tout le programme

config() est ce que l’on appelle une fonction c’est-à-dire qu’elle va effectuer une action prédéfinie en fonction des éléments rentrés entre ses parenthèses. Ici la fonction config va associer un composant électrique à un port et à un nom de variable que l’on pourra utiliser ainsi que ses caractéristiques.
Note: Les espaces n'ont aucune incidence.

Maintenant essayons de comprendre les paramètres entre parenthèses :
Le premier : Motor est assez évident. On dit à notre fonction que l’élément électrique que nous voulons configurer est un moteur.
Le deuxième : port2 précise sur quel port est branché le moteur que nous sommes en train de configurer.

? Mais… Mais… Attend un petit peu tu ne nous as jamais dit de brancher nos moteurs, et puis c’est lequel le port2 ?
Ne vous enflammez pas ! J’y arrive mais avant de brancher les moteurs, il fallait savoir où nous allions les mettre. C’est que nous venons juste de découvrir alors finissons de comprendre ces paramètres puis nous brancherons nos moteurs !

Nous en étions donc au troisième paramètre : rightMotor qui n’est ni plus ni moins le nom que nous allons utiliser pour notre moteur dans le programme. En effet nous avons deux moteurs à configurer. Comment les différencier ? Tout simplement en leur donnant un nom. Notez que l’on aurait pu écrire n’importe quel nom (sauf certains mots réservés pour le programme et ne commençant pas par un chiffre) tant que dans notre programme on utilise toujours le bon.
Le quatrième et le cinquième sont des caractéristiques techniques du moteur. Nous ne nous y intéressons pas ici.
Et pour le dernier présent dans la première ligne : reversed, il précise juste dans quel sens tourne les roues du moteur.

? Mais alors mes roues vont tourner à l’envers non ? Quel est l’intérêt ?
Oui et non car en effet un moteur va tourner dans le sens inverse de l’autre mais comme vos moteurs sont montés dans le sens contraire ils tourneront en fait dans le même sens !

Maintenant que nous avons compris ça, je suppose que vous savez ou branchez vos deux moteurs !
Je sais que vous en avez 4 mais pour le moment c’est juste un programme pour se familiariser, vous avez donc plusieurs options qui s’offrent à vous :
-Soit vous montez le cortex et la batterie sur le robot et vous branchez directement les moteurs qui font avancer le robot.
-Soit vous avez d’autres moteurs que sur le robot et vous pouvez tester la communication avant de tout monter.
-Soit vous ne branchez que le moteur qui fait tourner les petites roues sur le bras que vous branchez sur le port 2 puis sur le port 3 pour voir comment agit le programme (Avec mon équipe nous avons choisi cette option là).

Quelle que soit l’option que vous choisissez il vous faudra brancher un moteur au cortex, je vais donc vous montrez sur la photo ci-dessous où les brancher :

En effet ces ports sont exclusivement pour les moteurs et les numéros que vous voyez à gauche sont les numéros de port correspondant à ceux vus plus haut.
Si vous voulez brancher les moteurs qui n'ont que 2 broches sur le cortex qui a trois entrées (à part le port 1 et 10), vous devrez utiliser des contrôleur 29 (compris dans le kit) qui permettent de rajouter une broche:

Maintenant vous pouvez brancher vos moteurs !
Il ne reste plus qu’à télécharger notre programme dans le joystick et nous pourrons enfin voir le résultat de tous ces efforts.

Le joystick et le cortex doivent tous les deux être allumés avant d’envoyer un programme !

Pour cela faites :

Et maintenant vous pouvez voir en bougeant les joysticks que les moteurs branchés tournent dans un sens et dans l’autre.

Maintenant comment savoir quelle partie de la manette commande quoi ?
Je vais vous expliquer à quoi servent les lignes de code ce qui est suffisant pour reproduire et créer ses propres programmes basiques. Si vous voulez vraiment comprendre comment cela fonctionne je vous invite à lire un tutoriel sur les bases de la programmation en C, c’est quelques heures de lecture et de compréhension(Je ne parle ici que de compréhension de notion comme les conditions les boucles les variables... pas de l'apprentissage du langage) mais vous saurez ce que vous faites au lieu de juste recopier des lignes de code dont vous connaissez la fonction.
Voici par exemple un lien pour apprendre ces notions (partie 1):
http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c

Utiliser les joysticks :
C’est ce que nous avons dans notre code ici :


task main ()

{

    while(1 == 1)

    {

        motor[leftMotor]  = vexRT[Ch3];   // Left Joystick Y value

        motor[rightMotor] = vexRT[Ch2];   // Right Joystick Y value

    }

}

A chaque fois que l’on aura un programme qui utilise la manette nous aurons une boucle infinie, ce qui signifie que le programme exécutera toutes les instructions à l’intérieur de cette boucle encore et encore tant qu’on ne l’aura pas éteint.

Ici nous avons while(1 == 1){}, vous pouvez aussi trouver while(1){} et while(true){}
Les accolades après les parenthèses sont juste là pour vous montrer que toutes les instructions que vous voulez répéter doivent se trouver entre ces accolades.

Intéressons-nous maintenant au plus important: donner aux moteurs une valeur !
En effet pour faire tourner un moteur sur RobotC il faut, après l’avoir configurer, lui assigner une valeur. Pour faire cela il faut taper motor[NomDuMoteur] (vous vous souvenez le troisième paramètres de la fonction config() ) = Valeur (positive pour le faire tourner dans un sens et négative pour le faire tourner dans l’autre sens). Les valeurs par défaut utilisées dans les codes exemples sont 127 et – 127.
Ici comme vous l’avez remarqué nous n’avons aucune valeur mais : VEXRT[Ch2].
Mais cette instruction est aussi un nombre ! C’est juste qu’il n’est pas fixe il correspond à la position du joystick sur l’axe Ch2. Plus le joystick sera éloigné du centre et plus la valeur donnée au moteur sera élevée ou petite selon le sens pris.

A noter qu’il y a 4 axes sur la manette visible à côté des joysticks allant de Ch1 à Ch4.
Vous pouvez vous amusez à les inter-changer entre les crochets, mettre des valeurs fixes pour le moteur ou enlever la boucle infinie pour voir comment réagit votre robot et mieux comprendre tout cela avant de commencer à utiliser les boutons !

Utiliser les boutons :

Nous gardons les mêmes #pragma pour ce code


task main ()

{

  while(1 == 1)

{

        if(vexRT[Btn5U] == 1)                   //Si le bouton 5U est pressé alors…

        {

            motor[rightMotor] = 127;   //On fait tourner le moteur droit

        }

        else if(vexRT[Btn5D] == 1)          //Sinon si c’est le Bouton 5D qui est pressé alors…

        {

            motor[rightMotor] = -127;  //On fait tourner le moteur droit

        }

        else                                       //Sinon  aucun des deux boutons est pressé alors…

        {

            motor[rightMotor] = 0;  //On arrête le moteur droit

        }

 

        if(vexRT[Btn6U] == 1)                   // Si le bouton 6U est pressé alors…

        {

            motor[leftMotor] = 127;  //On fait tourner le moteur gauche

        }

        else if(vexRT[Btn6D] == 1)          // Sinon si c’est le Bouton 5D qui est pressé alors…

        {

            motor[leftMotor] = -127; //On fait tourner le moteur gauche

        }

        else                                       // Sinon aucun des deux boutons est pressé alors…

        {

            motor[leftMotor] = 0;   //On arrête le moteur gauche

        }

    }

}

Ici nous faisons avancer le robot en appuyant sur des boutons. Vous avez en tout et pour tout 12 boutons sur la manette que vous pouvez programmer comme vous le souhaitez !
Ces boutons sont différentiables par un chiffre et une lettre.
Et pour savoir s' ils sont pressés ou pas, on test la valeur associée à ce bouton grâce à la fonction vexRT[BtnNumBoutonLettreBouton] par exemple pour le bouton 6D au-dessus nous avons vexRT[Btn6D].
Maintenant vexRT[Btn6D] vaut 1 si le bouton est pressé et 0 si il est relâché. Il suffit donc de tester sa valeur avec ce que l’on appelle une condition, ici on utilisera if, else if et else (littéralement si, sinon si et sinon) pour tester cette condition.

La syntaxe du if : if (variable ou valeur opérandes variable ou valeur)
Comme opérandes nous avons :

==

Egale à

!=

Différent de

<

Inférieur à

<=

Inférieur ou égale à

>

Supérieur

>=

Supérieur ou égale

Donc en tapant : if(vexRT[Btn6U] == 1) {instructions} on effectue la ou les instructions entre accolades que si le bouton est pressé.
Ici on fait tourner le moteur gauche.
Vous êtes à présent capable de comprendre le code mis plus haut avec les commentaires.

Il existe de plus des opérateurs logiques qui sont le ET : && et le OU : || qui permettent de rassembler 2 conditions en 1 seule ligne.
Par exemple si vous voulez faire avancer le moteur droit que si les boutons 5U et 5D sont pressés en même temps on devrait écrire :



if(vexRT[Btn5U] == 1 && vexRT[Btn5D] == 1)                 //Si le bouton 5U et 5S sont pressés alors…

{

motor[rightMotor] = 127;   //On fait tourner le moteur droit

}

 

De même le code vu plus haut pourrait être réduit en enlevant les else if et en les remplaçant par des || :

if(vexRT[Btn5U] == 1 || vexRT[Btne5D] == 1)                   //Si le bouton 5U ou 5D est pressé alors…

{

motor[rightMotor] = 127;   //On fait tourner le moteur droit

}

else                                       //Sinon si aucun des deux boutons est pressé alors…

{

motor[rightMotor] = 0;  //On arrete le moteur droit

}

? Vous avez testé le programme mais vous trouvez que le robot avance par à-coups et n’est pas fluide comme avec le joystick ? C’est normal c’est parce qu’il ne fait tourner le moteur à une valeur fixe que pendant un temps très court avant de recommencer. Pour régler ce problème rajoutez la ligne suivante après la ligne où vous faites tourner le moteur :

wait1Msec(200);

Les capteurs sensorTouch :

Tout comme les moteurs, les capteurs sont des appareils électriques qu’il faut configurer pour pouvoir les utiliser dans notre programme. Voici une ligne type pour un capteur sensorTouch :

#pragma config(Sensor, dgtl2, nomCapteur, sensorTouch)

Il sera donc branché sur le port digital 2.

? Mais quelle est la différence entre digital et analog ?
Des entrées/sorties digitales sont des entrées/sorties qui ne reçoivent et envoient que des signaux électriques fixes par exemple 0 et 7.2V alors que les entrées/sorties analogs permettent d’envoyer des signaux de toutes les valeurs comprises entre les extrêmes.
Par exemple avec un capteur digital pour de la lumière on sait lorsque la lumière dépasse un certain seuil alors qu’avec un capteur analog pour la lumière on connait la luminosité et pas juste si on est au-dessus ou en dessous d'un seuil.

Et pour savoir si il est enfoncé on utilise un if suivi de la condition SensorValue(touchSensor) == 1 :
if( SensorValue(touchSensor) == 1){instructions}

Pour faire une action tant qu’il n’est pas enfoncé on peut utiliser :
while(SensorValue(touchSensor) == 0){}

Cela nous permet de protéger notre robot et/ou nos moteurs lorsque qu’ils rencontrent des obstacles ou arrivent à la fin de leur courses pour ne pas qu’ils forcent et s’abiment.
Petit code d’exemple avec ces capteurs :


int valueMotor;

while(true)

{

valueMotor = vexRT[Ch2];

    if(vexRT[Ch2]<0 && SensorValue(touchSensor) == 1)

    {

motor[brasMotor] = valueMotor;

    }

    if(vexRT[Ch2]>0 && SensorValue(touchSensor) == 1)

    {

motor[brasMotor] = valueMotor;

    }

}

Vous pouvez maintenant créer votre propre programme pour votre robot et le commander comme vous le souhaitez.