Premier programme avec Arduino : Moteur, Capteur et évitement d’obstacle

Etape 1 : Mise en place de l’environnement

Sur Windaub rien de plus simple, il suffit de télécharger l’IDE Arduino ici

Concernant la configuration la encore c’est très simple, il suffit de :

  • Choisir le modèle de sa carte dans la liste disponible du menu Tools > board
  • Définir le port de communication utilisé dans Tools >Serial Port

De plus il existe un système de débug via le port série via le menu Tools >Serial Monitor, celui ci permet de debugguer son programme assez facilement a l’aide de la fonction Serial.write (XXX). Nous pouvons même simuler l’envoi de commande via une entrée standard toute prête.

Etape 2 : Premier programme : Test des moteurs

Voici un petit code permettant de tester vos branchements moteurs

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M2 Direction Control

int speed = 200;

void run_motor()
{
analogWrite (E2, speed);
digitalWrite(M2,LOW);
analogWrite (E1, speed);
digitalWrite(M1,HIGH);
}
void setup(void)
{
int i;
for(i=6;i<=9;i++)
pinMode(i, OUTPUT);

Serial.begin(19200); //Set Baud Rate
}
void loop(void)
{
run_motor();
}

Un programme arduino se compose de deux fonctions principales. Une fonction setup correspondant a l’initialisation et une fonction loop correspondant au programme qui sera exécuté comme son nom l’indique en continue.

Dans la fonction setup, nous définissons que les pin correspondant aux commandes moteurs sont en mode output. En effet nous avons besoin d’envoyer des valeurs a nos moteurs, donc en toute logique nous choisissons le mode output. Ici les pins correspondant aux moteurs vont de 4 a 7, attention selon la version de votre board, ces pins peuvent être différents, ceci est a déterminer a l’aide des indications sur les datasheets ou plus simplement directement sur la carte. Enfin le serial.begin permet de définir la vitesse de transmission du port série. Celle ci doit être la même dans le mode sérial monitor si vous voulez communiquer de façon correcte avec votre carte.

Dans la fonction loop, nous appelons la fonction qui active les moteurs. AnalogWrite comme son nom l’indique permet d’écrire sur un pin analogique tandis que le DigitalWrite permet d’écrire sur un pin digitale. Ainsi sur le pin de direction on peut envoyer LOW ou HIGH selon que vous vouliez mettre vos moteurs en marche arrière ou avant, ensuite pour ce qui est des pins de vitesse, on y définit une vitesse celle ci étant en bytes la fourchette de valeur est 0 – 255.

Vous allez me dire qu’il y a un problème dans mon code ? Et bien oui mes deux moteurs ne semblent pas tourner dans le même sens. Et bien pas vraiment, au cours de mon montage j’ai donc branché deux moteurs en parallèles sur chaque contrôleur moteur ( Il y en a que deux sur la carte, 4 moteurs donc pas le choix). Cependant j’ai fait mes soudures au hasard, ainsi il s’est avéré que mes deux moteurs ne sont pas branchés dans le même sens de polarité. Ainsi si je veux aller en marche avant avec l’un je dois lui envoyer LOW, tandis que l’autre a besoin de HIGH. Ceci n’est pas très gênant étant donné qu’on programme notre petite fonction une fois et qu’après on n’y touche plus.

Pour tester le programme rien de plus simple, il y a un bouton upload. Attention sur certaine carte dont la Romeo, il est nécessaire de reset la carte entre chaque nouveau upload de code. Pour cela, il y a en général un bouton sur la carte. Ainsi il vous suffira d’appuyer sur le bouton de reset brièvement juste avant de lancer l’upload.

Finalement, on débranche son robot, on enclenche l’interrupteur et on espère que cela fonctionne, sinon a vous la chasse au faux contact, mauvaise soudure, etc..

Etape 3 : Intégration de capteur et arrêt de la plateforme a la rencontre d’un obstacle

capteur utilisé :  Module capteur de distance infrarouge Sharp GP2Y0A21  (datasheet)

Nous allons tout d’abord brancher notre capteur. Celui que nous utilisons est analogique, nous allons donc le brancher sur les pins analogique. Cependant votre bon sens vous dira que si celui ci est digital vous devrez utiliser les pins correspondant. Concernant notre cher capteur, pour le brancher rien de plus simple, un connecteur JST est deja plugguer sur le capteur, donc plus qu’a le brancher de façon très simple. Tout d’abord en lisant notre datasheet, nous repérons que le cable rouge est le plus (Vcc sur le schéma), Nous devons brancher ce Vcc sur le pin 5V de l’analogique, le Gnd sur le Gnd et enfin le Vo sur le S. Dans mon cas, j’ai branché mon capteur sur le pin 0.

extrait du datasheet du capteur sharp

Voici un petit programme très simple permettant de tester son bon fonctionnement :


//Standard PWM DC control

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M2 Direction Control

int front_sensor = 0; // pin analog 0
int speed = 200;

// mootor functions

void run_motor()
{
 analogWrite (E2, speed);
 digitalWrite(M2,LOW);
 analogWrite (E1, speed);
 digitalWrite(M1,HIGH);
}

void stop_motor ()
{
 analogWrite (E1, 0);
 analogWrite (E2, 0);
}

// sensor functions

boolean detect_obstacle (int sensor)
{
 if (analogRead(sensor) > 200)
 return true;
 return false;
}

void setup(void)
{
 int i;
 for(i=6;i<=9;i++)
 pinMode(i, OUTPUT);

Serial.begin(19200); //Set Baud Rate
}
void loop(void)
{

if (detect_obstacle (front_sensor) == false)
 {
 run_motor();
 }
 else
 {
 stop_motor ();
 }
}

Dans ce code, nous avons donc une fonction permettant de détecter les obstacles. Dans le cas ou nous détectons un obstacle, nous stoppons le robot. Le capteur est analogique, nous utilisons donc la fonction AnalogRead, le paramètre qui lui est passé correspondant a la valeur du pin sur lequel est branché le capteur a savoir 0. Enfin on définit le fait de tomber sur un obstacle lorsqu’on est a une certaine distance de celui ci. Il faut savoir que plus la valeur renvoyée par le capteur et plus l’obstacle sera proche. Donc attention la valeur renvoyée est une tension correspondant au voltage .

Etape 4 : Programme d’évitement d’obstacle

Voir l’étape 4 dans la seconde partie de l’article.

Etape 1 : Mise en place de l’environnement

Sur Windaub rien de plus simple, il suffit de télécharger l’IDE Arduino ici

Concernant la configuration la encore c’est très simple, il suffit de :

  • Choisir le modèle de sa carte dans la liste disponible du menu Tools > board
  • Définir le port de communication utilisé dans Tools >Serial Port

De plus il existe un système de débug via le port série via le menu Tools >Serial Monitor, celui ci permet de debugguer son programme assez facilement a l’aide de la fonction Serial.write (XXX). Nous pouvons même simuler l’envoi de commande via une entrée standard toute prête.

Etape 2 : Premier programme : Test des moteurs

Voici un petit code permettant de tester vos branchements moteurs

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M1 Direction Control

int speed = 200;

void run_motor()
{
analogWrite (E2, speed);
digitalWrite(M2,LOW);
analogWrite (E1, speed);
digitalWrite(M1,HIGH);
}
void setup(void)
{
int i;
for(i=6;i<=9;i++)
pinMode(i, OUTPUT);

Serial.begin(19200); //Set Baud Rate
}
void loop(void)
{
run_motor();
}

Un programme arduino se compose de deux fonctions principales. Une fonction setup correspondant a l’initialisation et une fonction loop correspondant au programme qui sera exécuté comme son nom l’indique en continue.

Dans la fonction setup, nous définissons que les pin correspondant aux commandes moteurs sont en mode output. En effet nous avons besoin d’envoyer des valeurs a nos moteurs, donc en toute logique nous choisissons le mode output. Ici les pins correspondant aux moteurs vont de 4 a 7, attention selon la version de votre board, ces pins peuvent être différents, ceci est a déterminer a l’aide des indications sur les datasheets ou plus simplement directement sur la carte. Enfin le serial.begin permet de définir la vitesse de transmission du port série. Celle ci doit être la même dans le mode sérial monitor si vous voulez communiquer de façon correcte avec votre carte.

Dans la fonction loop, nous appelons la fonction qui active les moteurs. AnalogWrite comme son nom l’indique permet d’écrire sur un pin analogique tandis que le DigitalWrite permet d’écrire sur un pin digitale. Ainsi sur le pin de direction on peut envoyer LOW ou HIGH selon que vous vouliez mettre vos moteurs en marche arrière ou avant, ensuite pour ce qui est des pins de vitesse, on y définit une vitesse celle ci étant en bytes la fourchette de valeur est 0 – 255.

Vous allez me dire qu’il y a un problème dans mon code ? Et bien oui mes deux moteurs ne semblent pas tourner dans le même sens. Et bien pas vraiment, au cours de mon montage j’ai donc branché deux moteurs en parallèles sur chaque contrôleur moteur ( Il y en a que deux sur la carte, 4 moteurs donc pas le choix). Cependant j’ai fait mes soudures au hasard, ainsi il s’est avéré que mes deux moteurs ne sont pas branchés dans le même sens de polarité. Ainsi si je veux aller en marche avant avec l’un je dois lui envoyer LOW, tandis que l’autre a besoin de HIGH. Ceci n’est pas très gênant étant donné qu’on programme notre petite fonction une fois et qu’après on n’y touche plus.

Pour tester le programme rien de plus simple, il y a un bouton upload. Attention sur certaine carte dont la Romeo, il est nécessaire de reset la carte entre chaque nouveau upload de code. Pour cela, il y a en général un bouton sur la carte. Ainsi il vous suffira d’appuyer sur le bouton de reset brièvement juste avant de lancer l’upload.

Finalement, on débranche son robot, on enclenche l’interrupteur et on espère que cela fonctionne, sinon a vous la chasse au faux contact, mauvaise soudure, etc..

Etape 3 : Intégration de capteur et arrêt de la plateforme a la rencontre d’un obstacle

capteur utilisé :  Module capteur de distance infrarouge Sharp GP2Y0A21  (datasheet)

Nous allons tout d’abord brancher notre capteur. Celui que nous utilisons est analogique, nous allons donc le brancher sur les pins analogique. Cependant votre bon sens vous dira que si celui ci est digital vous devrez utiliser les pins correspondant. Concernant notre cher capteur, pour le brancher rien de plus simple, un connecteur JST est deja plugguer sur le capteur, donc plus qu’a le brancher de façon très simple. Tout d’abord en lisant notre datasheet, nous repérons que le cable rouge est le plus (Vcc sur le schéma), Nous devons brancher ce Vcc sur le pin 5V de l’analogique, le Gnd sur le Gnd et enfin le Vo sur le S. Dans mon cas, j’ai branché mon capteur sur le pin 0.

extrait du datasheet du capteur sharp

Voici un petit programme très simple permettant de tester son bon fonctionnement :


//Standard PWM DC control

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M1 Direction Control

int front_sensor = 0; // pin analog 0
int speed = 200;

// mootor functions

void run_motor()
{
 analogWrite (E2, speed);
 digitalWrite(M2,LOW);
 analogWrite (E1, speed);
 digitalWrite(M1,HIGH);
}

void stop_motor ()
{
 analogWrite (E1, 0);
 analogWrite (E2, 0);
}

// sensor functions

boolean detect_obstacle (int sensor)
{
 if (analogRead(sensor) > 200)
 return true;
 return false;
}

void setup(void)
{
 int i;
 for(i=6;i<=9;i++)
 pinMode(i, OUTPUT);

Serial.begin(19200); //Set Baud Rate
}
void loop(void)
{

if (detect_obstacle (front_sensor) == false)
 {
 run_motor();
 }
 else
 {
 stop_motor ();
 }
}

Dans ce code, nous avons donc une fonction permettant de détecter les obstacles. Dans le cas ou nous détectons un obstacle, nous stoppons le robot. Le capteur est analogique, nous utilisons donc la fonction AnalogRead, le paramètre qui lui est passé correspondant a la valeur du pin sur lequel est branché le capteur a savoir 0. Enfin on définit le fait de tomber sur un obstacle lorsqu’on est a une certaine distance de celui ci. Il faut savoir que plus la valeur renvoyée par le capteur et plus l’obstacle sera proche. Donc attention la valeur renvoyée est une tension correspondant au voltage .

Etape 4 : Programme d’évitement d’obstacle

Voir l’étape 4 dans la seconde partie de l’article.

10 réflexions sur « Premier programme avec Arduino : Moteur, Capteur et évitement d’obstacle »

  1. Super projet sympa. Il faudrait le publier sur http://www.igloocommunity.org afin de le rendre plus visible et d’ouvrir une fenêtre d’échange sur le sujet robotique. Il y a de nombreux fan de robot dans la communauté. Bien sur en anglais mais avec Google translate tout est possible 🙂

    • Un peu tot pour cela. Lorsque mon projet sera plus aboutit pourquoi pas en effet le partager avec le reste de la communauté. Et pour l’anglais oui en effet, je me doute héhé mais pas le choix dans ce domaine.

  2. bonjour
    quelle carte arduino tu as utilisé a la construction d’eviteur d’obstacle ?
    et si on veut ajouter un petit moteur qui assure la rotation de notre capteur infrarouge il faut ajouter des modifications au programmation ou non ?
    merci d’avance 🙂

  3. Une romeo tout en un (http://www.dfrobot.com/index.php?route=product/product&product_id=56#.UtZItuVBPp4). Cette carte roméo est vendu au sein du kit 4WD dont je parle dans un de mes articles ici. Si tu piloter la rotation independemment a tes moteurs de tractions oui tu vas devoir rajouter quelques lignes de code mais rien de bien méchant.

    De plus, plus tu rajoutes de moteurs, au autres composants et plus tu vas devoir utiliser une alimentation puissance et t’assure aussi d’avoir le nombre d’entrée/sortie suffisante sur la carte que tu utilises pour piloter tes composants;

  4. Bonjour j’ai besoin de ce programme mais avec le moteur qui s’arrête quand le capteur est a 2 centimètres de l’obstacle ! Qu’est ce qui est à changer dans le programme ? Merci d’avance

  5. Je cherche a faire un programme avec arduino pour un projet de premiere. Il faut que jutilise deux capteurs emmeteurs et recepteur et en fonction des valeurs faire varie l’angle d’un servos moteur ….
    J’ai crée 2 programme separe mais je ne sais pas les regrouper pourrai tu me donner un conseil merci d’avance

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.