ich habe den code ein wenig entrümpelt, nochmals alles überprüft und die hindernis variablenwerte angepasst, es funktioniert jetzt auch mit der funktion "hindernis_vorh()"...
video
- perfekt ist es noch nicht, aber prinzipiell ok. Eine drehung nach rechts funktioniert wegen der lage des US-sensors nicht so gut, muss noch angepasst werden...
- da wo der einer robby am hindernis hängen bleibt, da sind die radwellen ein paar milimeter zu lang 
- auch habe ich überlegt ob es möglich wäre beim schräg angefahrenem hindernis entsprechend "drehe links" beim hindernis auf der rechten seite und "drehe rechts" beim hindernis links zu reagieren. Der entsprechende lösungsansatz fehlt mir aber noch. Hat jemand eine idee?
Code:
#include <CustomStepper.h>
#include <NewPing.h>
#include <Wire.h>
#define TRIGGER_PIN 6
#define ECHO_PIN 7
#define MAX_DISTANCE 400
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
uint8_t idx;
uint16_t distanz;
uint16_t uS;
uint8_t zitter;
enum stepper_e
{ stepper_HM, stepper_VR, stepper_VL, stepper_MAX };
CustomStepper stepper[stepper_MAX]
{
CustomStepper(35, 37, 39, 41),//stepper_HM-I
CustomStepper(23, 25, 27, 29),//stepper_VR-II
CustomStepper(47, 49, 51, 53) //stepper_VL-III
};
boolean start_ping;
boolean hindernis;
void setup()
{
start_ping = false;
hindernis = false;
zitter = 1;
Serial.begin(115200);
Serial1.begin(115200);
}
void loop()
{
hindernis_vorh();
{
vorwaerts();
fahrt_ausfuehren();
}
}
/***********************************************************/
void hindernis_vorh(void)
{
if (start_ping == false) ping_distanz();
if (uS != NO_ECHO)
{
if (((uS / US_ROUNDTRIP_CM) <= 20))
hindernis = true;
}
else
{
hindernis = false;
}
}
/***********************************************************/
void ping_distanz(void)
{
uS = sonar.ping();
Serial1.print("Ping: ");
Serial1.print(uS / US_ROUNDTRIP_CM);
Serial1.println(" cm");
Serial.print("Ping: ");
Serial.print(uS / US_ROUNDTRIP_CM);
Serial.println(" cm");
start_ping = true;
}
/***********************************************************/
void vorwaerts()
{
if (start_ping == true) ping_distanz();
if (hindernis == true)
{
hindernis = false;
//richtung_HM();
zitter_li_re();
fahrt_ausfuehren();
//entspricht rotate_left_deg
for (idx = stepper_HM; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CW);
stepper[idx].rotateDegrees(120);
}
fahrt_ausfuehren();
hindernis = false;
}
else
hindernis = false;
{
zitter_li_re();
fahrt_ausfuehren();
}
fahrt_ausfuehren();
}
/***********************************************************/
void zitter_li_re()
{
stepper[stepper_HM].setRPM(12);
stepper[stepper_VR].setRPM(12);
stepper[stepper_VL].setRPM(12);
stepper[stepper_HM].setSPR(4075.7728395);
stepper[stepper_VR].setSPR(4075.7728395);
stepper[stepper_VL].setSPR(4075.7728395);
stepper[stepper_VL].setDirection(CCW);
stepper[stepper_VL].rotateDegrees(30);
stepper[stepper_VR].setDirection(CW);
stepper[stepper_VR].rotateDegrees(30);https://youtu.be/JWn1sAYkfhc
if (zitter == 1)
{
stepper[stepper_HM].setDirection(CCW);
stepper[stepper_HM].rotateDegrees(25);//individuell anpassen
zitter = 0;
}
else
{
stepper[stepper_HM].setDirection(CW);
stepper[stepper_HM].rotateDegrees(25);//individuell anpassen
zitter = 1;
}
}
/***********************************************************/
void richtung_HM()
{
stepper[stepper_HM].setRPM(12);
stepper[stepper_VR].setRPM(12);
stepper[stepper_VL].setRPM(12);
stepper[stepper_HM].setSPR(4075.7728395);
stepper[stepper_VR].setSPR(4075.7728395);
stepper[stepper_VL].setSPR(4075.7728395);
stepper[stepper_VL].setDirection(CW);
stepper[stepper_VL].rotateDegrees(60);
stepper[stepper_VR].setDirection(CCW);
stepper[stepper_VR].rotateDegrees(60);
}
/***********************************************************/
boolean fahrt_fertig()
{
return stepper[stepper_HM].isDone() && stepper[stepper_VR].isDone()
&& stepper[stepper_VL].isDone();
}
/************************************************************/
void fahrt_ausfuehren()
{
while ( ! fahrt_fertig() )
{
for (idx = stepper_HM; idx < stepper_MAX; idx++)
{
stepper[idx].run();
// delay(1);
}
}
}
Lesezeichen