Управление роботом с ультразвуковым дальномером
- Войдите на сайт для отправки комментариев
Пнд, 08/08/2022 - 14:30
Привет,
прошу помочь с кодом.
Есть робот с ультразвуковым дальномером, почему то работает не корректно.
По логике если расстояние менее 10 см - робот должен остановится.
но почему то он останавливается вне зависимости от физического препятствия, при мониторинге порта видно что проскакивает расстояние с минусом.
52 cm 52 cm 52 cm -529 cm 43 cm -46 cm 50 cm 50 cm 50 cm 196 cm 51 cm 196 cm 50 cm -171 cm
#define PWMA 3 // выходам arduino присваиваем имена #define PWMB 9 #define AIN1 2 #define AIN2 1 #define BIN1 11 #define BIN2 12 #define STBY 8 #define TRIG 7 #define ECHO 6 long duration, distance; int motorSpeed = 100; // обычная скорость int motorSpeedSlow = 50; // замедленно void setup() { Serial.begin (9600); pinMode(PWMA, OUTPUT); //назначаем статус пинам pinMode(PWMB, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(STBY, OUTPUT); pinMode(TRIG, OUTPUT); // set trig pin as output pinMode(ECHO, INPUT); //echo pin в режим ввода данных digitalWrite(STBY, HIGH); //подаем напряжение на схему управления } void loop() { int duration, distance; digitalWrite(TRIG, LOW); delayMicroseconds(2); digitalWrite(TRIG, HIGH); // передаем серию импульсов длительностью 10 мкс delayMicroseconds(10); digitalWrite(TRIG, LOW); duration = pulseIn(ECHO, HIGH); // принимаем отраженные импульсы distance = duration / 58.2; // рассчитываем расстояние в см Serial.print(distance); Serial.println(" cm"); delay(10); if (distance > 10) { digitalWrite(AIN1, LOW); // едем вперед digitalWrite(AIN2, HIGH); digitalWrite(BIN1, LOW); digitalWrite(BIN2, HIGH); analogWrite(PWMA, motorSpeed); analogWrite(PWMB, motorSpeed); } if (distance < 10) { digitalWrite(AIN1, LOW); // стоим digitalWrite(AIN2, LOW); digitalWrite(BIN1, LOW); digitalWrite(BIN2, LOW); analogWrite(PWMA, motorSpeed); analogWrite(PWMB, motorSpeed); delay(500); digitalWrite(AIN1, HIGH); // едем назад digitalWrite(AIN2, LOW); digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMA, motorSpeedSlow); analogWrite(PWMB, motorSpeedSlow); delay(500); digitalWrite(AIN1, LOW); // стоим digitalWrite(AIN2, LOW); digitalWrite(BIN1, LOW); digitalWrite(BIN2, LOW); delay(100); digitalWrite(AIN1, LOW); // поворот digitalWrite(AIN2, HIGH); digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMA, motorSpeedSlow); analogWrite(PWMB, motorSpeedSlow); delay(2000); } }
А че это такое? Откуда, нафиг, вылезла серия импульсов? Почему тип int?
только учусь.... естественно я смотрел примеры похожих кодов и из них составлял свой...(
что не так с серией импульсов, как можно сделать иначе, подскажете?
по поводу int - http://wiki.amperka.ru/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:hc-sr04-ultrasonic-sensor-distance-module вот отсюда я брал примеры
А че это такое? Откуда, нафиг, вылезла серия импульсов? Почему тип int?
из интернета вестимо:
сделал так, ругается на синтаксис
значить, ты используешь неправильный синтаксис. Используй правильный
сделал правильный, теперь вообще нет реакции... только странный писк от конструкции
что я делаю не так?
из интернета вестимо:
Полный бред в вашем интернете пишут. Ровно те же вопросы.
если бред, подскажите пожалуйста в чем ошибка и как было бы сделать правильно?
Если тебя сочетание int и отрицательных значений ни на что не натолкнуло, то нужно пойти прочитать учебник, а не пытаться наскоком сделать вещи, которым годами нужно учиться.
спасибо что не помогли. думал что форум это то место куда новичок может прийти и получить ответ. а видимо, сюда надо приходить уже будучи покованным учебниками...
думал что форум это то место куда новичок может прийти и получить ответ.
Правила сетевой этики рекомендуют почитать форум прежде, чем на него писать.
Если бы Вы не пренебрегали этими правилами, у Вас не было бы заблуждений о предназначении форума.
Ответ ты получил. Что ты хотел - это чтобы кто-то бросил все свои занятия, и вместо этого сделал то, что нужно тебе. Бесплатно. И ты этого не получишь, хоть с учебниками, хоть с диссертацией.
тут rkit намекает:
так попробуй:
PS с библиотекой NewPing.h работа значительно стабильней
спасибо
пробую использовать эту библиотеку. вот такой код пишу, но он все равно работает не адекватно, хотя расстояния я показывает вроде корректно
может быть что то не так в условиях ?
там до условий еще далеко, во первых сонар должен опрашиваться периодически, минимальное время опроса 29 миллисекунд, обычно принимают 50, далее сравнивать надо сравнимые величины, то есть присвоить значение полученное от сонара некоторой переменной и далее с ней работать, для отладки программы использовать вывод значения сонара в компорт...с сонара периодически лезут артефакты (сильно отличающие значения) значит надо вводить функцию усреднения, коэффициент усреднения рассчитывается из скорости тележки с учётом ограничений числа измерений сонара в секунду в 20 (30) замеров. Значит нужен еще независимый таймер, который будет вызывать эти измерения...функцию усреднения и таймер можно найти здесь на сайте
PS где-то у меня есть код для тележки робота автомата обходящего препятствия, сонар был установлен на платформе поворачивающейся сервой, при подходе к препятствию тележка останавливалась, сонар поворачивался сервой в разные стороны и определял в какую сторону поворачиваться, и далее тележка поворачивалась в этом направлении и продолжала движение
вот код с применением библиотеки и математическим усреднением значения дистанции:
:)
А уз датчик отдельно проверить не пробовали?
:)
А уз датчик отдельно проверить не пробовали?
не с чем, есть другой, влагозащищённый, он с этой библиотекой не работает почему-то
Это ТСу надоб сделать.
Это ТСу надоб сделать.
я поправил скетч, добавил медианное средствами библиотеки, иногда проскакивают артефакты
А у него каковы результаты? УЗ датчик нормально работает?
Спасибо за проявленный интерес к моему вопросу...
давайте чуть подробнее обьясню) вот такая схема: https://ibb.co/TtNwR1Z
моторов 4, соединены между собой.
загружаю данный код который подсказали, в результате работает не корректно - проезжает чуть чуть и сразу поворачивает, хотя препятствий нету никаких рядом и так постоянно. монитор порта вот что выдает, и обновление не частое а будто с какой то задержкой
вот с этиим кодом монитор порта показывает корректно
осталось понять, как добавить сюда условие чтобы он поворачивал, по такой аналогии?
между строками 62 и 63 вставляйте ваш код, раз в 33 миллисекунды в этом месте будете иметь новое значение дистанции, естественно никаких delay() в вашем коде быть не должно, точнее может быть, но очень маленьким, на сквозники при переключении по 1 миллисекунде хватит
вот смотрите... какое странное поведение.
заливаю код:
и все вроде бы ок:
НО когда заливаю полный код:
поведение меняется, проскакивает нулевое расстояние и соотв работает не так как задумано. что это может быть?
пост 24
а лучше смотрим код тут и разбираем до полного просветления
простите, вчера уже уставший был, и не тот код вставил в пост, свой старый... сейчас я пост отредактировал и сделал правильно.
но в новом коде присутствует Delay в условиях.... вечером уберу и посмотрю на поведение. Отпишу о результате