Вопрос по программированию ардуино

Тема в разделе "Arduino & Shields", создана пользователем Miha1410, 13 мар 2022.

  1. Miha1410

    Miha1410 Нуб

    Здравствуйте. Я делаю робота на ультразвуковом датчике. Ардуино + датчик + драйвер с моторами. В общем, что он должен делать. Если дистанция меньше 20, то он останавливается делает разворот и едет дальше... Если дистант больше 20 то тупо едет вперёд... Проблема в том, что датчик не реагирует на припятствие, а моторы крутятся в таком цикле: покрутились, задержка, покрутился один и все по новой
    Где у меня ошибка?
    Код (C++):
    int echo = 2;
    int trig = 3;
    int in1 = 5;
    int in2 = 6;
    int in3 = 7;
    int in4 = 8;

    void setup() {
    Serial.begin(9600);
    pinMode(trig, OUTPUT);
    pinMode(trig, INPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    servo.attach(4);
    }

    void loop() {
    long dur, cm;
    digitalWrite(trig, 0);
    delayMicroseconds(2);
    digitalWrite(trig, 1);
    delayMicroseconds(10);
    digitalWrite(trig, 0);
    dur = pulseIn(echo, 1);
    cm = dur/58;
    Serial.print(cm);
    Serial.println("cm");





    if (cm < 20){
    digitalWrite(in1,0);
    digitalWrite(in2, 0);
    digitalWrite(in3, 0);
    digitalWrite(in4, 0);
    delay(500);
    digitalWrite(in1, 0);
    digitalWrite(in2, 1);
    digitalWrite(in3, 0);
    digitalWrite(in4, 1);
    delay(500);
    digitalWrite(in1, 0);
    digitalWrite(in2, 1);
    digitalWrite(in3, 0);
    digitalWrite(in4, 0);
    delay(500);
    digitalWrite(in1, 1);
    digitalWrite(in2, 0);
    digitalWrite(in3, 1);
    digitalWrite(in4, 0);
    }



    else {
    digitalWrite(in1, 1);
    digitalWrite(in2, 0);
    digitalWrite(in3, 1);
    digitalWrite(in4, 0);}
    }
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Зачем это
    pinMode(trig, OUTPUT);
    pinMode(trig, INPUT);
    Ну пин у вас теперь - вход. Тогда зачем ему команды выхода ?
    digitalWrite(trig, 0);
     
  3. Miha1410

    Miha1410 Нуб

    Упс. Ошибся там Echo INPUT
     
  4. Miha1410

    Miha1410 Нуб

    Код (C++):
    int echo = 2;
    int dur=0;
    int cm=0;
    int trig = 3;
    int in1 = 5;
    int in2 = 6;
    int in3 = 7;
    int in4 = 8;

    void setup() {
    Serial.begin(9600);
    pinMode(trig, OUTPUT);
    pinMode(echo, INPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    servo.attach(4);
    }

    void loop() {
    //long dur, cm;
    //digitalWrite(trig, 0);
    //delayMicroseconds(2);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    dur = pulseIn(echo, HIGH);
    cm = dur/58;
    Serial.print(cm);
    Serial.println("cm");





    if (cm < 20){
    digitalWrite(in1,0);
    digitalWrite(in2, 0);
    digitalWrite(in3, 0);
    digitalWrite(in4, 0);
    delay(500);
    digitalWrite(in1, 0);
    digitalWrite(in2, 1);
    digitalWrite(in3, 0);
    digitalWrite(in4, 1);
    delay(500);
    digitalWrite(in1, 0);
    digitalWrite(in2, 1);
    digitalWrite(in3, 0);
    digitalWrite(in4, 0);
    delay(500);
    digitalWrite(in1, 1);
    digitalWrite(in2, 0);
    digitalWrite(in3, 1);
    digitalWrite(in4, 0);
    }



    else {
    digitalWrite(in1, 1);
    digitalWrite(in2, 0);
    digitalWrite(in3, 1);
    digitalWrite(in4, 0);}
    delay(500);
    }
     
    Последнее редактирование модератором: 13 мар 2022
  5. Airbus

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

    Ну что он в порт выводит?Дистанцию измеряет?Зачем dur, cm-long? Там и int за глаза. Я их вообще делаю глобальными и присваиваю 0. Типа так
    Код (Text):
    #define Trig 1//TX
    #define Echo 0//RX
    #define ledPin 13

    int impulseTime=0;
    int distance_sm=0;
    int dist= 50; //Заданная дистанция
    void setup()
    {
      pinMode(Trig, OUTPUT); //инициируем как выход
      pinMode(Echo, INPUT); //инициируем как вход
      pinMode(ledPin, OUTPUT);
     
    }

    void loop()
    {
      digitalWrite(Trig, HIGH);
      // Подаем импульс на вход trig дальномера
      delayMicroseconds(10); // равный 10 микросекундам
      digitalWrite(Trig, LOW); // Отключаем
      impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
      distance_sm=impulseTime/58; // Пересчитываем в сантиметры
         if (distance_sm < dist) // Если расстояние менее dist
      {    
        digitalWrite(ledPin, HIGH); // Светодиод горит
      }
      else
      {  
        digitalWrite(ledPin, LOW); // иначе не горит
      }  
      delay(500);
        /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего.
       Это время называется периодом цикла (cycle period).Рекомендованный период между импульсами должен быть не менее 50 мс.  */
    }
     
  6. Miha1410

    Miha1410 Нуб

    Тоесть проблема не в командной части для моторов, а в моём Кривом написании команд для УД?
     
  7. b707

    b707 Гуру

    вы вообще поняли. что вам написали? - или русский не родной?
    Вас просили добавить вывод измеренных сантиметров в монитор и посмотреть, какие там значения в зависимости от расстояния до сенсора.
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Даташит требует старт-импульс 10 мкс. Вычисление дистации может производиться двумя путями согласно ДШ -

    .You can calculate the range through the time interval between sending trigger signal and
    receiving echo signal. Formula: uS / 58 = centimeters or uS / 148 =inch; or: the
    range = high level time * velocity (340M/S) / 2; we suggest to use over 60ms
    measurement cycle, in order to prevent trigger signal to the echo signal.

    Ты сможешь рассчитать диапазон через интервал времени между отправкой триггерного сигнала и приемом эхо-сигнала. Формула: мкс/58 = сантиметры или мкс/148 =дюймы; или дистанция = время высокого уровня * скорость (340 м/с) / 2; мы предлагаем использовать более 60 мс для цикла измерения, чтобы предотвратить наложение триггер-сигнала на эхо-сигнал.

    Я так понимаю. коль работаете по длительности (время высокого уровня) - надо использовать вторую формулу.
     
    Последнее редактирование: 13 мар 2022
  9. Airbus

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

    Да. Возьмите из моего кода он рабочий. Проверяйте я Ваш код поправил
     
    Последнее редактирование: 13 мар 2022
  10. Miha1410

    Miha1410 Нуб

    Я поменял, но проблема осталась та же. Моторы крутятся вот поэтому циклу
    Код (C++):
    digitalWrite(in1, 0);
    digitalWrite(in2, 1);
    digitalWrite(in3, 0);
    digitalWrite(in4, 1);
    delay(500);
    digitalWrite(in1, 0);
    digitalWrite(in2, 1);
    digitalWrite(in3, 0);
    digitalWrite(in4, 0);
    И так каждый раз по новой, наверно ошибка в командной части для моторов
     
  11. Airbus

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

    Расстояние измеряет? Что выдает в Сериал? УЗ датчик правильно подключен? Он вообще живой?
     
  12. Miha1410

    Miha1410 Нуб

    Код (C++):
    526cm
    525cm
    524cm
    525cm
    13cm
    00cm
    cm
    0cm
    0cm
    0,0cm
    9894474
    Это с моторами

    [code=cpp]m
    8cm
    7cm
    9cm
    7cm
    7cm
    6cm
    5cm
    5cm
    7cm
    5cm
    4cm
    4cm
    4cm
    5cm
    5cm
    5cm
    5cm
    139cm
    217cm
    228cm
    217cm
    229cm
    230cm
    229cm
    228cm
    216cm
     
    Без моторов всё в порядке
     
  13. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Слушайте - вы русский язык понимаете ? Вас просят протестировать сонар. Вы можете рукой перед ним подвигать и посмотреть как он расстояния показывает (до руки). Что это за череда одного и того же числа ?
    2. Мотор - механическое инерционное устройство. При изменении направления вращения - надо делать тайм-аут с остановкой (обесточиванием).
     
  14. Miha1410

    Miha1410 Нуб

    Я говорю, что когда подключены моторы датчик не работает. Рукой я вожу не вожу в мониторе фигня какая то вылазеет, когда без моторов ( я убираю из кода условие ) , то есть остаётся только один датчик, то все работает, рукой вожу он все выводит
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Без моторов - начиная от двух метров, до двадцати сантиметров - выведите нам "плавную" череду значений. И при 20 см пусть он напишет нам "разворачиваюсь". Чето вы темните.
     
  16. Miha1410

    Miha1410 Нуб

    Пишу я допустим даже так, самое простое
    Код (C++):
    if (cm < 20){
    digitalWrite(in1,0);
    digitalWrite(in2, 0);
    digitalWrite(in3, 0);
    digitalWrite(in4, 0);
    }



    else {
    digitalWrite(in1, 1);
    digitalWrite(in2, 0);
    digitalWrite(in3, 1);
    digitalWrite(in4, 0);}

    }
    если меньше 20 то мотор стоп, нет, крутится. Это все работает. Датчик живой

    Я просто хочу понять, как сделать так чтобы робот остановился один мотор развернул его и он дальше поехал
     
  17. Miha1410

    Miha1410 Нуб

    Код (C++):
    106cm
    103cm
    101cm
    101cm
    100cm
    104cm
    102cm
    100cm
    100cm
    100cm
    101cm
    103cm
    101cm
    103cm
    101cm
    102cm
    102cm
    102cm
    102cm
    101cm
    100cm
    101cm
    101cm
    102cm
    104cm
    100cm
    101cm
    101cm
    100cm
    102cm
    100cm
    101cm
    100cm
    103cm
    101cm
    102cm
    101cm
    101cm
    101cm
    100cm
    109cm
    100cm
    102cm
    104cm
    100cm
    101cm
    99cm
    100cm
    99cm
    99cm
    98cm
    100cm
    100cm
    98cm
    89cm
    91cm
    98cm
    99cm
    98cm
    90cm
    99cm
    98cm
    88cm
    91cm
    77cm
    66cm
    71cm
    86cm
    91cm
    91cm
    97cm
    86cm
    88cm
    92cm
    96cm
    96cm
    85cm
    96cm
    87cm
    88cm
    96cm
    85cm
    96cm
    86cm
    85cm
    96cm
    85cm
    97cm
    86cm
    86cm
    96cm
    82cm
    85cm
    95cm
    83cm
    94cm
    85cm
    83cm
    94cm
    84cm
    84cm
    93cm
    83cm
    93cm
    92cm
    82cm
    92cm
    92cm
    81cm
    92cm
    91cm
    82cm
    85cm
    91cm
    93cm
    92cm
    92cm
    91cm
    90cm
    91cm
    91cm
    91cm
    91cm
    92cm
    91cm
    90cm
    91cm
    89cm
    89cm
    90cm
    88cm
    89cm
    90cm
    88cm
    88cm
    89cm
    89cm
    87cm
    91cm
    88cm
    88cm
    88cm
    74cm
    72cm
    88cm
    87cm
    74cm
    87cm
    87cm
    72cm
    87cm
    86cm
    86cm
    86cm
    85cm
    85cm
    85cm
    85cm
    84cm
    84cm
    84cm
    84cm
    84cm
    84cm
    83cm
    84cm
    84cm
    83cm
    73cm
    84cm
    83cm
    82cm
    83cm
    82cm
    82cm
    82cm
    83cm
    82cm
    82cm
    82cm
    82cm
    81cm
    72cm
    81cm
    81cm
    81cm
    80cm
    80cm
    81cm
    80cm
    80cm
    80cm
    80cm
    80cm
    80cm
    80cm
    79cm
    79cm
    79cm
    79cm
    79cm
    79cm
    78cm
    79cm
    79cm
    78cm
    78cm
    77cm
    77cm
    78cm
    78cm
    77cm
    77cm
    77cm
    77cm
    77cm
    77cm
    76cm
    76cm
    76cm
    77cm
    76cm
    77cm
    76cm
    75cm
    76cm
    75cm
    75cm
    75cm
    74cm
    74cm
    74cm
    73cm
    74cm
    74cm
    73cm
    74cm
    73cm
    73cm
    73cm
    72cm
    73cm
    72cm
    72cm
    73cm
    72cm
    72cm
    72cm
    71cm
    72cm
    71cm
    71cm
    71cm
    70cm
    71cm
    70cm
    71cm
    70cm
    70cm
    70cm
    70cm
    69cm
    69cm
    69cm
    69cm
    69cm
    69cm
    69cm
    68cm
    68cm
    68cm
    68cm
    68cm
    67cm
    67cm
    67cm
    67cm
    66cm
    67cm
    66cm
    66cm
    66cm
    66cm
    66cm
    66cm
    66cm
    66cm
    65cm
    65cm
    65cm
    65cm
    65cm
    65cm
    64cm
    64cm
    65cm
    65cm
    64cm
    64cm
    64cm
    64cm
    63cm
    63cm
    63cm
    63cm
    63cm
    63cm
    63cm
    62cm
    62cm
    62cm
    62cm
    62cm
    62cm
    61cm
    62cm
    61cm
    61cm
    61cm
    61cm
    61cm
    60cm
    61cm
    60cm
    60cm
    60cm
    60cm
    60cm
    60cm
    60cm
    59cm
    59cm
    59cm
    59cm
    58cm
    58cm
    58cm
    58cm
    58cm
    58cm
    58cm
    58cm
    57cm
    57cm
    57cm
    57cm
    57cm
    57cm
    56cm
    56cm
    56cm
    56cm
    56cm
    56cm
    56cm
    55cm
    55cm
    55cm
    55cm
    55cm
    55cm
    55cm
    54cm
    54cm
    54cm
    54cm
    54cm
    53cm
    53cm
    53cm
    53cm
    53cm
    53cm
    53cm
    53cm
    53cm
    53cm
    52cm
    52cm
    52cm
    52cm
    52cm
    52cm
    51cm
    51cm
    51cm
    51cm
    51cm
    51cm
    51cm
    50cm
    50cm
    50cm
    50cm
    49cm
    50cm
    49cm
    49cm
    49cm
    49cm
    49cm
    48cm
    48cm
    48cm
    48cm
    48cm
    48cm
    47cm
    47cm
    47cm
    47cm
    47cm
    46cm
    46cm
    46cm
    46cm
    46cm
    46cm
    46cm
    46cm
    45cm
    45cm
    45cm
    45cm
    45cm
    44cm
    44cm
    44cm
    44cm
    44cm
    43cm
    43cm
    43cm
    43cm
    43cm
    43cm
    43cm
    43cm
    43cm
    43cm
    42cm
    42cm
    42cm
    42cm
    42cm
    42cm
    41cm
    41cm
    41cm
    41cm
    41cm
    40cm
    40cm
    40cm
    40cm
    40cm
    40cm
    40cm
    40cm
    39cm
    40cm
    40cm
    39cm
    39cm
    39cm
    39cm
    39cm
    39cm
    39cm
    39cm
    38cm
    38cm
    38cm
    38cm
    38cm
    38cm
    38cm
    38cm
    37cm
    37cm
    37cm
    37cm
    37cm
    37cm
    37cm
    36cm
    36cm
    36cm
    36cm
    36cm
    36cm
    36cm
    36cm
    36cm
    36cm
    35cm
    35cm
    35cm
    35cm
    35cm
    35cm
    35cm
    34cm
    35cm
    34cm
    34cm
    34cm
    34cm
    34cm
    34cm
    34cm
    34cm
    34cm
    33cm
    33cm
    33cm
    33cm
    33cm
    33cm
    33cm
    32cm
    32cm
    32cm
    32cm
    32cm
    32cm
    32cm
    32cm
    32cm
    32cm
    32cm
    31cm
    32cm
    31cm
    31cm
    31cm
    31cm
    31cm
    31cm
    31cm
    31cm
    31cm
    31cm
    31cm
    31cm
    30cm
    31cm
    30cm
    30cm
    30cm
    30cm
    30cm
    30cm
    30cm
    30cm
    30cm
    29cm
    30cm
    29cm
    30cm
    29cm
    30cm
    29cm
    29cm
    29cm
    29cm
    29cm
    29cm
    29cm
    29cm
    29cm
    29cm
    28cm
    28cm
    28cm
    28cm
    28cm
    28cm
    28cm
    28cm
    28cm
    27cm
    27cm
    27cm
    27cm
    27cm
    27cm
    27cm
    26cm
    26cm
    26cm
    26cm
    26cm
    26cm
    26cm
    26cm
    26cm
    26cm
    26cm
    25cm
    25cm
    25cm
    25cm
    25cm
    25cm
    25cm
    25cm
    25cm
    25cm
    24cm
    24cm
    24cm
    24cm
    24cm
    24cm
    24cm
    24cm
    24cm
    23cm
    23cm
    23cm
    23cm
    23cm
    23cm
    23cm
    23cm
    23cm
    23cm
    22cm
    23cm
    22cm
    22cm
    22cm
    22cm
    22cm
    22cm
    22cm
    22cm
    22cm
    22cm
    22cm
    21cm
    22cm
    21cm
    21cm
    21cm
    21cm
    21cm
    21cm
    21cm
    21cm
    21cm
    21cm
    21cm
    20cm
    20cm
    20cm
    20cm
    20cm
    20cm
    20cm
    20cm
    20cm
    20cm
    20cm
    19cm
    20cm
    19cm
    20cm
    19cm
    20cm
    19cm
    19cm
    19cm
    19cm
    19cm
    19cm
    19cm
    19cm
    19cm
    19cm
    19cm
    19cm
    19cm
    18cm
    18cm
    18cm
    18cm
    18cm
    18cm
    18cm
    18cm
    18cm
    18cm
    18cm
    17cm
    17cm
    17cm
    17cm
    17cm
    17cm
    17cm
    17cm
    17cm
    17cm
    16cm
    16cm
    16cm
    17cm
    17cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    16cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    15cm
    14cm
    15cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
    14cm
     
     
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Да как мы можем знать как у вас моторы включены и сколько их. Какому мотору какой выход принадлежит. Какой тип включения - мост или полумост. А лучше схему.
     
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    О. Это уже прогресс. А теперь пусть он выведет слово "разворачиваюсь" при 20 см. Как я просил выше. Я серьёзно !!!
    Потом - запустите программу в штатном режиме, но отключите движки аппаратно. Проверьте работу сонара. Потом подсоединяйте по одному движки держа игрушку в руках (без нагрузки). Потом на ходу. Возможно провалы по питанию сбоят сонар или ардуину.
     
    Последнее редактирование: 13 мар 2022
  20. Miha1410

    Miha1410 Нуб

    Моторы обычные с редуктором Желтые
    in1 = 5
    in2 =6
    in3 = 7
    in4 = 8
    Датчик подключен Echo = 2 Trig = 3
    Схема если что из инета, я подключал как написал выше
    [​IMG]
     

    Вложения:

    Последнее редактирование модератором: 13 мар 2022