Случайный выбор поворота для робота.

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Yarmost, 29 янв 2017.

  1. Yarmost

    Yarmost Нуб

    Всем здравствуйте. Подскажите пожалуйста, или скиньте ссылку,как реализовать случайный выбор поворота для робота. Робот 2WD с ультразвуковым дальномером HC-SR04. Это мой первый опыт и в программировании робота, да и вообще в программировании. Сам искал, но не нашёл.
    Код (C++):
    #include <Ultrasonic.h>

    int val;

    int leftDirPin = 4;
    int leftSpeedPin = 5;

    int rightDirPin = 7;
    int rightSpeedPin = 6;

    int runSpeed = 50;

    int trigPin = 9;
    int echoPin = 8;
    Ultrasonic ultrasonic (9, 8);

    void setup()
    {
      Serial.begin(9600);
      pinMode(leftDirPin, OUTPUT);
      pinMode(leftSpeedPin, OUTPUT);
      pinMode(rightDirPin, OUTPUT);
      pinMode(rightSpeedPin, OUTPUT);
    }

    void go()
    {
      analogWrite(leftSpeedPin, runSpeed);
      analogWrite(rightSpeedPin, runSpeed);
    }

    void stop()
    {
      analogWrite(leftSpeedPin, 0);
      analogWrite(rightSpeedPin, 0);
    }

    void goForward()
    {
      digitalWrite(leftDirPin, HIGH);
      digitalWrite(rightDirPin, HIGH);
      go();
    }

    void turnLeft()
    {
      digitalWrite(leftDirPin, LOW);
      digitalWrite(rightDirPin, HIGH);
      go();
    }

    void turnRight()
    {
      digitalWrite(leftDirPin, HIGH);
      digitalWrite(rightDirPin, LOW);
      go();
    }

    void loop()
    {
      float dist_cm = ultrasonic.Ranging(1);
      // Serial.println(dist_cm);
      if (dist_cm > 10)
      {
        goForward();
      }
      else
      {
        stop();
        turnRight();
      }
    }
     
  2. rkit

    rkit Гуру

    Код (C++):
    if (random(1))
      turnLeft();
    else
      turnRight();

     
     
  3. Yarmost

    Yarmost Нуб

    Я добавил код после else
    Код (C++):
     if (dist_cm > 10)
      {
        goForward();
      }
      else
      {
        if (random(1))
          turnLeft();
        else
          turnRight();
      }
    Он при подъезде к препятствию поворачивает всё время вправо.
     
  4. rkit

    rkit Гуру

    А, ну ошибся я немного. Исправить сможете самостоятельно, если прочитаете документацию к функции.
     
  5. Yarmost

    Yarmost Нуб

    Я понимаю, что нужно использовать функцию random или randomSeed для генерации, а затем нужно выбрать из этих 2 значений. А перед этим необходимо присвоить значения, например, что 0 это поворот вправо, а 1 влево. У меня проблема начинающего... как присвоить значение таким образом, что бы затем использовать ветвление if ... else.
    Код (C++):
    void loop()
    {  
    turn = randomSeed(1); // тут наверно нужна локальная переменная
    if (turn == 0)
    {
    turnRight();
    }
    else
    {
    turnLeft();
    }
      float dist_cm = ultrasonic.Ranging(1);
      // Serial.println(dist_cm);
      if (dist_cm > 10)
      {
        goForward();
      }
      else // иначе остановка и поворот
      {
        stop();
        turn;
      }
    turn инициализировать как переменную, но он пишет: "void value not ignored as it ought to be" как быть?