Un projet AI2 servant à piloter un robot mobile via Bluetooth

Que fait ce projet ?

ecran-3.png

Ce projet permet d’établir une communication Bluetooth et de commander les déplacement d’un robot comprenant un circuit Arduino.

L’application

Elle se trouve sur le site Appinventor, dans la galerie, avec le nom « BtRobot », ou rentrant plus simplement « dlefur ».

Le code Arduino

/* 
 Robot Commande par Bluetooth
 */

//------------------------------------------------------------
// Librairies
//------------------------------------------------------------

// pour le traitement du message recu sur la liaison serie
#include <SerialDLF.h>

//------------------------------------------------------------
// Constantes et variables
//------------------------------------------------------------

// Classe de SerialDLF
SerialString messageRecu;

//Moteur A Gauche
int E1 = 5; // Vitesse (PWM)
int M1 = 4; // Direction

//Motor B Droite
int E2 = 6; // Vitesse (PWM)
int M2 = 7; // Direction

const int MOTEUR_A=0;
const int MOTEUR_B=1;

const int AVANT=1;
const int ARRIERE=0;


//------------------------------------------------------------
// Setup
//------------------------------------------------------------

void setup()
{
  // Initialisation de la liaison serie
  Serial.begin(9600); 
  Serial.flush();
  Serial.println("Liaison serie operationnelle !");
  Serial.println("------------------------------");
  delay(1000);
  Serial.println("Descriptif du programme :");
  Serial.println("--------------------------");
  Serial.println("Ce programme permet de commander un robot.");
  Serial.println("--------------------------");
  Serial.println("Pour connaitre les commandes, taper sur h ou H.");
  Serial.println("--------------------------");


  // Autres initilisations

  pinMode(E1, OUTPUT);
  pinMode(M1, OUTPUT);

  pinMode(E2, OUTPUT);
  pinMode(M2, OUTPUT);


} // fin setup

//------------------------------------------------------------
// Loop
//------------------------------------------------------------

void loop()
{ 
  messageRecu.renew();  // on lit un eventuel message.
  if (messageRecu.empty()==false) // Si le message est non vide ...
  {
    //Serial.println(messageRecu.get());
    traitement();
    Serial.flush();
  }
} //fin loop


//------------------------------------------------------------
// Fonction traitement()
//------------------------------------------------------------
/*
Execute le traitement des caracteres recus par la liaison serie
 qui sont stockes dans messageRecu.
 */

void traitement()
{
  float temp;

  if ((messageRecu.equals("Descriptif")) || (messageRecu.equals("d")))
  {

    Serial.println("--------------------------");
    Serial.println("Descriptif du programme :");
    Serial.println("--------------------------");
    Serial.println("Ce programme mesure la temperature a la demande.");
    Serial.println("--------------------------");
  }
  else if  ((messageRecu.equals("Help")) || (messageRecu.equals("h")))
  {
    Serial.println("--------------------------");
    Serial.println("Liste des commandes :");
    Serial.println("--------------------------");
    Serial.println("--> Descriptif ou d : affiche le descriptif du programme.");
    Serial.println("--> Help ou h : affiche la liste des commandes.");
    Serial.println("--> Mesure ou m : demande une mesure.");
    Serial.println("--------------------------");
  }
  else if  ((messageRecu.equals("Avancer")))
  {
    Serial.println("Avancer.");
    activer(MOTEUR_A, AVANT, 250);
    activer(MOTEUR_B, AVANT,250); 
    delay(250);
    activer(MOTEUR_A, AVANT, 0);
    activer(MOTEUR_B, AVANT, 0);     
  }
  else if  ((messageRecu.equals("Reculer")))
  {
    Serial.println("Reculer.");
    activer(MOTEUR_A, ARRIERE, 250);
    activer(MOTEUR_B, ARRIERE, 250);
    delay(250);
    activer(MOTEUR_A, AVANT, 0);
    activer(MOTEUR_B, AVANT, 0);      
  }
  else if  ((messageRecu.equals("Droite")))
  {
    Serial.println("Droite.");
    activer(MOTEUR_A, AVANT, 250);
    activer(MOTEUR_B, ARRIERE, 250);
    delay(250);
    activer(MOTEUR_A, AVANT, 0);
    activer(MOTEUR_B, AVANT, 0);   
  }
  else if  ((messageRecu.equals("Gauche")))
  {
    Serial.println("Gauche.");
    activer(MOTEUR_A, ARRIERE, 250);
    activer(MOTEUR_B, AVANT, 250);
    delay(250);
    activer(MOTEUR_A, AVANT, 0);
    activer(MOTEUR_B, AVANT, 0);    
  }
  else if  ((messageRecu.equals("Arreter")))
  {
    Serial.println("Arreter.");
    activer(MOTEUR_A, AVANT, 0);
    activer(MOTEUR_B, AVANT, 0);    
  }

  else
  {
    Serial.println("Erreur de saisie !");
  }

} // fin traitement


//////////////////////////////////////////
// Fonction activer
//////////////////////////////////////////

void activer(int moteur, int sens, int vitesse)
// moteur : MOTEUR_A ou MOTEUR_B
// sens : AVANT ou ARRIERE
// vitesse : entre 0 et 255
{

  switch (moteur)
  {
  case MOTEUR_A :
    if (sens==AVANT)
    {
      digitalWrite(M1, LOW);       
      analogWrite(E1, vitesse);
    }
    else
    {
      digitalWrite(M1, HIGH);       
      analogWrite(E1, vitesse);
    }
    break;

  case MOTEUR_B :
    if (sens==AVANT)
    {
      digitalWrite(M2, LOW);       
      analogWrite(E2, vitesse);
    }
    else
    {
      digitalWrite(M2, HIGH);       
      analogWrite(E2, vitesse);
    }
    break;
  }
}



//////////////////////////////////////////
// Fonction arreter_tout
//////////////////////////////////////////

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


//////////////////////////////////////////
// Fonction arreter
//////////////////////////////////////////

void arreter(int moteur)
{
  switch (moteur)
  {
  case MOTEUR_A :
    analogWrite(E1, 0);

  case MOTEUR_B :
    analogWrite(E2, 0);
  }
}