понедельник, 27 июня 2016 г.

3.9. Измерение расстояния ультразвуком

Урок: 3.9. Измерение расстояния ультразвуком

Транскрибация урока: Что делать, если мы захотим измерить большее расстояние, чем позволяет диапазон нашего инфракрасного дальномера? Напомню, что там он может увидеть препятствия на расстоянии от 10 до 80 см. Ну одно решение — это взять дальномер с другим диапазоном. Например, бывают инфракрасные дальномеры с диапазоном 20‐150 см. Но и это не всегда нас спасет, поэтому теперь мы познакомимся с ультразвуковым дальномером. В чем заключается принцип его работы? Как и инфракрасный дальномер, он что-то излучает и что-то принимает, но на этот раз он излучает высокочастотный звук 40 кГц. Примерно таким же образом, например, ориентируются летучие мыши. Мы своим ухом такой звук услышать не можем, однако приемник дальномера его воспринимает. И поскольку скорость звука нам известна, мы по времени возвращения этого импульса можем понять, от какого предмета... от предмета на каком расстоянии эта акустическая волна отразилась, и вычислить, соответственно, расстояние. Как мы его будем подключать? У него есть 4 пина, которые подписаны прямо на нем: это VCC (питание), TRIG, ECHO и GND (земля). Что это за пины TRIG и ECHO? На пин TRIG мы отправляем импульс, который заставляет дальномер отправить свою акустическую волну, а с пина ECHO мы считываем импульс определенной длины, пропорциональной расстоянию до препятствия. Давайте мы его подключим и посмотрим, как это работает. Зеленый провод «папа-мама» у меня подключен к земле. Красный провод к 5 вольтам, то есть питание. TRIG я подключу к 7-му пину, а ECHO — к 8-му. Здесь я хочу обратить ваше внимание на то, что если бы у вас были провода «мама-мама», вы точно так же могли бы использовать вот эти вот тройные пины Troyka Shield, потому что линии земля или питание равноценны стандартным пинам Arduino 5 вольт и земля. Можно было бы точно так же подключить к любым из них, даже не используя сигнальный канал, потому что питание там всегда есть. Теперь мы посмотрим на скетч, с помощью которого мы будем считывать этот дальномер. Давайте посмотрим. Как всегда, вначале я определяю пины: ECHO_PIN — 8-й, в соответствии с тем, как я подключил, и TRIG — 7-й. Не забываем указывать направление их работы. С ECHO_PIN мы будем получать импульс. Он будет INPUT. На TRIG_PIN мы импульс будем отправлять, поэтому он будет OUTPUT. Ну и отправлять данные мы будем в последовательный порт. Установим для этого соединение. Затем, как я говорил, для того чтобы дальномер отправил свой импульс, мы отправляем на пин TRIG короткий импульс-строб, HIGH и сразу LOW. После чего в переменную distance мы будем сохранять значение расстояния. Но чтобы его получить, мы воспользуемся еще одной встроенной функцией Arduino, которая называется pulseIn. Она позволяет измерить длительность импульса на цифровом входе. Мы указываем ей пин, с которым работаем (это ECHO_PIN в нашем случае), а также уровень, который мы ожидаем (в нашем случае HIGH). Она нам вернет количество микросекунд, соответствующее длительности импульса. Обращу ваше внимание, что микросекунд, а не миллисекунд, с которыми мы работали раньше. То есть дальномер нам будет отправлять высокий уровень сигнала на цифровой вход, и его длительность пропорциональна расстоянию. Чтобы перевести ее — длительность импульса — в сантиметры, нужно ее поделить на какую-то константу. Я использую 50. На самом деле, можно экспериментально подобрать точнее. Некоторые считают, что 54 подходит лучше. Хотя, конечно, скорость звука в разных средах может немножко отличаться — зависит от температуры воздуха и так далее. Но 50 – это близкое к правде значение. Итого, длительность импульса в микросекундах будет делиться на 50 и сохраняться в переменную distance, которую мы отправляем в последовательный порт. Теперь давайте это загрузим и посмотрим, что получится. [СИГНАЛ] Мы видим, что есть какое-то препятствие на расстоянии чуть больше метра. Но я поднесу руку поближе, и вот здесь мы уже видим 13 см, 9 см. Вы, наверное, обращаете внимание, что иногда проскакивают какие-то большие значения. Это тоже своего рода шум, хотя датчик у нас цифровой. Но это шум, не связанный с наводками на провода, а с тем, что, например, не вернулся отправленный импульс, и там приходит стандартное ошибочное значение. Сейчас чуть позже мы научимся с этим бороться. Ну отлично! Мы видим, что расстояние он измеряет довольно стабильно и диапазон его работы заявлен, насколько я помню, до 5-ти метров, но до 3-х метров он работает точно неплохо. Давайте теперь мы преобразуем нашу функцию measure под работу с ультразвуковым дальномером. Я взял скетч, с которым только что мы работали, и вновь создал в нем функцию measure, в которую просто-напросто вынес те 3 строчки, которые отвечают за отправку импульса на TRIG и считывание длительности сигнала на ECHO. Обратите внимание на то, что я здесь не передаю в функцию никакие параметры. Эти макроопределения так и зашиты в начале программы. Возможно, это не самый корректный способ, но я хотел вам подчеркнуть, что если даже ваша функция не принимает никаких параметров, мы все равно используем при определении ее и при вызове 2 скобки, пустые. Вызываем мы ее сразу в Serial.println точно так же с пустыми скобками. Теперь я хочу еще один момент подчеркнуть. Обратите внимание, что здесь я в pulseIn добавил третий параметр — вот этот вот 15000. Что это такое? Это третий необязательный параметр у этой стандартной функции. Он обозначает timeout, то есть время ожидания вот этого импульса. Соответственно, если в течение 15000 микросекунд не поступит импульса, то pulseIn просто вернет в ноль. Для чего это сделано? Во-первых, стандартное время ожидания у него секунда. И если по каким-то причинам измерение не удалось, то есть дальномер не получил обратно свой акустический сигнал, мы целую секунду прождем, и ничего не будет происходить. При этом мы понимаем, что дальномер эффективно работает в диапазоне, там, 3 метра. И, соответственно, 15000 микросекунд – это как раз та длительность импульса, которая соответствует 3-м метрам при нашей константе 50 микросекунд на 1 сантиметр. Можно таким образом подстраховаться от длительного ожидания. Но здесь возникает еще один момент. Во-первых, мы с вами видели, что при отсутствии ответного сигнала мы можем получить с дальномера большое значение, которое в каких-то наших вычислениях может испортить всю картину. Мы ожидаем значение в диапазоне, например, 50-150, а к нам приходит 3000. Нехорошо. А во-вторых, когда мы стали использовать третий параметр timeout, у нас может получиться значение 0, что тоже в каком-то случае может оказаться вообще плохо, если мы делим что-то, например, на расстояние. Поэтому здесь мы воспользуемся еще одной полезной встроенной функцией среды Arduino — constrain. Она предназначена для того, чтобы загнать значение какой-то переменной в определенный диапазон. То есть она возвращает то, что находится в переменной distance, если оно попадает в указанный диапазон. В моем случае, от 1 до 300. Если же значение выходит за пределы этого диапазона, то оно насильно приводится к значению 1, если оно было меньше единицы, и к значению 300, если оно было больше 300. Таким образом, мы можем быть уверены, что функция measure вернет нам значение от 1 до 300, и никаких нулей и 3000, которые могут почему-то получиться, мы от нее не увидим. Часто constrain используется в паре с известной нам функцией map, которая приводит число из одного диапазона в другой диапазон. Дело в том, что если число, с которым работает map, не попало в указанный входящий диапазон, оно все равно будет пропорционально преобразовано согласно указанному выходному диапазону. Это также может приводить к нежелательным результатам вычислений, поэтому часто бывает полезно перед тем как отдать число в map, провести над ним constrain, то есть быть уверенным в том, что значение будет в указанном диапазоне. Сейчас я хочу еще раз акцентировать ваше внимание на то, как вы выбираете датчик. Сегодня мы уже познакомились с инфракрасным и ультразвуковым дальномерами, и у каждого из них есть свои плюсы и минусы. Например, с инфракрасным дальномером проще работать — мы просто считываем аналоговый сигнал. С другой стороны, чтобы получить из него расстояние в метрических единицах, нужно провести какие-то преобразования. Ультразвуковой дальномер имеет больший рабочий диапазон. У инфракрасного дальномера есть риск получения наводок на сам провод, которым он подключен к контроллеру. Еще следует учитывать такой параметр как диаграмма направленности. То есть препятствие может находиться непосредственно перед датчиком, а может быть, например, чуть правее или левее него, но все равно засекаться им как препятствие, находящееся перед ним. Это особенно заметно при работе с ультразвуковым дальномером. И, как всегда, желательно посмотреть документацию, но еще лучше эмпирически убедиться в том, каким образом он работает с вашими препятствиями в ваших условиях. Еще что важно? Полезно понимать принцип работы каждого датчика. Например, инфракрасный дальномер будет немного по-разному работать со светопоглащающими и светоотражающими поверхностями, потому что в основе его работы лежит инфракрасное излучение. В случае с ультразвуковым дальномером нужно учитывать, что мы имеем дело со звуком. То есть с одной стороны, это может нам быть полезно. Мы, например, можем измерить расстояние до стекла, через которое свет проходит. Мы можем измерить расстояние, например, до воды, но если мы хотим измерить расстояние до кота, например, то мы имеем большой риск получения странных данных, потому что кот лучше поглощает акустические волны, чем, например, стена. И поэтому что-то может не вернуться в дальномер. Когда мы работаем с ультразвуковым дальномером, большую роль играет то, как расположено препятствие. Например, если перед дальномером какое-то препятствие стоит под острым углом, с большой вероятностью мы его не заметим с помощью дальномера из-за особенностей отражения и переотражения акустической волны. Так или иначе, задумывайтесь о том, в какой среде, с какими препятствиями вы собираетесь работать и выбирайте датчик осмысленно. То же самое касается, естественно, работы с любыми другими датчиками.

Часть: Видео

Модуль: Цель обнаружена

Описание модуля: На этой неделе вы научитесь ощупывать пространство дальномерами, делать визуализацию на компьютере, существенно дополните свои возможности в программировании и наконец-то сделаете устройство с движущимися частями.

Курс: Строим роботов и другие устройства на Arduino. От светофора до 3D-принтера

Описание курса: На протяжении тысячелетий люди усовершенствовали орудия труда, изучали силы природы и подчиняли их себе, использовали их энергию для работы машин, а в прошлом веке создали машины, которые могут управлять другими машинами. Теперь создание устройств, которые взаимодействуют с физическим миром, доступно даже школьнику.

Наш курс состоит из серии практических задач про создание вещей, которые работают сами: изучают мир, принимают решения и действуют – двигаются, обмениваются данными друг с другом и с человеком, управляют другими устройствами. Мы покажем, как собирать эти устройства и программировать их, используя в качестве основы платформу Arduino.

Пройдя этот курс, вы сможете создавать устройства, которые считывают данные о внешнем мире с разнообразных датчиков, обрабатывают информацию, получают и отправляют данные на ПК, в Интернет, на мобильные устройства, управляют индикацией и движением. Создание устройств будет включать проектирование, изучение компонентов, сборку схем, написание программ, диагностику. Попутно с созданием самих устройств вы сделаете визуализацию на ПК, создадите веб-страницу, которую будет демонстрировать одно из ваших устройств, а также разберетесь с устройством и работой FDM 3D-принтера.

Помимо тех, кто увлекается робототехникой или стремится расширить кругозор и свои навыки, курс будет полезен всем, кто сталкивается с задачами бытовой и производственной автоматизации, а также занимается промышленным дизайном, рекламой и искусством.

Курс не требует специальных знаний у слушателей, доступен даже ученикам старших классов средней школы. Плюсом будут навыки программирования и владение английским языком на уровне чтения технической документации, однако обязательным это не является.

Весь курс посвящен практике и самым лучшим решением для вас будет раздобыть электронику, повторять показанные примеры и экспериментировать самостоятельно.

Программа:

  • Неделя 1 Один старый и много новых знакомых
  • Неделя 2 Контроллер изучает мир
  • Неделя 3 Цель обнаружена
  • Неделя 4 Как полить цветок из другого города
  • Неделя 5 Мобильный робот
  • Неделя 6 Как создать новый предмет за час
Преподаватель: Алексей Перепелкин (1), Дмитрий Савицкий (2)

Описание преподавателя: (1) Алексей Перепёлкин занимается развитием робототехники на базе ЛИОТ МФТИ. В 2012 году открыл для себя новое захватывающее чувство – когда устройство, которое сам построил и запрограммировал, работает. Свернул с финансовой дорожки и создал кружок робототехники для подростков. Готовил их к соревнованиям. Стал посещать конференции, а затем проводил мастер-классы для тех, кто тоже хочет организовать занятия. Совместно с коллегами в 2013 году разработал новые соревнования – Робопрофи – для конкурса Робот для жизни и провел их. В 2014 году впервые провел Arduino-номинацию на фестивале Робофест, а для российского финала Russian Robot Olympiad 2014 сделал творческую категорию. С тех пор эти соревнования стали регулярными. Летом 2014 провел двухнедельную мастерскую в детском лагере Никола-Ленивца, а затем преподавал в выездной школе, посвященной программированию и робототехнике, которую провели ABBYY и Яндекс. В 2015 году стал руководителем направления робототехники в GoTo Camp, выездных школах, где участники создали десятки проектов, от прототипов умных домов и операторских тележек до робота-бубниста и принтера для незрячих. В 2014 году с коллегами начал проект Роболабы: мероприятия для школьников и студентов, где участники параллельно решают усложненные задачи, а затем проводят рефлексию сделанной работы и оценивают чужие в ходе серии мероприятий.

(2) Физик, научный сотрудник, выпускник МФТИ. Запустил кружок робототехники в 2011 году. Рассказал Алексею Перепелкину о том, как здорово вести кружок робототехники. Рассказал об этом еще целому ряду людей. Побеждал со своими командами на соревнованиях. Проводил проектную работу с участниками исследовательской выездной школы МКШ с 2013 года, где руководил реализацией физических и робототехнических проектов, например, «Вслед за солнцем», в котором изучалась эффективность динамической ориентации солнечных батарей на солнце. Вместе с коллегами разрабатывал и был судьей Робопрофи. Участвовал в подготовке проекта Роболабы. Вновь пришел в МФТИ для проведения факультативного курса «Основы создания киберфизических устройств»

Организатор: Лаборатория инновационных образовательных технологий МФТИ (1), Лаборатория инновационных образовательных технологий МФТИ (2)

Описание организатора: (2) Московский физико-технический институт (неофициально известный как МФТИ или Физтех) является одним из самых престижных в мире учебных и научно-исследовательских институтов. Он готовит высококвалифицированных специалистов в области теоретической и прикладной физики, прикладной математики, информатики, биотехнологии и смежных дисциплин. Физтех был основан в 1951 году Нобелевской премии лауреатами Петром Капицей, Николаем Семеновым, Левом Ландау и Сергеем Христиановичем. Основой образования в МФТИ является уникальная «система Физтеха»: кропотливое воспитание и отбор самых талантливых абитуриентов, фундаментальное образование высшего класса и раннее вовлечение студентов в реальную научно-исследовательскую работу. Среди выпускников МФТИ есть Нобелевские лауреаты, основатели всемирно известных компаний, известные космонавты, изобретатели, инженеры.

Категория: Компьютерные науки

Описание категории: Специализации и курсы по компьютерным наукам посвящены разработке и дизайну программного обеспечения, алгоритмическому мышлению, человеко-компьютерному взаимодействию, языкам программирования и истории вычислительной науки. Курсы в этой широкой области помогут вам мыслить абстрактно, методически подходить к проблемам и вырабатывать качественные решения.

Тематика: Разработка ПО

Материал: