Hi botty,

Zitat von
botty
Hallo inka, Dein erstes Problem liegt in
Code:
void alle_stepper_rueckwaerts(void)
{
if (hindernis = true)
im "if" ist eine Zuweisung und kein Vergleich, sprich der Ausdruck ist immer wahr und daher rennt er da immer rein.
zu blöd, dass ich immer wieder über so etwas stolpere 

Zitat von
botty
Dein zweites Problem liegt daran, das du in "rotieren_links()" bzw. "rotieren_rechts()" zwar die
Stepper richtig konfigurierst, dann die Konfiguration aber nicht mit "fahrt_ausfuehren()" durchführen läßt.
........
Du mußt also immer auch Überlegen ob nach Deiner Entscheidungsfindung die
Stepper nicht nur konfiguriert sondern auch ausgeführt werden müssen.
ich dachte dieses " fahrt_ausfuehren();" reicht einmal in der loop? Muss ich dann doch jedes mal nach dem aufruf einer funktion wie z.b. " alle_stepper_vorwaerts();" dieses "fahrt_ausfuehren();" aufrufen?
übrigens, habe ich - einem vorschlag von Rabenauge folgend - die unübersichtlichen if-abfragen durch switch / case ersetzt. Jetzt sieh es so aus, dass ich hindernisse abfragen kann, mit dem mittleren IR-sensor abfragen kann ob der robby auf einer linie ist und per abfrage der Li/Re IR-sensoren entscheiden kann, ob links zu der linienmitte oder rechts rotiert werden soll. Die grenzparameter für alle abfragen der IR Sensoren stimmen noch nicht, da bin ich noch dran...
Code:
// entstanden aus "cruise_avoid_collision_4_2_enum_idx_new_ping"
#include <CustomStepper.h>
#include <NewPing.h>
#define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor. //12
#define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor. //11
#define MAX_DISTANCE 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
uint8_t idx;
uint16_t distanz;
uint16_t uS;
uint8_t bewegung, li_re;
uint8_t Analog_Pin_0 = A0; //analog pin 0
uint8_t Analog_Pin_1 = A1; //analog pin 1
uint8_t Analog_Pin_2 = A2; //analog pin 2
uint8_t IR_Reading_A0; //IR wert analog sensor_0 - links
uint8_t IR_Reading_A1; //IR wert analog sensor_1 - mitte
uint8_t IR_Reading_A2; //IR wert analog sensor_2 - rechts
uint8_t wert_li_A0;
uint8_t basis_A1;
uint8_t wert_re_A2;
enum stepper_e
{ stepper_VL, stepper_HL, stepper_VR, stepper_HR, stepper_MAX };
CustomStepper stepper[stepper_MAX]
{
CustomStepper(23, 25, 27, 29),
CustomStepper(31, 33, 35, 37),
CustomStepper(47, 49, 51, 53),
CustomStepper(46, 48, 50, 52)
};
boolean start_ping;
boolean hindernis;
void setup()
{
start_ping = false;
hindernis = false;
Serial.begin(115200);
Serial1.begin(115200);
Serial.println("setup_ende");
Serial1.println("setup_ende");
}
void loop()
{
hindernis_vorh();
read_IR ();
print_IR();
switch (bewegung)
{
default:
{
alle_stepper_vorwaerts();
if (bewegung == 1)
{
read_IR ();
wert_li_A0 = analogRead(Analog_Pin_0);//links
basis_A1 = analogRead(Analog_Pin_1); //mitte
wert_re_A2 = analogRead(Analog_Pin_2);//rechts
if ((basis_A1 <= 240) && (basis_A1 >= 210)) //auf der linie?
{
if (wert_li_A0 > 1, 5 * (wert_re_A2)) rotieren_links();
else if (wert_re_A2 < 1, 5 * (wert_li_A0)) rotieren_rechts();
}
}
break;
}
}
fahrt_ausfuehren();
}
/***********************************************************/
boolean fahrt_fertig()
{
return stepper[stepper_VL].isDone() && stepper[stepper_HL].isDone()
&& stepper[stepper_VR].isDone() && stepper[stepper_HR].isDone();
}
void fahrt_ausfuehren()
{
while ( ! fahrt_fertig() )
{
for (idx = stepper_VL; idx < stepper_MAX; idx++)
{
stepper[idx].run();
// delay(1);
}
}
}
void ping_distanz(void)
{
//delay(500);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
Serial1.print("Ping: ");
Serial1.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range)
Serial1.println(" cm");
Serial.print("Ping: ");
Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range)
Serial.println(" cm");
start_ping = true;
}
void hindernis_vorh(void)
{
if (start_ping == false) ping_distanz();
if (uS != NO_ECHO)
{
if (((uS / US_ROUNDTRIP_CM) <= 25))
{
hindernis = true;
bewegung = 4;
}
else
{
hindernis = false;
bewegung = 1;
}
}
}
void alle_stepper_stop()
{
// stepper_stop = true;
for (idx = stepper_VL; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(0);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(STOP);
}
}
void alle_stepper_vorwaerts(void)
{
read_IR ();
wert_li_A0 = analogRead(Analog_Pin_0);//links
basis_A1 = (analogRead(Analog_Pin_1) + 20); //mitte
wert_re_A2 = analogRead(Analog_Pin_2);//rechts
if (wert_li_A0 < wert_re_A2) rotieren_links(); //bewegung = 2; //rotiere links
else rotieren_rechts(); //bewegung = 3;//rotiere rechts
if (start_ping == true) ping_distanz();
if (hindernis == true)
{
bewegung = 4;
Serial1.print(hindernis);
Serial1.println(" hindernis - true - alle_stepper_rückwärts - if-abfrage_6");
Serial.print(hindernis);
Serial.println(" hindernis - true - alle_stepper_rückwärts - if-abfrage_6");
hindernis = false;
for (idx = stepper_VL; idx < stepper_MAX; idx++) //alle Stepper rückwärts
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CCW);
stepper[idx].rotateDegrees(60); //rotate(1)
}
}
else
{
hindernis = false;
bewegung = 1;
for (idx = stepper_VL; idx < stepper_MAX; idx++)//alle Stepper vorwärts
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CW);
stepper[idx].rotateDegrees(60);//rotate(1)
}
}
}
void alle_stepper_rueckwaerts(void)
{
for (idx = stepper_VL; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CCW);
stepper[idx].rotateDegrees(60);//rotate(1)
}
}
void rotieren_links(void)
{
Serial1.println("rotiere_links");
Serial.println("rotiere_links");
for (idx = stepper_VL; idx < stepper_VR; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CCW);
stepper[idx].rotateDegrees(30);//rotate(1)
}
for (idx = stepper_VR; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CW);
stepper[idx].rotateDegrees(30);//rotate(1)
}
}
void rotieren_rechts(void)
{
Serial1.println("rotiere_rechts");
Serial.println("rotiere_rechts");
for (idx = stepper_VL; idx < stepper_VR; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CW);
stepper[idx].rotateDegrees(30);//rotate(1)
}
for (idx = stepper_VR; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CCW);
stepper[idx].rotateDegrees(30);//rotate(1)
}
}
void read_IR (void)
{
IR_Reading_A0 = analogRead(Analog_Pin_0);//links
IR_Reading_A1 = analogRead(Analog_Pin_1);//mitte
IR_Reading_A2 = analogRead(Analog_Pin_2);//rechts
}
void print_IR (void)
{
Serial.print("links: ");
Serial1.print("links: ");
Serial.print(IR_Reading_A0);
Serial1.print(IR_Reading_A0);
Serial.print(" mitte: ");
Serial1.print(" mitte: ");
Serial.print(IR_Reading_A1);
Serial1.print(IR_Reading_A1);
Serial.print(" rechts: ");
Serial1.print(" rechts: ");
Serial.println(IR_Reading_A2);
Serial1.println(IR_Reading_A2);
}
Lesezeichen