Cours:StartMindstormEV3DEV

De troyesGEII
Aller à : navigation, rechercher

Cours:configurationBriqueLego

Infos utiles

librairie brick

Pour commencer, nous utiliserons la librairie simplifiée "brick.h" dont nous allons explorer quelques aspects ici.

Programme minimum

Cette base minimum de programme devra être reprise systématiquement :

#include <stdio.h>
#include "brick.h"
#include <unistd.h>
#define Sleep( msec ) usleep(( msec ) * 1000 )

int main( void )
{
   if ( ev3_init() == -1 )
   {
     printf("\erreur d'initialisation\n");
     return ( 1 );
   }
   printf("initialisation des capteurs ... ");
   ev3_sensor_init();
   printf(" ok !\n");
   printf("initialisation des actionneurs ... ");
   while ( ev3_tacho_init() < 1 ) Sleep( 1000 );
   printf(" ok !\n");

   // début du programme


   // fin du programme
   ev3_uninit();
   printf("*** ( EV3 ) Bye! ***\n" );
   return(0);
}

Pour compiler et exécuter votre programme test.c , il suffit de :

gcc test.c -lev3dev-c -o test
./test

Capteurs

http://slideplayer.com/slide/10944320/

Capteur de couleur

On trouve 3 modes de mesure principaux :

COL-COLOR retourne un nombre entre 0 et 7 tel que :
0 ?? 1 noir 2 bleu
3 vert 4 jaune 5 rouge
6 blanc 7 marron
COL-REFLECT intensité de la lumière réfléchie entre 0 et 100
COL-AMBIENT intensité de la lumière ambiante entre 0 et 100

Il faudra tout d'abord initialiser le capteur et choisir le mode de mesure :

POOL_T capteurCouleur;
 
const char const *nomCouleur[] = { "?", "BLACK", "BLUE", "GREEN", "YELLOW", "RED", "WHITE", "BROWN" };
#define NB_COULEUR  (( int )( sizeof( nomCouleur ) / sizeof( nomCouleur[ 0 ])))
int couleur;
 
int initCapteurCouleur()
{
   capteurCouleur = sensor_search( LEGO_EV3_COLOR );
   if (capteurCouleur)
   {
       color_set_mode_col_color(capteurCouleur);
       //color_set_mode_col_reflect(capteurCouleur);
       //color_set_mode_col_ambient(capteurCouleur);
       printf( "capteur couleur connecté\n");
   }
   else
   {
       printf("vérifier le branchement du capteur couleur !\n");
       return (0);
   }
   return 1;
}

On utilisera ensuite le capteur par exemple de la façon suivante (à placer dans le main !!) :

   // début du programme
   if ( initCapteurCouleur()==0 )
   {
       ev3_uninit();
       return(-1);
   }
   int i;
   for (i=0;i<100;i++)
   {
       couleur=sensor_get_value0(capteurCouleur,0);
       if ( (couleur>=NB_COULEUR) || (couleur<0) )
       {
           printf("problème, couleur inconnue !");
       }
       else
       {
           printf("couleur n°:%d : %s\n",couleur,nomCouleur[couleur]);
       }
       Sleep(200);
   }
   // fin du programme

Capteur de contact

L'utilisation est identique au capteur précédent.

Nous allons juste modifier ici la déclaration du capteur en ne faisant pas de "découverte" mais en donnant directement son emplacement :

#define capteurContact IN4
bool etatCapteurContact;

int initCapteurContact()
{
    if ( sensor_is_plugged(capteurContact,LEGO_EV3_TOUCH) )
    {
        printf( "capteur contact connecté\n");
    }
    else
    {
       printf("vérifier le branchement du capteur de contact !\n");
       return (0);
    }
    return 1;
}
Remarque :
si le robot n'a pas été mis à jour, la fonction sensor_is_plugged ne fonctionne pas correctement et renvoie toujours la valeur true !!

On l'utilisera comme pour les autres capteurs :

   if ( initCapteurContact()==0 )
   {
       ev3_uninit();
       return(-1);
   }
   int i;
   for (i=0;i<100;i++)
   {
       etatCapteurContact=sensor_get_value0(capteurContact,0);
       printf("etat du capteur :%d\n",etatCapteurContact);
       Sleep(200);
   }

Actionneur

moteur de type "tacho"

On pensera bien évidemment à initialiser les moteurs :

#define moteurGauche   OUTC
#define moteurDroit    OUTB
int maxSpeedMoteurDroit;
int maxSpeedMoteurGauche;

int initMoteurs()
{
   if (tacho_is_plugged( moteurGauche|moteurDroit , TACHO_TYPE__NONE_ ))
   {
       maxSpeedMoteurDroit  = tacho_get_max_speed( moteurDroit, 0 );
       maxSpeedMoteurGauche = tacho_get_max_speed( moteurGauche, 0 );
       printf("moteurs trouvés, vitesses max : %d-%d\n",maxSpeedMoteurGauche,maxSpeedMoteurDroit);
   }
   else
   {
       printf("Attention, il faut brancher les moteurs !\n");
       printf("et au bon endroit !!!\n");
       return (0);
   }
   return 1;
}

Remarquons :

  • si on souhaite utiliser la même commande sur plusieurs moteur, on écrira par ex :
    • OUTA | OUTB | OUTC
    • moteurGauche | moteurDroit , si on a fait une association de moteur* avec OUT?
  • tacho_is_plugged : permet de vérifier la présence d'un (ou plusieurs) moteur tacho
  • tacho_get_max_speed : récupère la vitesse maximum d'un moteur

On pourra alors utiliser les moteurs par exemple de la façon suivante (toujours à placer dans le main bien entendu !) :

   if ( initMoteurs()==0 )
   {
       ev3_uninit();
       return(-1);
   }
   int i;
   for (i=0;i<10;i++)
   {
       tacho_set_speed_sp( moteurGauche|moteurDroit,  100);
       tacho_run_forever( moteurGauche|moteurDroit );
       Sleep(2000);
       tacho_stop(moteurDroit|moteurGauche);
       Sleep(200);
       tacho_set_speed_sp( moteurGauche,  -100);
       tacho_set_speed_sp( moteurDroit ,   100);
       tacho_run_forever( moteurGauche|moteurDroit );
       Sleep(1000);
       tacho_stop(moteurDroit|moteurGauche);
       Sleep(200);
   }
   tacho_stop(moteurDroit|moteurGauche);