Cours:StartMindstormEV3DEV
Sommaire
Infos utiles
librairie brick
Pour commencer, nous utiliserons la librairie simplifiée "brick.h" dont nous allons explorer quelques aspects ici.
- on trouve une description globale des différentes approches de la librairie
- il faudra nécessairement se référer à la documentation de la librairie brick
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 :
| |||||||||
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);