Selbstfahrendes Auto Code Hilfe

hab ich jetzt ists so
tart...
Abstand Sensor 0: 12
Abstand Sensor 1: 47
Abstand Sensor 0: 12
Abstand Sensor 1: 46
Abstand Sensor 0: 12
Abstand Sensor 1: 45
Abstand Sensor 0: 12
Abstand Sensor 1: 14
Abstand Sensor 0: 12
Abstand Sensor 1: 45
Abstand Sensor 0: 12
Abstand Sensor 1: 48

Na siehste, Deine Beiden Sensoren machen was Du willst.
NUn muss ich nur noch wissen, was Du da an Bauteile hast - ich frage also zumletzten Mal nach einem Link zu dem verkauften teil, damit ich mir was zusammenreimen kann....

Gewöhne dich Bitte die leere Zeilen löschen, so ist das fast nicht lesbar.

Hey sorry für die verspätete Antwort...

AAAHHH!

Der ist ja spannend.
Mit der Lib dazu brauchst Du nicht alles selbst erfinden, sondern kannst den Antrieb direkt ansteuern.

Wenn ich zwischendurch Zeit finde, werd ich mal schaun was das Ding so kann und was zusammenschreiben.

Hier ist nochmal überarbeiteter CODE

#define trigPin 13
#define trigPin2 11
#define trigPin3 5
#define echoPin 12
#define echoPin2 4
#define echoPin3 2
#define motor 8
#define buzzer 6
#define motor2 7
#define rmotor 3
#define rmotor2 2
void setup()
{

  pinMode(trigPin, OUTPUT);
  pinMode(trigPin2,OUTPUT);
  pinMode(trigPin3,OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(echoPin2,INPUT);
  pinMode(echoPin3,INPUT);
  pinMode(motor, OUTPUT);
  pinMode(motor2, OUTPUT);
  pinMode(rmotor, OUTPUT);
  pinMode(buzzer, OUTPUT);
}
void loop()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(2);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(10);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;
  if (distance > 30)     // hier schaut man ob die distanz größer als 30 ist
  {
    digitalWrite(rmotor, HIGH);   // Wenn die distanz größer als 30 ist, dann wird dieser code ausgeführt
    digitalWrite(rmotor2, HIGH);
    digitalWrite(motor, LOW);
    digitalWrite(buzzer, HIGH);
  } else
  {
    digitalWrite(rmotor, LOW);  // when kleiner als 30 dann...
    digitalWrite(rmotor2, LOW);
    digitalWrite(motor, HIGH);
    digitalWrite(buzzer, LOW);
  }
    
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(2);
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  duration = pulseIn(echoPin2, HIGH);
  distance = (duration / 2) / 29.1;
  if (distance > 30)     // hier schaut man ob die distanz größer als 30 ist
  {
    digitalWrite(rmotor, HIGH);   // Wenn die distanz größer als 30 ist, dann wird dieser code ausgeführt
    digitalWrite(rmotor2, HIGH);
    digitalWrite(motor, LOW);
    digitalWrite(buzzer, HIGH);
  } else
  {
    digitalWrite(rmotor, LOW);  // when kleiner als 30 dann...
    digitalWrite(rmotor2, LOW);
    digitalWrite(motor, HIGH);
    digitalWrite(buzzer, LOW);
  }
  {
  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(2);
  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  duration = pulseIn(echoPin3, HIGH);
  distance = (duration / 2) / 29.1;
  if (distance > 30)     // hier schaut man ob die distanz größer als 30 ist
  {
    digitalWrite(rmotor, HIGH);   // Wenn die distanz größer als 30 ist, dann wird dieser code ausgeführt
    digitalWrite(rmotor2, HIGH);
    digitalWrite(motor, LOW);
    digitalWrite(buzzer, HIGH);
  } else
  {
    digitalWrite(rmotor, LOW);  // when kleiner als 30 dann...
    digitalWrite(rmotor2, LOW);
    digitalWrite(motor, HIGH);
    digitalWrite(buzzer, LOW);
  }
}
}

Moin @my_xy_projekt ,

wenn es sich tatsächlich um das URC10 Board handelt, wird der UNO nicht benötigt:

Der Cytron Combat Robot Controller ist ein zweikanaliger Controller des phänomenalen Roboters Uno Cytron 10A, der zusätzlich voll kompatibel mit dem Arduino Uno Board ist. Der Minicomputer enthält den ATmega328P-Mikrocontroller, der genau derselbe ist, der in der Originalversion des italienischen Herstellers zu finden ist.

Quelle: Cytron Combat Robot Controller

Motoren, diverse Sensoren (u.a. Ultraschall, IR-Annäherungsensoren) und Empfänger für eine IR-Fernbedienung können direkt am URC10 angeschlossen und ausgewertet werden:

Quelle: https://www.hackster.io/cytron-technologies/building-a-sumo-robot-45d703

Die Library https://github.com/CytronTechnologies/Cytron_URC10_Library/tree/master
unterstützt direkt ein SSD1306 Display, zwei Motoren und zweiUltraschall-Entfernungsmesser.

Moin @therealshadowknight ,

benutzt Du tatsächlich ein URC10 Board?

Dann würden die Pins nicht zu den Vorgaben des Herstellers passen ... So ist es in der Library vorgegeben:

// urc10 general
// ultrasonic
#define URC10_ULTRASONIC1_ECHO 8
#define URC10_ULTRASONIC1_TRIG 9
#define URC10_ULTRASONIC2_ECHO 10
#define URC10_ULTRASONIC2_TRIG 11
// motor
#define URC10_MOTOR_1_DIR 4
#define URC10_MOTOR_1_PWM 5
#define URC10_MOTOR_2_DIR 7
#define URC10_MOTOR_2_PWM 6

#define URC10_MOTOR_1_CW 0
#define URC10_MOTOR_1_CCW 1
#define URC10_MOTOR_2_CW 0
#define URC10_MOTOR_2_CCW 1

Du kannst alles natürlich auch über einen separaten UNO laufen lassen, das wäre aber unnötig, da auf dem URC10 bereits ein identischer Controller extra dafür verbaut ist ...

Gruß
ec2021

Ich weiss,

darum hab ich ja vor, später evtl. die Doku mal in die Hand zu nehmen, denn mir fehlt noch, was die lib alles kann. (Ja, ich könnte das auch anhand der Keywords rausfinden :slight_smile: )

Eine Doku zu der Lib habe ich leider nicht gefunden, auch auf der gitHub-Seite steht eher ... äh, nichts ... ;-) Es wäre schon einfacher für Dich, wenn der TO [w/m/d] die Pins gemäß Lib benutzen würde.

Ich hoffe Dir ein wenig Zeit erspart zu haben und überlasse Dir nun gerne wieder das Feld ::slight_smile:

Gruß und ein schönes Wochenende!
ec2021

Will ich das? :thinking:

Schönes WE.

1 Like

Aber !!! Das kannst Du besser

So dann wolln wa mal...
Du wirst das URC10 Board brauchen, da die Hardware für die Motoren da mit drauf ist.

Jetzt kommt das ABER

Für die Motoren (und einem optionalem Display) bist Du an die Anschlüsse gebunden.
Alles andere kann, im Rahmen der dann noch vorhandenen Möglichkeiten, ausgetauscht werden.

Erzähl ma, was Du vor hast.
Mir sieht das nach Kauderwelsch aus und ich möchte ungerne etwas bauen, was dann noch zig mal geändert werden muss.

Hey,
also ich möchte aus 3 Ultraschallsensoren, 1 Arduino Uno, einer Motorplatine und 2 Motoren ein autonomes auto bauen

Die URC10 Platine ist ein komplettes Board, incl. der Motortreiber.

Damit brauchst Du den einzelnen UNO nicht.

Bei den Motoranschlüssen bist Du an das Board gebunden, weil die fest verdrahtet sind. Alle anderen Anschlüsse können wir frei belegen.

Ich würde mir das zu morgen mal ansehen, ob ich Dir da was zusammenklöppeln kann, was die Motoren drehen läßt, und drei Ultraschallsensoren abfragt.
So Du denn willst....

// Forensketch Selbstfahrendes Auto
// https://forum.arduino.cc/t/selbstfahrendes-auto-code-hilfe/1418597

/*
   Pinbelegung:
   2 - trigger Ultraschall 1
   3 - echo Ultraschall 1
   4 - Motor 1 - Direction (fest vorgegeben)
   5 - Motor 1 - Enable (fest vorgegeben)
   6 - Motor 2 - Enable (fest vorgegeben)
   7 - Motor 2 - Direction (fest vorgegeben)
   8 - trigger Ultraschall 2
   9 - echo Ultraschall 2
  10 - trigger Ultraschall 3
  11 - echo Ultraschall 3
*/

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming

#define DEBUG              // Wenn aktiviert, werden Zwischenwerte ausgegeben

#ifdef DEBUG
  #define DBG_PRINT(...) Serial << __VA_ARGS__
  #define DBG_PRINTLN(...) Serial << __VA_ARGS__ << endl
#else
  #define DBG_PRINT(...)
  #define DBG_PRINTLN(...)
#endif

constexpr bool forward {HIGH};
constexpr bool backward {!forward};

constexpr uint8_t LEFT {0};
constexpr uint8_t RIGHT {1};

struct MOTO
{
  const uint8_t dirPin;
  const uint8_t enaPin;
  uint8_t speed;
  bool dir;

  void init() {
    pinMode(dirPin, OUTPUT);
    pinMode(enaPin, OUTPUT);
  }
  void update() {
    analogWrite(enaPin, speed);
    digitalWrite(dirPin, dir);
  }

};

struct USS
{
  const uint8_t sendPin;
  const uint8_t echoPin;
  uint16_t distance;

  void init() {
    pinMode(sendPin, OUTPUT);
    pinMode(echoPin, INPUT);
  }

  void update() {
    digitalWrite(sendPin, LOW);
    delayMicroseconds(2);
    digitalWrite(sendPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(sendPin, LOW);
    distance = (pulseIn(echoPin, HIGH) * (0.034 / 2));
  }

};

MOTO moto[] {{4, 5, offSpeed, forward,}, {7, 6, offSpeed, forward,},};

USS uss[] {{2, 3, 0,}, {8, 9, 0,}, {10, 11, 0,},};

struct SENSORS
{
  const uint8_t sensNums = sizeof(uss) / sizeof(USS);

  uint32_t lastCheck;
  uint8_t sensIdx = 0;

  void update() {
    uint32_t myMillis = millis();

    if (myMillis - lastCheck > 500) {
      uss[sensIdx].update();
      DBG_PRINT(F("Sensor: "));
      DBG_PRINT(sensIdx);
      DBG_PRINT(F(" Abstand: "));
      DBG_PRINT(uss[sensIdx].distance);
      DBG_PRINTLN(F(" cm"));
      lastCheck = myMillis;

      if (++sensIdx >= sensNums)
      { sensIdx = 0; }
    }
  }
} sensors;

void setup()
{
  Serial.begin(115200);
  delay(300);
  Serial << (F("\r\nStart...\r\n")) << endl;
  DBG_PRINTLN(__FILE__);
  DBG_PRINTLN( __TIMESTAMP__);
  Serial << sensors.sensNums << endl;

  for (MOTO &m : moto)
  {m.init();}

  for (USS &u : uss)
  {u.init();}

  test();
}

void loop()
{
  sensors.update();
}

void test()
{
  Serial << F("Vorwärts - beschleunigen") << endl;

  for (byte b = 0; b < 255; b++)
  {
    DBG_PRINT(F("Speed: "));
    DBG_PRINTLN(b);

    for (MOTO &m : moto)
    {
      m.dir = forward;
      m.speed = b;
      m.update();
    }

    delay(30);
  }

  delay(500);
  Serial << F("Links - halt") << endl;
  moto[LEFT].speed = 0;
  moto[LEFT].update();
  delay(500);
  Serial << F("Rechts - halt") << endl;
  moto[RIGHT].speed = 0;
  moto[RIGHT].update();
}

Nach dem aufspielen auf die URC-Platine sollten die Motoren beschleunigen, dann links und rechts zeitversetzt aus gehen.
Auf dem Seriellen Monitor kannst Du den Geschwindigkeitsanstieg mitverfolgen, eben so das anhalten.
Danach werden Dir die jeweiligen Entfernungswerte in Dauerschleife ausgegeben.

Wenn das tut, sag mir wohin die US-Sensoren zeigen, sodass ich die Nummern den Richtungen zuweisen kann.