Что-то здесь не так.
- Войдите на сайт для отправки комментариев
Доброго времени суток. Это мой первый опыт работы с ардуино и соответственно первый скетч, посему сильно не смейтесь, особенно не ругайтесь, если что не так.
Итак. Задача: сделать робота, движущегося по линии.
Успешно выполнил. Далее пытаюсь добавить функцию определения расстояния и при наличии препятствия - должен останавливаться, либо если препятствие перед началом движения - не начинать движение. Внес соответсвующие изменения в скетч - программа ошибок не нашла. Загружаю - не работает. Не могу разобраться - почему. Что неправильно сделал, либо чего-то недописал. Ткните пожалуйста. Только начинаю осваивать язык программирования. До этого ничем подобным не занимался, кроме электроники и пайки
вот смотри
вот смотри
О_О
Как бы намек ТС , где скетч?! Ваш кэп
я запретил.
извиняюсь, на работе отвлекли
//Робот с функцией следования по черной полосе "синей изоленте".
оч. смешно
1. Прочитайте и перевыложите скетч. Это не придирка, так как Вы выложили обсуждать невозможно - нет номеров строк.
программа ошибок не нашла.
Открою Вам страшный секрет, - она их и не искала :))) Она лишь проверила синтаксис. А искать ошибки - это дело программиста.
ЕвгенийП спасибо за конструктивную критику. Сейчас попробую исправить
1.
проверка условия в строке 129 лишняя. Обратное условие уже проверялось в строке 103, так что куда оно нафиг денется. Оставьте только else, остальное убирайте.
2.
Зачем Вы пишете "
return
с;
" в строке 95, если в строке 102 Вы этим не пользуетесь? К тому же , делая ненужную вещь, Вы ещё и ошибку внесли - dist у Вас long, а функция izmdist - int. В строке 86 заменяёте int на void, а строку 95 удаляйте вовсе.А теперь по сути Вашей проблемы.
Откуда Вы взяли значение 10 для MINdist? Вы знаете, что возвращает pulseIn в строке 93? Она вовращает время в микросекундах за которое звук прошёл расстояние от датчика до препятствия и обратно. Если считать скорость звука 330м/с, то 10 соответсвует дистанции в семнадцать миллиметров. Это то, что Вы хотели? Боюсь, что нет.
А теперь общее правило. Общее - не только про эту задачу: Никогда не работайте вслепую!!!
Вот возникла у Вас проблема: переменная сравнивается не так, как Вы ожидали. Первое действие - это не писать в форум. а просто распечатать эту переменную и посмотреть на неё. Просто поставьте перед строкой 103 вывод dist в сериал и посмотрите чему эта самая dist равна. Подносите и отодвигайте препятствие и смотрите как меняется dist. Тогда Вы увидите разумное значение dist на выбранной Вами дистанции останова и вставите его в качестве значения MINdist. После этого у Вас всё нормально заработает. Удачи!
ЕвгенийП, большое Спасибо за поправки.
Насчет long и int: я пока вникаю в значение всех этих терминов и в процессы, связанные с этими терминами. Поэтому, видимо,не уловив суть определения указанных функций, допустил в программе ошибку.
По значению MINdist: считаю не критичным цифру 10. На функциональность программы это не влияет. Я намеренно занизил расстояние, чтобы проверить работу, пока вплотную не поднесешь препятствие к датчику.
Насчет работы вслепую: пока не приходилось на практике применять Serial. Теперь буду пробовать.
Буду пробовать обновленный с вашей помощью скетч
только бы вот побольше на доступном мне языке теории как вывести на экран работу функций скетча
Да, какая там теория? В сетапе вызываете Serial.begin(115200); а по мере необходимости что-то напечатать пишете Serial.println(dist); Только не забудьте в окне монитора скорость правильную выставить, чтобы была такая же, как и в Serial.begin() (у меня вот выше была 115200).
тогда вопрос такой. Имеет ли значение - какую я выберу скорость? А то в большинстве (почти во всех, что я видел) скетчей стоит скорость 9600. А вы предлагаете 115200
Нет, если Вы не собираетесь выводить часто. Если собираетесь, то вывод будет притормаживать.
загрузил, проверил работу сонара в сериале - все показывает. но в работе робот на препятствие не реагирует, все-равно едет. Но это уже хоть что-то. До этого вообще не было движений. Буду дальше искать, где ошибка. Вот обновленный с учетом советов скетч:
Так, а чё печатает-то? Выкладывайте
Если вы про печать в сериале, то печатает от 200 до 15000 в зависимости от того, как близко подношу ладонь к сонару или совсем убираю и он стену видит
И что, при 200 или там 300, она у Вас не останавливается.
Значит возможны два варианта: либо что-то напутано таки в условии, но я пока не вижу что, либо не работает функция stopp.
Чтобы проверить какой вариант имеет место, опять же, принцип тот же (усвойте его наконец!) - не работать вслепую..
1. После строки 132 вставляем печать чего угодно (например, Serial.println("Stroka 133"); )
2. После строки 80 вставляем печать опять же чего угодно (например, Serial.println("Stroka 81"); )
3. После строки 104 вставляет печать переменной MINdist
Таким образом мы точно узнаём попадает она в функцию stopp или нет. Ведь если dist < MINdist, она обязана туда попасть. Вот и посмотрим.
Если попадает, но не останавливается - разбирайтесь почему Вы везде подали LOW, а она едет (это скорее вопрос к схеме, чем к программе). А вот если не попадает, будем думать, почему.
Большое спасибо. Завтра попробую.
И что, при 200 или там 300, она у Вас не останавливается.
Значит возможны два варианта: либо что-то напутано таки в условии, но я пока не вижу что, либо не работает функция stopp.
Чтобы проверить какой вариант имеет место, опять же, принцип тот же (усвойте его наконец!) - не работать вслепую..
1. После строки 132 вставляем печать чего угодно (например, Serial.println("Stroka 133"); )
2. После строки 80 вставляем печать опять же чего угодно (например, Serial.println("Stroka 81"); )
3. После строки 104 вставляет печать переменной MINdist
Таким образом мы точно узнаём попадает она в функцию stopp или нет. Ведь если dist < MINdist, она обязана туда попасть. Вот и посмотрим.
Если попадает, но не останавливается - разбирайтесь почему Вы везде подали LOW, а она едет (это скорее вопрос к схеме, чем к программе). А вот если не попадает, будем думать, почему.
Вот так - ненавязчиво, шаг за шагом и научите нас правильному тону! Снимаю шляпу!
схема скорее всего правильная, так как робот встает при сигнале HIGH на обоих датчиках линии. Но не буду, усвоив урок о работе вслепую что-либо утверждать. Надо проверить.
Постаил сериал в указанные строки и результат таков:
монитор порта при сигнале LOW на датчиках линии:
10569
1000
stroka81
10564
1000
stroka81
.......
при сигнале HIGH на датчиках линии:
8234
1000
8156
1000
......
при сигнале HIGH на датчикеах линии и перпятствии меньше установленного минимума:
547
1000
stopp
stroka81
.......
вроде все правильно
Что-то я вообще ничего не понял. Сейчас после введения сериала в указанные строки и мониторинга проверил робота снова - все работает. Странно - ведь толком программу не менял. Я в шоке.
Ну да и ладно. Спасибо ЕвгенийП за помощь.
хотя нет. Кое-какие изменения внес: в строке 128 поставил 50, а в строке 133 - 100
Добавив некоторые дополнительные возможности своего робота, получился робот, который, используя 2 датчика линии, должен двигатся по светлой линии. При движении мигает светодиод, выполняя функцию световой сигнализации включенного состояния робота. Поставил 3 датчика препятствия HC-SR-04
Также хотел использовать звуковую сигнализацию, но с ней выходят проблемы. Но об этом позже.
Проблемы: Робот во время схода одним датчиком линии со светлой линии не успевает среагировать и включить левый( ну или правый) ход. Из-за чего сходит с линии и соответственно встает. Либо если все-таки успевает среагировать на сход с линии и включая левый (ну или правый) ход, то при возврате на линию может не успеть включить ход "вперед" и соответственно поворот продолжается и выводит робота с линии. Что соответственно приводит к полному сходу с линии и его остановке.
Попробовал оставить один датчик препятствия. Стало получше. Стал успевать реагировать на сход с линии. Но все равно с запаздыванием.
Вопрос: - почему такое происходит?
- можно ли это исправить?
Я так понимаю, что процесс измерения расстояния отнимает время, во время которого ардуино не принимает информацию от датчиков линии и соответственно не реагирует ни изменение их статуса?
Нельзя ли сделать так, чтобы на опрос статуса датчиков линии и на соответствующее их статусу действие никакие другие процессы не влияли?
Думал исправить это остановкой робота на время, необходимое для измерения расстояния,но желательно, чтобы робот во время измерения расстояния не останавливался.
Вот скетч с тремя датчиками препятствия:
Вам скорость звука известна?
Прикинтьте, на каком расстоянии Вам нужно обнаруживать препятствие и задавайте таймаут для PulseIn в соответствии с рассчитанным временем.
Скорость звука мне известна. Непонятна ваша мысль про таймаут для PulseIn. Мне нужно будет останавливать робота на время, необходимое процессу PulseIn, высчитавающему заданное мной расстояние? И только после этого продолжать движение?
Где читал, не помню, что во время PulseIn микроконторллер слеп и глух, не воспринимает сигналы внешних датчиков. Так ли это?
Если да, то значит ли, что пользуясь тремя датчиками, у которых свой PulseIn, я увеличиваю продолжительность слепоты в 3 раза. Или все 3 процесса происходят в одно время?
Либо нужно уходить от delay. Везде, где он используется - использовать millis. Кто как думает?
http://arduino.ru/Reference/PulseIn
часть делеев вообще можно убрать, а местами без паузы и не обойтись.
Работайте с 3-мя сразу используя прямой доступ к портам. Не разбирался к какому порту они у вас подключены, но лучше повесьте все на один порт. От использования пульсеин естественно придется отказаться. Как вариант возможно использование милис, а можно и другой таймер запускать, что думаю лучше будет (большей точности можно добиться). т.е. посылайте уз сразу с трех, читайте порт пока не приедет 1,1,1 , а можно только первой. по приходу читайте таймер (или 3 раза), останавливайте и обнуляйте Т. думаю получится быстрее, возможно придется вносит изменения в конструкцию, чтоб не было влияния датчиков друг на друга.
а можно и один датчик использовать, поворачивая его. локатор видели?
зы: а внизу ссылки "Справочник языка ардуино". Во! оказывается дуиноделы новый язык придумали, а я и не знал. гы-гы :-)
Либо нужно уходить от delay. Везде, где он используется - использовать millis. Кто как думает?
То что от delay() в серьезных проектах это понятно. Другое дело, не все новички умеют пользоваться millis(),micros(). PulseIn тоже не айс.
часть делеев вообще можно убрать, а местами без паузы и не обойтись.
Подскажите пожалуйста без каких делеев не обойтись. И не совсем до конца понгимаю - насколько продолжительными должны быть те, без которых не обойтись.
Работайте с 3-мя сразу используя прямой доступ к портам. Не разбирался к какому порту они у вас подключены, но лучше повесьте все на один порт. От использования пульсеин естественно придется отказаться. Как вариант возможно использование милис, а можно и другой таймер запускать, что думаю лучше будет (большей точности можно добиться). т.е. посылайте уз сразу с трех, читайте порт пока не приедет 1,1,1 , а можно только первой. по приходу читайте таймер (или 3 раза), останавливайте и обнуляйте Т. думаю получится быстрее, возможно придется вносит изменения в конструкцию, чтоб не было влияния датчиков друг на друга.
а можно и один датчик использовать, поворачивая его. локатор видели?
зы: а внизу ссылки "Справочник языка ардуино". Во! оказывается дуиноделы новый язык придумали, а я и не знал. гы-гы :-)
1. Правильно ли я понял, что все на один порт -это соединить разьемы трех датчиков параллельно и посадить на один порт? Не думал, что так можно.
2. через один датчик на серве прошел уже - вариант не сойдет. Все равно 3 раза приходится замерять расстояние , сравнивать с заданным и затем действовать в согласии с измеренным расстоянием. Уж лучше 3 одновременно.
Другое дело, не все новички умеют пользоваться millis(),micros(). PulseIn тоже не айс.
На а что теперь делать новичкам? Вот и приходится спрашивать совета зрелых и бывалых, просить подсказок и надеяться на помощь.
А чем PulseIn не айс?
Скорость звука мне известна. Непонятна ваша мысль про таймаут для PulseIn. Мне нужно будет останавливать робота на время, необходимое процессу PulseIn, высчитавающему заданное мной расстояние? И только после этого продолжать движение?
О-хо-хох...
Т.е. скорость звука Вы знаете, но арифметика Вам неизвестна и читать Вы не умеете.
Ладно, сделаю это за Вас.
1. Внимательно читаем документацию: http://arduino.ru/Reference/PulseIn , где узаем, чьл функцию можно вызвать либо с двумя, либо с тремя параметрами. Последний - таймаут, по умолчанию 1 секунда. Т.е. если мы не задаем таймаут, наша тележка ровно секунду послде вызова команды будет неуправляемо двигаться по инерции. Если, скажем, ее скорость 0.5 м/с, то за это время она может уйти на 0.5 м от линии.
2. За секунду звук успеет дойти до препятствия на расстоянии 170 м, отразиться от него и вернуться обратно. Но у нашего датчика недостаточно чувствительности, чтобы почувствовать препятствие на расстоянии 170 м. Для него предел - где-то около 2 м. А звук проходит 4 метра (туда и обратно) примерно за 12 мс. Стало быть, абсолютно бессмысленно задавать величину таймаута бошлее 12 мс. Кстати, тележка за это время пройдет всего 6 мм, т.е. просто не успеет сойти с линии.
3. Если нам кажется, что и 12 мс слишком ного, можно вообще задаьбся расстоянием, скажем, 40 см - вполне достаточно, чтобы заметить препятствие и отвернуть в сторону. Тогда нам нужнор задавать таймаут всего 2.5 мс. Отклонгение тележки за это время не будет превосходить 1.2 мм.
4. Для того, чтобы это все посчитать вполне достаточно курса средней школы. Но главное - это решение задачи, не выходя за пределы концепции Ардуино. ВЫ протичном случае можно сменить концепцию с Ардуино на AVR: прочитать дэйташит и самому написать неблокирующий аналог PulseIn, как Вам уже советовали ывше.
Уважаемый andriano, спасибо, что разжевали. Повторюсь: с ардуино знаком только недавно, с программирование тоже стал знакомиться в связи со знакомством с ардуино. До этого работал только с паяльником и схемами. Следовательно все термины, связанные с программированием слышу впервые и поэтому нужно для их осмысления больше времени, чем например вам. Да и без посторонней помощи это было бы еще дольше. А ссылка http://arduino.ru/Reference/PulseIn у меня закреплена во вкладках - постоянно читаю. Просто там все кратко и без обьяснений. И поэтому не всегда ясно, что там имеется ввиду и как понимать то или иное выражение.
А вот спасибо вам - немного раскрыли момент при PulseIn. Например только сейчас догнал, что если препятствия не будет ближе, чем способен увидеть датчик, то ожидание сигнала составит 1 сек. Поэтому нужно сразу установить ограничение по времени ожидания сигнала ровно на такую величину, на которой я ожидаю увидеть препятствие.В моем случае это 50 см и соответственно время ожидание 3 мс.
Надеюсь правильно все понял. Но есть другой вопрос, который еще не осмыслил - если delay стоит не в LOOP, а в SETUP, тормозит ли она программу?
Если нет, то как определять нужную продолжительность?
Если да, то ее необходимо тоже заменить в настройках работы мотора forward, left, right?
И еще: не совсем понятно обьяснение принципа действия датчика препятствия и процесса измерения расстояния. Позвольте я сформулирую так, как понял это я. и если ошибаюсь или чего-то не до сказал - поправьте и дополните.
Итак: на вывод trigg подается с выхода ардуино сигнал длительностью 10 мс. Этот сигнал в датчике разбивается на пачку из 8 УЗ импульсов 40кГц и посылается вперед.
И в это же самое время, сразу после подачи этих импульсов, на выводе ECHO появляется сигнал HIGH, который у нас подключен ко входу ардуино. И функция PulseIn начинает считать его продолжительность. А продолжаться по времени этот сигнал HIGH будет ровно столько, сколько пачка импульсов 40кГц будет идти до препятствия, отразиться от него и вернется в приемник датчика. И тут же сигнал HIGH c вывода ECHO исчезает. Фунция PulseIn считает это момент концом отсчета.
Т.о это время и есть время которое ультразвук преодолел, начиная свой долгий путь от излучателя датчика до препятствия и обратно домой - в приемник датчика. Но следует учесть, что в данном датчике ультразвук способен вернуться обратно только отразившись от препятствия, находящегося не больше 5 метров. Если препятствие находится далее 5 метров - датчик их не увидит и соответственно сигнал либо не дойдет до него, либо отразившись - не дойдет обратно из-за недостаточно сильного сигнала.
И тут случится оказия: появившийся на выводе ECHO сигнал HIGH так и не исчезнет. Но оказывается не тут-то было. Разработчики датчика препятствия установили ограничение по времени наличия сигнала HIGH на выводе ECHO, которое равно 1 сек. Т.о. не встретив препятствия, через секунду после излучения пачки импульсов 40кГц сигнал HIGH исчезает с вывода ECHO.Но и получается, что ардуино все это долгое для него время (1сек) ждал ответа, из-за чего вся его другая деятельность, связанная с работой других датчиков была парализована.
Но если в функции PulseIn регламентировать время возврата отразившейся от препятствия пачки импульсов 40кГц с помощью переменной timeout, то ардуино будет ждать не секунду, а столько, сколько мы указали.
Подскажите, все ли правильно я для себя уяснил. И если да, то хотелось хотя бы примерно вот такого развернутого объяснения терминов.
Подскажите пожалуйста без каких делеев не обойтись. И не совсем до конца понгимаю - насколько продолжительными должны быть те, без которых не обойтись.
не делеев, а пауз. с уз излучателя должна уйти волна в течении N-ного времени. у вас это 10 мс. можно конечно и на милис переписать, но не критично.
121,131,141 зачем там пауза?
1. Правильно ли я понял, что все на один порт -это соединить разьемы трех датчиков параллельно и посадить на один порт? Не думал, что так можно.
не правильно. порт это не нога мк. дуина это только голая плата и все. изучайте описани самого мк.
у мк есть порты PORT A, PORT B и тд. это 8 битные регистры ввода вывода. в порт можно записать байт и значение получиться сразу на 8 ногах. Так же и читать его можно 8 - ног за раз.
[не делеев, а пауз. с уз излучателя должна уйти волна в течении N-ного времени. у вас это 10 мс. можно конечно и на милис переписать, но не критично.
121,131,141 зачем там пауза?
Про 121, 131, 141 сам не знаю. Исправлю. Меня интересует смысл и необходимая продолжительность 83, 92, 101, 109, 196
не правильно. порт это не нога мк. дуина это только голая плата и все. изучайте описани самого мк.
у мк есть порты PORT A, PORT B и тд. это 8 битные регистры ввода вывода. в порт можно записать байт и значение получиться сразу на 8 ногах. Так же и читать его можно 8 - ног за раз.
Подскажите пожалуйста , где можно почитать про это
не надо пока вам читать про порты. Заставьте двигаться робота, оно и без этого поедет вполне нормально при правильном коде.
...с ардуино знаком только недавно, с программирование тоже стал знакомиться в связи со знакомством с ардуино. До этого работал только с паяльником и схемами. Следовательно все термины, связанные с программированием слышу впервые и поэтому нужно для их осмысления больше времени, чем например вам. Да и без посторонней помощи это было бы еще дольше. А ссылка http://arduino.ru/Reference/PulseIn у меня закреплена во вкладках - постоянно читаю. Просто там все кратко и без обьяснений. И поэтому не всегда ясно, что там имеется ввиду и как понимать то или иное выражение.
1. То, что я писал, никакого отношения к Ардуино не имеет - исключительно школьный курс физики.
2. Описание http://arduino.ru/Reference/PulseIn действительно не просто излишне краткое, а просто неполное, не описывающее некоторых тонкостей, в результате чего может сложиться просто неверное понимание. Рекомендую англоязычную документацию, по крайней мере, PulseIn там описана лучше. Подозреваю, что и другие тоже.
Надеюсь правильно все понял. Но есть другой вопрос, который еще не осмыслил - если delay стоит не в LOOP, а в SETUP, тормозит ли она программу?
delay предназначена именно для того, чтобы тормозить программу. Соответственно, везде, где мы ее вызываем, она тормозит. Другое дело, что setup выполняется 1 раз, а loop - постоянно. Поэтому delay в setup, как правило, используются, даже если в loop их полностью избегают.
Остальных вопросов в этом сообщении не понял.
По следующему сообщению.
По работе датчика вглубь я не копал. Но у меня сложилось впечатление, что это достаточно интеллектуальный датчик, который сам знает, что ему делать. Т.е. длительности того, что он выдает, не зависят от длительности управляющих сигналов Ардуино.
Из неточностей: там, где Вы пишете про 10 мс, мне кажется, должно быть 10 мкс.
И то, что Вы понимаете явно неправильно: таймаут - это свойство функции PulseIn, к датчику оно никакого отношения не имеет. Кстати, если бы имело, то Ардуино не могла бы понять, когда принят сигнал, а когда наступил таймаут. Но т.к. таймаут происходит именно внутри Ардуины, она знает, что именно произошло и в случает сигнала - возвращает длительность, а в случае таймаута - 0. Если бы датчик сам срабатывал по таймауту, Ардуина бы возвращала длину импульса датчика, а не 0.
1. Давайте для начала таки разберемся с работой узв. датчика. Его алгоритм работы достаточно прост: по сигналу на входе trig он запускает 8 коротких посылок ультразвуком из пищалки, после чего выставляет высокий уровень на выходе echo и как только прилетает обратное эхо он сбрасывает в 0 выход echo. Всё.
Соответственно, управление им это отправка короткого (10 микросекунд) импульса на ногу trig, ожидание установки в 1 ноги echo и замер времени до сброса ноги echo в 0 снова. Или выход по таймауту - "не дождалися". Заметьте что echo может так и остаться в состоянии 1! Соответственно в начальный этап управления надо внести исправление, а именно проверять после отправки сигнала trig перешло ли состояние echo в 0 или "зависло".
Далее. Скорость звука 335 м/сек для Н.У. (760мм.рт.ст., +20 градусов Цельсия, приповерхностная плотность воздуха). Или 335 миллиметров за миллисекунду. Да, ещё он летит "туда и обратно", соответственно можно считать что его скорость в 2 раза ниже, т.е. 167.5 мм/мсек. Предельная дальность по чувствительности этого датчика составляет около 5м, что дает 5000/167.5 = 29,85мсек., как максимальный период ожидания эха или "таймаут". Ждать дольше 30-35мсек - нет никакого смысла.
Ещё надо заметить, что для обратного преобразования в расстояние Вы зачем-то делите вычисленное время на 58 (иногда делят на 59), в то время как операции целочисленного деления у Ардуино нет и в помине, а деления вещественных чисел нет как класса чисел и вовсе. Куда как полезнее делить на такие чиселки, которые являются степенями двойки, чтобы заменить деление сдвигами. Если предварительно умножить нашу скорость в 0.335 мм/мксек на скажем 1024, то получим константу 343.040, что мало отличается от 343 (0,012%!) и, в этом случае мы можем измеренное время в микросекундах домножить на эту константу и поделить на 1024, а поскольку "туда и обратно", то на 2048 что куда как экономичнее и быстрее делается Арудиной! Кто и с какого перепою предложил делить на 58 - ума не приложу, каким надо быть безграмотным программистом.
Да, не забываем проверять "граничные значения": макс. дальность это 5м. или 29850 микросекунд на ожидание. 29850 *343 = 10238550 это меньше чем long, так что в разрядную сетку длинных целых влезает запросто. 10238550/2048 = 4999,29мм или ошибка на коце диапазона из-за целочисленного вычисления составляет около 0,014%. Мне кажется что точность до 0.7мм в конце диапазона - это более чем достаточно. :)
И того, окончательный вариант подпрограммы с использованием pulseIn() может выглядеть примерно так:
Вот примерно так оно должно выглядеть. Вызывать можно просто указав номера пинов ваших дачтиков и требуемое время измерения сигнала.
Для самокатной тележки надо помнить, что во время измерения никаких иных действий оно делать НЕ БУДЕТ, соответственно его надо ставить как можно меньше.
И второе. Если собираетесь измерять расстояния с малым временем, скажем по 4мсек (вполне достаточно для обнаружения препятствий и не сильно мешает управлению), то НЕ ЗАБУДЬТЕ что эхо вполне может прилететь и от предыдущего запуска, ибо оно "гуляет" по полю не менее 30мсек пока не затухнет.. не стоит измерять чаще чем 1 раз в 35мсек. :)
P.S. Приведенный код - всего лишь пример как можно измерять расстояния не сильно мешая управлению, и проверяя корректность работы датчика. Он конечно же НЕ проверялся и даже не компилировался. Приведен как демонтсрация идеи и только. Скорее всего, он даже замерять будет неверно, поскольку задержки по 1мксек в циклах, да ещё и с вызовом wiring-функций .. это конечно нонсенс и время работы будет сильно искажено. Для нормальной работы надо скорее всего микроздержки ставить по 3-5-10мксек и соответственно изменять код, чтобы кривизна wiring сказывалась как можно меньше.
Ещё лучше этуработу переложить на прерывание и измерять длительность импульса обработчиком прерываний, скажем PCINT вполне годится. Он, кстати, вполне будет способен измерять дальность хоть от 8-и датчиков и даже одновременно и совершенно не влияя на работу цикла управления... но, это уже иной уровень программирования. :)
delay предназначена именно для того, чтобы тормозить программу. Соответственно, везде, где мы ее вызываем, она тормозит. Другое дело, что setup выполняется 1 раз, а loop - постоянно. Поэтому delay в setup, как правило, используются, даже если в loop их полностью избегают.
Остальных вопросов в этом сообщении не понял.
Насчет того, для чего delay предназначена, чтобы тормозить программу- это я понял. Я не понял смысл этого. Зачем нужно тормозить программу? Нельзя ли без торможения, операция за операцией?
Насчет остальных вопросов: раз уж и нужна эта delay, хоть я пока не понимаю - зачем, то сколько ей уделять времени? какую продолжительность ставить в конкретных случаях? Есть ли общий принцип, который помогает определять сколько нужно времени для паузы?
Из неточностей: там, где Вы пишете про 10 мс, мне кажется, должно быть 10 мкс.
И то, что Вы понимаете явно неправильно: таймаут - это свойство функции PulseIn, к датчику оно никакого отношения не имеет. Кстати, если бы имело, то Ардуино не могла бы понять, когда принят сигнал, а когда наступил таймаут. Но т.к. таймаут происходит именно внутри Ардуины, она знает, что именно произошло и в случает сигнала - возвращает длительность, а в случае таймаута - 0. Если бы датчик сам срабатывал по таймауту, Ардуина бы возвращала длину импульса датчика, а не 0.
Пардон опечатка. Конечно же в данном параметре 10 мкс.
Вероятно заговорился. Конечно же, разработчики не датчика, а мк. Таймаут заложен в ардуино, а не в датчике. И одновременно с началом сигнала HIGH на ECHO, включается время по таймауту. Если не регламертировно, то 1 сек. Если указано, то установленное.
Ещё надо заметить, что для обратного преобразования в расстояние Вы зачем-то делите вычисленное время на 58 (иногда делят на 59), в то время как операции целочисленного деления у Ардуино нет и в помине, а деления вещественных чисел нет как класса чисел и вовсе. Куда как полезнее делить на такие чиселки, которые являются степенями двойки, чтобы заменить деление сдвигами. Если предварительно умножить нашу скорость в 0.335 мм/мксек на скажем 1024, то получим константу 343.040, что мало отличается от 343 (0,012%!) и, в этом случае мы можем измеренное время в микросекундах домножить на эту константу и поделить на 1024, а поскольку "туда и обратно", то на 2048 что куда как экономичнее и быстрее делается Арудиной! Кто и с какого перепою предложил делить на 58 - ума не приложу, каким надо быть безграмотным программистом.
Уважаемый Arhat109-2, спасибо за подробности и глубинные нюансы. Насчет деления - согласен, что умножение ардуино выполнит быстрее. А деление на 58 - это образец на разных сторонних сайта, где приводили примеры перевода времени в сантиметры. Вот я и воспользовался. Другого способа не знал. Сечас постараюсь по вашему совету исправить.
Есть ли общий принцип, который помогает определять сколько нужно времени для паузы?
Диалог из фильма Кин-дза-дза:
- Ну, это на глаз.
- Дикари!