Projet 15 : Projet Final Entièrement Fonctionnel
Code de Test
/*
keyestudio Mini Tank Robot V2.1
leçon 15
réservoir 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 sur A5
#define SDA_Pin A4 //Définir la broche de données sur 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; //sauvegarder la valeur de la réception 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': // instruction de virage à gauche
Car_left();
matrix_display(left); //afficher le signe de virage à gauche
break;
case 'R': //instruction 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;
}
}
/**************La fonction de la matrice de points****************/
//cette fonction est utilisée pour l'affichage de la matrice 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 sur 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 se termine
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
Remarque : Retirez le module Bluetooth avant de télécharger le code de test. Sinon, vous échouerez à télécharger le code de test. Reconnectez le module Bluetooth après le téléchargement du code de test.
Téléchargez le code de test avec succès, insérez le module Bluetooth, allumez l’appareil et connectez-vous à Bluetooth. Le robot réservoir peut afficher des fonctions distinctes via l’application.
Très bien, tous les projets sont terminés. N’hésitez pas à nous contacter si vous rencontrez des problèmes.