Помогите с ошибкой пожалуйста

Тема в разделе "Arduino & Shields", создана пользователем YuriiOd, 22 апр 2019.

  1. YuriiOd

    YuriiOd Нерд

    Собираю модель советского трактора т 74, напечатанную на 3Д принтере. С механикой проблем не возникло, а вот с ардуино работаю впервые. Нашел в интернете схему и скетч к ней, собственно ардуино, L298N, блютуз модуль. Все собрал, а вот скетч залить не могу, выбивает ошибку:
    Вот скетч:
    Код (C++):
    #include <SoftwareSerial.h>
    const int TIMEOUT_TIME_MS = 150;
    unsigned long lastPilotSymbolTime;
    char symbol;

    int val;
    int IN1 = 7; // выводы модуля L298N подключены к следующим пинам Arduino
    int IN2 = 5;
    int IN3 = 4;
    int IN4 = 2;
    int LED = 13; // используем встроенный светодиод для индикации работы

    SoftwareSerial BTSerial(A0,A1);
    char vcmd;
    int vspdL,vspdR;
    int vspd=200;
    enum States
    {
      WAITING,
      READING,
      RUNNING,
      ERROR,
      TIMEOUT
    };

    States state;
    States onWait();
    States onRead();
    States onRun();
    States onError();

    States onTimeout();

    void setup()
    {
      BTSerial.begin(9600);
      Serial.begin(9600);
      lastPilotSymbolTime = 0;
      pinMode(IN1, OUTPUT);
      pinMode(IN2, OUTPUT);
      pinMode(IN3, OUTPUT);
      pinMode(IN4, OUTPUT);

      //используем 13 пин как индикатор включённой ардуины
      pinMode(LED, OUTPUT);
      digitalWrite(LED, HIGH);
    }

    void loop()
    {
      if(BTSerial.available())
    {
      vcmd=(char)BTSerial.read();
      Serial.println(vcmd);
      if(vcmd=='F')
      {
        vforvard();
      }
    if(vcmd=='B'){
      vbackward();
    }
    if(vcmd=='L'){
      vleft();
    }
    if(vcmd=='R'){
      vright();
    }
    if(vcmd=='G'){
      vforwardleft();
    }
    if(vcmd=='I'){
      vforwardright();
    }
    if(vcmd=='H'){
      vbackwardleft();
    }
    if(vcmd=='J'){
      vbackwardright();
    }
    if(vcmd=='S'){
      vrelease();
      switch (state)
      {
      case WAITING:
        state = onWait();
        break;
      case READING:
        state = onRead();
        break;
      case RUNNING:
        state = onRun();
        break;
      case TIMEOUT:
        state = onTimeout();
        break;
      default:
        state = onError();
      }
    }

    States onWait()
    {
      if (Serial.available() > 0)
      {
        return READING;
      }
      if (lastPilotSymbolTime && (millis() - lastPilotSymbolTime > TIMEOUT_TIME_MS))
      {
        return TIMEOUT;
      }
      return WAITING;
    }

    States onRead()
    {
      symbol = Serial.read();
      return RUNNING;
    }

    States onRun()
    {
      switch (symbol)
      {
      case 'W':
        //начало действий при полученном символе 'W' (вперед)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 'S':
        //начало действий при полученном символе 'S' (назад)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      case 'D':
        //начало действий при полученном символе 'D' (вправо)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      case 'A':
        //начало действий при полученном символе 'A' (влево)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 'T':
        //начало действий при полученном символе 'T' (остановка)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 'P':
        //получили контрольный символ, не изменяйте этот код
        lastPilotSymbolTime = millis();
        break;
      default:
        return ERROR;
      }
      return WAITING;
    }

    States onError()
    {
      //Получены неоговоренные символы. Очищаем ввод и продолжаем.
      //Здесь можно добавить какие-то действия для этой ситуации.
      //...
      while (Serial.available())
      {
        Serial.read();
      }
      return WAITING;
    }

    States onTimeout()
    {
      //Действия при таймауте.
      //Вероятно, связь утеряна,
      //но при получении контрольного символа она будет восстановлена.
      //Здесь, например, уместно выключить двигатели
      //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
      digitalWrite(IN1, LOW); // На пары выводов IN поданы сигналы одинакового уровня, моторы не работают
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      if (Serial.available())
      {
        return READING;
      }
      return TIMEOUT;
    }

    Буду благодарен за помощь, не пинайте очень, не хватает времени во всем разбираться(((
     
  2. KindMan

    KindMan Гик

    Согласен, Время - деньги! С вашими текущими познаниями в программировании ничего не получится, к сожалению. Поэтому, чтобы сэкономить время, потратьте деньги в разделе "Закажу проект"
     
  3. YuriiOd

    YuriiOd Нерд

    А ещё лучше купить трактор готовый, я правильно понял ваш ход мыслей? :mad:
    Вообще совета просил, можно же указать что не так в коде...:(
     
    Airbus нравится это.
  4. parovoZZ

    parovoZZ Гуру

    Нет объявления данной функции. Компилятор не знает, откуда брать данную функцию, поэтому и ругается. Но это только первая ошибка. А их ещё насобирается штук с 10. Программирование - это не та стезя, где можно отделаться копипастой, а недостающее выкинуть.
     
  5. KindMan

    KindMan Гик

    Нет, не правильно. У вас не возникло проблем с механикой, для вас, наверное, это просто. Я вот, когда делаю что-то для себя, не пытаюсь делать то, в чем потребуется много не нужных усилий, например сделать корпус - нет навыков в работе с программами, нет принтера, и мне проще заказать готовое. А если я задам вопрос на форуме автокада, из которого будет понятно, что я первый раз его запустил, открыл проект готовой фигуры, и пытаюсь её переделать под себя, и чтобы у меня получилось это, нужно объяснить материала на пять часов, меня пошлют в гугл и мануал, изучать азы.
     
    DIYMan нравится это.
  6. Код нерабочий. Фундаментально. Кто-то без понимания пытался склеить две разные вещи, и не закончил.
     
  7. YuriiOd

    YuriiOd Нерд

    Да для меня механика просто, я инженер и работаю в этой отрасли, чертежи и все связанное с железом мое родное. С программированием увы не особо знаком. На форумах по инженерии и им подобным народ подобрее будет, всегда помогут, разжуют и по полочкам разложат..имхо. Я понимаю что правильный путь начать изучение с самого начала, и постепенно дойти до нужных мне знаний, но физически нет на это время. Вот человек написал
    , теперь буду читать, выяснять как править код, уже знаю откуда начинать изучать.
     
  8. YuriiOd

    YuriiOd Нерд

    этот человек на ютубе создает ролики, уроки ардуино....видать хороший специалист :eek:
     
  9. тавтология
     
  10. YuriiOd

    YuriiOd Нерд

    и?
     
  11. DIYMan

    DIYMan Гуру

    Вечная беда.
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    if(vcmd=='F')
    {
    vforvard();
    }

    Forward пишется через "w"
     
    Последнее редактирование: 23 апр 2019
    Tomasina нравится это.
  13. b707

    b707 Гуру

    нечего тут править, тут половины кода нет.
     
  14. parovoZZ

    parovoZZ Гуру

    Ролики на ютубе создаются не для зрителей, а для рекламы и рекламодателей))
     
    Andrey12 нравится это.
  15. DetSimen

    DetSimen Спамовредитель Модератор

    Дак на ютубе максимальная концентрация громматеев.
     
    Andrey12 и Ariadna-on-Line нравится это.
  16. Airbus

    Airbus Радиохулиган Модератор

    В каких то случаях да.Возможно и в Вашем.Тут дело вот в чем-авторы кода или большие шутники или стимулируют копипастеорв к размышлениям.Делают преднамеренно (или случайно) ошибку в коде иногда просто заменяют английскиие а,о,е на русские и при этом код никак не хочет компилиться.Приходиться его внимательно анализировать иногда настолько внимательно что переписывать на 100%.Я уже не говорю об откровенных ляпах.Сам неоднократно напарывался на такое поэтому сейчас понимаю что лучше написать код с ноля чем ковырять чей то косячный код
     
  17. KindMan

    KindMan Гик

    Хорошо, я с утра бодрый. Исправил вам код, теперь он компилируется и вы сможете его загрузить в ардуино.
    Код (C++):
    #include <SoftwareSerial.h>
    const int TIMEOUT_TIME_MS = 150;
    unsigned long lastPilotSymbolTime;
    char symbol;

    int val;
    int IN1 = 7; // выводы модуля L298N подключены к следующим пинам Arduino
    int IN2 = 5;
    int IN3 = 4;
    int IN4 = 2;
    int LED = 13; // используем встроенный светодиод для индикации работы

    SoftwareSerial BTSerial(A0,A1);
    char vcmd;
    int vspdL,vspdR;
    int vspd=200;
    enum States
    {
      WAITING,
      READING,
      RUNNING,
      ERROR,
      TIMEOUT
    };

    void vforwardleft(){};
    void vforwardright(){};
    void vbackward(){};
    void vforvard(){};
    void vleft(){};
    void vright(){};
    void vrelease(){};
    void vbackwardleft(){};
    void vbackwardright(){};

    States state;
    States onWait();
    States onRead();
    States onRun();
    States onError();

    States onTimeout();

    void setup()
    {
      BTSerial.begin(9600);
      Serial.begin(9600);
      lastPilotSymbolTime = 0;
      pinMode(IN1, OUTPUT);
      pinMode(IN2, OUTPUT);
      pinMode(IN3, OUTPUT);
      pinMode(IN4, OUTPUT);

      //используем 13 пин как индикатор включённой ардуины
      pinMode(LED, OUTPUT);
      digitalWrite(LED, HIGH);
    }

    void loop()
    {
      if(BTSerial.available())
    {
      vcmd=(char)BTSerial.read();
      Serial.println(vcmd);
      if(vcmd=='F')
      {
        vforvard();
      }
    if(vcmd=='B'){
      vbackward();
    }
    if(vcmd=='L'){
      vleft();
    }
    if(vcmd=='R'){
      vright();
    }
    if(vcmd=='G'){
      vforwardleft();
    }
    if(vcmd=='I'){
      vforwardright();
    }
    if(vcmd=='H'){
      vbackwardleft();
    }
    if(vcmd=='J'){
      vbackwardright();
    }
    if(vcmd=='S'){
      vrelease();
      switch (state)
      {
      case WAITING:
        state = onWait();
        break;
      case READING:
        state = onRead();
        break;
      case RUNNING:
        state = onRun();
        break;
      case TIMEOUT:
        state = onTimeout();
        break;
      default:
        state = onError();
       }
      }
    }
    }

    States onWait()
    {
      if (Serial.available() > 0)
      {
        return READING;
      }
      if (lastPilotSymbolTime && (millis() - lastPilotSymbolTime > TIMEOUT_TIME_MS))
      {
        return TIMEOUT;
      }
      return WAITING;
    }

    States onRead()
    {
      symbol = Serial.read();
      return RUNNING;
    }

    States onRun()
    {
      switch (symbol)
      {
      case 'W':
        //начало действий при полученном символе 'W' (вперед)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 'S':
        //начало действий при полученном символе 'S' (назад)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      case 'D':
        //начало действий при полученном символе 'D' (вправо)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      case 'A':
        //начало действий при полученном символе 'A' (влево)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 'T':
        //начало действий при полученном символе 'T' (остановка)
        //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 'P':
        //получили контрольный символ, не изменяйте этот код
        lastPilotSymbolTime = millis();
        break;
      default:
        return ERROR;
      }
      return WAITING;
    }

    States onError()
    {
      //Получены неоговоренные символы. Очищаем ввод и продолжаем.
      //Здесь можно добавить какие-то действия для этой ситуации.
      //...
      while (Serial.available())
      {
        Serial.read();
      }
      return WAITING;
    }

    States onTimeout()
    {
      //Действия при таймауте.
      //Вероятно, связь утеряна,
      //но при получении контрольного символа она будет восстановлена.
      //Здесь, например, уместно выключить двигатели
      //[ДОБАВИТЬ СВОЙ КОД НИЖЕ]
      digitalWrite(IN1, LOW); // На пары выводов IN поданы сигналы одинакового уровня, моторы не работают
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      if (Serial.available())
      {
        return READING;
      }
      return TIMEOUT;
    }
     
  18. DetSimen

    DetSimen Спамовредитель Модератор

    киндман - тролль.
     
    Andrey12 нравится это.
  19. DetSimen

    DetSimen Спамовредитель Модератор

  20. KindMan

    KindMan Гик

    Не, я исправил ошибки того тролля(хорошего специалиста), который из Ютуба