Projet 14 Contrôle du Robot par Bluetooth

Description

Nous avons appris les connaissances de base sur le Bluetooth. Dans cette leçon, nous allons créer une voiture intelligente télécommandée par Bluetooth. Dans l’expérience, nous considérons par défaut le module Bluetooth HM-10 comme Esclave et le téléphone portable comme Maître.

keyes BT car est une application développée par l’équipe keyestudio. Vous pouvez contrôler facilement la voiture robot avec celle-ci.

APPLICATION

  • Application Android

    • Veuillez télécharger l’application ici.

    • Appuyez sur l’icône Tank_Car pour accéder à l’application Bluetooth. Comme indiqué ci-dessous.

    • Après avoir téléchargé le code sur la carte UNO R3, connectez le module Bluetooth, la LED du module Bluetooth clignotera. Ensuite, appuyez sur l’option CONNECT dans l’application pour rechercher le Bluetooth.

    • Cliquez pour connecter le Bluetooth. HMSoft connecté, la LED Bluetooth s’allumera normalement.

    • Appuyez sur le bouton ①, le panneau LED 8x16 affichera l’icône avant. Relâchez le bouton, affichage « STOP ».

    • Ci-dessous se trouve l’interface de l’application Bluetooth du robot Tank et nous avons listé la fonction de chaque touche :

  • Application iOS

    • Ouvrez l’App Store

    • Cliquez pour rechercher keyestudio, et vous verrez keyes BT car.

    • Appuyez pour ouvrir keyes BT car

    • Pour ouvrir le Bluetooth, cliquez sur « Connect » dans le coin supérieur gauche, recherchez et connectez le Bluetooth.

    • Appuyez sur l’icône Tank_Car pour accéder à l’interface de contrôle.

    • Ci-dessous se trouve l’interface de l’application Bluetooth du robot Tank et nous avons listé la fonction de chaque touche :

Code de Test

/*
 keyestudio Mini Tank Robot V2.1
 lesson 14.1
 test bluetooth
 http://www.keyestudio.com
*/
char ble_val; //variable de caractère, utilisée pour enregistrer la valeur reçue par Bluetooth
void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  if(Serial.available() > 0)  //vérifier s'il y a des données dans la zone tampon
  { ble_val = Serial.read();  //lire les données du tampon série
    Serial.println(ble_val);  //afficher
  }
}//**************************************************************

Retirez le module Bluetooth, téléchargez le code de test, reconnectez le module Bluetooth, ouvrez le moniteur série et réglez la vitesse de transmission à 9600. Pointez vers le module Bluetooth et appuyez sur les touches de l’application, le caractère correspondant s’affiche comme ci-dessous.

Le caractère détecté et la fonction correspondante :

Schéma de Connexion

Attention au Câblage :

Panneau LED 8x16

Carte d’Extension

GND

-(GND)

VCC

+(VCC)

SDA

SDA

SCL

SCL

Insérez le module Bluetooth verticalement, vous n’avez pas besoin de connecter ses broches STATE et BRK

Code de Test

Remarque : Retirez le module Bluetooth avant de télécharger le code de test. Sinon, le téléchargement du code de test échouera.

/*
 keyestudio Robot Car v2.0
 lesson 14.2
 voiture bluetooth
 http://www.keyestudio.com
*/

//Tableau, utilisé pour stocker les données du motif, peut être calculé par vous-même ou obtenu à partir de l'outil de modulus
unsigned char start01[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char front[] = {0x00,0x00,0x00,0x00,0x00,0x24,0x12,0x09,0x12,0x24,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char back[] = {0x00,0x00,0x00,0x00,0x00,0x24,0x48,0x90,0x48,0x24,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char left[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x44,0x28,0x10,0x44,0x28,0x10,0x00};
unsigned char right[] = {0x00,0x10,0x28,0x44,0x10,0x28,0x44,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char STOP01[] = {0x2E,0x2A,0x3A,0x00,0x02,0x3E,0x02,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x0A,0x0E,0x00};
unsigned char clear[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
#define SCL_Pin  A5  //Définir la broche d'horloge à A5
#define SDA_Pin  A4  //Définir la broche de données à A4

#define ML_Ctrl 13  //définir la broche de contrôle de direction du moteur gauche
#define ML_PWM 11   //définir la broche de contrôle PWM du moteur gauche
#define MR_Ctrl 12  //définir la broche de contrôle de direction du moteur droit
#define MR_PWM 3    //définir la broche de contrôle PWM du moteur droit

char bluetooth_val; //enregistrer la valeur reçue par Bluetooth

void setup(){
  Serial.begin(9600);
  
  pinMode(SCL_Pin,OUTPUT);
  pinMode(SDA_Pin,OUTPUT);
  matrix_display(clear);    //Effacer l'affichage
  matrix_display(start01);  //afficher le motif de démarrage

  pinMode(ML_Ctrl, OUTPUT);
  pinMode(ML_PWM, OUTPUT);
  pinMode(MR_Ctrl, OUTPUT);
  pinMode(MR_PWM, OUTPUT);
}

void loop(){
  if (Serial.available())
  {
    bluetooth_val = Serial.read();
    Serial.println(bluetooth_val);
  }
  switch (bluetooth_val) 
  {
     case 'F':  //commande d'avance
        Car_front();
        matrix_display(front);  //afficher le motif d'avance
        break;
     case 'B':  //commande de recul
        Car_back();
        matrix_display(back);  //afficher le motif de recul
        break;
     case 'L':  //commande de virage à gauche
        Car_left();
        matrix_display(left);  //afficher le signe de virage à gauche
        break;
     case 'R':  //commande de virage à droite
        Car_right();
        matrix_display(right);  //afficher le signe de virage à droite
       break;
     case 'S':  //commande d'arrêt
        Car_Stop();
        matrix_display(STOP01);  //afficher l'image d'arrêt
        break;
  }
}

/**************Fonction du panneau de points**************/
//cette fonction est utilisée pour l'affichage du panneau de points
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();
  IIC_send(0xc0);  //Choisir l'adresse
  
  for(int i = 0;i < 16;i++) //les données du motif ont 16 bits
  {
     IIC_send(matrix_value[i]); //données pour transmettre les motifs
  }
  IIC_end();   //terminer la transmission du motif de données
  
  IIC_start();
  IIC_send(0x8A);  //contrôle d'affichage, définir la largeur d'impulsion à 4/16
  IIC_end();
}
//La condition pour commencer la transmission de données
void IIC_start()
{
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
}
//transmettre les données
void IIC_send(unsigned char send_data)
{
  for(char i = 0;i < 8;i++)  //Chaque octet a 8 bits
  {
      digitalWrite(SCL_Pin,LOW);  //abaisser la broche d'horloge SCL_Pin pour modifier les signaux de SDA    
delayMicroseconds(3);
      if(send_data & 0x01)  //définir le niveau haut et bas de SDA_Pin selon le 1 ou 0 de chaque bit
      {
        digitalWrite(SDA_Pin,HIGH);
      }
      else
      {
        digitalWrite(SDA_Pin,LOW);
      }
      delayMicroseconds(3);
      digitalWrite(SCL_Pin,HIGH); //relever la broche d'horloge SCL_Pin pour arrêter la transmission de données
      delayMicroseconds(3);
      send_data = send_data >> 1;  //Détecter bit par bit, donc décaler les données vers la droite d'un
  }
}
//Le signe que la transmission de données est terminée
void IIC_end()
{
  digitalWrite(SCL_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);
}
/*************la fonction pour faire fonctionner le moteur**************/
void Car_front()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,200);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,200);
}
void Car_back()
{
  digitalWrite(MR_Ctrl,HIGH);
  analogWrite(MR_PWM,200);
  digitalWrite(ML_Ctrl,HIGH);
  analogWrite(ML_PWM,200);
}
void Car_left()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,255);
  digitalWrite(ML_Ctrl,HIGH);
  analogWrite(ML_PWM,255);
}
void Car_right()
{
  digitalWrite(MR_Ctrl,HIGH);
  analogWrite(MR_PWM,255);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,255);
}
void Car_Stop()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,0);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,0);
}
void Car_T_left()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,255);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,180);
}
void Car_T_right()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,180);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,255);
}
  //****************************************************************

Résultat du Test

Après avoir téléchargé le code avec succès, réglez le commutateur DIP à l’extrémité droite et mettez sous tension. Après la connexion Bluetooth, vous pouvez contrôler la voiture intelligente pour se déplacer via l’application Bluetooth.

Appuyez sur , le robot tank avance ;

cliquez sur , la voiture intelligente recule ;

appuyez sur le bouton , le robot tank tourne à gauche ; cliquez sur , le robot tourne à droite ;

maintenez , il s’arrête.

Cliquez sur pour activer le contrôle gravitationnel, appuyez sur à nouveau pour désactiver le contrôle gravitationnel. En même temps, le panneau LED 8X16 sur la voiture robot affiche le motif correspondant.