Датчик движения для переключения радиостанций — часть II

    Привет, Хабр! Сегодня — продолжение импровизированного цикла подробных постов для начинающих. В прошлом посте мы взяли готовый набор радиоконструктора с Ардуино и ультразвуковой дальномер для того, чтобы не только совместить их, и получить возможность настраивать радио «одной левой», но также чтобы разобраться в «Ардуиностроении» с нуля. Если у вас есть только Ардуино и сам датчик, вы тоже можете попробовать кое-что собрать из этого поста, но, видимо, остановитесь, после того, как настроите неплохую такую ультразвуковую линейку — что тоже хорошо. Мне захотелось пойти дальше и посадить датчик на плату расширения для создания готового устройства. Вот как это у меня вышло.



    Мы остановились на том, что если с самим датчиком и его пинами нам всё стало более или менее (надеюсь, более, чем менее) понятно, то к каким пинам на Ардуино их подсоединять и почему — пока не ясно. Давайте ответим на этот вопрос.

    Пины на Ардуино


    В комплект у нас входит Ардуино Нано (выбранная неслучайно, так как она маленькая и подходит для прототипирования движущихся и переносных объектов). Существует замечательная схема расположения её пинов (не единственная, но мне нравится больше всех).

    Как и в принципиальной схеме устройства мы пока что обратим внимание только на две части этой схемы:



    Слева мы видим пины 5 и 6. Посмотрите ещё раз на принципиальную схему устройства из первой части поста. От K4 и K5 контакт идёт к пинам D5 и D6. Это значит, что шилд, на котором мы сейчас работаем, передаёт напряжение с этих контактов на\с эти пины: логический ноль – 0 В; логическая единица – 5 В. Поэтому подключая что-то на эти контакты, мы пошлём\получим сигнал с этих пинов.

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

    Почему мы выбрали именно эти две ножки Ардуино? Две причины:

    1. Именно они «остались свободными» в нашей схеме.
    2. Именно они являются цифровыми входами\выходами, которые мы можем запрограммировать на приём\отправку сигнала.

    Исходя из последней фразы угадайте, какие пины датчика мы подключим к K4 и K5? Правильно, цифровые вход и выход устройства.

    Хозяйке на заметку:

    Цифровыми входами-выходами или — правильнее — цифровыми линиями у Ардуино Нано являются пины D0 – D13; могут быть и цифровыми и аналоговыми А0 – А5; только аналоговые А6, А7.


    Именно потому, что к цифровым входам\выходам Ардуино можно цеплять устройства отправляющие\принимающие сигнал, мы могли бы добавить сюда также любой другой датчик или компонент, например: датчик температуры, влажности, цвета, звука, света и т. д., или исполнительные устройства, например, реле.

    Это важная информация на будущее, так как именно благодаря ней можно иметь представление, какие компоненты и как вы можете соединить с вашим МК, создавая собственный прототип или устройство.

    Подключение питания через Ардуино


    Отлично, с двумя пинами датчика разобрались. Теперь куда подключать питание датчика — два оставшихся пина плюс и минус?

    У Ардуино несколько взаимозаменяющих возможностей подключить питание. В нашем случае мы можем подключить готовое устройства (радио) через батарейки (батарейный отсек я сейчас отпаяла, чтобы не мешался), а также через USB. И здесь, и там на входе у нас получается 5 Вольт — то, что нужно.

    Однако к настоящему моменту у нас два пина датчика подключены к пинам Ардуино чтобы получать\отправлять сигнал, а пины питания датчика — свободны. Выход есть! Мы можем подключить их к пинам, расположенным наверху Ардуино (см. верх схемы расположения пинов). Это часть, обозначенная на схеме как ICSP. Точкой обозначен пин #1. Далее пины располагаются попарно:

    1 и 2, где 2 — Плюс, Vcc
    3 и 4
    5 и 6, где 6 — Минус, Grnd, Ground

    Здесь всё то же напряжение 5 Вольт. Можно ли подключить сюда датчик? Нужны ли, например, резисторы? Смотрим его ТТХ:

    Напряжение питание: 5 В
    Потребление в режиме тишины: 2мА
    Потребление при работе: 15мА

    Правильный ответ: можно. Резисторы не нужны.

    Важно: если мы перепутаем плюс и минус, то с первого раза мы, может, и не сожжём Ардуино. Некоторые компоненты будут греться, некоторые, возможно, начнут дымиться. Зато, если уж что-то сгорит, то, скорее всего это будет датчик, т.к. полюса питания для него будут перепутаны, и вместо 5 В на нем будет -5 В, то есть напряжение питания датчика выйдет за допустимый предел (5В по ТТХ).


    Сборка компонентов


    Вот что у нас получится, когда мы соединим Ардуино и датчик через плату расширения.:



    Здесь показаны только шилд, Ардуино и датчик, которые мы соединили как показано выше. Все остальные компоненты нам пока не нужны, так как мы не в курсе ещё пока что, работает ли наш новый датчик. Если водрузить Ардуино на его месте на плате, у нас всё будет готово к проверке датчика. Поэтому дальше с «железом» всё, настала очередь программирования.

    На этом этапе, если вы не используете, как я, плату расширения из этого набора, вы можете непосредственно подключить датчик к нужным пинам Ардуино и действовать далее. Ещё раз повторюсь, что, к сожалению, автор поста не несёт ответственности, если вы перепутаете что-то при подключении и сожжете Ардуино или датчик. Так что, пожалуйста, будьте внимательны.

    Программирование: проверка датчика


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

    Шаг 1: Скачайте библиотеку для датчика. Если вы не знаете, как работать с библиотекой и скетчем, вы можете быстро научиться этому здесь.

    Шаг 2: Откройте в текстовом редакторе пример NoBlindDemo2.
    Это файл .pde — такое расширение имеют файлы среды Processing. Это тот же скетч. Ардуино понимает файлы скетчей .pde помимо своих файлов .ino, потому что среда Ардуино основана на среде Processing. О других типах файлов для Ардуино и о том, как их правильно именовать, вы можете почитать здесь.



    Переназначьте используемые линии ввода/вывода, после чего сохраните скетч.

    Для TRIGGER_PIN укажите 5, для ECHO_PIN – 6.

    Почему мы сделали именно так? Если пин датчика Trigger получает запрос от МК, то пусть этот запрос ему отправляет 5-й пин Ардуино. Мы так решили. Как вы помните, свободных пинов у нас сейчас два — 5й и 6й, с этим мы уже разобрались выше. Соответственно, Echo отправляет данные с датчика в Ардуино, и пусть отправляет их на шестой пин.

    Обратите внимание на команды, использованные в этом скетче:




    Обратите внимание на то, что каждая строчка скетча заканчивается точкой с запятой. А также обратите внимание на фигурные скобки — они открываются и закрываются в нужный момент. Также, обратите внимание, что любой скетч разделён на две части:

    Void setup() {}
    В этой части вы пишете то, что произойдёт один раз в начале программы. У нас ардуино подключится к серийному порту на нужной скорости и напишет, что пошла измерять.
    Void loop() {}
    Цикл. В этой части вы пишите то, что будет повторяться до тех пор, пока вы не отключите питание МК. В данном случае — измерение дальности расстояния датчиком каждые 50 мс.


    Каждая часть программы умещается между соответствующими {}
    То, что пишется после // программа игнорирует — это комментарии разработчика кода тому, кто будет в нём потом разбираться, то есть нам. Как вы видите, этот код писал очень ответственный и аккуратный разработчик, который всё откомментировал.

    Шаг 3: Загрузите наш новый скетч в Ардуино.
    Если вы никогда не делали этого раньше, давайте я сначала расскажу вам, как это сделать.

    Важно: перед любыми манипуляциями с Ардуино снимайте её с платы и обесточивайте.

    Шаг 4: Отсоедините Ардуино от USB. Посадите его на плату, подключите датчик. Вновь подключите USB к компьютеру.
    Вероятно, вам придётся закрыть и открыть IDE снова, т.к. сейчас устройство может не определиться в Сервис — Последовательный порт. Не волнуйтесь, это бага. Просто отсоедините и перезапустите всё.



    Всё то же, только теперь посадите Ардуино на плату тоже. Убедитесь, что вы не перепутали + и -, иначе Земля налетит на небесную ось.

    Важно: автор статьи не несёт никакой ответственности, если вы сожжёте свою Ардуино. Помните, все манипуляции с вашим МК вы проделываете на свой страх и риск.

    Последний раз проверяем, что куда:


    Теперь можно подключить USB.

    Шаг 5: Запустите IDE. Убедитесь, что Ардуино «висит» на назначенном ей порте:

    Сервис → Последовательный порт → здесь прописан автоматически порт. В противном случае вся надпись серая и нужно всё перезапустить.

    Шаг 6: Выберите Сервис → Монитор порта.

    Убедитесь, что в правом нижнем углу установлена скорость, соответствующая нашему скетчу: 115200 бод.
    Выберите скорость, соответствующую указанной в программе. Если эта скорость у вас уже выставлена, то сразу после подключения Ардуино с датчиком (после её обнаружения на одном из портов), монитор побежит отдавать вам значение Distance, каждые 50 мс:



    При включении датчик лежал на столе и смотрел в потолок, до которого, как видите, было 180 см.

    Шаг 7: Приближайте и отдаляйте руку от датчика. Посмотрите, как меняются его показания. В моём случае это было так:



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

    Ардуино-радио на ультразвуковом управлении


    Всё, что нам осталось теперь это две вещи:

    1. Заново собрать все оставшиеся компоненты радио обратно на шилд.
    2. Загрузить в Ардуино скетч, который совместит радио и датчик. А для этого нам надо взять стандартный скетч радио и прописать там кое-что.

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

    Вот эти библиотеки для самого набора
    Библиотека для датчика
    Вот этот скетч

    Изменение радиостанции.
    Для изменения радиостанции необходимо изменять расстояние с шагом 5 см.
    Приближение к датчику — переключение станции вниз по диапазону,
    отдаление от датчика — переключение станции вверх по диапазону.
    За шаг изменения расстояния отвечает константа DISTANCE_STEP.
    Ее значение можно поменять.

    Выход из режима настройки станции.
    После настройки станции необходимо не менять расстояние до датчика в течение 5 с,
    настройка завершится с фиксацией текущей станции. За время «фиксации» отвечает
    константа EXIT_TUNE_TIME. При необходимости, её значение можно поменять.

    Вот и всё, поздравляю вас со сборкой нового устройства на Ардуино. Мы с вами многому научились за эти два поста:
    1. Разобрали характеристики нового датчика и собрали по нему отличную коллекцию ссылок.
    2. Научились выбирать пины на Ардуино и на плате расширения под него.
    3. Научились ориентироваться в схемах и даташитах.
    4. Научились тестировать новый датчик ещё до внедрения его в проект.
    5. Собрали и запрограммировали готовое устройство.

    И хотя (я надеюсь) вы всё свободнее чувствуете себя с «железом», но важно отметить, что я помню, что пока что мы попытались разобрать только один скетч — для тестирования датчика. Поэтому если вам понадобится сейчас написать или изменить скетч под новое устройство, вы, вероятно, будете пока не готовы. Следите за новыми постами, подписывайтесь — я обязательно поделюсь с вами тем, что знаю и умею, в своих будущих постах.

    Для чего вы использовали бы звуковой дальномер? Как можно изменить и дополнить мой проект? Добро пожаловать в комментарии!

    //** PS В комментариях объявляю конкурс на лучшее объяснение того, что такое бод, почему у них разные скорости и чем это важно. Приза не будет, но я с удовольствием постараюсь понять именно ваше объяснение.
    МАСТЕР КИТ
    64,18
    Компания
    Поделиться публикацией

    Комментарии 10

      0
      В моем понимании — бод это количество передаваемых символов (с учетом кодировки) в единицу времени, а не бит или байт.
        0
        Спасибо. Мне стало интересно, почему отказались от бита или байта. Если я правильно понимаю — они верны для двоичного кода. Когда мы компиллируем наш код в IDE — мы переводим его в машинный язык, если я ничего не путаю — ассемблер. Так вот он записан в виде двоичного кода — или на самом деле нет?

        Если да, то скорость передачи данных в битах кажется ок. Если нет, то поправьте меня пожалуйста.
          0
          Хранение информации мы тут не трогаем, только передачу по последовательному интерфейсу. Суть в том, что полезная пропускная способность канала UART, которую можно измерять в битах или байтах в секунду, меньше полной пропускной способности, т.к. передаются еще служебные биты, обычно 1 (стоповый) на байт.
            0
            для чего нужны служебные биты?
              0
              Для контроля целостности данных (биты четности, в нашем случае не используются) и для оповещения приемника о том, что передача пакета закончена (стоповый бит).
        0
        Все же в вики кратко и годно про бод расписано. В случае UART — количество бит в секунду включая служебные.
          0
          Спасибо. К сожалению, это объяснение вызвает у меня больше вопросов, чем ответов (см. выше). А в приложении к Ардуино — почему так усложнили и ввели бод вместо байта? В детстве у меня был замечательный двухтомник с картинками по ЭВМ. Там все очень просто и понятно было. А теперь, к сожалению, та прежняя ясность будто пропала куда-то. Пропали и доступные ответы на сотни «почему».
            0
            Двухтомник, думаю, этот. У самого такой где-то зарыт.
            Как-то исторически сложилось, что скорость последовательного интерфейса меряют в бодах. Связано это с тем, что в передаваемом пакете может быть разное количество бит для разных целей. Подробнее.
              0
              Ммм, этот беленький двухтомник тоже был, но он у меня появился позднее и понравился мне меньше. А у меня был вот этот и я его до сих пор обожаю:

              image

              Спасибо за ссылку, читаю про UART. Опять что-то новенькое, т.к. этого сокращения в моём арсенале ещё не было:

              image

                0
                А на пузике у этой ардуины микросхема FT232, у которой с одного конца USB, а с другого — собственно UART, подключенный к соответствующим ножкам Mega328 (продублированы выводами TXD и RXD).

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое