Une fonctionnalité très sympathique à développer sur son robot est le pilotage à distance par Smartphone. Un robot télécommandé avec un téléphone peut être facilement fabriqué avec Arduino et un module Bluetooth.
Matériel
- Robot mobile Rovy
- 4x TTGM
- DC Motor driver (ici nous utilisons un Arduino Mega prototyping shield et 2x pont en H SN754410)
- Batterie 7,4V
- Bluetooth module HC-06
- Arduino Mega
- Smartphone Android
Structure
Dans ce projet, nous utilisons le robot mobile Rovy mais cette solution peut être appliquée à tout type de robot programmable.
Hardware
- Microcontrôleur
La carte doit avoir suffisamment d’entrée/sortie pour piloter deux ponts en H. Ici nous utilisons un Arduino Mega mais un UNO suffirait.
- Driver
Pour contrôler un moteur CC en vitesse et en direction, les ponts en H sont souvent utilisés comme le SN754410.
- HC-06
Pour communiquer sans fil avec le robot une des méthodes les plus simples est d’utilisé un module Bluetooth HC-06 connecté à l’Arduino.
Schéma de montage
Interface
Une simple application peut-être créé à partir de Processing ou App Inventor 2. L’application présente quatre boutons qui représentent les directions du robot, un bouton et un affichage pour gérer la connexion au Bluetooth. Vous pouvez télécharger le projet de l’Application sur ce lien.
Lorsqu’on appuie sur un bouton de direction la commande correspondante est envoyée via Bluetooth sous forme de caractère.
Bouton |
Commande |
Mouvement |
Haut |
« F » |
Forward |
Gauche |
« L » |
Turn left |
Droite |
« R » |
Turn right |
Bas |
« B » |
Backward |
“S” |
Stop |
Si aucun bouton n’est pressé la commande « S » est envoyée.
Software
Le programme à implémenter dans l’Arduino peut être divisé en étapes simples. Lire la commande venant du module Bluetooth, sélectionner une fonction à partir de la commande reçue et contrôler les moteurs en fonction du mouvement sélectionné.
Lire la commande venant du module HC-06
Sur la carte Arduino Mega, 3 ports séries sont prédéfinis. Avec une autre carte, il aurait fallu utiliser la librairie SoftwareSerial.h. Lisez le tutoriel sur le module HC-06 pour plus d’information.
if (Serial3.available()>=MESSAGE_BYTES) { // If data is available to read delay(3); if( Serial3.read() == HEADER) { state = (char)Serial3.read(); // read it and store it in val } } Serial.print("Recieved : "); Serial.println(state);
Sélectionner la fonction mouvement correspondant à la commande
Retrouvez comment utiliser le mot-clé switch.
movementEnable(); switch(state){ case 'F': GoForward(Power); Serial.println("Robot walking"); break; case 'B': GoBackward(Power); Serial.println("Robot backing"); break; case 'R': TurnRight(Power); Serial.println("turn right"); break; case 'L': TurnLeft(Power); Serial.println("turn left"); break; default://S Stop(); Serial.println("resting"); break; }
Contrôler les moteurs CC
Regardez comment piloter un moteur CC ici.
void movementEnable(){ digitalWrite(enableBridge1,HIGH); digitalWrite(enableBridge2,HIGH); digitalWrite(enableBridge3,HIGH); digitalWrite(enableBridge4,HIGH); } void movementDisable(){ digitalWrite(enableBridge1,LOW); digitalWrite(enableBridge2,LOW); digitalWrite(enableBridge3,LOW); digitalWrite(enableBridge4,LOW); } void GoForward(int Power){ analogWrite(MotorForward1,Power); analogWrite(MotorReverse1,0); analogWrite(MotorForward2,Power); analogWrite(MotorReverse2,0); analogWrite(MotorForward3,Power); analogWrite(MotorReverse3,0); analogWrite(MotorForward4,Power); analogWrite(MotorReverse4,0); } void GoBackward(int Power){ analogWrite(MotorForward1,0); analogWrite(MotorReverse1,Power); analogWrite(MotorForward2,0); analogWrite(MotorReverse2,Power); analogWrite(MotorForward3,0); analogWrite(MotorReverse3,Power); analogWrite(MotorForward4,0); analogWrite(MotorReverse4,Power); } void TurnRight(int Power){ analogWrite(MotorForward1,Power); analogWrite(MotorReverse1,0); analogWrite(MotorForward2,0); analogWrite(MotorReverse2,Power); analogWrite(MotorForward3,Power); analogWrite(MotorReverse3,0); analogWrite(MotorForward4,0); analogWrite(MotorReverse4,Power); } void TurnLeft(int Power){ analogWrite(MotorForward1,0); analogWrite(MotorReverse1,Power); analogWrite(MotorForward2,Power); analogWrite(MotorReverse2,0); analogWrite(MotorForward3,0); analogWrite(MotorReverse3,Power); analogWrite(MotorForward4,Power); analogWrite(MotorReverse4,0); } void Stop(){ analogWrite(MotorForward1,0); analogWrite(MotorReverse1,0); analogWrite(MotorForward2,0); analogWrite(MotorReverse2,0); analogWrite(MotorForward3,0); analogWrite(MotorReverse3,0); analogWrite(MotorForward4,0); analogWrite(MotorReverse4,0); movementDisable(); }
Code Complet
#include <Servo.h> #include <SoftwareSerial.h> //SoftwareSerial HC06(2,3); // If board different from Mega // Motors definition const int enableBridge1 = 22; const int enableBridge2 = 23; const int enableBridge3 = 24; const int enableBridge4 = 25; const int MotorForward1 = 11; const int MotorReverse1 = 10; const int MotorForward2 = 8; const int MotorReverse2 = 9; const int MotorForward3 = 7; const int MotorReverse3 = 6; const int MotorForward4 = 4; const int MotorReverse4 = 5; //Serial port #define HEADER '|' #define MESSAGE_BYTES 2 // the total bytes in a message char state='S'; // Parameters int Power = 80; //Motor velocity /******************************************************************\ * PRIVATE FUNCTION: setup * * PARAMETERS: * ~ void * * RETURN: * ~ void * * DESCRIPTIONS: * Initiate inputs/outputs * \******************************************************************/ void setup(){ Serial3.begin(9600); Serial.begin(9600); delay(500); } /******************************************************************\ * PRIVATE FUNCTION: loop * * PARAMETERS: * ~ void * * RETURN: * ~ void * * DESCRIPTIONS: * Main Function of the code \******************************************************************/ void loop(){ if (Serial3.available()>=MESSAGE_BYTES) { // If data is available to read delay(3); if( Serial3.read() == HEADER) { state = (char)Serial3.read(); // read it and store it in val } } Serial.print("Recieved : "); Serial.println(state); movementEnable(); switch(state){ case 'F': GoForward(Power); Serial.println("Robot walking"); break; case 'B': GoBackward(Power); Serial.println("Robot backing"); break; case 'R': TurnRight(Power); Serial.println("turn right"); break; case 'L': TurnLeft(Power); Serial.println("turn left"); break; default://S Stop(); Serial.println("resting"); break; } } /******************************************************************\ * PRIVATE FUNCTION: movementEnable * * PARAMETERS: * ~ void * * RETURN: * ~ void * * DESCRIPTIONS: * Enable motor control \*****************************************************************/ void movementEnable(){ digitalWrite(enableBridge1,HIGH); digitalWrite(enableBridge2,HIGH); digitalWrite(enableBridge3,HIGH); digitalWrite(enableBridge4,HIGH); } void movementDisable(){ digitalWrite(enableBridge1,LOW); digitalWrite(enableBridge2,LOW); digitalWrite(enableBridge3,LOW); digitalWrite(enableBridge4,LOW); } /******************************************************************\ * PRIVATE FUNCTION: GoForward * * PARAMETERS: * ~ int Power motor velocity * * RETURN: * ~ void * * DESCRIPTIONS: * \*****************************************************************/ void GoForward(int Power){ analogWrite(MotorForward1,Power); analogWrite(MotorReverse1,0); analogWrite(MotorForward2,Power); analogWrite(MotorReverse2,0); analogWrite(MotorForward3,Power); analogWrite(MotorReverse3,0); analogWrite(MotorForward4,Power); analogWrite(MotorReverse4,0); } /******************************************************************\ * PRIVATE FUNCTION: GoBackward * * PARAMETERS: * ~ int Power motor velocity * * RETURN: * ~ void * * DESCRIPTIONS: * \*****************************************************************/ void GoBackward(int Power){ analogWrite(MotorForward1,0); analogWrite(MotorReverse1,Power); analogWrite(MotorForward2,0); analogWrite(MotorReverse2,Power); analogWrite(MotorForward3,0); analogWrite(MotorReverse3,Power); analogWrite(MotorForward4,0); analogWrite(MotorReverse4,Power); } /******************************************************************\ * PRIVATE FUNCTION: TurnRight * * PARAMETERS: * ~ int Power motor velocity * * RETURN: * ~ void * * DESCRIPTIONS: * \*****************************************************************/ void TurnRight(int Power){ analogWrite(MotorForward1,Power); analogWrite(MotorReverse1,0); analogWrite(MotorForward2,0); analogWrite(MotorReverse2,Power); analogWrite(MotorForward3,Power); analogWrite(MotorReverse3,0); analogWrite(MotorForward4,0); analogWrite(MotorReverse4,Power); } void TurnLeft(int Power){ analogWrite(MotorForward1,0); analogWrite(MotorReverse1,Power); analogWrite(MotorForward2,Power); analogWrite(MotorReverse2,0); analogWrite(MotorForward3,0); analogWrite(MotorReverse3,Power); analogWrite(MotorForward4,Power); analogWrite(MotorReverse4,0); } void Stop(){ analogWrite(MotorForward1,0); analogWrite(MotorReverse1,0); analogWrite(MotorForward2,0); analogWrite(MotorReverse2,0); analogWrite(MotorForward3,0); analogWrite(MotorReverse3,0); analogWrite(MotorForward4,0); analogWrite(MotorReverse4,0); movementDisable(); }
Résultat
Si vous désirez plus d’information sur ce projet n’hésitez pas à laisser un commentaire ou à nous envoyer un message.
le rôle du enablebridge ??
Le rôle de la broche enableBridge lorsqu’elle est reliée au pont en H est de pouvoir la désactiver par le programme dans le cas d’un arrêt d’urgence, par exemple. Cela assure qu’aucun courant n’est envoyé aux moteurs.
Il n’est pas nécessaire de la relier à Arduino pour faire fonctionner le robot.