Die For Schleifen habe ich nur zum Rampen von 0 auf 255 und zurück genutzt.
Man kann natürlich auch vor dem Aufruf feste Werte eingeben.
Wenn man keinen Entscheidungsbaum hat kann man ein festes Fahrprogramm mit delay() schreiben (wodurch man aber nichts anderes merh machen kann).
Üblicherweise würde man (nicht bei Deinem Balancer) Bumper auswerten für STOP und dann auswerten welcher Bumper ausgelöst wurde und entsprechend eine gewisse Strecke oder Zeit nach hinten fahren und dann auf der Stelle drehen um die Ausrichtung weg vom Hinderniss zu verändern.
Bei den Fernsensoren würde man z.B.:
bei einem Hinderniss vorne Rechts mit Abstand < 10cm den Linken Motor auf 50 drosseln und den rechts auf 230 lassen. (231 bis 255 sind Regelreserve).
Bei einem Hinderniss vorne Rechts mit Abstand < 20cm den Linken Motor auf 90 drosseln und den rechts auf 230 lassen.
Bei einem Hinderniss vorne Rechts mit Abstand < 30cm den Linken Motor auf 130 drosseln und den rechts auf 230 lassen.
Bei einem Hinderniss vorne Rechts mit Abstand < 40cm den Linken Motor auf 170 drosseln und den rechts auf 230 lassen.
Bei einem Hinderniss vorne Rechts mit Abstand < 50cm den Linken Motor auf 200 drosseln und den rechts auf 230 lassen.
Bei einem Hinderniss vorne Rechts mit Abstand >= 50cm den Linken Motor auf 230 lassen und den rechts auf 230 lassen.
Das selbe noch für links und man hat ein relativ flüssiges Fahren, bei dem der Roboter Annäherungen unter 50cm an erkannte Hindernisse versucht zu vermeiden und bei Unterschreitung immer stärker gegenlenkt ohne zu langsam zu werden.
Delay() sollte man im fertigen Program vermeiden.
An dem Rechner hier habe ich keine Arduino IDE, der Code ist rein im Notepad geschrieben, ich kann also nicht sicher sagen ob er fehlerfrei ist.
Er sollte die Buildin LED blinken lassen und 1 Sekunde vorwärts fahen mit blinkender LED.
Dann 1 Sekunde rückwärts fahren mit delay(), wodurch die LED nicht blinken kann.
Dann 1 Sekunde auf der Stelle rechts drehen mit blinkender LED und 1 Sekunde ein enge Kurve nach links fahren mit delay(), wodurch die LED wieder nicht blinken kann.
Code:
/*
PWM Pins
Nano: 3; 5; 6; 9; 10; 11
Uno: 3; 5; 6; 9; 10; 11
Due: 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13
Mega 2560: 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13
*/
int IN1 = 9;
int IN2 = 8;
int IN3 = 7;
int IN4 = 6;
int speedl1;
int speedl2;
int speedr1;
int speedr2;
unsigned long prev1micros = 0;
const long waittime1 = 1000;
int togglestate1 = LOW;
unsigned long prev2micros = 0;
const long waittime2 = 100;
int togglestate2 = LOW;
void setup()
{
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
//Blinken der Build in LED
unsigned long cur2micros = millis();
if (cur2micros - prev2micros >= waittime2) {
prev2micros = cur2micros;
if (togglestate2 == LOW){
togglestate2 = HIGH;
digitalWrite(LED_BUILTIN, HIGH);
}else{
togglestate2 = LOW;
digitalWrite(LED_BUILTIN, LOW);
}
}
// Warten ohne delay
unsigned long cur1micros = millis();
if (togglestate1 == LOW){
if (cur1micros - prev1micros >= waittime1) {
prev1micros = cur1micros;
// rückwärts mit delay
speedl1 = 0;
speedl2 = 200;
speedr1 = 0;
speedr2 = 200;
PWMDrive(speedl1, speedl2, speedr1, speedr2);
delay(1000);
togglestate1 = HIGH;
}else{
// vorwärts ohne Delay (LED Blinkt)
speedl1 = 200;
speedl2 = 0;
speedr1 = 200;
speedr2 = 0;
PWMDrive(speedl1, speedl2, speedr1, speedr2);
}
}
if (togglestate1 == LOW){
if (cur1micros - prev1micros >= waittime1) {
prev1micros = cur1micros;
// linksrum mit delay
speedl1 = 50;
speedl2 = 0;
speedr1 = 200;
speedr2 = 0;
PWMDrive(speedl1, speedl2, speedr1, speedr2);
delay(1000);
togglestate1 = LOW;
}else{
// Rechts drehen ohne Delay (LED blinkt)
speedl1 = 200;
speedl2 = 0;
speedr1 = 0;
speedr2 = 200;
PWMDrive(speedl1, speedl2, speedr1, speedr2);
}
}
}
void PWMDrive(int speedl1,int speedl2,int speedr1,int speedr2){
analogWrite(IN1, speedl1);
analogWrite(IN2, speedl2);
analogWrite(IN3, speedr1);
analogWrite(IN4, speedr2);
}
Update: Fehler im Code beseitigt.
Lesezeichen