Progetto 15: Progetto Finale Completamente Funzionale
Codice di Test
/*
keyestudio Mini Tank Robot V2.1
lezione 15
serbatoio bluetooth
http://www.keyestudio.com
*/
//Array, utilizzato per memorizzare i dati del modello, può essere calcolato da solo o ottenuto dallo strumento modulo
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 //Impostare il pin dell'orologio su A5
#define SDA_Pin A4 //Impostare il pin dei dati su A4
#define ML_Ctrl 13 //definire il pin di controllo della direzione del motore sinistro
#define ML_PWM 11 //definire il pin di controllo PWM del motore sinistro
#define MR_Ctrl 12 //definire il pin di controllo della direzione del motore destro
#define MR_PWM 3 //definire il pin di controllo PWM del motore destro
char bluetooth_val; //salvare il valore della ricezione Bluetooth
void setup()
{
Serial.begin(9600);
pinMode(SCL_Pin,OUTPUT);
pinMode(SDA_Pin,OUTPUT);
matrix_display(clear); //Cancellare il display
matrix_display(start01); //visualizzare il modello di avvio
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': //comando di avanzamento
Car_front();
matrix_display(front); // mostra il design di avanzamento
break;
case 'B': //comando di retromarcia
Car_back();
matrix_display(back); //mostra il modello di retromarcia
break;
case 'L': // istruzione di svolta a sinistra
Car_left();
matrix_display(left); //mostra il segno di "svolta a sinistra"
break;
case 'R': //istruzione di svolta a destra
Car_right();
matrix_display(right); //visualizza il segno di svolta a destra
break;
case 'S': //comando di arresto
Car_Stop();
matrix_display(STOP01); //mostra l'immagine di arresto
break;
}
}
/**************La funzione della matrice di punti****************/
//questa funzione è utilizzata per la visualizzazione della matrice di punti
void matrix_display(unsigned char matrix_value[])
{
IIC_start();
IIC_send(0xc0); //Scegliere l'indirizzo
for(int i = 0;i < 16;i++) //i dati del modello hanno 16 bit
{
IIC_send(matrix_value[i]); //dati per trasmettere i modelli
}
IIC_end(); //terminare la trasmissione del modello di dati
IIC_start();
IIC_send(0x8A); //controllo del display, impostare la larghezza dell'impulso su 4/16
IIC_end();
}
//La condizione per iniziare la trasmissione dei dati
void IIC_start()
{
digitalWrite(SCL_Pin,HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin,HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin,LOW);
delayMicroseconds(3);
}
//trasmettere i dati
void IIC_send(unsigned char send_data)
{
for(char i = 0;i < 8;i++) //Ogni byte ha 8 bit
{
digitalWrite(SCL_Pin,LOW); //abbassare il pin dell'orologio SCL Pin per cambiare i segnali di SDA
delayMicroseconds(3);
if(send_data & 0x01) //impostare il livello alto e basso di SDA_Pin secondo 1 o 0 di ogni bit
{
digitalWrite(SDA_Pin,HIGH);
}
else
{
digitalWrite(SDA_Pin,LOW);
}
delayMicroseconds(3);
digitalWrite(SCL_Pin,HIGH); //alzare il pin dell'orologio SCL_Pin per interrompere la trasmissione dei dati
delayMicroseconds(3);
send_data = send_data >> 1; // Rilevare bit per bit, quindi spostare i dati a destra di uno
}
}
//Il segno che la trasmissione dei dati è terminata
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 funzione per far funzionare il motore**************/
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);
}
Risultato del Test
Nota: Rimuovere il modulo Bluetooth prima di caricare il codice di test. Altrimenti, non riuscirai a caricare il codice di test. Ricollega il modulo Bluetooth dopo aver caricato il codice di test
Carica il codice di test con successo, inserisci il modulo Bluetooth, accendi e connettiti a Bluetooth. Il robot serbatoio può mostrare funzioni distinte tramite l’App.
Bene, tutti i progetti sono terminati. Non esitare a contattarci se riscontri dei problemi.