Hallo!
Ich hab vor kurzem einen Arduino Uno bekommen. Dazu hab ich mir bei www.physicalcomputing.at ein Roboter Chassis http://www.physicalcomputing.at/shop/article_ROB-00100/Roboter-Chassis.html?shop_param=cid%3D23%26aid%3DROB-00100%26, einen Motor Treiber http://www.physicalcomputing.at/shop/article_A-1123300/DC-Motor-Treiber-1A%2C-Dual.html?shop_param=cid%3D10%26aid%3DA-1123300%26 und einen digitalen Sensor http://www.physicalcomputing.at/shop/article_A-1123200/Line-Sensor-Digital.html?shop_param=cid%3D7%26aid%3DA-1123200%26 bestellt.
Den Sensor hab ich ich vorne am Roboter befestigt.
Ich will ein Programm für einen Roboter schreiben der immer geradeaus fährt und wenn ein Hinderniss vor ihm ist soll er zurückfahren und dann eine Linkskurve machen.
Mein Problem ist jetzt, dass wenn ich den Roboter einschalte und er ein Hinderniss erkennt, fährt er zurück und dann nach links aber danach bleibt er einfach stehen und ich muss den Taster wieder erneut drücken und dann beginnt das Ganze von vorne.
Was ist mein Fehler?
Ich bin für jede Hilfe dankbar!
mfg
Michael K.
#define ON 1
#define OFF 0
const int pwmA_rechts=10; //rechter Motor
const int pwmB_links=11; //linker Motoer
const int AIN1=2; //AIN1,AIN2,BIN1 und BIN2 sind die steuereingänge des Motortreibers ( ob er Vorwährts oder Rückwährts fahren soll)
const int AIN2=3;
const int BIN1=4;
const int BIN2=5;
const int stby=7;
const int power_button=8;
boolean button_state=0;
boolean robo_state=0;
int led_pin=13;
const int speed_pin=0;
int robo_speed;
const int robo_speed_min=100; //minimalste Geschwindikeit
const int sensor_pin=9;
int sensor_value;
int readSensor();
int readSensor() //Unterprogramm zum Auslesen des Sensors;
{ //Quelle: http://physicalcomputingaustria.blogspot.co.at/search?updated-min=2012-01-01T00:00:00-08:00&updated-max=2013-01-01T00:00:00-08:00&max-results=1
long time; //auf der Website heißst das Unterprogramm "readqd1()"
int diff;
pinMode(sensor_pin,OUTPUT);
digitalWrite(sensor_pin,OUTPUT);
delayMicroseconds(10);
pinMode(sensor_pin,INPUT);
time=micros();
while(digitalRead(sensor_pin) == HIGH && micros()-time < 3000);
diff = micros() - time;
return diff;
}
void setup()
{
Serial.begin(9600);
pinMode(pwmA_rechts,OUTPUT);
pinMode(pwmB_links,OUTPUT);
pinMode(AIN1,OUTPUT);
pinMode(AIN2,OUTPUT);
pinMode(BIN1,OUTPUT);
pinMode(BIN2,OUTPUT);
pinMode(stby,OUTPUT);
pinMode(power_button,INPUT);
pinMode(led_pin,OUTPUT);
digitalWrite(led_pin,LOW);
digitalWrite(stby,HIGH); //standby pin muss 1 seins damit die Motoren aktiv sind
}
void loop()
{
sensor_value=readSensor();
Serial.print("sensor_value: ");
Serial.println(sensor_value);
robo_speed=analogRead(speed_pin)/4; //die Geschwindigkeit kann mit einem Potentiometer eingestellt werden
if(robo_speed<robo_speed_min) //Überprüfung ob das Eingangssignal kleiner ist als die minimalste erlaubte Geschwindikeit
robo_speed=robo_speed_min;
Serial.print("robo_speed: ");
Serial.println(robo_speed);
button_state=digitalRead(power_button); //Taster zum Einschalten wird ausgelesen
if((button_state==HIGH)&&(robo_state==OFF)) //Überprüfung ob der Roboter eingeschalten ist oder ausgeschalten
robo_state=ON;
else if((button_state==HIGH)&&(robo_state==ON))
robo_state=OFF;
delay(2);
if(robo_state==ON)
{
digitalWrite(led_pin,HIGH); //Roboter soll am Anfang nur geradeaus fahren
digitalWrite(AIN1,HIGH);
digitalWrite(AIN2,LOW);
analogWrite(pwmA_rechts,robo_speed);
digitalWrite(BIN1,HIGH);
digitalWrite(BIN2,LOW);
analogWrite(pwmB_links,robo_speed);
if(sensor_value<=1000) //wenn ein Hinderniss kommt, soll er zurück fahren und dann eine Linkskurve fahren
{
digitalWrite(AIN1,LOW);
digitalWrite(AIN2,HIGH);
analogWrite(pwmA_rechts,robo_speed);
digitalWrite(BIN1,LOW);
digitalWrite(BIN2,HIGH);
analogWrite(pwmB_links,robo_speed);
delay(1000);
digitalWrite(AIN1,HIGH);
digitalWrite(AIN2,LOW);
analogWrite(pwmA_rechts,robo_speed);
digitalWrite(BIN1,HIGH);
digitalWrite(BIN2,LOW);
analogWrite(pwmB_links,OFF);
delay(500);
}
}
else if(robo_state==OFF)
analogWrite(pwmA_rechts,OFF);
analogWrite(pwmB_links,OFF);
digitalWrite(led_pin,LOW);
}