Contrôle d’une voiture RC avec Arduino Uno

Dans le cadre de mes études, nous devions réaliser un projet au choix sur une carte Armadeus APF28. Le projet n’ayant pu aboutir, nous allons réaliser un équivalent avec une carte Arduino Uno. Le projet consiste à contrôler le servomoteur de direction ainsi que le variateur du moteur électrique d’une voiture radio-commandé de modélisme.

L’équipement qui va être utilisé :

Buggy RC B4RS Team Associated constitué de :

Carte Arduino Uno R3

Contrôle du servomoteur et du variateur

Circuit électrique

Schema_1

Les servomoteurs possèdent 3 fils de connexion :

  • Le +
  • Le – (ou la masse)
  • La commande du servomoteur (impulsion modulé qui définit la position de l’axe du servomoteur)

Le circuit électrique à réaliser pour connecter un servomoteur à la carte Arduino :

  • Le + (ici Rouge) doit être relié à la borne 5V de la carte
  • Le – ou masse (ici Noir) doit être relié à la borne 0V (ou GND)
  • Le fil de l’impulsion de commande (ici Blanc) doit être relié à une broche numérique de la carte

Voici donc comment relier l’électronique de notre voiture à la carte Arduino :

Schema_2

Servomoteur de direction :

  • Fil Rouge : Borne 5V Arduino
  • Fil Noir : Borne GND Arduino
  • Fil Blanc : Borne Digital n°7

Variateur du moteur :

  • Fil Rouge : Borne Vin Arduino
  • Fil Noir : Borne GND Arduino
  • Fil Blanc : Borne Digital n°8

La borne Vin est utilisé pour l’alimentation du variateur du moteur car celui-ci fournit du courant via la batterie de la voiture pour alimenter la carte Arduino Uno.

Programmation

Le contrôle d’un servomoteur par la carte Arduino nécessite l’utilisation d’une « Librairie » externe. Pour l’importer rien de plus simple : Croquis > Importer Bibliothèque > Servo

Ou tout simplement inclure ce texte au début du programme :

#include <Servo.h>

Après plusieurs test, la fonction Serial.parseInt() s’est montré trop longue à l’exécution pour avoir une bonne réactivité de la voiture. La première partie du void loop() permet donc de remplacer l’utilisation de cette fonction. Les commandes seront transmises selon la méthode suivante :

R090
  • R permet de passer le premier if afin que le nombre qui le succède soit interprété par la carte Arduino.
  • 090 correspond à l’ordre donné à la carte Arduino.

Le variateur et le servomoteur attendent une valeur comprise entre 0 et 180, 90 correspondant au milieu.

Pour contrôler le moteur nous allons utiliser les valeur de 0 à 180 (ici brider dans la carte Arduino entre 70 et 104 pour garder une voiture « contrôlable »). Pour contrôler le servomoteur nous allons utiliser les valeurs entre 200 et 380 (200 sera soustrait à ces valeurs à la réception pour rester dans l’intervalle 0 – 180)

Voici le code utilisé sur la carte Arduino :

//Déclaration de la librairie servo
#include 

//Déclaration des servo et des variables
Servo mymotor; 
Servo myservo;
int angle;

void setup() 
{ 
  //Servo branché sur la borne digitale 7
  myservo.attach(7);
  //Variateur branché sur la borne digitale 8
  mymotor.attach(8);
  //Initiation d'une connexion série 9600bauds
  Serial.begin(9600);
  //Initialisation de la variable angle à 90
  angle = 90;
} 

void loop() 
{ 
  //Si des données sont reçues sur la connexion série
  if(Serial.available() > 0)
  {
    //Si octet reçu = 82 (donc le caractère R)
    if(Serial.read() == 82)
    {
      //Calcul de ciffre de centaine
      int r1 = 0;
      switch((int)Serial.read())
      {
      case 48:
        r1 = 0;
        break;
      case 49:
        r1 = 1;
        break;
      case 50:
        r1 = 2;
        break;
      case 51:
        r1 = 3;
        break;
      case 52:
        r1 = 4;
        break;
      case 53:
        r1 = 5;
        break;
      case 54:
        r1 = 6;
        break;
      case 55:
        r1 = 7;
        break;
      case 56:
        r1 = 8;
        break;
      case 57:
        r1 = 9;
        break;
      default :
        r1 = 0;
        break;
      }

      //Calcul du chiffre de dizaine
      int r2 = 0;
      switch((int)Serial.read())
      {
      case 48:
        r2 = 0;
        break;
      case 49:
        r2 = 1;
        break;
      case 50:
        r2 = 2;
        break;
      case 51:
        r2 = 3;
        break;
      case 52:
        r2 = 4;
        break;
      case 53:
        r2 = 5;
        break;
      case 54:
        r2 = 6;
        break;
      case 55:
        r2 = 7;
        break;
      case 56:
        r2 = 8;
        break;
      case 57:
        r2 = 9;
        break;
      default :
        r2 = 0;
        break;
      }

      //Calcul du chiffre des unités
      int r3 = 0;
      switch((int)Serial.read())
      {
      case 48:
        r3 = 0;
        break;
      case 49:
        r3 = 1;
        break;
      case 50:
        r3 = 2;
        break;
      case 51:
        r3 = 3;
        break;
      case 52:
        r3 = 4;
        break;
      case 53:
        r3 = 5;
        break;
      case 54:
        r3 = 6;
        break;
      case 55:
        r3 = 7;
        break;
      case 56:
        r3 = 8;
        break;
      case 57:
        r3 = 9;
        break;
      default :
        r3 = 0;
        break;
      }

      //Calcul du nombre complet
      angle = ((int)r1 * 100) + ((int)r2 * 10) + (int)r3;
      Serial.flush();
    }
  }
  else
  {
    Serial.flush();
    Serial.println("Wait : Flush !");
  }

  //Si angle entre 70 et 104, controle du variateur de moteur
  if(angle > 70 & angle < 104)   
  {    
    Serial.print("Moteur :");     
    Serial.println(angle);     
    mymotor.write(angle);     
    delay(15);   
  }  

//Si angle entre 200 et 380, controle du servomoteur
else if(angle > 200 & angle < 380)
  {
    Serial.print("Servo :");
    Serial.println(angle-200);
    myservo.write(angle-200);
    delay(15);
  }
  else
  {
    Serial.flush();
    Serial.println("Error value !");
  }
}

En ouvrant une invite de commande sur le port COM3, il est alors possible de diriger la direction et la propulsion de la voiture en envoyant les commandes adéquates. (Possible directement via le raccourci CTRL+SHIFT+M dans le logiciel de programmation Arduino.

Prise de commande via WiFi

Pour que la voiture soit complètement autonome et sans câble, nous allons utiliser une liaison WiFi avec un interface Web qui permettra de contrôler la voiture à partir d’un simple navigateur acceptant le Javascript.

Pour cela, une carte Raspberry Pi a été utilisé pour héberger un serveur Web Node-js qui permet d’envoyer les instructions de commandes à la carte Arduino. La Raspberry Pi est alimenté via une batterie avec port USB qui délivre 5V et 600mA (Les batteries externes qui permettent de recharger les smartphones).

Matériel :

(A suivre…)

7 réflexions sur « Contrôle d’une voiture RC avec Arduino Uno »

  1. Sauvy

    Bonjour,
    Je suis actuellement en train de réaliser un projet simillaire afin d’apprendre les base de l’electronique et de la programmation.
    L’objectif fixé est simple, je souheterai dérivé ma voiture telecommandée pour y installer un capteur ultrason type HC SR04, afin que la voiture ce pilote de manière autonome (dans un premier temps).
    Jusque là j’arrive a faire balayer le capteur lui même installé sur un servomoteur, et je recupère les donnée de lecture sans soucis.
    Par contre je peine, à trouver une solution simple pour les stocker, les comparer et extraire l’angle Max ou Min, me permettant de trouver l’echapatoire la plus pratique en cas de detection de collision par le capteur.
    Auriez vous une idée à proposer??
    Merci d’avance.

    Répondre
    1. Manu Auteur de l’article

      Bonjour,

      Malheureusement je ne pense pas pouvoir vous aider. N’étant pas un « grand » développeur, je ne me suis pas vraiment occupé de la partie software du projet. De plus notre but étant de prendre le contrôle de la voiture à distance via un smartphone, le développeur de l’équipe s’est restreins à une simple application Android (et également une appli web) qui envoie les commandes de contrôle à un serveur node.js hébergé sur la Raspberry Pi en temps réel via socket.io. La Raspberry transfère ensuite les commandes vers la Arduino pour piloter servomoteur et variateur. Aucune sauvegarde de données n’a été prévue pour une interprétation ultérieure comme tel est votre cas.

      J’espère que vous trouverez des réponses à vos interrogations, et je vous remercie d’avoir consulter cet article bien qu’incomplet et d’avoir commenter.

      Répondre
    1. Manu Auteur de l’article

      Malheureusement pas de lien avec le projet complet. Le prototype était fonctionnel lors de la présentation du projet au cours de mes études supérieures mais depuis l’ensemble est retourné au placard et je ne dispose plus de la partie de code concernant le serveur NodeJS et l’interface de commande.

      Répondre
    1. Manu Auteur de l’article

      Bonjour,
      Je ne suis pas développeur et comme précisé dans les précédents commentaires je ne possède plus le reste du code et de la configuration du projet.
      Pour un contrôle via téléphone il faudrait simplement une application qui transmet les commandes à un applicatif serveur hébergé sur le Raspberry qui à son tour transmet les commandes vers l’arduino pour diriger la voiture.

      Répondre
  2. Mellon Samuel

    Merci de ta réponse!
    Je suis sur un projet, et je dois enlever le récepteur hertziens et y remplacer par une arduino pour pouvoir, via une application le contrôler par téléphone. Aurais tu des idées à me proposer pour m’aider stp?

    Répondre

Laisser un commentaire

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