Не приходит сигнал в порт.

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем verloor, 8 фев 2020.

  1. verloor

    verloor Нуб

    Всем привет, случилась такая проблема:есть приложение для телефона написанное на MIT App Inventor, при нажатии на кнопки в нём оно отправляет сигналы на ардуину, WASD и T, WASD управляют за повороты, т.е. вперёд, назад, лево, право. А сигнал T отвечает за остановку всех моторов (скрин работы в приложении прикрепил). Так вот, не всегда приходит сигнал T, из-за чего моторы крутятся без остановки. Код из ардуинки прикрепил тоже. Прошу добрых людей помочь с этой проблемой. (использую оригинальную ардуину, белые мотор шилды от амперки и китайские моторчики с редуктором).
    Код (C++):
     if (mySerial.available())
      {
        val = mySerial.read();
       
        // Задаём движение вперёд
        if (val == 'W') // При нажатии клавиши «W»
        {Serial.println(val);
          // Выводы конфигурируются согласно работе Motor Shield'а
          // Моторы крутятся вперед
          digitalWrite(EN1, HIGH);
          digitalWrite(EN2, HIGH);
          digitalWrite(EN3, HIGH);
          digitalWrite(EN4, HIGH);
          digitalWrite(IN1, HIGH);
          digitalWrite(IN2, HIGH);
          digitalWrite(IN3, HIGH);
          digitalWrite(IN4, HIGH);
        }
       

        // Задаём движение назад
        if ( val == 'S')
        {Serial.println(val);
          digitalWrite(EN1, HIGH);
          digitalWrite(EN2, HIGH);
          digitalWrite(EN3, HIGH);
          digitalWrite(EN4, HIGH);
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, LOW);
          digitalWrite(IN3, LOW);
          digitalWrite(IN4, LOW);
        }
       
        // Задаём движение вправо
        if ( val == 'D')
        {Serial.println(val);
          digitalWrite(EN1, HIGH);
          digitalWrite(EN2, HIGH);
          digitalWrite(EN3, HIGH);
          digitalWrite(EN4, HIGH);
          digitalWrite(IN1, HIGH);
          digitalWrite(IN2, LOW);
          digitalWrite(IN3, HIGH);
          digitalWrite(IN4, LOW);
        }
       

        // Задаём движение влево
        if ( val == 'A')
        {Serial.println(val);
          digitalWrite(EN1, HIGH);
          digitalWrite(EN2, HIGH);
          digitalWrite(EN3, HIGH);
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, HIGH);
          digitalWrite(IN3, LOW);
          digitalWrite(IN4, HIGH);
        }
       

        // Стоп режим
        // При отпускании клавиш в программе в порт шлется «T»
        if ( val == 'T') // При нажатии клавиши «T»
        {Serial.println(val);
          // Выводы ENABLE притянуты к минусу, моторы не работают
          digitalWrite(EN1, LOW);
          digitalWrite(EN2, LOW);
          digitalWrite(EN3, LOW);
          digitalWrite(EN4, LOW);

        }
      }
     

    Вложения:

  2. parovoZZ

    parovoZZ Гуру

    А телефон как связан с ардруиной?
     
  3. verloor

    verloor Нуб

    по блютуз модулю
     
  4. parovoZZ

    parovoZZ Гуру

    Кто из них сервер, а кто клиент? Клиент в каком режиме работает?
     
  5. verloor

    verloor Нуб

    не очень понял вопрос, первый раз работаю с приложением
     
  6. b707

    b707 Гуру

    vertoor - кода, что вы выложили - недостаточно. Выкладывайте весь скетч
     
  7. verloor

    verloor Нуб

    всё что находится в
    можно не читать, там всё работает
    Код (C++):
    ///////////////////MOTOR PART////////////////////////////

    int buttonState = 0; //состояние кнопки

    char val;
    //подключение моторов IN - управление  EN - подключение
    int IN1 = 4;
    int IN2 = 7;
    int IN3 = 7;
    int IN4 = 7;
    int EN1 = 6;
    int EN2 = 5;
    int EN3 = 5;
    int EN4 = 5;

    int pos = 0;

    ////////////////////////////SERVOS PART///////////////////
    #include <EEPROM.h> // подключаем библиотеку EEPROM
    #include <Servo.h> // подключаем библиотеку для Servo
    #include <Wire.h>
    #include <Multiservo.h>
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(8, 9);

    Multiservo servo_1; //даём имена servo
    Multiservo servo_2;
    Multiservo servo_3;
    Multiservo servo_4;
    Multiservo servo_5;

    // для хранения градуса поворота Servo машин.
    int servo_val_1;
    int servo_val_2;
    int servo_val_3;
    int servo_val_4;
    int servo_val_5;


    int serial_val; // для хранения значений Serial.parseInt.
    int serial_val2;
    int serial_val3;
    int serial_val4;
    int serial_val5;


    void setup()
    {
      mySerial.begin(9600);
      Serial.begin(9600); // скорость передачи
      /////////////////////////MOTOR PART////////////////////////
      //подключение моторов на вывод информации
      pinMode(IN1, OUTPUT);
      pinMode(IN2, OUTPUT);
      pinMode(EN1, OUTPUT);
      pinMode(EN2, OUTPUT);
      pinMode(IN3, OUTPUT);
      pinMode(EN3, OUTPUT);
      pinMode(IN4, OUTPUT);
      pinMode(EN4, OUTPUT);

      ////////////////////////SERVOS PART////////////////////////
      // При вызове parseInt() задержка ожидания последующего символа по умолчанию 1 секунда.
      // Функцией setTimeout() можно уменьшить эту задержку. Например на 4 миллисекунды, setTimeout(4);.
      // Чем выше скорость Serial.begin, тем меньше потребуется значение setTimeout.
      mySerial.setTimeout(4);

      //подключаем сервоприводы к цифровым пинам
      servo_1.attach(10);
      servo_2.attach(11);
      servo_3.attach(12);
      servo_4.attach(13);
      servo_5.attach(14);


      // для восстановления сохранённых параметров положения servo,
      servo_val_1 = EEPROM.read(1), servo_1.write(servo_val_1);
      servo_val_2 = EEPROM.read(2), servo_2.write(servo_val_2);
      servo_val_3 = EEPROM.read(3), servo_3.write(servo_val_3);
      servo_val_4 = EEPROM.read(4), servo_4.write(servo_val_4);
      servo_val_5 = EEPROM.read(5), servo_5.write(servo_val_5);



    }
    void loop()
    {

      //////////////////////////////////////////MOTOR PART/////////////////////////////
      if (mySerial.available())
      {
        val = mySerial.read();
       
        // Задаём движение вперёд
        if (val == 'W') // При нажатии клавиши «W»
        {Serial.println(val);
          // Выводы конфигурируются согласно работе Motor Shield'а
          // Моторы крутятся вперед
          digitalWrite(EN1, HIGH);
          digitalWrite(EN2, HIGH);
          digitalWrite(EN3, HIGH);
          digitalWrite(EN4, HIGH);
          digitalWrite(IN1, HIGH);
          digitalWrite(IN2, HIGH);
          digitalWrite(IN3, HIGH);
          digitalWrite(IN4, HIGH);
        }
       

        // Задаём движение назад
        if ( val == 'S')
        {Serial.println(val);
          digitalWrite(EN1, HIGH);
          digitalWrite(EN2, HIGH);
          digitalWrite(EN3, HIGH);
          digitalWrite(EN4, HIGH);
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, LOW);
          digitalWrite(IN3, LOW);
          digitalWrite(IN4, LOW);
        }
       
        // Задаём движение вправо
        if ( val == 'D')
        {Serial.println(val);
          digitalWrite(EN1, HIGH);
          digitalWrite(EN2, HIGH);
          digitalWrite(EN3, HIGH);
          digitalWrite(EN4, HIGH);
          digitalWrite(IN1, HIGH);
          digitalWrite(IN2, LOW);
          digitalWrite(IN3, HIGH);
          digitalWrite(IN4, LOW);
        }
       

        // Задаём движение влево
        if ( val == 'A')
        {Serial.println(val);
          digitalWrite(EN1, HIGH);
          digitalWrite(EN2, HIGH);
          digitalWrite(EN3, HIGH);
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, HIGH);
          digitalWrite(IN3, LOW);
          digitalWrite(IN4, HIGH);
        }
       

        // Стоп режим
        // При отпускании клавиш в программе в порт шлется «T»
        if ( val == 'T') // При нажатии клавиши «T»
        {Serial.println(val);
          // Выводы ENABLE притянуты к минусу, моторы не работают
          digitalWrite(EN1, LOW);
          digitalWrite(EN2, LOW);
          digitalWrite(EN3, LOW);
          digitalWrite(EN4, LOW);

        }
      }
     
  8. b707

    b707 Гуру

    это все? а что за драйвер мотора? Он не требует подачи импуотсов для вращения?
     
  9. verloor

    verloor Нуб

    не драйвер, два обычных мотор шилда от амперки
     
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Те вы в мониторе
    {Serial.println(val);
    не видите пришедшей команды "Т" ? Тогда дело в передаче-приёме.

    ПС. Зачем у вас несколько раз
    If (val == xxx) {
    Serial.println(val); ?
    Получили - один раз распечатайте, а потом разбирайтесь.
    val = mySerial.read();
    Serial.println(val);
    If (val == xxx) {...

    ПС. Надо бы выбирать буквы не имеющие аналогов. Не поймешь латинская там или русская...
     
    Последнее редактирование: 8 фев 2020
  11. verloor

    verloor Нуб

    да, именно так. Буквы как-то влияют на это?
     
  12. parovoZZ

    parovoZZ Гуру

    Так надо разобраться. Я так понимаю, что работа идет без подтверждения доставки пакета (широковещательная передача), отсюда и провалы в связи.
     
  13. b707

    b707 Гуру

    конечно. Если отправите русскую "Т" вместо латинской - система не сработает
     
  14. verloor

    verloor Нуб

    есть какие-то статьи на эту тему? апп инвентором мало кто пользуется
     
  15. verloor

    verloor Нуб

    приложение само отправляет буквы записанные в коде, я не выбираю в какой раскладке её отправить.
     
    Последнее редактирование: 8 фев 2020
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Измените код как я вам посоветовал. И смотрите что вам приходит вместо "Т", а потом под него измените вашу проверку

    if (mySerial.available()) {
    val = mySerial.read();
    {Serial.println(val); //********************Смотрим что пришло вместо "Т"
    }
    ...
    if (val == 'T') { //*********************Меняем на то что пришло
    {Serial.println(val);
    // Выводы ENABLE притянуты к минусу, моторы не работают
    digitalWrite(EN1, LOW);
    ...
    }
    }
     
  17. parovoZZ

    parovoZZ Гуру

    Есть. Только все на ангельском. Будешь читать?
     
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Мит Инвентор, вроде бы не халявная приблуда. В триал-режиме он имеет ограничение на количество объектов. Может в этом проблема ? Мита я не видел, поэтому только мысли вслух.