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



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

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


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

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



Слева мы видим пины 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 В комментариях объявляю конкурс на лучшее объяснение того, что такое бод, почему у них разные скорости и чем это важно. Приза не будет, но я с удовольствием постараюсь понять именно ваше объяснение.

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


  1. WebMonet
    04.06.2015 12:20

    В моем понимании — бод это количество передаваемых символов (с учетом кодировки) в единицу времени, а не бит или байт.


    1. AnastasiaPMP Автор
      04.06.2015 15:25

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

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


      1. eta4ever
        04.06.2015 16:02

        Хранение информации мы тут не трогаем, только передачу по последовательному интерфейсу. Суть в том, что полезная пропускная способность канала UART, которую можно измерять в битах или байтах в секунду, меньше полной пропускной способности, т.к. передаются еще служебные биты, обычно 1 (стоповый) на байт.


        1. AnastasiaPMP Автор
          04.06.2015 16:08

          для чего нужны служебные биты?


          1. eta4ever
            04.06.2015 16:12

            Для контроля целостности данных (биты четности, в нашем случае не используются) и для оповещения приемника о том, что передача пакета закончена (стоповый бит).


  1. eta4ever
    04.06.2015 13:26

    Все же в вики кратко и годно про бод расписано. В случае UART — количество бит в секунду включая служебные.


    1. AnastasiaPMP Автор
      04.06.2015 15:27

      Спасибо. К сожалению, это объяснение вызвает у меня больше вопросов, чем ответов (см. выше). А в приложении к Ардуино — почему так усложнили и ввели бод вместо байта? В детстве у меня был замечательный двухтомник с картинками по ЭВМ. Там все очень просто и понятно было. А теперь, к сожалению, та прежняя ясность будто пропала куда-то. Пропали и доступные ответы на сотни «почему».


      1. eta4ever
        04.06.2015 15:56

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


        1. AnastasiaPMP Автор
          04.06.2015 16:06

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

          image

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

          image


          1. eta4ever
            04.06.2015 16:11

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