Projekt 15: Vollständiges funktionsfähiges Projekt
Testcode
/*
keyestudio Mini Tank Robot V2.1
Lektion 15
Bluetooth-Panzer
http://www.keyestudio.com
*/
//Array, wird verwendet, um die Daten des Musters zu speichern, kann selbst berechnet oder mit dem Modulus-Tool erhalten werden
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 //Taktsignal-Pin auf A5 setzen
#define SDA_Pin A4 //Daten-Pin auf A4 setzen
#define ML_Ctrl 13 //Richtungssteuerungs-Pin des linken Motors definieren
#define ML_PWM 11 //PWM-Steuerungs-Pin des linken Motors definieren
#define MR_Ctrl 12 //Richtungssteuerungs-Pin des rechten Motors definieren
#define MR_PWM 3 //PWM-Steuerungs-Pin des rechten Motors definieren
char bluetooth_val; //Wert des Bluetooth-Empfangs speichern
void setup()
{
Serial.begin(9600);
pinMode(SCL_Pin,OUTPUT);
pinMode(SDA_Pin,OUTPUT);
matrix_display(clear); //Display löschen
matrix_display(start01); //Startmuster anzeigen
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': //Vorwärts-Befehl
Car_front();
matrix_display(front); //Vorwärts-Design anzeigen
break;
case 'B': //Rückwärts-Befehl
Car_back();
matrix_display(back); //Rückwärts-Muster anzeigen
break;
case 'L': //Linksabbiege-Befehl
Car_left();
matrix_display(left); //Zeichen „Linksabbiegen" anzeigen
break;
case 'R': //Rechtsabbiege-Befehl
Car_right();
matrix_display(right); //Zeichen „Rechtsabbiegen" anzeigen
break;
case 'S': //Stopp-Befehl
Car_Stop();
matrix_display(STOP01); //Stoppbild anzeigen
break;
}
}
/**************Die Funktion der Dot-Matrix****************/
//Diese Funktion wird für die Dot-Matrix-Anzeige verwendet
void matrix_display(unsigned char matrix_value[])
{
IIC_start();
IIC_send(0xc0); //Adresse wählen
for(int i = 0;i < 16;i++) //Musterdaten haben 16 Bits
{
IIC_send(matrix_value[i]); //Daten zur Übertragung von Mustern
}
IIC_end(); //Beendigung der Musterübertragung
IIC_start();
IIC_send(0x8A); //Anzeigesteuerung, Impulsbreite auf 4/16 setzen
IIC_end();
}
//Die Bedingung zum Starten der Datenübertragung
void IIC_start()
{
digitalWrite(SCL_Pin,HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin,HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin,LOW);
delayMicroseconds(3);
}
//Daten übertragen
void IIC_send(unsigned char send_data)
{
for(char i = 0;i < 8;i++) //Jedes Byte hat 8 Bits
{
digitalWrite(SCL_Pin,LOW); //Taktsignal-Pin SCL herunterziehen, um die Signale von SDA zu ändern
delayMicroseconds(3);
if(send_data & 0x01) //Hohe und niedrige Pegel von SDA_Pin gemäß 1 oder 0 jedes Bits setzen
{
digitalWrite(SDA_Pin,HIGH);
}
else
{
digitalWrite(SDA_Pin,LOW);
}
delayMicroseconds(3);
digitalWrite(SCL_Pin,HIGH); //Taktsignal-Pin SCL hochziehen, um die Datenübertragung zu stoppen
delayMicroseconds(3);
send_data = send_data >> 1; //Bit für Bit erkennen, daher die Daten um eins nach rechts verschieben
}
}
//Das Zeichen, dass die Datenübertragung endet
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);
}
/*************Die Funktion zum Ausführen des Motors**************/
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);
}
Testergebnis
Hinweis: Entfernen Sie das Bluetooth-Modul vor dem Hochladen des Testcodes. Andernfalls können Sie den Testcode nicht hochladen. Verbinden Sie das Bluetooth-Modul nach dem Hochladen des Testcodes wieder.
Laden Sie den Testcode erfolgreich hoch, setzen Sie das Bluetooth-Modul ein, schalten Sie die Stromversorgung ein und verbinden Sie sich mit Bluetooth. Der Panzerroboter kann mit der App unterschiedliche Funktionen anzeigen.
Alles klar, alle Projekte sind abgeschlossen. Bitte kontaktieren Sie uns gerne, wenn Sie auf Probleme stoßen.