Официальный сайт компании Arduino по адресу arduino.cc
Определение направления движения
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всем добрый вечер! Сразу хочу обозначить свои познания в ардуино и программировании, чуть больше нуля)))
Так вот, уже достаточно долго пытаюсь собрать один небольшой проект, но в интернете почему-то почти нет информации по такому простому вопросу. Возможно он и вправду простой, и потому его не рассматривают особо. Оборудование: Ардуино Нано, два датчика приближения Sonar SR04. Суть проекта: коридор, ставится один датчик, чуть дальше второй. С помощью них, определить в каком направлении было движение. Логику работы данной схемы я понимаю.
При пересечении первого датчика, происходит проверка переменной "two", если значение "0", тогда происходит присвоение параметра переменной "one=1". Если же у переменной "two" значение "1" значит была уже сработка второго датчика и мы присваиваем "val" значение "2" Это будет означать что направление было "назад"
Далее идет сработка второго датчика. Тут необходимо сверить, если переменной "one" уже было присвоено значение "1" , то-есть сработал первый датчик, значит переменной, "val" присваивается так же "1". Это будет означать что направление было допустим "вперед"
Если при сработке второго датчика и проверки переменной "one" получается что значение исходное "0", то переменной "two" присваиваем "1".
Ну и далее по кругу. Для начала хотел бы услышать Ваше мнение, в нужном ли направлении я двигаюсь или есть вариант проще?
При пересечении первого датчика,
Можете, например, фиксировать millis пересечения лучей и вычислять разницу в момент, когда пересечены будут оба луча.
Знак числа покажет направление.
датчик приближения, каждые пол секунды измеряет расстояние. Оно фиксированное. Как только проходит человек, расстояние уменьшится датчик сработает, тут вопросов нет.
Прочел про millis. Если все правильно понял, то при запуске программы ардуино начнет считать. Сработал первый датчик, запомнили значение, сработал второй датчик, так же запомнили значение. Допустим 100 и 200. Далее сверяем если первое значение меньше второго, то человек вошел, если на оборот. то вышел. Так?
Как вариант. С флагами, конечно, более правильно для МК, но и с миллисом потащит. Заодно можно будет анализировать факт наличия засыпания объекта в процессе передвижения.
датчик приближения, каждые пол секунды измеряет расстояние. Оно фиксированное. Как только проходит человек, расстояние уменьшится датчик сработает, тут вопросов нет.
Какой человек?
В исходном тексте ни о каком человеке информации не было.
Постарайтесь в одном сообщении сформулировать проблему полностью.
датчик приближения, каждые пол секунды измеряет расстояние. Оно фиксированное. Как только проходит человек, расстояние уменьшится датчик сработает, тут вопросов нет.
Какой человек?
В исходном тексте ни о каком человеке информации не было.
Постарайтесь в одном сообщении сформулировать проблему полностью.
Я постарался максимально подробно описать, что нужно сделать. Вопрос не в том, из за чего сработает датчик, а вопрос в алгоритме, который позволит определить, какой датчик сработает первым, благодаря чему, можно понять в каком направлении двигается объект( человек, крокодил, тележка из гипермаркета)
Видите ли, когда неясна задача, трудно понять вообще, почему один датчик должен срабатывать раньше, чем другой.
У Вас что, робот, который движется по коридору, причем сам робот не может понять, в какую сторону он движется? Откуда-то еще люди берутся. Они что, роботом управляют?
Они что, роботом управляют?
Судя по всему, они в нём сидят
вопрос в алгоритме, который позволит определить, какой датчик сработает первым,
Вот уж действительно вопрос, не требующий рассмотрения.
я так понимаю у ТС датчики направлены поперёк коридора, один за другим. И он хочет знать в какую сторону перемещаются люди/предметы. Только ультразвуковые здесь не подходят имхо. Araris вроде умной ванной это реализовывал, нужно искать. тут ещё смотреть
я так понимаю у ТС датчики направлены поперёк коридора, один за другим. И он хочет знать в какую сторону перемещаются люди/предметы. Только ультразвуковые здесь не подходят имхо. Araris вроде умной ванной это реализовывал, нужно искать. тут ещё смотреть
Спасибо за наводку. Тему по ссылке прочёл, но это не совсем то что я спрашивал. Мне нужно написать код, в этом проблема. Какие датчики использовать тоже я не спрашивал. Это и ИК могут быть, и датчики на движение. Вопрос в АЛГОРИТМЕ. Правильно ли я его составил... Задание простое. Понять какой из датчиков(без разницы какого типа они будут) сработал первым а какой вторым. Отсюда сможем понять какое было направление движения.
По сути работа этих датчиков аналогична работе энкодера и можно применить чтонить готовое типа бенротариэнкодер
По сути работа этих датчиков аналогична работе энкодера и можно применить чтонить готовое типа бенротариэнкодер
Сегодня ознакомлюсь с данной библиотекой. Спасибо за подсказку. Но думаю с моими знаниями дольше буду в работе библиотеки разбираться, чем вариант, который я в начале описал.
По сути работа этих датчиков аналогична работе энкодера и можно применить чтонить готовое типа бенротариэнкодер
По сути бред какой-то сказал.
разве для этого нужен какой-то алгоритм?
Если в начале работы программы оба датчика выключены - то как только один из них сработал - он и первый. Нафига вы там в первом сообщении ветки накрутили какой-то бредятины...
как не то? там в посте 17 как раз скетч с четырьмя флагами, причем работа его опробована, далеко не бестолковым человеком. По этому скетчу можно и алгоритм понять. Что вам мешает собрать и попробовать. Так и будете каждый шаг спрашивать?
А то бывает составишь алгоритм, а полевые испытания всегда вносят коррективы.
а в скетче поста 14 по той ссылке вверху скетча, даже так и написано :
//Алгоритм подсчёта следующий:
Не заметил сноску с кодом(17 пост). Надо было нажать на раскрыть....Спасибо! Думаю как раз то что нужно.
Добавлю, что описанная там конструкция на двух VL53L0X по сей день трудится в моей прихожей )).
Не заметил сноску с кодом(17 пост). Надо было нажать на раскрыть....Спасибо! Думаю как раз то что нужно.
Появилось время, сел снова за комп. Ссылка, которую привел MaksVV, очень помогла, спасибо! Немного переработал под себя скетч, чтоб работало с Сонарами. Заработало, но с некоторым условием.. Что бы проход был засчитан, нужно чтоб датчики сработали очень быстро. Как я понял, "bool" это переменная, но она не сохраняет свое значение. В комментариях в скетче говорилось, "Продолжительность прохода не учитывается, можно стоять в дверях сколь угодно долго" Видимо за это отвечала строка когда, которую я удалил(там менялись адреса датчиков) к сожалению не разобрался зачем. Каким образом можно зафиксировать значения переменных? Считывание с датчиком происходит каждые 50 мск, в этот промежуток и нужно попасть чтоб сработали оба. В идеале, при сработке одного датчика, зафиксировать значение переменной, и в течение некоторого времени ждать сработку второго. Не произошло, значит все по новой. Сам скетч :
Как я понял, "bool" это переменная, но она не сохраняет свое значение.
Неправильно поняли.
bool - это тип переменной. Тип, естественно, никакого значения сохранить не может, чтобы хранить значение, нужна переменная.
Вам бы для начала почитать о языке, на которм хотите писать: https://nsu.ru/xmlui/bitstream/handle/nsu/9058/kr.pdf
Каким образом можно зафиксировать значения переменных?
Что Вы подразумеваете под "зафиксировать значения переменных"?
В любом случае, Вам нужно почитать описание языка, без этого, похоже, даже с терминологией проблемы. Ну и после прочтения, думаю, большинство вопросов отпадет сама собой.
Вообще-то с этими вашими двумя датчиками
надо работать как с простым инкрементальным энкодером.
Еще один не знает как энкодер устроен.
Как я понял, "bool" это переменная, но она не сохраняет свое значение.
Неправильно поняли.
bool - это тип переменной. Тип, естественно, никакого значения сохранить не может, чтобы хранить значение, нужна переменная.
Вам бы для начала почитать о языке, на которм хотите писать: https://nsu.ru/xmlui/bitstream/handle/nsu/9058/kr.pdf
Каким образом можно зафиксировать значения переменных?
Что Вы подразумеваете под "зафиксировать значения переменных"?
В любом случае, Вам нужно почитать описание языка, без этого, похоже, даже с терминологией проблемы. Ну и после прочтения, думаю, большинство вопросов отпадет сама собой.
Я не программист, потому объясняюсь своими словами. "bool" Тип переменной, ок. Но он хранит значения true либо false. В начале скетча все выставлено на false, при сработке датчика, значение меняется на true но тут же слетает. А нужно чтоб это значение держалось некоторое время, чтоб дождаться сработки второго датчика.
Еще один не знает как энкодер устроен.
Крутил энкодером через разъём флоппи драйв
когда Ардуины не было и в помине, а вы ещё даже и не родились.
(Флоппи - это SSD версии 0.1)
Мультик гляньте, может быть весной поможет вам сдать ЕГЭ:
https://www.youtube.com/watch?v=HeILJPjSQ_Y
"bool" Тип переменной, ок. Но он хранит значения true либо false.
Нет, тип ничего не хранит. Хранить может переменная. Вы понимаете, чем отличается переменная от типа переменной?
В начале скетча все выставлено на false, при сработке датчика, значение меняется на true но тут же слетает. А нужно чтоб это значение держалось некоторое время, чтоб дождаться сработки второго датчика.
Так не бывает. Сама по себе переменная "слететь" не может. Ну, точнее, может в случае серьезной аппаратной неисправности, но если бы была такая неисправность, крайне маловероятно, что скетч мог бы вообще хоть как-то выполняться.
Вот я и прошу объяснить неучу почему так происходит, а вы начинаете искать кошку в черной комнате. Факт что скетч выполняется не так как нужно, вопрос почему. Переменная в начале false, после сработки она становится true, но видимо скетч дальше идёт по кругу и переменная снова возвращается к дефолтному сочтоянию. Если в начале скетча выставляю delay секунды две, то и датчики начинают измерять расстояние каждые две секунды. И что бы был засчитан проход, сработке соответственно должна произойти в этот промежуток 2 сек.
Только ультразвуковые здесь не подходят имхо.
Согласен, поскольку различий между приведённым в #22 кодом и тем, что работает у меня, я не нахожу, возможно проблема в том, что сонары работают иначе (то есть не мгновенно, а с задержкой), либо "мешают" друг другу, если близко расположены.
Вставьте в скетч побольше отладочной информации, попытайтесь самостоятельно найти причину.
Например, во все блоки
else
if
вставьтеи анализируйте, когда какой нолик/единичка поменялся и почему.
Этим сонарам нужен период "молчания" длительностью примерно 50мс, чтобы переотражения затихли. А если их запускать сразу друг за другом - ничего хорошего ждать нечего.
Как "так"?
Факт что скетч выполняется не так как нужно, вопрос почему.
Факт, что скетч выполняется в точности так, как написан.
А как Вам нужно, известно только Вам.
Переменная в начале false, после сработки она становится true, но видимо скетч дальше идёт по кругу и переменная снова возвращается к дефолтному сочтоянию.
Какая переменная?
Если в начале скетча выставляю delay секунды две, то и датчики начинают измерять расстояние каждые две секунды. И что бы был засчитан проход, сработке соответственно должна произойти в этот промежуток 2 сек.
Постарайтесь четко сформулировать:
1. Что должен делать скетч.
2. Что он на самом деле делает.
3. Чем 1 отличается от 2.
Если ты хорошенько и вдумчиво прочитаешь Кернигана и Ритчи, то 80% твоих вопросов тут же отпадут сами
Логику можно сделать например так
Здесь вместо датчиков поставил кнопки для отладки. Меняйте на датчики. Пробуйте!
Логику можно сделать например так
Здесь вместо датчиков поставил кнопки для отладки. Меняйте на датчики. Пробуйте!
Какие кнопки?

Вот весь ваш процесс прохода слева направо и справа налево.
Раньше на 176-ой (561-ой) серии такое ваялось на реверсивном счётчике.
Сейчас делается на прерываниях или конечном автомате.
http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html
Только ультразвуковые здесь не подходят имхо.
Согласен, поскольку различий между приведённым в #22 кодом и тем, что работает у меня, я не нахожу, возможно проблема в том, что сонары работают иначе (то есть не мгновенно, а с задержкой), либо "мешают" друг другу, если близко расположены.
Вставьте в скетч побольше отладочной информации, попытайтесь самостоятельно найти причину.
Например, во все блоки
else
if
вставьтеи анализируйте, когда какой нолик/единичка поменялся и почему.
Спасибо за совет. Сонары расположены на достаточном расстоянии друг от друга. Добавил вывод информации в блок. Получается то, что я как раз и описывал. Когда я закрываю датчик рукой(sonarIn допустим), то значение меняется как нужно. Получаем (sonarIn_state 1, sonarOut_state 0, sonarIn_already 1, sonarOut_already 0, sonar_together 0, sonar_first 1) 101001. Второй датчик так же работает нормально 010102. НО, как только я убираю руку, то значения возвращаются к 000000. Вот это и нужно как то исправить. Необходимо чтоб значение осталось после того как я убираю руку.
Вот весь ваш процесс прохода слева направо и справа налево.
Раньше на 176-ой (561-ой) серии такое ваялось на реверсивном счётчике.
Сейчас делается на прерываниях или конечном автомате.
http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html
Не факт. Могут быть короткие импульсы, когда задний фронт первого импульса будет раньше переднего - второго.
НО, как только я убираю руку, то значения возвращаются к 000000. Вот это и нужно как то исправить. Необходимо чтоб значение осталось после того как я убираю руку.
Значение чего?
Возвращает ведь его Ваш скетч. Просто не делайте это "возвращение" до тех пор, порка не сработал второй (по времени) датчик. Правда, здесь есть опасность, что если человек дойдет до середины коридора и повернет обратно (не доходя до второго датчика), система зависнет. Но на этот случай можно предусмотреть таймаут. Или отслеживать не текущее состояние датчиков, а их переход из одного состояния в другое. В общем, масса вариантов.
Отлично, я наконец понял, чего Вы хотите. И дело не в ультразвуковых датчиках, кстати.
Вот здесь http://arduino.ru/forum/apparatnye-voprosy/schetchik-datchik-kol-va-chelovek-v-komnate#comment-344885
в коде я специально описал алгоритм его работы, просто прочтите :
Если Вы закрыли рукой первый датчик, а потом убрали руку, то имеете последовательность 00 10 00 , которая "не засчитывается" по логике работы данного скетча. Собственно и всё.
НО, как только я убираю руку, то значения возвращаются к 000000. Вот это и нужно как то исправить. Необходимо чтоб значение осталось после того как я убираю руку.
Значение чего?
Возвращает ведь его Ваш скетч. Просто не делайте это "возвращение" до тех пор, порка не сработал второй (по времени) датчик. Правда, здесь есть опасность, что если человек дойдет до середины коридора и повернет обратно (не доходя до второго датчика), система зависнет. Но на этот случай можно предусмотреть таймаут. Или отслеживать не текущее состояние датчиков, а их переход из одного состояния в другое. В общем, масса вариантов.
Да да да. Я понимаю что скетч его возвращает, после того как прописал вывод текущих значений, это подтвердилось. Пытаюсь разобраться как в коде прописать чтоб значения не возвращались. И по поводу зависания тоже писал чуть выше, что необходимо выставить какое то значение в секундах. Сработал один датчик, ждем некоторые время сработку второго. Если не сработал, значит сбрасываем значения. Просто не хватает знаний что бы все это в коде отобразить. Буду пробовать
Еще проясните (хотя бы для себя) такой момент: что будет раньше (при стандартном сценарии), "отпустит" первый датчик или сработает второй? Либо возможны обе эти ситуации?
По сути, в посте №39, вероятно, изложена оптимальная стратегия, вот только конкретная реализация будет зависеть от указанного выше обстоятельства.
ТС вы читаете что вам пишут вообще ? Пост 39 внимательно читаем. Значение не будет сбрасываться, если датчики будут срабатывать в определённой последовательности. В вашем скетче проверил , все нормально работает. Только вместо датчиков просто кнопки или просто проводками на GND замыкать. Все отлично работает. Значит если есть проблемы, они в специфике работы сонаров, вам уже ранее это говорили, а вы упрямый.
Тогда объясните пожалуйста, в чем разница сонара от датчика, используемого в оригинальном скетче? что сонар измеряет расстояние до объекта со скоростью 50 мск, что лазерный дальномер. Разница лишь в способе получения информации, один ультразвук использует, и дальность у него больше, второй лазер, до 2 метров. Может я и не прав, вот только внятного ответа я так и не получил, почему. Скетч должен одинаково работать как с ультразвуковым дальномером, так и с лазерным. И то что я часть кода, мне непонятную вырезал из скетча, на это тоже внятного ответа не получил. Возможно в этом и заключается корректная работа. А посылать читать книжки каждый может. Я не прошу готового решения, но форумы для помощи людям созданы, людям несведующим в определенных сферах.
Я не прошу готового решения, но форумы для помощи людям созданы, людям несведующим в определенных сферах.
Вас этой фразе где обучили?
Столовые тоже для питания людей созданы. Попробуйте зайти и похавать там нахаляву, руководствуясь этим догматом.
Про сонар все просто: у него иной принцип работы, в отличии от оптического дальномера. Попробуйте вдесятером одновременно поговорить, а потом перескажите, что сказал каждый.
А посылать читать книжки каждый может. Я не прошу готового решения, но форумы для помощи людям созданы, людям несведующим в определенных сферах.
Достали новички, каждый из которых, в нарушение правил форума считает своим долгом высказать мнение (причем, всегда в безапелляционной форме!) о назначении форума. Данный форум создан для общения по интересам. А не для того, чтобы каждому невежде подтирать здесь попу. Тот, кто ничего не знает, не интересен для общения. И его мнение о назначении форума также никого не интересует.
Разница в том, что лазерные датчики при измерении не влияют друг на друга. А ультразвуковые сначала излучают сигнал (звук) потом принимают. Дак вот если звук с излучателя первого датчика попадет в приёмник второго как вы думаете что получится?
основная логика скетча да, она и работает. Только вот проблема в том, что сам статус (измерение расстояния) ультразвуковых датчиков неправильно работает.
А то что вы рукой закрывали и убирали, пытаясь этим самым чего то проверить , вы неправильно это делали. и пытались изменить нормальную логику работающего скетча (типа сохранять статус или чего то там). Ещё раз повторяюсь: сымитируйте сработку датчиков в нужной последовательности, тогда поймете, что все работает.
И то что я часть кода, мне непонятную вырезал из скетча, на это тоже внятного ответа не получил.
Вырезанная из setup() (если Вы о ней) часть кода предназначена исключительно для датчиков VL53L0X, понять непонятное могут помочь подробные комменты, начиная с 24-й строки.
Разница в том, что лазерные датчики при измерении не влияют друг на друга. А ультразвуковые сначала излучают сигнал (звук) потом принимают. Дак вот если звук с излучателя первого датчика попадет в приёмник второго как вы думаете что получится?
основная логика скетча да, она и работает. Только вот проблема в том, что сам статус (измерение расстояния) ультразвуковых датчиков неправильно работает.
А то что вы рукой закрывали и убирали, пытаясь этим самым чего то проверить , вы неправильно это делали. и пытались изменить нормальную логику работающего скетча (типа сохранять статус или чего то там). Ещё раз повторяюсь: сымитируйте сработку датчиков в нужной последовательности, тогда поймете, что все работает.
Как уже писал ранее , датчики работают корректно. Расположены на значительном расстоянии друг от друга. Прочтите даташит по данным датчикам, там указан угол распространения ультразвука. Дело не в железе, оно исправно и работает не мешая друг другу. Вы рекомендуете сделать сработке в нужной последовательности. Какая тут может быть последовательность...? Сперва первый, потом второй. Вот вам вход, сперва второй потом первый, вот вам выход. Работает все, вот только проходы отмечаются если дать сработку обоим датчикам практически одновременно. Винить железо бесполезно, оно исправно и не мешает друг другу...Наверно проще записать видео порта чтоб стало понятнее как ведёт себя программа.
Вырезанная из setup() (если Вы о ней) часть кода предназначена исключительно для датчиков VL53L0X, понять непонятное могут помочь подробные комменты, начиная с 24-й строки.
Я так и подумал, что эта часть кода необходима непосредственно для датчиков, я только не понял зачем нужно было менять адреса. Комменты я прочел, все расписано кроме этого))
Менять один из адресов нужно, что бы иметь возможность общаться с датчиками индивидуально с каждым, датчики должны иметь уникальные адреса.
Если сонары расположены на расстоянии, не позволяющем движущемуся объекту перекрывать их одновременно оба, то этот скетч не для Вас.