Da jeder T1 andere Toleranzen hat, wird mit einem Programm zum Bestimmen der Lenkwinkel begonnen. Die Grundlagen der Ansteuerung eines Servos sollten bekannt sein (siehe T1-Remote -> Schritt 2 -> Einen Servo anschließen und in Betrieb nehmen).

#include <ESP32Servo.h>

Servo lenkungServo;

#define Lenkwinkel 90

void setup() 
{
  //Den Servo für den ESP32 bereit machen                        
  lenkungServo.setPeriodHertz(50);
  lenkungServo.attach(14, 500, 2500);
}

void loop() 
{
  lenkungServo.write(Lenkwinkel); //Die Textersetzung "Lenkwinkel" kann genutzt werden, um die Winkel für die Geradeausfahrt, den linken Anschlag und rechten Anschlag zu bestimmen.
  delay(1000);
}


Nach Bestimmen der Winkel für

  • Geradeaus
  • maximal Links
  • maximal Rechts

muss sich nun mit den empfangenen Daten aus der App beschäftigt werden. Die App übermittelt die Daten in einem festen Muster:

<Fahrtrichtung>;<Lenkung0><Lenkung1><Lenkung2>

wobei Fahrtrichtung folgende Werte annehmen kann:

  • 0 - Stillstand
  • 1 - Vorwärts
  • 2 - Rückwärts

Die Lenkung kann wiederum Werte von 0 bis 100 annehmen. 0 entspricht hier 100 % Links, 50 der Geradeausfahrt und 100 100 % rechts.

Um nun die Werte der App auf die Lenkwinkel des Servos anzupassen, bietet Arduino die "map" Funktion. Sie interpoliert die eingegeben Werte auf den gewünschten Bereich. Der Aufruf der Funktion erfolgt wie folgt:

map(<Variable>, <minEigabe>, <maxEingabe>, <minAusgabe>, <maxAusgabe>)


Nun fehlt noch das Empfangen der Bluetooth Daten aus der App auf den ESP32.

Wie beim Servo muss hier auch erst wieder eine Instanz der Klasse Servo erzeugt werden. Anschließend muss in "setup()" der Connection ein Name gegeben werden (diesen sieht man dann bei den verbundenen Geräten). Jetzt ist der ESP32 bereit für eine Verbindung.

Das Einlesen der Daten erfolgt in der "loop()" Funktion. Sobald Daten von der App gesendet werden, gibt "SerialBT.available()" ein "true" zurück und das Einlesen der Daten beginnt. Da bei einer seriellen Verbindung jeder Buchstabe einzeln übertragen wird, muss der String der empfangenen Buchstaben Stück für Stück zusammengesetzt werden. Dies geschieht in der "while" Schleife.

Nach der Schleife ist der String bekannt, welcher kurz zuvor vom Smartphone gesendet wurde.

#include <BluetoothSerial.h>
#include <ESP32Servo.h>   //Laden der beiden Bibliotheken

BluetoothSerial SerialBT; //Erzeugen der Instanz SerialBT
Servo lenkungServo; //Erzeugen der Instanz lenkungServo


void setup() { //BT Connection starten SerialBT.begin("T1Xplorer22"); //Starten der BT-Verbindung //DEn Servo für den ESP32 bereit machen lenkungServo.setPeriodHertz(50); lenkungServo.attach(14, 500, 2500); //Die beiden Pins für die Antriebsteuerung setzen pinMode(12, OUTPUT); pinMode(13, OUTPUT); } void loop() { //Wenn an der BT Connection Daten anliegen if(SerialBT.available()) { String empfangen = ""; //Die ankommenden Daten einlesen, bis alles da ist while(SerialBT.available()) { empfangen += (char)SerialBT.read(); //Daten Einlesen delay(3); } //Der erste Char gibt auskunft über die Richtung des Motors String hilf = (String) empfangen.charAt(0); int richtung = hilf.toInt(); /* * 0 = Still * 1 = Vorwärts * 2 = Rückwärts */ //Entsprechend der Definition der Daten die Pins schalten if(richtung == 0) { digitalWrite(12, LOW); //Der L298N ist eine Doppel H-Brücke, er kann somit also auch die Spannung drehen (vorwärts / rückwärts). Daher sind 2 Pins zum Schalten notwendig. digitalWrite(13, LOW); } else if(richtung == 1) { digitalWrite(12, HIGH); digitalWrite(13, LOW); } else if(richtung == 2) { digitalWrite(12, HIGH); digitalWrite(13, HIGH); }
     //Die ersten beiden Char enfernen (<richtung> und <;>)
     empfangen.remove(0,2);
     //Der übrige String gibt nun Auskunft über den Lenkwinkel
     int lenkung = empfangen.toInt();

     //Entsprechend der Definition der Daten die den Servo setzen
     if(lenkung == 50)
     {
      lenkungServo.write(90);
     }
     else if((lenkung > 50) && (lenkung < 100))
     {
      lenkungServo.write((map(lenkung, 51, 100, 89, 55)));//Nutzen der Map Funktion zum Interpolieren der Lenkwinkel
     }
     else if((lenkung < 50) && (lenkung > 0))
     {
      lenkungServo.write((map(lenkung, 0, 49, 125, 91)));
     }
  }
  delay(10); //Die App sendet nur alle 50 ms, daher kann hier kurz Pause gemacht werden
}


































Last modified: Monday, 5 February 2024, 2:19 PM