Hallo zusammen,
Ich baue einen kleinen Roboter für einen Schul-Wettbewerb. Das Ziel des Wettbewerbes ist, dass man Ping-Pong-Bälle aufsammelt in einem Feld von 2.5 m auf 2.5 m. Das Aufsammeln ist kein Problem und wird auch nicht vom Roboter gesteuert. Das Problem ist das Richtige Ansteuern der Motoren.
Ich habe die folgenden Materialien benutzt:
Arduino Uno
Arduino Motor Shield 3r
HC-SR04 Ultraschallsensor
2 Brushless Motoren mit je einem esc und je einem Akku
Informationen zum Code:
Der Roboter initialisiert zuerst alles, und dann startet er mit einer Speed-Runde: Das bedeutet, dass er 4 mal eine Kurve machen sollte, und dann in die Mitte des Feldes fahren sollte.
Dann sollte er mit einem Slalom beginnen:
Er fährt zur gegenüberliegenden Wand und dreht sich und fährt auf der nächsten Linie wieder zurück.
Das alles sollte er mit einem unbeweglichem Ultraschallsensor vollbringen.
Ich habe jetzt jedoch 3 Probleme:
- Ich kann die Kurven nicht zählen, da er mehrmals in einer Kurve messen wird und die Motoren mehrmals gleich ansteuert, wodurch ich keine Variabel einsetzen kann.
- Der Ultraschallsensor reagiert nicht
- WIe kann ich die Kurven so gestalten, damit er nach einer Kurve wieder geradeaus fährt?
Hier ist mein Code.
Ich weiss, dass er total verwirrend ist, aber bitte schaut ihn euch mal an, wahrscheinlich ist es einfach ein Anfängerfehler.
#include <Servo.h>
// Definiere Servos
Servo rechts;
Servo links;
// Definiere Pins
const int pingPin = 10;
const int inPin = 7;
// Initialisiere Variabeln
long duration = 100;
long cm; //Sensor-Wert
int gfahr = 1350; //Geschwindigkeit nach vorn
int gdrehen = 500; // Geschwindigkeit für die Drehung, falls zu nah an der Wand
int gkurve = 900; // Geschwindigkeit für das 2. Rad bei der langsamen kurve
int gzurueck = 0;
int arm = 100;
int k = 0; // k ist die Variable, die für das Zahlen der Kurve genommen wird
int h = 0; // h wird benötigt, um in die Mitte zu fahren
int a = 0; // a wird ebenfalls für den übergang von der Mitte zum Slalom benötigt
// Definiere FUNKTIONEN:
int fahr();
int fahrrechts();
int drehen();
int fahrzurmitte(); // Damit fährt er nach seiner schnellen Runde durch die mitte, und fährt dann in einem Slalom-Muster über das ganze Spielfeld
int slalom(); //Der Slalom wird zum Schluss initialisiert und läuft bis zum Ende des Matches
// Setup das wird nur einmal ausgeführt:
void setup()
{
// Kombiniere Servos mit den zugehörenden PINS
rechts.attach( 3 ); // hier werden die PINS den servos zugewiesen
links.attach( 11 );
// Definiere inpin und pingpin für den Sensor
pinMode( inPin, INPUT );
pinMode( pingPin, OUTPUT );
digitalWrite( pingPin, LOW );
}
// Programm main
void loop()
{
digitalWrite(pingPin, HIGH); // Hier misst der Sensor den Abstand zur vorderen Wand
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
duration = pulseIn(inPin, HIGH);
cm = microsecondsToCentimeters(duration); //und gibt sie als die Variabel cm heraus
if (cm >=150) // Hier wird der Abstand so definiert, damit sich der Roboter vollständig dreht und nicht nur immer an die Wand schaut
{
fahr();
}
else if (cm < 60 && cm > 35)
{
fahrrechts();
k ++;
}
else if (cm <= 35)
{
drehen();
}
if( k == 4 ) // wenn dieses k jetzt auf eine gewisse Zahl aufgezählt hat, dann hat der Roboter die speed-Runde abgeschlossen und macht die langsameren Runden
{
fahrzurmitte();
if ( a > 0)
{
slalom();
}
}
}
int microsecondsToCentimeters(int microseconds)
{
return microseconds / 60;
}
int fahr()
{
rechts.write( 50); //hier wird der Motor für die Geradeaus-Phase gesetzt
delayMicroseconds(gfahr);
rechts.write(LOW);
links.write(50);
delayMicroseconds(gfahr);
links.write(LOW);
delay(20);
}
int fahrrechts()
{
rechts.write(50);
delayMicroseconds(gfahr);
rechts.write(LOW);
links.write(50);
delayMicroseconds(gkurve);
links.write(LOW);
delay(20);
}
int drehen()
{
rechts.write(50);
delayMicroseconds(gdrehen);
rechts.write(LOW);
links.write(50);
delayMicroseconds(gzurueck);
links.write(LOW);
delay(20);
}
int fahrzurmitte()
{
if ( cm < 200) // wenn der Roboter in der Mitte ist, dann dreht er sich bis er (fast) zur Mitte schaut
{
rechts.write(50);
delayMicroseconds(gdrehen);
rechts.write(LOW);
links.write(50);
delayMicroseconds(gzurueck);
links.write(LOW);
delay(20);
}
else if ( cm > 200) // sobald er soweit ist, fährt er durch die Mitte hindurch bis zur anderen Wand
{
fahr();
h ++; // dann wird h heraufgezählt
}
if (h > 0 && cm >20)
{
fahr();
}
else if (cm <= 20 && a == 0) // mit dieser Programmierung fährt der Roboter zur anderen Wand und kehrt dort ab
{
drehen();
if (cm >= 50)
{
a ++; // a wir höher als 0 gesetzt
}
}
}
int slalom()
{
if (cm >= 20)
{
fahr;
}
else if ( cm <=20)
{
drehen();
delay(500);
}
}