Projekt 12 Ultraschall-Verfolgungspanzer

Beschreibung

In Projekt 11 haben wir ein Hindernisvermeidungsauto gebaut. Tatsächlich müssen wir nur den Testcode ändern, um ein Hindernisvermeidungsauto in ein Verfolgungsauto umzuwandeln. In dieser Lektion werden wir einen Ultraschall-Verfolgungsroboter bauen. Der Ultraschallsensor erkennt den Abstand zwischen dem intelligenten Auto und dem Hindernis, um den Panzerwagen zu bewegen.

Die spezifische Logik des Ultraschall-Verfolgungsroboters ist wie folgt dargestellt:

Erkennung

Gemessener Abstand zu vorderen Hindernissen

Abstand (Einheit: cm)

Einstellungen

Servo-Winkel 90°

8X16 LED-Panel zeigt das Symbol “V”

Wenn

20≤ Abstand ≤60

Status

Vorwärts fahren (PWM auf 200 setzen)

Wenn

10<Abstand<20

Abstand>60

Status

Stopp

Wenn

Abstand ≤10

Status

Stopp (PWM auf 200 setzen)

Ablaufdiagramm

Schaltplan

Verkabelungshinweis:

1.8x16 LED-Panel

V5 Sensor Shield

GND

-(GND)

VCC

+(VCC)

SDA

SDA

SCL

SCL

Testcode

 /*
 keyestudio Mini Tank Robot V2.1
 Lektion 12
 Ultraschall-Verfolgungspanzer
 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  // Richtungssteuer-Pin des linken Motors definieren
#define ML_PWM 11   // PWM-Steuer-Pin des linken Motors definieren
#define MR_Ctrl 12  // Richtungssteuer-Pin des rechten Motors definieren
#define MR_PWM 3   // PWM-Steuer-Pin des rechten Motors definieren
#define Trig 5  // Ultraschall-Trig-Pin
#define Echo 4  // Ultraschall-Echo-Pin
int distance;
int pulsewidth;
#define servoPin 9  // Servo-Pin
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(servoPin, OUTPUT);
  procedure(90); // Servo auf 90° setzen
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  pinMode(ML_Ctrl, OUTPUT);
  pinMode(ML_PWM, OUTPUT);
  pinMode(MR_Ctrl, OUTPUT);
  pinMode(MR_PWM, OUTPUT);
}
void loop(){
  distance = checkdistance();  // Den vom Ultraschallsensor erkannten Abstand der Variablen distance zuweisen
  if (distance >= 20 && distance <= 60) // Bereich zum Vorwärtsfahren
  {
    Car_front();
  }
  else if (distance > 10 && distance < 20)  // Bereich zum Stoppen
  {
    Car_Stop();
  }
  else if (distance <= 10)  // Bereich zum Rückwärtsfahren
  {
    Car_back();
  }
  else  // Andere Situationen, stoppen
  {
    Car_Stop();
  }
}
/***********Funktion für Motorlauf****************/
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,200);
  digitalWrite(ML_Ctrl,HIGH);
  analogWrite(ML_PWM,200);
}
void Car_right()
{
  digitalWrite(MR_Ctrl,HIGH);
  analogWrite(MR_PWM,200);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,200);
}
void Car_Stop()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,0);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,0);
}

/******************Punktmatrix********************/
// Funktion für Punktmatrix-Anzeige
void matrix_display(unsigned char matrix_value[])
{
  IIC_start(); // Funktion aufrufen, die die Datenübertragung startet
  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();   // Datenübertragung beenden
  
  IIC_start();
  IIC_send(0x8A);  // Pulsbreite 4/16 wählen, Anzeige steuern
  IIC_end();
}

// 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
  }
}
// Zeichen für das Ende der Datenübertragung
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);
}
/***************Ende Punktmatrix-Anzeige******************/
// Funktion zur Servo-Steuerung
void procedure(int myangle) {
  for (int i = 0; i <= 50; i = i + (1)) {
    pulsewidth = myangle * 11 + 500;
    digitalWrite(servoPin,HIGH);
    delayMicroseconds(pulsewidth);
    digitalWrite(servoPin,LOW);
    delay((20 - pulsewidth / 1000));
  }}
// Funktion zur Steuerung der Ultraschallsensorfunktion, die das Ultraschallsignal steuert
float checkdistance() {
  digitalWrite(Trig, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);
  float distance = pulseIn(Echo, HIGH) / 58.20;  // 58.20, das heißt, 2*29.1=58.2
  delay(10);
  return distance;
}
//****************************************************************

Testergebnis

Code erfolgreich hochgeladen, DIP-Schalter ist auf das rechte Ende gestellt, das Servo dreht sich auf 90°, “V” wird auf dem 8X16 LED-Panel angezeigt und das intelligente Auto bewegt sich mit dem Hindernis.