Мы остановились на том, что если с самим датчиком и его пинами нам всё стало более или менее (надеюсь, более, чем менее) понятно, то к каким пинам на Ардуино их подсоединять и почему — пока не ясно. Давайте ответим на этот вопрос.
Пины на Ардуино
В комплект у нас входит Ардуино Нано (выбранная неслучайно, так как она маленькая и подходит для прототипирования движущихся и переносных объектов). Существует замечательная схема расположения её пинов (не единственная, но мне нравится больше всех).
Как и в принципиальной схеме устройства мы пока что обратим внимание только на две части этой схемы:
Слева мы видим пины 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)
eta4ever
04.06.2015 13:26Все же в вики кратко и годно про бод расписано. В случае UART — количество бит в секунду включая служебные.
AnastasiaPMP Автор
04.06.2015 15:27Спасибо. К сожалению, это объяснение вызвает у меня больше вопросов, чем ответов (см. выше). А в приложении к Ардуино — почему так усложнили и ввели бод вместо байта? В детстве у меня был замечательный двухтомник с картинками по ЭВМ. Там все очень просто и понятно было. А теперь, к сожалению, та прежняя ясность будто пропала куда-то. Пропали и доступные ответы на сотни «почему».
eta4ever
04.06.2015 15:56Двухтомник, думаю, этот. У самого такой где-то зарыт.
Как-то исторически сложилось, что скорость последовательного интерфейса меряют в бодах. Связано это с тем, что в передаваемом пакете может быть разное количество бит для разных целей. Подробнее.AnastasiaPMP Автор
04.06.2015 16:06Ммм, этот беленький двухтомник тоже был, но он у меня появился позднее и понравился мне меньше. А у меня был вот этот и я его до сих пор обожаю:
Спасибо за ссылку, читаю про UART. Опять что-то новенькое, т.к. этого сокращения в моём арсенале ещё не было:
eta4ever
04.06.2015 16:11А на пузике у этой ардуины микросхема FT232, у которой с одного конца USB, а с другого — собственно UART, подключенный к соответствующим ножкам Mega328 (продублированы выводами TXD и RXD).
WebMonet
В моем понимании — бод это количество передаваемых символов (с учетом кодировки) в единицу времени, а не бит или байт.
AnastasiaPMP Автор
Спасибо. Мне стало интересно, почему отказались от бита или байта. Если я правильно понимаю — они верны для двоичного кода. Когда мы компиллируем наш код в IDE — мы переводим его в машинный язык, если я ничего не путаю — ассемблер. Так вот он записан в виде двоичного кода — или на самом деле нет?
Если да, то скорость передачи данных в битах кажется ок. Если нет, то поправьте меня пожалуйста.
eta4ever
Хранение информации мы тут не трогаем, только передачу по последовательному интерфейсу. Суть в том, что полезная пропускная способность канала UART, которую можно измерять в битах или байтах в секунду, меньше полной пропускной способности, т.к. передаются еще служебные биты, обычно 1 (стоповый) на байт.
AnastasiaPMP Автор
для чего нужны служебные биты?
eta4ever
Для контроля целостности данных (биты четности, в нашем случае не используются) и для оповещения приемника о том, что передача пакета закончена (стоповый бит).