Робот управляемый по Bluetooth.

Тема в разделе "Arduino & Shields", создана пользователем ИВАН 1454, 26 ноя 2017.

  1. ИВАН 1454

    ИВАН 1454 Нерд

    Добрый день всем. Не давно участвовал в Робоштурме и заметил что робот управляемый по Bluetooth не работает. Получается управлять им только с компьютера. Проблема засела в коде. Помогите её отыскать.
    Код (C++):
    #include <Ultrasonic.h>
    #include <Servo.h>

    #define SPEED_1      5
    #define DIR_1        4

    #define CON_MOTOR1     0
    #define CON_MOTOR2     0

    #define TRIGGER_PIN  16
    #define ECHO_PIN     17

    Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);

    #define SPEED_2      6
    #define DIR_2        7

    #define FORWARD   0
    #define BACKWARD  1
    #define LEFT      2
    #define RIGHT     3

    Servo neck;

    int val;

    void go(int newDirection, int speed)
    {
      boolean motorDirection_1, motorDirection_2;

      switch ( newDirection ) {

        case FORWARD:
          motorDirection_1 = true;
          motorDirection_2 = true;
          break;
        case BACKWARD:
          motorDirection_1 = false;
          motorDirection_2 = false;
          break;
        case LEFT:
          motorDirection_1 = true;
          motorDirection_2 = false;
          break;
        case RIGHT:
          motorDirection_1 = false;
          motorDirection_2 = true;
          break;
      }
      analogWrite(SPEED_1, speed);
      analogWrite(SPEED_2, speed);

      digitalWrite(DIR_1, motorDirection_1);
      digitalWrite(DIR_2, motorDirection_2);
    }
    void robot_avtonomno()
    {
      delay(50);
      float dist_cm = ultrasonic.Ranging(CM);
      delay(100);
      if (dist_cm < 45.0)
      {
        go(FORWARD, 0);
        neck.write(180);
        delay(600);
        float dist_cm_1 = ultrasonic.Ranging(CM);
        neck.write(0);
        delay(600);
        float dist_cm_2 = ultrasonic.Ranging(CM);
        if (dist_cm_1 > dist_cm_2) {
          neck.write(90);
          delay(300);
          go(LEFT, 100);
          delay(360);
        } else {
          neck.write(90);
          delay(300);
          go(RIGHT, 100);
          delay(360);
        }
      }
      else
      {
        go(FORWARD, 75);
      }
    if (Serial.available())
    {
      val = Serial.read();
      if (val == 'T')
      {
        go(FORWARD, 0);
        while (1)
        {
          float dist_cm = ultrasonic.Ranging(CM);
          Serial.println(dist_cm);
          robot_upravlenie();
          delay(100);
        }
      }
    }
    }
    void robot_upravlenie()
    {

      if (Serial.available())
      {
        val = Serial.read();
        if (val == 'F')
        {
          go(FORWARD, 75);
          delay(200);
        }
        if (val == 'B')
        {
          go(BACKWARD, 75);
          delay(200);
        }
        if (val == 'L')
        {
          go(LEFT, 100);
          delay(200);
        }
        if (val == 'R')
        {
          go(RIGHT, 100);
          delay(200);
        }
        if (val == 'S')
        {
          go(FORWARD, 0);
        }
        if(val == 'W')
        {
          neck.write(90);
        }
        if(val == 'D')
        {
          neck.write(0);
        }
        if(val == 'A')
        {
          neck.write(180);
        }
        if (val == 'Y')
        {
          while (1)
          {
            neck.write(90);
            float dist_cm = ultrasonic.Ranging(CM);
            Serial.println(dist_cm);
            robot_avtonomno();
            delay(100);
          }
        }
      }
    }
    void setup()
    {
      for (int i = 4; i <= 7; i++)
      pinMode(i, OUTPUT);
      neck.attach(2);
      neck.write(90);
      Serial.begin(9600);
    }
    void loop()
    {
      if (Serial.available())
      {
        val = Serial.read();
        if (val == 'Y')
        {
          while (1)
          {
            neck.write(90);
            float dist_cm = ultrasonic.Ranging(CM);
            Serial.println(dist_cm);
            robot_avtonomno();
          }
        }
        else if (val == 'T')
        {
          while (1)
          {
            float dist_cm = ultrasonic.Ranging(CM);
            Serial.println(dist_cm);
            robot_upravlenie();
          }
        }
      }
    }
     
  2. akl

    akl Гуру

    может в блютус-модуле не так скорость установлена (не 9600)?
     
  3. ИВАН 1454

    ИВАН 1454 Нерд

    Нет. Я скорость пробовал менять. Ничего не выходит.
     
  4. akl

    akl Гуру

    по идее, управление через ком-порт с компа и через блютус ничем не отличается - один и тот же уарт. может что-то не так в программе, которая на телефоне?
    что за плата кстати? не леонардо случайно
     
  5. DIYMan

    DIYMan Guest

    Блютус-балалайка, подключаемая к дуне - суть работает как удлинитель UART, всё. Если получается управлять роботом по UART, подоткнув плату по USB к компу, но не получается, когда к плате подоткнута балалайка - значит, проблема в том, что балалайка не передаёт данные на плату. Причин может быть много: разные скорости работы по UART балалайки и платы, разные настройки UART, отсутствие сопряжения по блютуз балалайки и управляющего устройства - выбирайте любую.
     
  6. Что за мероприятие? Понравилось?
     
  7. ИВАН 1454

    ИВАН 1454 Нерд

    Нет. Плата Arduino Uno. Программа на телефоне Arduino Bluetooth Controller. Раньше код работал. Но что-то пошло не так.
    Да очень понравилось. Проходило в Ярославле. Спортивные соревнования роботов
    Оно закончилось вчера. Вот их сайт: http://roboshturm.ru/
     
  8. ИВАН 1454

    ИВАН 1454 Нерд

    Данные передаются(по крайней мере я проверял в другом коде). Скорость настраивал. Устройства сопрягаются.
     
  9. DIYMan

    DIYMan Guest

    Но в дуньку они не попадают по какой-то причине. Либо попадают - но искажённые. Надо тестировать, других вариантов не вижу. Допишите в прошивку дуньки код, который эхом выводит в UART данные, полученные извне - так хоть будет понятно, доходит ли до дуньки что-либо. Ну и, конечно, надо убедиться, что с подключением и с питанием всё ништяк.
     
  10. Впечатлился. А в златоглавой такое бывает?
     
  11. ИВАН 1454

    ИВАН 1454 Нерд

    Пока что не знаю. Робоштурм это всероссийские соревнования. Проводятся в Ярославле.