Text
                    



УДК 004.896 ББК 32.816 К70 К70 Корягин, Андрей Владимирович. Умная робототехника для начинающих : разработка на Arduino / Андрей Корягин. — Москва : Эксмо, 2025. — 336 с. : цв. ил. — (Электроника для начинающих). ISBN 978-5-04-203713-9 Книга «Умная робототехника для начинающих. Разработка на Arduino» дает необходимые знания и навыки для создания собственных роботов. Благодаря доступным объяснениям книга ведет новичков от азов инженерного искусства до разработки полноценных устройств с использованием платформы Arduino. Читатели получат возможность самостоятельно собирать электронные устройства и программировать их, следуя пошаговым инструкциям. В каждой главе предусмотрен список необходимых компонентов и инструментов, даны электрические схемы, чертежи для сборки, а также основные концепции программирования. В результате обучения можно будет создавать такие проекты, как гоночные симуляторы, музыкальные устройства, умная одежда и мобильные роботы. УДК 004.896 ББК 32.816 ISBN 978-5-04-203713-9 © Корягин А.В., текст, иллюстрации, 2025 © Оформление. ООО «Издательство «Эксмо», 2025
Оглавление Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Пояснение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Об авторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Электроника для проектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Платы Аrduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Датчики и сопутствующие модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Актуаторы (электроприводы) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Микросхемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 14 18 19 Среда программирования устройств и проектирования схем . . . . . . . . . . . . . . . . . . 21 Программирование в среде mBlock5 Scratch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Панель инструментов: возможности и функции . . . . . . . . . . . . . . . . . . . . . . . . . 21 Основы программирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Типы данных. Переменные. Линейный алгоритм . . . . . . . . . . . . . . . . . . . . . . . . . . . Ветвления и вложенные ветвления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Циклы: конечные и бесконечные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Вложенные циклы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Комбинированные алгоритмы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Особенности конструкции кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Функции void setup() и void loop() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задержка по времени . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Функции digitalRead() и analogRead() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ветвление и вложенные ветвления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Циклы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Материалы для проектирования и создания моделей . . . . . . . . . . . . . . . . . . . . . . 26 34 45 58 61 62 64 70 71 73 75 77 80 82 84 Введение в разработку устройств на Аrduino и программирование . . . . . . . . . . . . 92 Управление светодиодами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Подключение светодиода в цепь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Программирование светодиодов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Фоторезистор и датчик света . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Датчик температуры и влажности воздуха . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Датчик влажности почвы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
6 Оглавление Лазерный модуль . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пьезоэлемент . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Кнопки и клавиатура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ультразвуковой датчик расстояния . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bluetooth-модуль . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Датчик линии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DC-мотор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сервопривод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Шаговый двигатель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Дисплеи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Электропроводящие нити . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пайка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 132 136 146 149 154 156 164 169 173 176 179 Простые роботизированные устройства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Светофор с пешеходным переходом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Настольный вентилятор с подсветкой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Простой манипулятор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Солнечный трекер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Светодиодный куб . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сейф . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Футбол . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 181 185 192 200 205 215 247 Настольные роботизированные игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 Гоночный симулятор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 Симулятор Марио . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Музыкальные аппараты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Простое пианино . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Лазерный синтезатор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 Умная одежда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Умная подсветка одежды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Мобильный робот . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 Послесловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 Предметный указатель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Введение Дорогой читатель! Эта книга приглашает тебя в мир электроники, программирования и роботов. Если ты хочешь создать устройство, которое будет твоим помощником, я помогу тебе это сделать. Немного внимательности, аккуратности и терпения — и все получится! Итак, ты готов начать путь инженера, разработчика и конструктора роботов и роботизированных устройств? Приступим. Любое роботизированное устройство, или робот, — это сложная конструкция с некоторым набором компонентов. Общая структура устройства Электронные компоненты Несущая конструкция Электронные компоненты (ЭК) — микроконтроллеры, микросхемы, датчики, электронные модули, относительно простые электрокомпоненты (резисторы, светодиоды, кнопки), соединительные провода, токопроводящие нити и чернила. Несущая конструкция — это любого вида конструкция из бумаги, картона, пенокартона, фанеры, пластика, дерева, металла, ткани. Несущая конструкция защищает ЭК от воздействия внешних факторов и объединяет их, а также является элементом дизайна. Неправильный выбор электронных компонентов и материала для конструкции может стать причиной недолговечной или ошибочной работы устройства. Поэтому необходимо определить, с какой целью устройство создается, сделать предварительный рисунок (эскиз конструкции с разных ракурсов, простенький чертеж). Если владеете 3D-моделированием, можно разработать 3D-модель с анимацией подвижных частей и рассчитать нагрузки. Эта книга поможет делать роботизированные устройства на плате Arduino и рассчитана на начальный уровень программирования. Начнем с основных компонентов и попробуем создавать простые устройства на их основе. Далее — программирование устройств (программирование платы семейства Аrduino). Мы рассмотрим процесс создания программы в двух средах программирования: mBlock5 и Аrduino IDE. Чтобы закрепить знания и навыки,
8 Введение полученные в этой книге, предлагаю создать устройства, которые можно использовать дома, показывать на выставках и конкурсах, проводить с их помощью исследования, удивлять друзей и просто развивать свое мастерство. В книге есть пояснения и рекомендации по использованию той или иной платы Аrduino, датчиков, модулей и материалов по проектированию. Ты всегда можешь заменить одну плату на другую, использовать другой DC-мотор, который не описан в книге, или заменить картон на металлический лист — в любом случае сборка, проектирование и программирование не изменятся. Во многих разделах книги будут QR-коды со ссылкой на видео, где материал разъясняется более подробно с практической точки зрения. Рисунок 1 Все программы из книги можно скачать из репозитория автора на GitHub https://github.com/Antipat/Smart_robot_arduino1
Пояснение В этом разделе содержатся краткие сведения о том, какую именно информацию и в каком разделе искать. Темы разбиты по степени сложности и не изолированы друг от друга. Полученные знания можно использовать при проектировании робота с разнообразным функционалом. Введение. Описание разработки роботизированных устройств с использованием плат Аrduino: плюсы и минусы. Электроника для проектов. Подробный обзор разных плат Аrduino: минимум характеристик, понятный даже ученикам начальной школы. Обзор датчиков и электроприводов, которые понадобятся, адреса интернет-магазинов, где это можно приобрести. Чтобы электроника заработала как надо, необходимо прописывать скрипты (коды) и загружать в плату Аrduino — и эти сведения есть. Язык программирования — урезанный С++ (отступы не важны, подсветка сильной роли не играет, код может быть черно-белым). Для разработки устройства нужны разные материалы: бумага, картон, пенокартон, фанера, вспененный ПВХ, деревянные бруски, пластик, латунные и алюминиевые трубки — я подскажу, какой материал лучше применять. Среда программирования устройств и проектирование схем. Обзор двух сред программирования на языке Scratch в mBlock5 и на языке C++ в Аrduino IDE. Здесь ты получишь базовые знания и навыки программирования на этих языках. Введение в разработку устройств на Arduino и программирование покажет принцип подключения, управления и получения данных с использованием Аrduino и элементов, указанных в предыдущей главе. Научимся не только собирать мини-устройства, но и программировать их. Простые роботизированные устройства. Глава посвящена созданию несложных работающих устройств. Их много, они очень разные. Разные конструкции, варианты электронных схем. Идем от простого к сложному. Настольные роботизированные игры. Рассмотрим принцип создания настольных автоматизированных устройств, которые когда-то были популярны: симулятор вождения, «Марио» и т. д. Музыкальные аппараты. Расскажем о создании музыкальных устройств с использованием пьезоэлемента (зуммера). Погрузимся в мир теории звуков и сможем проектировать музыкальные инструменты.
10 Пояснение Умная одежда. Электронные компоненты можно применять и на одежде: используя электропроводящие нити, можно легко сделать одежду светящейся. Мобильный робот. Объясним, как собрать трехколесного мобильного робота с несколькими режимами работы: объезд препятствий, движение по линии. В каждой главе (4–12) обязательно есть: — список необходимой электроники; — электрическая схема в двух вариантах (графическая и изображение конструкции); — примитивные чертежи и рисунки — чтобы создать несущую конструкцию устройства с описанием материала; — поэтапное описание, как собрать устройство; — программирование устройства; — небольшое усложнение устройства (увеличение количества электроники, усложнение программы). Светофор. Простое автоматизированное устройство — светофор со звуковым сопровождением. Настольный вентилятор с подсветкой. Простое автоматизированное устройство с вариантами управления. Задача устройства — подсветка и нагнетание воздуха (охлаждение). Простой манипулятор. Роботизированное устройство средней сложности, позволяющее захватывать и перемещать предметы в пространстве. Солнечный трекер. Роботизированное устройство средней сложности, позволяющее поворачивать платформу в пространстве в сторону наибольшей плотности освещения. Светодиодный куб. Пространственная матрица из светодиодов, позволяющая создавать варианты освещения и управления каждым светодиодом отдельно. Гоночный симулятор. Полный аналог советской игры «За рулем», игровой набор ОМ-4800. Симулятор Марио. Устройство из бумаги, фанеры и картона, начиненное электроникой. Повторяет концепцию платформенных игр, но без компьютера. Многие элементы подвижные: фон экрана — из гибкой бумаги, склеенной в виде браслета, движение осуществляется мотором по принципу ленты для перемещения товара у кассира в торговом магазине. На ленте изображен фон (либо нарисованный от руки, либо распечатанный). Лента располагается горизонтально и совершает перемещение фона по горизонтали либо влево, либо вправо. Фигурка Марио (или другого персонажа) закреплена на ленте меньшего размера и перемещается перпендикулярно движению первой. Задача игрока — управлять персонажем так, чтобы он не столкнулся с нарисованными препятствиями на первой ленте.
Пояснение 11 Пианино простое. Электронное музыкальное устройство, издающие звуки разной частоты и интервала в зависимости от нажатой клавиши (кнопки). Лазерный синтезатор. Аппарат, где мелодии формируются от прерывание лазерных лучей рукой. Лучей может быть много — от 8 (как ноты) до 256 (тональность, басы и т. д.). В этой книге мы ограничимся восемью лазерными модулями. Умная подсветка одежды. Гибкое автоматизированное устройство средней сложности, которое можно вшивать в одежду. Например, для подсветки пространства вокруг человека, когда стемнеет.
Об авторе Андрей Корягин — выпускник физико-математического факультета Пензенского государственного педагогического университета им. В. Г. Белинского. Автор книг по робототехнике и программированию. Занимается педагогической деятельностью по направлениям: Python, C#, C++, Lua, Java, робототехника с lego, vex, mackblock, Аrduino, robotis, raspberry pi, 3D-моделирование и gamedev с blender и unity. Победитель конкурса «Молодой учитель-2011» Пензенской области в номинации «Информационные технологии». Автор научных статей в области применения информационных технологий в образовании. Ведет образовательный канал на YouTube по программированию, робототехнике и разработке игр https://www.youtube.com/c/АндрейКорягин.
Электроника для проектов Платы Аrduino Микроконтроллер Аrduino — одна из основных частей программируемого устройства. Его можно назвать условно мозжечком робота. Почему мозжечком, а не мозгом, спросите вы? Ответ достаточно прост: у него маленькая память, порядка 16 Кбайт — 1 Мбайт. Она не позволяет анализировать большой объем данных, но ее достаточно для контроля и управления всеми электронными компонентами устройства. Малая память компенсируется быстродействием и стабильностью. Для большинства устройств не нужна большая память, но зачастую их работа вызывает у нас восхищение, и мы невольно сравниваем их действия с интеллектом: умный светильник, тостер, холодильник, современная стиральная машина, конфетные и кофейные автоматы, станки с программным управлением, игрушки-роботы и многое другое. Вот самые распространенные платы Аrduino, их краткие характеристики и возможные сферы применения. a) Arduino uno, Аrduino mega Одни из самых востребованных плат. Очень популярны среди любителей робототехники. Uno означает один, mega — большой: больше пинов, памяти, источников питания и т. д. Официальная разработка создана в Италии, ее клоны — в Китае. С официальной платой можно работать без предварительных настроек. У китайских плат есть особенность: они собраны на своей микросхеме CH401, поэтому сначала необходимо установить драйвер. а) Arduino mega Рисунок 2. Плата Аrduino mega 2560
14 Электроника для проектов b) Arduino LilyPad Эта плата часто используется как мозг для умной одежды. Она не боится воды, и ее можно пришивать к одежде с помощью электропроводящих нитей. Рисунок 3. LilyPad Датчики и сопутствующие модули Кроме самих плат Аrduino, нам необходимы органы чувств умного устройства — датчики. Они бывают аналоговые и цифровые. Аналоговые датчики вырабатывают аналоговый сигнал пропорционально изменению входной величины. Цифровые датчики преобразуют входное воздействие любой физической величины в сигнал, удобный для дальнейшего использования. a) Фоторезистор Аналоговый датчик может менять свое сопротивление в зависимости от освещения. Чем ярче свет, который падает на него, тем меньше сопротивление. Он используется как датчик освещенности. Рисунок 4. Фоторезистор
Датчики и сопутствующие модули 15 b) Датчик температуры и влажности воздуха Этот датчик может измерять температуру и влажность воздуха. Есть много готовых библиотек по работе с ним. Часто используется в террариумах и теплицах. Рисунок 5. Датчик температуры и влажности воздуха Есть много моделей с небольшой разницей в характеристиках. Для начинающих это не имеет большого значения. c) Датчик влажности почвы Предназначен для измерения влажности почвы. Аналоговый. Способ применения — погружение двух контактов датчика в почву и подключение к плате Аrduino. Рисунок 6. Датчик влажности почвы d) Лазерный модуль Этот модуль не является датчиком, но часто работает вместе с фоторезистором или фотоэлементом, иногда в совокупности с web-камерой. Применение: сигнализация, фотоловушка, сканер, лазерный тир. Рисунок 7. Лазерный модуль
16 Электроника для проектов e) Пьезоэлемент Интересен тем, что может издавать звуки разной частоты. Применение: сигнализация, будильник, синтезатор мелодий. Будем использовать пьезоэлементы, рассчитанные на 3 В или 5 В. Рисунок 8. Пьезоэлемент f) Ультразвуковой датчик расстояния Определяет расстояние до объекта (препятствия). Диапазон измерения — до 50 сантиметров. Применение: радар, объезд препятствий мобильным роботом, физические эксперименты. Рисунок 9. Ультразвуковой датчик расстояния g) Bluetooth-модуль Необходим для передачи и получения радиосигналов. Он полезен при дистанционном управлении с компьютера, телефона или планшета. Дистанция до 10 метров. Рисунок 10. Bluetooth-модуль
Датчики и сопутствующие модули 17 h) Датчик линии Необходим для определения границы между темными и светлыми линиями. С его помощью можно анализировать степень поглощения и отражения света от поверхности. Рисунок 11. Датчик линии i) Дисплеи Дисплеи отображают информацию. Например, через них можно выводить информацию о влажности и температуре воздуха, степени освещения. Рисунок 12. LCD-дисплей 1620 j) Светодиоды Элементы сигнального освещения. Могут применяться непосредственно как освещение или сигнальное световое оповещение. Применение: светодиодная лампа, гирлянда, освещение в моделях устройств. Используем светодиоды от 3В до 5В. Рисунок 13. Светодиоды
18 Электроника для проектов k) Электропроводящие нити и чернила Выполняют функцию соединительных проводов в электрических схемах. Так как нити очень гибкие и в диаметре небольшие, их вшивают в одежду в электронные схемы и получают умную одежду. Рисунок 14. Электропроводящие нити Актуаторы (электроприводы) Электроприводы — это устройства, которые электрическую энергию переводят в механическую. С их помощью можно заставить устройство двигаться или совершать действия, т. е. физически воздействовать на окружающий мир. a) DC-мотор Обычные электромоторы, которые применяются почти во всех отраслях робототехники. Могут быть без редуктора или с редуктором (в зависимости от задачи). Чаще всего мы будем применять моторы с редуктором. Для разных силовых нагрузок применяют разные моторы. Характеристики мотора: потребление тока (напряжение, сила тока), крутящий момент сил, количество оборотов в минуту. Обычно с потреблением от 3 В до 12 В. Рисунок 15. DC-мотор b) Сервопривод Предназначен для более точного перемещения как самого робота, так и его частей. Сервоприводы различаются по силовым характеристикам:
Микросхемы 19 потребление тока (напряжение, сила тока), крутящий момент сил, градусы поворота (180, 270, 360), количество оборотов в минуту. Рисунок 16. Сервопривод c) Шаговый двигатель Предназначен для точного позиционирования. В отличие от сервопривода, может проворачиваться бесконечно. Характеристики двигателя: потребление тока (напряжение, сила тока), крутящий момент сил, количество шагов в полном обороте (24, 48, 72 …). Рисунок 17. Шаговый двигатель Микросхемы Кроме плат Аrduino зачастую нужны дополнительные микросхемы, которые улучшают и облегчают управление множеством устройств.
20 Электроника для проектов a) L293D Рисунок 18. Драйвер двигателей L293D Микросхема L293D предназначена для управления двумя DC-моторами или одним шаговым двигателем. Способна проводить силу тока I = 0,6 A, а напряжение U = 3B – 36 B. Эта микросхема легко справляется со всеми моторами в игрушках: ей под силу моторы для управления жалюзи, воротами в гараже, для открывания и закрывания окон. Подойдет она и для наших будущих устройств. b) 74HС595 Рисунок 19. Сдвиговый регистр 74HC595 Иногда очень важно экономить контакты на платах Аrduino. Для этого подойдет сдвиговый регистр 74HC595. Микросхема 74HC595 — восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защелкой и тремя состояниями на выходе. Эта микросхема способна управлять восемью светодиодами.
Среда программирования устройств и проектирования схем Так как книга предназначена для начинающих робототехников любого возраста — и детей, и взрослых, — предлагаю выбрать среду программирования, которая будет тебе по душе. Здесь будут представлены два варианта программирования электроники на базе Аrduino: — mBlock5 с языком программирования Scratch; — Arduino IDE 1.8.19 с языком С++. К каждому проекту будет приложен код, написанный на двух языках. Эти среды можно установить на компьютер или работать онлайн в web-версии. Основную информацию по этим языкам я изложил в двух следующих разделах. Если ты знаешь один из этих языков программирования, смело пропускай эти разделы. Если нет, рекомендую изучить работу с одним из них, чтобы легче понимать код и научиться его составлять и загружать в плату Аrduino. Программирование в среде mBlock5 Scratch Панель инструментов: возможности и функции Перед тем, как приступить к созданию программ в среде mBlock5, необходимо изучить ее возможности и познакомиться с инструментарием. Программную среду mBlock5 можно использовать десктопно (установленную на вашем ПК), web-версию (работа в браузере) или мобильную (Android и iOS). Варианты программ можно скачать здесь: https://mblock.makeblock.com/enus/download/.
22 Среда программирования устройств и проектирования схем Рисунок 20. Среда mBlock5 В этой книге я буду рассматривать версию для ПК. Ту же структуру имеет и web-версия. Запускаем программу mBlock5: Рисунок 21. Программная среда mBlock5 Диалоговое окно разбито на множество секторов. Изучим каждый.
Программирование в среде mBlock5 Scratch 23 Рисунок 22. Структура mBlock5 1. Во вкладке Файл можно создать, открыть или сохранить файл. 2. Значок «+» позволяет выбрать устройство, для которого создаем программу (библиотека устройств). 3. После выбора устройства подключите его к компьютеру, выбрав пункт Подключение, для настройки загрузки программы через COM-порт. 4. Набор инструментов (команд) для создания программы. 5. Рабочее поле, где создается программа. 6. Альтернативная запись программы на языке C++ для Аrduino IDE. Открываем вкладку Файл и рассмотрим шесть представленных функций, рис.23: — Новый подразумевает создание нового файла (нового окна). — Открыть — открывает созданный в mBlock5 файл из облака; доступен, если у тебя есть аккаунт на сайте mBlock5. — Сохранить как — сохраняет файл в облаке, если есть учетная запись на сайте, см. рис. 24. — Открыть с вашего компьютера — открывает созданные файлы, которые хранятся на вашем компьютере. — Сохранить на вашем компьютере — сохраняет созданную программу на компьютер.
24 Среда программирования устройств и проектирования схем — Поделиться с… — можно поделиться своим проектом в облаке, если есть аккаунт на сайте mBlock. Зарегистрироваться можно через программу mBlock5. Рисунок 23. Регистрация в сообществе mBlock5 Рисунок 24. Регистрация
Программирование в среде mBlock5 Scratch 25 Рисунок 25. Способ регистрации через Google Рисунок 26. Регистрация аккаунта Регистрация дает возможность не только делиться своими проектами с сообществом, но и пользоваться облачными технологиями. А они, в свою очередь, обеспечивают функциональность ваших проектов в области IoT и AI (ИИ).
Основы программирования Рассмотрим процесс создания программ. Для этого перейдем во вкладку Персонажи. В этом разделе можно создавать программу непосредственно для персонажа, который представлен в левом верхнем углу, т. е. работа как со стандартной программой Scratch. Рисунок 28. Основы программирования
Основы программирования 27 Во вкладке Персонажи можно выбрать различных персонажей, нажав на значок «+». Рисунок 29. Выбор спрайта (персонажа) В Библиотеке персонажей много различных элементов. Для облегчения поиска они разбиты по категориям. Добавляем персонажа, нажимая левую кнопку мыши на выбранном значке, затем OK. Выбранных персонажей можно редактировать. Если кликнуть правой кнопкой мыши по персонажу, появится контекстное меню: копировать, экспортировать и удалить (рис. 28). Касательно копировать и удалить все просто: эти функции копируют и вставляют или удаляют персонажа. Функция Экспортировать сохраняет файл на вашем компьютере в формате .sprite3. Кроме этого, персонажа можно перемещать по области экрана — как с использованием левой кнопки мыши, так и непосредственно указывая его координаты X и Y. Центром координатной сетки с координатами (0, 0) будет центр экрана, в котором располагается персонаж. Персонажа можно уменьшать или увеличивать, меняя значение параметра Размер (стрелка 1), а также вращать, меняя значение градусов параметра Направление.
28 Основы программирования Рисунок 30. Редактирование спрайта Если в Библиотеке персонажей пусто, можно нарисовать своего. Для этого необходимо перейти во вкладку «+» и выбрать вкладку Рисовать. Рисунок 31. Рисование спрайта Рисуя персонажа, можно сразу видеть его конечную реализацию во вкладке Персонажи. Кроме этого, к каждому персонажу можно добавить звук. Выберите нужные звуки, которые можно редактировать, см. рис.33. Нажимаем на вкладку Звуки.
Основы программирования 29 Рисунок 32. Создание персонажа В окне Выбор звука можно добавить звук, нажав «+», и редактировать его. Инструменты редактирования находятся справа. Рисунок 33. Выбор звука
30 Основы программирования Рисунок 34. Работа со звуком Ниже представлен пример использования звука в программе. Рисунок 35. Программа вызова звука при нажатии флага При нажатии зеленого флажка в окне с персонажем будет издаваться звук, который мы выбрали.
Основы программирования 31 Интересна вкладка Учебники в правом верхнем углу. Рисунок 36. Учебники Вкладка Руководство пользователя отправит нас к документации программы mBlock5. Рисунок 37. Документация по руководству Во вкладке Примеры программ представлены интересные примеры программ, которые реализованы как для персонажей, так и для робототехнических наборов.
32 Основы программирования Рисунок 38. Примеры программ Рисунок 39. Примеры программ Рисунок 40. Примеры программ Примеры программ будут доступны для устройств, драйверы которых ты загрузил в mBlock5 (выбрав устройство с помощью «+»). Рекомендую
Основы программирования 33 использовать некоторые примеры, особенно для персонажей, чтобы понять отдельные аспекты программирования. Кроме вкладок Устройства и Персонажи есть вкладка Фон; там можно настроить фон, на котором будет действовать персонаж. Фон можно выбрать из Библиотеки фонов или нарисовать свой. Рисунок 41. Установка фона Рисунок 42. Установка фона
34 Основы программирования Основные моменты работы с устройствами и персонажами мы рассмотрели, теперь переходим к процессу создания программ. Типы данных. Переменные. Линейный алгоритм Чтобы научиться писать программы и понимать принцип их работы, необходимо познакомиться с азами программирования. Программа — это инструкция для компьютера (контроллера). Чем лучше она будет написана для чтения машиной, тем качественнее выполнит задачу. В основе программ лежат базовые алгоритмы. В любом языке программирования есть фундамент: это типы данных. Понимая их специфику и возможности, можно корректно писать программы. Нужно также понимать, что такое переменная. Переменная — это именованный участок памяти: мы резервируем его под хранение значения того или иного типа данных. От выбора типа данных зависит объем, который зарезервируется в памяти ПК (контроллера). Чем больше памяти будет резервироваться, тем меньше останется места для вычислений; всегда приходится искать золотую середину. Переменные могут быть именованы буквами латинского алфавита, целыми словами или фразами (желательно слитное написание), сочетанием букв и цифр. Пример: - a, b, c, d, e…. -A, B, C, D, E… - a1, a2, a3,… x1, x2, x3… - Name, speed, Number, lineGraf, … В mBlock5 мы можем оперировать такими типами данных: целые числа (integer), дробные числа (float), строки (string), списки (list). Задать переменную можно во вкладке Переменная — как для персонажей, так и для устройств. Создать переменную можно для двух глобальных типов: переменная и список. Переменная может хранить в себе целые, дробные числа и отдельные буквы (символы), а списки хранят строковые типы: буквы, слова, числа, переведенные в строки в большом количестве.
Типы данных. Переменные. Линейный алгоритм Рисунок 43. Создание переменной Рисунок 44. Создание переменной 35
36 Основы программирования Рисунок 45. Создание переменной для списка Из рисунков 45 и 46 видно, что переменные и списки можно создать для всех персонажей (в том числе и подключенного устройства) или персонально для какого-то определенного (некий аналог глобальной переменной и локальной). Это заметно в следующих рисунках (47–48). Рисунок 46. Переменная списка для CyberPi
Типы данных. Переменные. Линейный алгоритм 37 Рисунок 47. Переменная и списки для персонажа Как видно из предыдущих примеров, глобальные переменные отображаются для всех, а локальные — только для персонажей или устройств, для которых они создавались. Это можно использовать, когда надо изменять или считывать значения для конкретного объекта программы, а не для всех.
38 Основы программирования Рисунок 48. Переменная и списки для устройства CyberPi Алгоритм — набор простых действий, который универсален для многих схожих процессов. Первый алгоритм, который мы должны изучить, — линейный. Линейный алгоритм — это алгоритм из последовательных действий, идущих один за другим. Пример: создадим программу, которая заставит персонажа сдвинуться на один шаг вперед. Все, что связано с перемещением, находится во вкладке Движение. Представленная ниже программа (рис. 50) содержит набор действий для персонажа, которые не только перемещают его вперед, но и поворачивают на 90°, а каждый шаг имеет задержку в 1 секунду. Благодаря этой программе можно наблюдать движение персонажа с течением времени, а именно — движение вперед и поворот.
Типы данных. Переменные. Линейный алгоритм 39 Рисунок 49. Линейный алгоритм Мы видим движение персонажа, но не траекторию движения. Для записи его траектории можно воспользоваться модулем Перо, который содержится в Центре расширений. Рисунок 50. Линейный алгоритм движения Чтобы перейти в него, необходимо кликнуть по знаку + Расширения.
40 Основы программирования Рисунок 51. Центр расширений Рисунок 52. Центр расширений — Перо Как только добавляем модуль Перо, в панели инструментов появляется большой выбор команд для работы с пером (рис. 53).
Типы данных. Переменные. Линейный алгоритм 41 Рисунок 53. Функции расширения Перо Добавим в предыдущую программу две команды: опустить перо и выбрать цвет пера. Рисунок 54. Рисуем траекторию движения
42 Основы программирования Если запустим программу, мы не заметим никаких изменений, хотя они есть. При движении персонаж будет рисовать линию, но так как длина перемещения меньше размера персонажа, траектория не будет видна. Необходимо уменьшить размер персонажа, а лучше — заменить его. Создадим программу с линейным алгоритмом, с помощью которой персонаж в виде стрелочки рисует квадрат. Сам персонаж уменьшен до сопоставимых размеров (рис. 59). Для выбора нового костюма можно пойти двумя способами: изменить костюм персонажа (выбрав кнопку Костюм) или нажать на кнопку + добавить. Рисунок 55. Выбор нового костюма (персонажа) Если выбрали вариант Костюмы, нажмите кнопку Добавить костюм. Переходим к выбору костюма. Если выбрали + добавить, также откроется окно выбора костюма, но это будет другой персонаж и для него необходимо создавать новый код (программу).
Типы данных. Переменные. Линейный алгоритм Рисунок 56. Добавляем костюм Рисунок 57. Выбор костюма стрелочки 43
44 Основы программирования Уменьшите размеры стрелочки, укажите направление и примените нашу программу, содержащую алгоритм с движением в 100 шагов и поворотом в 90°, который повторяет это 4 раза (рис. 58). Рисунок 58. Рисование траектории пути персонажа Получился квадрат. Сам алгоритм построения квадрата прост: повторение поочередно движения вперед и поворота на 90°. У нас добавились две новые команды из модуля Перо: удалить все, поднять перо. Они позволяют очистить предыдущие рисунки с помощью пера и поднять перо, чтобы ничего не рисовать, но при этом перемещать перо. Команда идти к x:0 y:0 позволяет переместить персонажа на поле с координатой (0, 0) — центр поля. Дополним нашу программу командой на установку цвета (рис. 59). Рисунок 59. Добавление цвета пера
Ветвления и вложенные ветвления 45 Кроме этого, можно установить и толщину линии (рис. 60). Рисунок 60. Толщина линии пера Ветвления и вложенные ветвления Кроме линейных алгоритмов (поочередное выполнение команду действий), есть алгоритм с ветвлением. Ветвление — вид алгоритма, который содержит как минимум два действия на проверяемые условия. Из определения следует, что в этом алгоритме нужно проверять условие на вхождение данных и в зависимости от их истинности запускать определенные действия. Пример: Программа будет сверять числа с указанным и выдавать результат в зависимости от того, большое или маленькое число выбрано. Если введенное число больше 50, его можно считать большим, если меньше — маленьким. Программу будем создавать во вкладке Персонажи для выбранного типа. То есть эта программа будет обрабатываться на компьютере, а не на любом другом подключенном устройстве. На рис. 61 представлен пример такой программы. Для введения числа используется вкладка Сенсоры и выбирается команда Спросить: «Как вас зовут?» И ждать ответа (рис. 62). Фразу «Как вас зовут?» заменяют на любую другую, которая нужна в программе
46 Основы программирования Рисунок 61. Программа с ветвлением Рисунок 62. Функция для ввода числа (строки) Чтобы можно было вводить числовые значения, создадим переменную (рис. 63). Оператор условия (ветвления) находится во вкладке Управление. С его помощью мы создадим алгоритм ветвления Если… Иначе…, рис. 64.
Ветвления и вложенные ветвления Рисунок 63. Создание переменной Рисунок 64. Оператор условия: если и если иначе 47
48 Основы программирования Чтобы проверить число, нужно применить оператор сравнения … > 50, который находится во вкладке Операторы (рис. 65). Рисунок 65. Выбираем оператор сравнения Для вывода текста воспользуемся действием Сказать фразу ___________ в течение _____ секунд, которое находится во вкладке Внешность (рис. 66). Итоговый вариант программы представлен на рис. 61. Для закрепления работы с алгоритмом ветвление выполните задание. Ответ можете придумать сами, главное, чтобы он был разным для разного выбора. Кроме простых вариантов ветвлений, возможны алгоритмы со вложенными ветвлениями — это когда внутри одного условия есть еще одно или несколько условий.
Ветвления и вложенные ветвления 49 Рисунок 66. Функция вывода значений Пример: Программа предлагает выбрать длину стороны квадрата и толщину линии границы. Если длина больше 100, а толщина — больше 25, квадрат будет создаваться в точке (–100, 200) с красным цветом. В противном случае будет создаваться квадрат синего цвета в точке (0,0). Решение: Создадим для начала нового персонажа (стрелку) и две переменные Number и width, которые будут хранить в себе длину и толщину. Размер персонажа укажем 10.
50 Основы программирования Рисунок 67. Задаем персонажа и переменные Во вкладке Внешность выберем команду Сказать фразу …, чтобы пользователь понял, что программа требует от него. Рисунок 68. Программа просит ввести длину стороны квадрата Выберем команду для ввода длины. Рисунок 69. Функция для приема вводимой информации Эту длину присвоим переменной Number.
Ветвления и вложенные ветвления 51 Рисунок 70. Присвоение значения переменной По такому же принципу поступаем с вводом ширины (толщины) линии пера. Рисунок 71. Вводим длину и толщину Не забудьте подключить расширение Перо для рисования квадрата. Перед рисованием необходимо все очистить и поднять перо, чтобы не было загромождений рисунками. Рисунок 72. Настройки Пера
52 Основы программирования В начале программы она каждый раз будет отправлять нашего персонажа в исходную точку (0, 0). Рисунок 73. Задаем исходную точку Следующим шагом будет добавление оператора условия с разветвлением Если … , иначе … Рисунок 74. Добавление оператора условия
Ветвления и вложенные ветвления 53 Для оператора Если добавим оператор сравнения значения Number с числом 100. Это первое условие. Рисунок 75. Первое условие Внутри оператора Если добавим еще один оператор Если …. Это второе условие (вложенное). Рисунок 76. Добавление второго условия
54 Основы программирования В нем мы будем сравнивать значение переменной width с числом 25. Рисунок 77. Сравнение второй переменной Если оба условия истинны, выполнится алгоритм действий для создания красного квадрата.
Ветвления и вложенные ветвления 55 Рисунок 78. Рисуем красный квадрат в точке (–100, 200) Если первое условие не истинно, выполняется алгоритм рисования синего квадрата в точке (0, 0).
56 Основы программирования Рисунок 79. Если Number меньше 100 Полный код представлен ниже. Запустите программу и протестируйте с разными значениями Number и width.
Ветвления и вложенные ветвления Рисунок 80. Полный код программы 57
58 Основы программирования Циклы: конечные и бесконечные Циклы — вид алгоритма, который повторяет множество раз определенную часть кода программы. Циклы бывают конечными и бесконечными. Пример конечного цикла: программа выводит значение переменной d, которая с каждым шагом увеличивается на 1. Количество шагов равно 100. Рисунок 81. Пример конечного цикла Из этой программы видно, что переменная d с числовым значением ноль постепенно увеличивает свое значение на единицу сто раз. Интервал времени изменения значения — 0,2 секунды. В конце программа выходит из цикла, и значение переменной обнуляется. Используемый цикл берется из вкладки Управление; оставшиеся элементы мы уже знаем. Рассмотрим пример бесконечного цикла. Оператор цикла выберем Повторять пока … Рисунок 82. Вариант бесконечного цикла
Циклы: конечные и бесконечные 59 Согласно коду, персонаж должен написать фразу Привет! и Пока! с интервалом в 0,5 секунды, если переменная d меньше 5. Но при запуске программы персонаж ничего не выведет. Для анализа раскроем справа этот код на языке Python. Рисунок 83. В 6 строчке видно, что стоит еще один оператор not Оператор not делает отрицание условия, которое здесь указано: если d<5, с оператором not (d<5), оно превращается в условие d>5. Таким образом, чтобы цикл работал бесконечно, достаточно поставить значение d больше указанного значения для сравнения. Рисунок 84. Бесконечный цикл Такой цикл называется циклом с предусловием. Сначала проверяется значение, а затем выполняется цикл. Есть другой вариант бесконечного цикла. Он выполняется всегда, пока действие внутри цикла не противоречит истинности.
60 Основы программирования Рисунок 85. Бесконечный цикл Рассмотрим практическое применение цикла: нарисовать с помощью персонажа и пера квадрат. Мы уже выполняли подобное задание в линейном алгоритме. С циклом этот процесс можно облегчить. Рисунок 86. Цикл для создания квадрата Согласно программе, здесь используется конечный цикл на 4 шага, в котором рисуется одна сторона и совершается поворот на 90°.
Вложенные циклы 61 Вложенные циклы Вложенные циклы — это когда в программе есть два и более циклов, одни из которых находятся внутри других. Часто они применяются для работы с несколькими параметрами, которые необходимо изменять. Конечно, можно было бы обойтись без такого подхода и просто писать несколько конечных циклов множество раз друг под другом. Но в таком случае код оказался бы громоздким, а программирование всегда стремится к упрощению. Рассмотрим пример. Нужно нарисовать квадрат, и при этом не один раз, а сто, да еще и поворачивать его на 15°. Ниже представлен код такой программы. Рисунок 87. Вращаем квадрат Здесь применили вложенные циклы и получили интересный рисунок. Кроме простого поворота фигуры, можно ее еще и смещать. Ниже представлен пример с подобным видом операций: поворот и сдвиг.
62 Основы программирования Рисунок 88. Рекурсия Подобные операции над фигурами называются аффинными преобразованиями. Комбинированные алгоритмы Под комбинированными алгоритмами понимается сочетание уже изложенных алгоритмов в программе. Рассмотрим пример, где необходимо сочетать ветвление и цикл. Программа рисует одну из трех фигур в зависимости от полученной числовой команды: 1, 2 или 3. Фигуры — квадрат, шестиугольник и пятиугольник. Пример подобной программы представлен ниже.
Комбинированные алгоритмы 63 Рисунок 89. Первая часть программы Рисунок 90. Вторая часть программы После каждой выполненной команды программа рисует фигуру и обнуляет значение переменной, которая отвечает за команду. Процесс повторяется бесконечно, пока не будет введена команда 4.
64 Основы программирования Arduino IDE Среда была разработана производителями плат Аrduino, поэтому в программировании и управлении одноименных плат не должно возникнуть проблем. На момент написания книги есть две версии Аrduino IDE: Arduino IDE 1.8.19 и Arduino IDE 2.3.2. Коды, написанные на C++ , тестировались исключительно на версиях Аrduino IDE 1.8.X. Рекомендую поначалу использовать эти версии, например, Arduino IDE 1.8.19. Официальная страница для скачивания программы: https://www.arduino. cc/en/Main/Software. Здесь находим нужную ссылку на дистрибутив. Рисунок 91. Arduino IDE 1.8.19
Arduino IDE 65 Как видно, на странице есть множество вариантов для разных операционных систем. Рассмотрим процедуру установки Arduino IDE на Windows. Для Windows можно воспользоваться тремя способами установки: — скачать установщик; — скачать архив с установщиком; — установить программу через магазин Windows. Совместима с Windows 8.1 и Windows 10. Самый простой способ — первый. Нажимаем по надписи Windows Installer, for Windows XP and up. После нажатия нас перебросит на страницу добровольной помощи разработчикам. Здесь можно оказать им финансовую помощь. Рисунок 92. Страница добровольной помощи разработчикам Аrduino IDE А можно сразу перейти к скачиванию. Нажимаем на кнопку JUST DOWNLOAD — начнется скачивание. Запускаем скачанный файл и устанавливаем программу согласно появляющимся инструкциям. В течение установки будут появляться окна для разрешения установить файлы с определенной лицензией. Мы соглашаемся и продолжаем установку. В итоге на рабочем столе и в меню Пуск появится значок Arduino «f». Запустим программу.
66 Основы программирования Рисунок 93. Программа Аrduino IDE Галочка вверху программы нужна для проверки вашего кода на наличие синтаксических ошибок. Код программ пишется на С++. Значок ð загружает ваш код на плату Arduino. По умолчанию структура кода выглядит как на рис. 93. В коде есть две функции void setup () и void loop () (стрелка 1 и 2). Стрелка 3 указывает на область, где будет показан успех загрузки программы. Стрелка 4 указывает на значок монитор-порта (вывод или ввод данных по COM-порту). Во вкладке Файл — Примеры представлены примеры установленных библиотек.
Arduino IDE Рисунок 94. Примеры программ для Аrduino IDE 67
68 Основы программирования Во вкладке Инструменты, перед тем как загружать программу на плату, необходимо выбрать нужную нам платформу. Платформ Arduino очень много, нужно знать конкретную. В примерах по книге будут использоваться Arduino Uno, Arduino Mega 2560 и LilyPad Arduino. Рисунок 95. Выбор платы Arduino После выбора платы необходимо выбрать порт, к которому подключена плата через компьютер.
Arduino IDE 69 Рисунок 96. Выбор COM-порта, подключенного к Arduino После сделанных процедур можно загружать программу. Рисунок 97. Проверка кода (1), компиляция кода в Arduino (2) Более подробно и кратко о написании кода можно узнать из справочника: https://arduinoplus.ru/coding-arduino/.
70 Основы программирования Особенности конструкции кода Основные функции и операторы int, float, pinMode, digitalWrite(), analogRead(), analogWrite(), Serial(), delay() Мы рассмотрели основные инструменты программы Arduino IDE. Перейдем к особенностям программирования в этой среде. Программы в Arduino IDE написаны на языке С; он относится к языкам программирования высокого уровня со статической типизацией. Статическая типизация — это обозначение типов данных для переменных, которые будут неизменны уже в начале программы. Такой способ облегчает работу компилятора, избавляя его от диагностики и определения типов данных. Типы данных — один из самых важных элементов программирования. В зависимости от типа применяют различные операции или получают разные ответы при одной и той же операции. Типы данных: int — возвращает целочисленное значение в диапазоне от –32768 до 32767. float — возвращает дробное значение, записанное в виде десятичной дроби в диапазоне от 3.4028235E+38 до –3.4028235E+38. byte — возвращает восьмибитовое числовое значение без десятичной точки в диапазоне от 0 до 255. bool — логический тип данных. Возвращает значение true (истина) или false (ложь). С этими типами данных можно проводить ряд операций. Рассмотрим их. Математические операторы: + сложение x -- уменьшение на 1 - вычитание x+=y — увеличение на значение y / деление x- =y — уменьшение на значение y * умножение x*=y — последующее умножение на y x++ увеличение на 1 x/=y — последующее деление на y
Arduino IDE 71 С помощью математических операторов можно проводить простые арифметические действия с числами. Операторы сравнения x==y равенство x<y меньше x!=y не равно x>=y больше или равно x>y больше x<=y меньше или равно С помощью операторов сравнения можно проверять свои результаты с условием на истинность, т. е. подходят ли ваши результаты под условие или нет. Логические операторы Логические операторы необходимы для вычисления логических операций, т. е. для определения истинности или ложности при взаимодействии двух и более логических значений. Ниже представлена Таблица истинности, которая проверяет истинность выражения из двух значений A и B. В таблице показаны три логических оператора: AND, OR и NOT. В скобках — альтернативные обозначения логических операторов. A B AND (&&) OR (||) NOT (!A) true true true true false true false false true false false true false true true false false false false true Переменные Переменные — это именованные ячейки памяти. Переменными выступают обычно буквы латинского алфавита или английские слова, которые несут смысловую нагрузку принимаемого ими значения — так, чтобы его мог понять любой программист. Перед указанием переменной необходимо указать тип данных, который она будет записывать.
72 Основы программирования Пример записи переменных в программу представлен на рисунке ниже. Рисунок 98. Пример кода с переменными Как видно, обычно переменные вводятся в самом начале. Здесь представлены три переменные с разными типами данных. Напротив переменных указаны числа. Они могут играть две роли: — начальное значение переменной; — указание пина (цифрового или аналогового), на который будут подавать или от которого будут получать числовые значения. В нашем случае — это указание пина. Но ничто не мешает рассматривать это как число — до тех пор, пока не будет указана некая функция. Отметим, что после каждого определения переменной стоит точка с запятой. Это одна из главных особенностей языка С, как и фигурные скобки.
Arduino IDE 73 Функции void setup() и void loop() При открытии нового файла в Arduino IDE всегда присутствуют две некие функции: void setup() и void loop(). Для большинства задач возможностей этих функций достаточно. В функции void setup() необходимо определить пины, к которым подключены датчики, модули или актуаторы (моторы). Не только их определить, но и указать: получаем или передаем цифровые или аналоговые сигналы. Также здесь настраивается связь с последовательным портом. Функция pinMode() — определяет номер пина на плате Arduino и указывает действие на прием или передачу значений: — pinMode (13, OUTPUT); — отправляем числовые значения на пин 13; — pinMode (13, INPUT); — принимаем числовые значения с пина 13. Функция Serial.begin(9600); открывает последовательный порт и задает скорость 9600 для последовательной передачи данных. Ниже представлен пример записи пинов и указания действий с ними. Рисунок 99. Структура кода с функциями setup и loop
74 Основы программирования Как видно, кроме обозначения номера пина, можно указать имя переменной, которая принимает значение номера пина в функции pinMode(). Функция void loop() нужна для запуска бесконечного цикла. В нем можно указать действия, которые будут многократно повторяться. Например, вывод значений через последовательный порт пина номер 12 — encoder. За вывод информации отвечает функция Serial.print() или Serial.println(). По форме записи эти функции отличаются только двумя последними буквами. Первая функция будет выводить информацию непрерывно друг за другом в строчку. Значения при таком выводе будут писаться слитно (конечно, можно придумать раздельное написание). Вторая функция будет выводить информацию непрерывно друг за другом построчно (в столбик). Пример представлен ниже. Рисунок 100. Вывод в одну строку
Arduino IDE 75 Рисунок 101. Вывод построчно Как видно из рисунков, в зависимости от функций будет разный вариант вывода, и выводимая числовая информация записана в виде дробного значения, так как тип данных — float. Информация выводится через монитор порта, см. рисунок 93 — монитор порта. Если не указывать, в каком формате получать числовые значения, они выводятся по умолчанию подключенного пина (см. понятие цифровые и аналоговые пины платы Arduino). Задержка по времени Выводить информацию плата может со скоростью в 1/1000 секунды. При такой скорости очень трудно сфокусировать взгляд. Поэтому применяют
76 Основы программирования функцию delay(). Она проводит задержку выполнения программы. В скобках функции указываем значение времени в миллисекундах. Ниже представлен пример вывода значения переменной encoder с задержкой в 0,5 секунды. Рисунок 102. Реализация функции delay В примере указано, что значение переменной encoder будет выводиться через каждые 0,5 секунды.
Arduino IDE 77 Функции digitalRead() и analogRead() На плате Arduino есть цифровые и аналоговые пины, которые по умолчанию выводят либо значения 0 или 1 (цифровые пины), либо от 0 до 1023 (аналоговые пины). Некоторые пины могут выводить как цифровые, так и аналоговые значения (они помечены значком ~). Для чтения с одного пина либо цифровые значения, либо аналоговые применяют функции digitalRead() и analogRead() . Если нужно получить значение в виде 0 и 1, используем функцию digitalRead(). Если нужно получить значения от 0 до 1023, используем функцию analogRead(). Ниже представлены примеры работы двух функций. Рисунок 103. Код с функцией digitalRead
78 Основы программирования Рисунок 104. Результат работы функции Рисунок 105. Код с функцией analogRead Для удобства заменим тип данных для переменной encoder с float на int.
Arduino IDE 79 Рисунок 106. Результат работы функции analogRead Кроме чтения данных с пинов, можно отправлять значения на них. За эту процедуру отвечают функции digitalWrite() и analogWrite(). Функция digitalWrite() позволяет посылать значения на пин: 0 (LOW) или 1 (HIGH). Функция analogWrite() позволяет посылать значения на пин от 0 до 255. Пример представлен ниже. Рисунок 107. Код с digitalWrite и его результат
80 Основы программирования Рисунок 108. Код с analogWrite и его результат Ветвление и вложенные ветвления Мы рассмотрели основные элементы Arduino API. Теперь необходимо рассмотреть реализацию основных видов алгоритмов. Первый такой алгоритм — ветвление (условие). С ним мы познакомились в параграфе в среде mBlock. Теперь необходимо рассмотреть его структуру в среде Arduino IDE. Рассмотрим пример реализации условия в задаче Управление включением светодиода с помощью кнопки. Конструкция условия для Arduino IDE выглядит так: if (проверка условия){ действие при истинности условия }
Arduino IDE 81 Ниже представлен алгоритм с условием для этой задачи. Как только будет нажата кнопка, пойдет команда на включение светодиода. Если кнопку не нажать, светодиод не включится. В конструкции else { действие при ложности условия } прописывается альтернативное действие. Рассмотрим задачу, когда необходимы вложенные циклы. Например, есть два фоторезистора. Они снимают показания освещенности, и на их основе установка вращает дополнительный источник света с помощью сервопривода. Внутреннее условие заключено в {} внешнего условия, при этом альтернативного действия может не быть. Каждое действие, что в одном ветвлении, что во вложенных, всегда в конце заканчивается на знаке « ; » .
82 Основы программирования Циклы Общая конструкция конечного цикла представлена ниже. for (int i=0;i<100,i++) { действия } Оператор for определяет начало цикла. В цикле необходимо указать количество шагов и значения диапазона. Для этого чаще применяют локальные переменные (переменные, которые были созданы непосредственно в какомто месте программы, см. пример выше). Согласно примеру, создается локальная переменная i со значением ноль, которая принимает целочисленные значения. Они увеличиваются на единицу, пока не достигнут значения 99, после этого цикл прервется. Подобная реализация алгоритма приводится в примере по управлению сервоприводом: Конструкция вложенных циклов похожа на конструкцию вложенных условий. Например, необходимо синхронное управление двумя сервоприводами. Первый сервопривод поворачивается на 180° и обратно, после этого поворачивается на один градус второй сервопривод. И так повторяется 180 раз.
Arduino IDE 83 Бесконечные циклы мы не будем рассматривать, так как достаточно самой функции void loop(). Кроме умения программировать и заливать программу в микроконтроллер, необходимо точно понимать, как устроено электронное творение. Поэтому перед реализацией конечной идеи я рекомендую создавать чертеж электрической схемы. Такой способ называется принципиальной схемой устройства. Это не профессиональное построение схемы, но оно поможет в дальнейшем глубже вникнуть в профессиональную среду разработчиков. Схему можно изобразить на бумаге или в специальных программных средах, с одной из которых мы и познакомимся. Она называется fritzing. Ниже представлена структура программы и пример схемы устройства. Рисунок 109. Среда проектирования электрических схем Рисунок 110. Видеообзор Благодаря таким схемам уже не так трудно создавать роботизированные устройства.
84 Основы программирования Материалы для проектирования и создания моделей Кроме создания электронной начинки устройства, необходимо придать ему форму, разработать дизайн, подобрать и обработать материал. Нам необходимы начальные знания в инструментарии и материаловедении. a) Соединительные провода Рисунок 111. Соединительные провода По названию понятно, что их функция — что-то соединять. Так как мы имеем дело с электросхемами, необходимо провести электрический ток ко всем элементам схемы (цепи). За это и отвечают соединительные провода. b) Отвертка Инструмент для завинчивания или отвинчивания крепежных деталей: винта и самореза. Рисунок 112. Отвертка c) Плоскогубцы и кусачки Рисунок 113. Плоскогубцы
Материалы для проектирования и создания моделей 85 Рисунок 114. Кусачки Кусачки предназначены для откусывания, сжимания, скручивания и удержания. В основном применяются к цилиндрическим деталям из металла: проволока, трубки мелкого диаметра, гвозди, болты и т. д. d) Инструмент для снятия изоляции Рисунок 115. Инструмент для снятия изоляции Инструмент для снятия изоляции необходим для этих целей — снятия изоляции с проводов. Я рекомендую использовать данный вид инструмента, так как там можно регулировать зазор вручную для провода любого диаметра, а сама масса инструмента позволит без усилий снять изоляцию. e) Канцелярский нож Рисунок 116. Канцелярский нож Такой нож очень полезен в моделировании. С его помощью легко вырезать фигуры из картона, пенокартона, пластика (до 5 мм) и даже тонкой фанеры (до 3 мм). Соблюдайте осторожность при работе с ним! Эти инструменты потребуются, когда мы начнем работать с металлом.
86 Основы программирования f) Напильник и наждачная бумага Рисунок 117. Напильник Все, что ты отрежешь и отпилишь, будет иметь шероховатости и неровности. Чтобы их сгладить или убрать, используют напильники и наждачную бумагу. g) Платы для монтажа (с пайкой и без пайки) Рисунок 118. Плата для монтажа Такие платы очень необходимы в разработке электрических схем устройств. Сначала мы будем тренироваться на беспаечных платах, затем перейдем к тем, где нужно паять. h) Дерево Рисунок 119. Деревянный брусок
Материалы для проектирования и создания моделей 87 Этот материал применяют при создании моделей и прототипов устройств. Чаще всего из дерева делают несущий каркас. Используют в основном мягкие породы древесины: сосну, липу, березу. Приобрести их можно в строительных магазинах. i) Фанера Рисунок 120. Фанера Очень распространенный материал в поделках. Применяется так же, как и древесина, так как является отходом деревообработки. j) Пластик Пластик — самый распространенный материал в наше время. Он разнообразен по химическому составу и физическим свойствам. В доме обычно всегда есть пластиковые коробки, бутылки, контейнеры или листы. Рисунок 121. Пластик Пластик может быть альтернативой фанере и древесине или использоваться в сочетании с ними. Все зависит от задач, которые он должен выполнять, и вида пластика. k) Пенокартон Мягкий, легкий, но тверже, чем обычный картон. Из-за своих свойств часто применяется в создании моделей, облицовке устройства, если оно не взаимодействует с водой, и там, где оно будет находиться, должна быть невысокая влажность.
88 Основы программирования l) Рекламный пластик (вспененный ПВХ) Это разновидность пластика, но выделенная в отдельную группу, потому что продается в основном в рекламных агентствах: такой пластик применяют в наружной рекламе, которую прикрепляют над входом магазина или учреждения. Из него также вырезают буквы. Этот материал очень легко обрабатывается, легкий и водостойкий. Если хочешь сделать свое устройство быстро, чтобы оно прослужило долго, лучше этого материала пока ничего нет (если, конечно, устройство — не транспорт). m) Металл Рисунок 122. Металл Прочный материал, а если сделать антикоррозийную обработку, еще и долговечный. Минус: его трудно обрабатывать. Часто из металла делают несущую конструкцию, которая способна выдержать достаточно большие нагрузки. Для начального уровня предлагаю применять металл в крайних случаях. В строительных магазинах можно купить алюминиевые и стальные профили, трубки, болты, гвозди, саморезы и т. д. n) Клеи и клеевой пистолет Рисунок 123. Клеевой пистолет Многие элементы конструкции нужно будет крепить с помощью клея. Клеи бывают разные и под разные материалы. Самые простые — силикатный
Материалы для проектирования и создания моделей 89 клей и ПВА, а также термоклей, который продается в виде стержней для клеевого пистолета. Не экономь на качестве пистолета! Чем он надежнее, тем дольше прослужит. Термоклей нагревается в пистолете и выдавливается на участок склеивания, охлаждаясь, застывает. Это крепление достаточно прочное, если не планируется нагревать устройство или проводить краш-тест. Термоклей отлично подходит для быстрого создания прототипов устройств. Кроме перечисленных, есть клей Момент и клей Титан, которые обеспечивают достаточную прочность, выдерживают приличные нагрузки. Однако у них едкий запах, который может вызвать аллергическую реакцию, но при застывании он исчезает: улетучиваются входящие в состав этих клеев ацетон, этилацетат и бензол. При взаимодействии с ними рекомендую использовать маску (защитные очки) и работать в проветриваемом помещении. o) Измерительные приборы: линейка, штангенциркуль Рисунок 124. Измерительная лента Без точного измерения устройство может получиться неровным и даже нестабильным. Электронный штангенциркуль поможет измерить деталь с приемлемой точностью. Если достаточно часто работать с измерительными приборами, появится навык разработки устройства без лишних выравниваний напильником и другими инструментами. p) Паяльная станция Рисунок 125. Паяльная станция
90 Основы программирования Когда собрана электрическая цепь и все электронные компоненты работают как задумано, ее можно зафиксировать с помощью пайки. Все съемные концы цепи спаиваются с помощью олова. Для спайки используют паяльник. Я настоятельно рекомендую применять паяльную станцию с регулятором температуры, у которой уже есть подставка под паяльник. Для начинающего любителя паяльная станция более приемлема: с ней быстрее получишь опыт пайки, чем работая простым паяльником, вдобавок она безопаснее. Помни: наконечник паяльника может разогреваться до 450 градусов Цельсия. Следи, чтобы он не касался провода, с которым соединен. Ручку с наконечником всегда клади на специальную подставку. q) Дрель Рисунок 126. Дрель + шуруповерт Чтобы быстро и качественно сделать отверстия в устройстве, необходима дрель. На первых порах используй легкие дрели-шуруповерты или мини-дрели. Их легче держать в руке и они могут просверлить все материалы, о которых говорится в этой книге. Если работаешь с мягкими материалами (фанера, картон, пластик, сосновые или липовые бруски), можно использовать любые сверла. Если нужно просверлить отверстие в алюминии или стали, выбирай сверла по металлу. Дрель (шуруповерт) при неумелом использовании может нанести вред человеку, поэтому соблюдай технику безопасности: — держи подальше от сверла в дрели волосы и пальцы; — материал, который будешь сверлить, должен быть надежно закреплен, чтобы не соскользнуть;
Материалы для проектирования и создания моделей 91 — при работе с сетевой дрелью следи, чтобы провод от сети не лежал на пути сверла; — держи дрель крепко, лучше двумя руками, чтобы удержать ее, если сверло заклинит. r) Дополнительные держатели и изоляция Рисунок 127. Держатель Третья рука Места пайки и оголенные контакты проводов или электронных компонентов необходимо изолировать с помощью изоляционной ленты. Если оголенный контакт коснется проводящего материала — как твердого, так и жидкого, — высока вероятность короткого замыкания, и устройство может выйти из строя. Плата Аrduino защищена от высоких перепадов напряжения на некоторых участках, но полностью защитить все контакты разработчикам не удалось. При пайке или скручивании контактов часто не хватает двух рук. На этот случай уже все предусмотрено: создан держатель под названием Третья рука. Рано или поздно он нам понадобится.
Введение в разработку устройств на Аrduino и программирование В предыдущих разделах ты кратко познакомился с материалами и инструментарием, которые будут необходимы. Электронику и комплектующие можно приобрести: — в магазинах радиоэлектроники в вашем городе, например, «Чип и Дип»; — в интернет-магазинах ROBOTBAZA (https://robotbaza.ru), Амперка (https://amperka.ru/), AliExpress (https://ru.aliexpress.com). Там же можно приобрести и инструменты для работы с материалом. Некоторые инструменты ты можешь не использовать, так как один инструмент может выполнять роль нескольких. Мы начнем с создания простых электронных устройств с минимумом инструментария и материалов и закончим разработкой устройств с сочетанием почти всех элементов, описанных в книге. Знакомство начнем с правильного подключения электронных компонентов и работы с ними. Рекомендую изучить эту главу и отработать все варианты подключения и настройки электрокомпонентов. На всех этапах будут присутствовать QR-коды со ссылкой на видеоуроки. Рассмотрим плату Аrduino Mega. На рисунке 128 представлено краткое описание ключевых элементов платы Аrduino Mega 2560. Все части других плат с этим обозначением выполняют те же функции. Например, плата Аrduino Uno имеет похожую структуру; отличие только в количестве цифровых и аналоговых пинов. Включить плату можно как минимум тремя способами: — Через USB-порт подключить плату к компьютеру по специальному шнуру, максимальный ток 0.5 А, напряжение 5 В. — Через разъем для штекеров. Можно подать напряжение от 9 В до 12 В без ущерба для платы. — Через порты GND и VIN — подача питания напрямую к плате, минуя стабилизатор. Максимальное значение тока 0.3 А и напряжение 5 В.
Введение в разработку устройств на Аrduino и программирование 93 Рисунок 128. Структура платы Аrduino Mega 2560 Чаще всего применяют первый способ подключения: он самый безопасный для платы. Также через этот порт загружают программы на плату из компьютера или передают данные с платы на компьютер. Вторым способом пользуются, когда программа залита в плату, а устройство протестировано и работает исправно. Третий способ используют в редких случаях: либо когда нет возможности использовать первые два, либо для решения специфических задач. Все входы и выходы принято называть пинами (Pin). Пины GND. Их здесь целых три. Отвечают за питание цепи от платы и замыкание цепи — это знак «-», еще его называют земля. Пины 3.3 В и 5 В — это питание цепи платы, знак «+». Пины с 0 до 13 являются цифровыми и цифро-аналоговыми выводами. Пины 13, 12, 8, 7, 4, 2, 1, 0 — цифровые, а пины 11, 10, 6, 7, 5, 3 — цифро-аналоговые. В основном их задача — передавать сигналы команды на подключенные электронные элементы устройства. Они также могут выполнять функцию приема данных с этих элементов. В Аrduino Mega также есть цифровые пины с 22 по 52. Пины А0 — А5 — аналоговые выводы, их задача — получать данные с аналоговых датчиков (Arduino uno). В Аrduino mega их 16 пинов — с A0 по A15. Рисунок 129. Видеообзор платы Аrduino
94 Введение в разработку устройств на Аrduino и программирование По ходу разработки устройств будем дополнять сведения о тонкостях работы с платой. Управление светодиодами Светодиоды — это особый вид электронного компонента, который может излучать свет и при этом проводить ток только в одном направлении. Мы будем использовать светодиоды, рассчитанные на напряжение в цепи 3 В и на 5 В. Для начала рекомендую применять светодиоды на 3 В: они чуточку дешевле и потребляют меньше тока, что может быть критичным при питании множества электрокомпонентов от Аrduino. Чтобы светодиод не сгорел от повышенного напряжения, мы будем использовать резисторы. Резисторы нужны слаботочные с сопротивлением порядка 220 Ом, 470 Ом, 560 Ом и т. д. До 1 кОм резисторы будут приемлемы. Об этом можно спросить продавца или выбрать в каталоге в интернет-магазине. Каждый резистор имеет маркировку — цветные полоски. Порядок этих полосок определяет значение сопротивления резистора. Проверить маркировку можно на странице сайта «Чип и Дип» https:// www.chipdip.ru/info/rescalc Если более подробно хотите изучить данный вопрос, то есть ссылка на ГОСТ: http://docs.cntd.ru/document/gost-28883-90. Подключение светодиода в цепь Для нашего устройства понадобятся плата Аrduino, светодиод на 3 В, резистор из предложенных выше и соединительные провода. Теперь нам необходимо собрать эти элементы в цепь. Сначала соберем цепь, которая позволит зажечь светодиод, т.е. контакты цепи выведем на пины GND и 5 V платы Аrduino Uno. Напомню: пин GND — это «-» (земля), а 5 V — это «+». Чтобы светодиод не сгорел, на пути движения тока поставим резистор. Его можно подключить либо к длинной ножке светодиода, либо к короткой. Обязательно учти полярность светодиодов. У светодиода две ножки разной длины. Длинная подключается к «+», короткая — к «-». Если ты все правильно сделал, после подачи питания на плату Аrduino светодиод загорится. Подать питание на Аrduino можно разными способами: 1. Подключить плату по USB-порту к компьютеру. 2. Подключить элемент питания по штекеру до 12 В. 3. Подать питание 5 В на порты VIN и GND.
Подключение светодиода в цепь 95 Рисунок 130. Схема электрической цепи со светодиодом Полученная электрическая цепь состоит из последовательного подключения компонентов и образует замкнутый контур. Это обязательное условие движения тока: цепь должна быть замкнута. Как бы она ни ветвилась и какой бы большой ни была, один конец цепи обязательно подключен к «+», а второй — это «-», а в самой цепи нет разрывов. Рисунок 131. Видеообзор подключения Рассмотрим вариант, при котором подключены три светодиода друг за другом последовательно. Если использовать светодиод на 3 В, резистор здесь может не понадобиться. Схема подключения представлена ниже.
96 Введение в разработку устройств на Аrduino и программирование Рисунок 132. Схема электрической цепи с последовательным соединением светодиодов Светодиоды обладают своим внутренним сопротивлением, которое позволяет выдерживать напряжение тока 3 В. При 5 В один светодиод сгорит без резистора, а вот два и более светодиода, последовательно подключенных в цепь, смогут выдержать напряжение в 5 В. Можно заметить, что два светодиода будут светиться ярче, чем три. Это связано с сопротивлением. В физике применяют такие обозначения: I — сила тока, измеряется в амперах (А) U — напряжение, измеряется в вольтах (В) R — сопротивление, измеряется в омах (Ом) Единицы измерения этих величин пишутся с заглавной буквы. Они измеряются в единицах, названных в честь ученых, открывших и изучавших их: Андре-Мари Ампер, Алессандро Вольта, Георг Ом. Между этими физическими величинами существует закономерность, названная законом Ома для участка цепи: I = U / R. Из математического выражения закона следует: если сопротивление будет возрастать, сила тока будет падать при неизменном напряжении. И наоборот, если напряжение будет возрастать при неизменном сопротивлении, сила тока будет увеличиваться. Именно от силы тока зависит яркость свечения светодиода. Пин 3.3 V и 5 V выдают I = 50 мА = 50 10–3 А = 0,05 А. Это важное понятие в разработке электрических схем. Если части схемы соединены последовательно, их общее сопротивление складывается: R = R1 + R2 + R3.
Подключение светодиода в цепь 97 Поэтому мы не стали использовать резистор в схеме на рис. 132. Суммарное сопротивление не позволяет сжечь эти электронные компоненты. С каждым увеличением числа светодиодов будет возрастать сопротивление и уменьшаться распределение напряжения на каждый из них. При последовательном соединении общее напряжение делится на все подключенные компоненты: U = U1 + U2 + U3. Сила тока в данном случае будет неизменна. Интересен и такой момент: если мы вытащим один из светодиодов из цепи, она разомкнется, и ток не сможет пройти по оставшимся участкам. Рисунок 133. Видеообзор последовательного соединения Теперь рассмотрим случай, когда светодиоды подключены параллельно. Пример схемы представлен на рис. 134. Рисунок 134. Схема электрической цепи с параллельным соединением светодиодов
98 Введение в разработку устройств на Аrduino и программирование Для наглядности используем светодиоды разного цвета свечения, но ничто не мешает использовать и светодиоды одного цвета. Как видно из рисунка, в схеме использован резистор: здесь он выполняет такую же роль, как и в первом варианте подключения с одним светодиодом. Это связано с тем, что общее сопротивление при таком подключении вычисляется иначе: 1/R = 1/R1 + 1/R2 +1/R3 Нетрудно догадаться: суммарное сопротивление будет намного меньше суммарного сопротивления при последовательном соединении. Заметим: напряжение будет одинаково на каждом светодиоде, а вот сила тока распределится на светодиоды: I = I1 + I2 + I3. Так как не будет падения напряжения и сопротивление не сильно возрастет, рекомендуется поставить резистор. Светодиоды будут гореть достаточно ярко, и даже если один из них (или два) убрать из цепи, она не разомкнется, и оставшийся светодиод будет светить. Мы рассмотрели особенности подключения светодиодов и на их примере — электрических цепей. Так подключаются все электрокомпоненты. Перед подключением обязательно нужно посмотреть на характеристики электродетали (напряжение, сила тока и сопротивление) и изучить рациональность использования ее в том или ином виде соединения цепи. Рисунок 135. Видеообзор параллельного соединения светодиодов Мы научились создавать простые электрические цепи на примере светодиодов. Теперь научимся управлять электронными компонентами цепи с помощью платы Аrduino и программ. Программирование светодиодов Изменим предыдущую схему так, чтобы воздействовать на светодиод с помощью программ. 12-й порт (пин) цифровой; он будет выполнять роль подачи тока. Если подать питание на плату Аrduino, ничего не произойдет. Для управления им создадим программу в специальном редакторе кода Аrduino IDE и альтернативно — в mBlock5. Согласно задаче, нужно заставить светодиод мигать с интервалом в одну секунду.
Программирование светодиодов Рисунок 136. Схема электрической цепи для управления светодиодом Запустим редактор Аrduino IDE. Рисунок 137. Редактор Аrduino IDE 99
100 Введение в разработку устройств на Аrduino и программирование В этом редакторе можно писать код на языке C++. Рекомендую найти справочник «Arduino. Блокнот программиста», автор Brian W. Evans. На его сорока страницах есть исчерпывающая информация по программированию на начальном уровне. Создадим программу согласно нашей задаче. Вначале необходимо ввести переменную, которая должна принимать целые значения; присвоим ей число 12, которое соответствует порту 12 на плате Аrduino. В языке C функция создается после объявления оператора void. В функции void setup() пропишем порты, которые будем использовать, с помощью команды pinMode (пин, режим работы). Режим работы может быть двух видов: прием сигналов (OUTPUT) и отправление сигналов (INPUT). В функции void loop() происходит зацикливание действий, которые в ней прописаны. Так как светодиод подключен к цифровому порту, сигнал мы должны отправлять цифровой, а он имеет значения только 0 (LOW) или 1 (HIGH). Отправка цифрового сигнала осуществляется командой digitalWrite (пин, значение). Чтобы светодиод мигал, необходимо чередовать передачу сигналов ноль и единицы. Так как плата по умолчанию может передавать до 1000 сигналов в секунду, необходимо ставить задержку, чтобы глаз смог зафиксировать изменения. За это отвечает команда delay (время в микросекундах). Ниже представлен описанный код в редакторе Аrduino IDE. int svet = 12; void setup() { pinMode(svet, OUTPUT); } void loop() { digitalWrite(svet, HIGH); delay(1000); digitalWrite(svet, LOW); delay(1000); } Обрати внимание: каждая функция имеет фигурные скобки. То, что должно в них прописываться, должно находиться внутри них. Каждая строчка, за
Программирование светодиодов 101 исключением самих функций, заканчивается знаком « ; » (точка с запятой). Сохраним под именем svet.ino. Осталось загрузить программу на плату Аrduino. Для этого необходимо подключить ее по USB-кабелю к компьютеру и выбрать номер последовательного (com) порта во вкладке Инструменты — Порт. Если у тебя плата от официального производителя, в списке портов будет подписан порт с подключенной платой Аrduino, как на рисунке ниже. Рисунок 138. Выбор порта подключения к плате Аrduino Достаточно выбрать нужный порт, щелкнув левой кнопкой мыши по списку. Если у тебя плата — клон, придется перебрать порты из списка, чтобы отыскать нужный. Также необходимо выбрать плату, в которую будем загружать программу. Путь идентичен: Инструменты — Плата.
102 Введение в разработку устройств на Аrduino и программирование Рисунок 139. Выбор платы в Аrduino IDE После этого необходимо сохранить программу в файл. Назовем его svetodiod.ino. Рисунок 140. Сохранение программы в файл
Программирование светодиодов 103 Последний шаг — загрузка программы в плату Аrduino. Рисунок 141. Сохранение программы в файл Необходимо подождать несколько секунд, пока программа перезапишется в плату. Индикатор перезаписи — зеленый индикатор загрузки: когда он исчезнет, это знак, что загрузка прошла успешно. В этот же момент можно наблюдать выполнение программы платой Аrduino: светодиод одну секунду горит, вторую — не светится. Рисунок 142. Видеообзор управления светодиодом
104 Введение в разработку устройств на Аrduino и программирование Аналогично тот же алгоритм можно реализовать с помощью среды mBlock5. Открываем программу и добавляем библиотеку по работе с устройством Arduino. Рисунок 143. Добавляем устройство Аrduino Если работаешь с Arduino Uno или Mega, на рисунке ниже представлены примеры таких библиотек. Я выберу для примера Arduino Uno. Выбрав нужную библиотеку, кликаем по кнопке ОК.
Программирование светодиодов 105 Рисунок 144. Выбираем библиотеку под Аrduino Uno Во вкладке Устройства появится наша библиотека. Кликаем по ней — и справа отобразятся доступные операторы и функции, разбитые по категориям. Программа должна начаться при включении платы Arduino, т. е. когда есть питание электрическим током. Поэтому переходим во вкладку События и выбираем функцию при запуске Arduino Uno. Рисунок 145. Выбираем событие запуска программы Далее нам необходим бесконечный цикл, аналог loop(). Его мы найдем во вкладке Управление.
106 Введение в разработку устройств на Аrduino и программирование Рисунок 146. Добавление бесконечного цикла в программу Теперь в данном цикле нам нужно включать и выключать светодиод, подключенный к 12 пину Arduino Uno. Функции работы с пинами находятся во вкладке Пин. Будем работать с цифровым пином, так как нужно менять значения только на 1 (HIGH) или 0 (LOW). В выбранной функции есть окошко для вписывания номера пина; укажем значение 12. Рисунок 147. Функция работы с цифровым пином
Программирование светодиодов 107 Далее должна идти задержка в 1 секунду. Функция задержки — во вкладке Управление. Рисунок 148. Добавляем задержку в 1 секунду Теперь нужно повторить две последние функции с изменением на выключении питания на пине 12. Рисунок 149. Алгоритм включения и выключения светодиода на 12 пине Следующий шаг — подключение устройства к компьютеру по USB-проводу и сопряжение со средой mBlock5. С Arduino лучше использовать режим Загрузки.
108 Введение в разработку устройств на Аrduino и программирование Рисунок 150. Кнопки сопряжения mBlock5 с подключенным устройством После нажатия кнопки Подключение всплывет окно с выбором COMпорта. Чтобы видеть все задействованные порты, поставь галочку напротив текста Показать все подключенные устройства. Выбрав нужный COM-порт (его легко определить, отключая и включая устройство), нажимаем кнопку Подключение. Рисунок 151. Процесс сопряжения Аrduino с mBlock5 Произойдет подключение, как на рисунке ниже. Теперь можно загружать созданную программу, кликнув по кнопке Загрузить.
Программирование светодиодов 109 Рисунок 152. Функция загрузки программы в Аrduino Запустив процесс загрузки, увидим всплывающее окно с визуализацией прогресса загрузки. На этом же этапе программа диагностирует наличие ошибок, если они есть. Рисунок 153. Процесс загрузки программы
110 Введение в разработку устройств на Аrduino и программирование После завершения загрузки программы можем наблюдать тот же алгоритм работы светодиода, что и с программой, написанной в Arduino IDE. В дальнейшем процедуру загрузки программы опустим, так как она во всех случаях одна и та же. Акцент сделаю на написании кода и практике создания устройств. В некоторых случаях представлю уже готовый код на mBlock5 или Arduino, если они либо очень простые, либо очень громоздкие (для Arduino IDE). Фоторезистор и датчик света Следующий наш шаг — познакомиться с фоторезистором. Он обладает сопротивлением, которое может изменяться под действием света. Чем интенсивнее освещение, тем меньше сопротивление. Такой эффект часто применяют для создания устройств сигнализаций. Ниже представлена схема подключения резистора. Рисунок 154. Схема подключения фоторезистора Так как фоторезистор меняет сопротивление под действием света, для работы с ним нужно получать изменения от него. Для этого проведем синий провод к порту A0: это аналоговый порт. Будем получать значения от 0 до 1023, которые эквивалентны изменению напряжения при изменении сопротивления. Если значения меняются при изменении света, следовательно, меняется и сопротивление фоторезистора. Создадим программу, с помощью которой будем получать значения показаний с фоторезистора. Откроем программу Аrduino IDE. Введем переменную, которой присвоим значение A0. В функции void setup() определим пин и его назначение на передачу данных плате Аrduino. Чтобы в реальном времени передавать и видеть передачу данных, нужно воспользоваться методом Serial; он позволяет получать данные с пинов и передавать на компьютер
Фоторезистор и датчик света 111 через com-порты. Здесь необходимо указать начало работы метода, указать скорость (кодировку) информации: Serial.begin(9600). В функции void loop() необходимо прописать команду на чтение переданных аналоговых данных с датчика и их передачу на компьютер: analogRead(foto) и Serial.println(). Чтобы процесс уловить взглядом, поставим задержку в полсекунды: delay(500). Полностью код представлен ниже. int foto =A0; void setup() { pinMode(foto, INPUT); Serial.begin(9600); } void loop() { Serial.println(analogRead(foto)); delay(500); } Сохраним файл под именем fotoresistor.ino и загрузим программу в плату Аrduino. Теперь, чтобы увидеть данные от фоторезистора, необходимо открыть вкладку Монитор порта, см. рис. 156. Рисунок 155. Вкладка Монитор порта в программе Arduino IDE
112 Введение в разработку устройств на Аrduino и программирование Поднеси палец вплотную к фоторезистору — и увидишь, что значения повысятся. Если убрать палец, значения фоторезистора понизятся. Рисунок 156. Работа монитора порта. Получение данных с фоторезистора Рисунок 157. Видеообзор подключения фоторезистора Программа на mBlock5: Для отображения данных в mBlock5 используют расширение по передаче локальных сообщений между устройством и компьютером. Это расширение нужно подключить к библиотеке Arduino Uno и к персонажу (компьютеру).
Фоторезистор и датчик света Рисунок 158. Вкладка Расширение для устройств Рисунок 159. Вкладка Расширение для персонажа (компьютера) 113
114 Введение в разработку устройств на Аrduino и программирование Выбираем расширение Трансляция режима передачи для персонажа. Рисунок 160. Окно с расширениями для персонажа Рисунок 161. Подключенное расширение для персонажа
Фоторезистор и датчик света 115 Переходим во вкладку Устройства и подключаем нужное расширение Upload Mode Broadcast. Рисунок 162. Расширение для платы Arduino Рисунок 163. Подключенное расширение для Аrduino
116 Введение в разработку устройств на Аrduino и программирование Теперь приступаем к написанию программы по аналогии с программой для Arduino IDE. Чтобы видеть отображаемое значение на , нужно создать переменную для персонажа. Обозначим ее буквой F. Как только создадим ее, она отобразится в окне со спрайтом панды. Рисунок 164. Вкладка Переменные у персонажа Рисунок 165. Создание переменной с именем F
Фоторезистор и датчик света 117 Рисунок 166. Отображение переменной с данным именем и первоначальным значением Теперь напишем программу для нашего персонажа (компьютера), который должен принимать сообщения со значением от фоторезистора. Выбираем событие при получении сообщения message в режиме загрузки. Имя сообщения «message» можно изменять под свои нужды, но главное, чтобы отправленное сообщение имело то же имя, что и получаемое. Получив сообщение, присвоим его значение переменной F. Рисунок 167. Программа для персонажа
118 Введение в разработку устройств на Аrduino и программирование Теперь переходим во вкладку Устройства и выбираем Arduino. Добавим уже известное событие и цикл. Укажем функцию отправки сообщения с именем message со значением и установим задержку в 0,5 секунды согласно алгоритму. Рисунок 168. Основная конструкция программы для Аrduino Теперь нам нужно считать значение с пина A0. Для этого переходим во вкладку Пин и выбираем аналоговый ввод пин (А) и указываем значение ноль. Рисунок 169. Программа для Аrduino
Фоторезистор и датчик света 119 Подключаем устройство Arduino к компьютеру и загружаем программу. Меняя освещение над фоторезистором, наблюдаем за показаниями в окне с персонажем. Рисунок 170. Результаты вывода с фоторезистора Если все работает так, как описано в книге, можем перейти к следующему шагу: создадим умный светильник. Если в помещении станет достаточно темно, светодиод в цепи загорится, если светло — потухнет. Соберем схему, которая представлена ниже. Рисунок 171. Схема подключения фоторезистора и светодиода к плате Аrduino В схеме подключения почти ничего нового, за исключением того, что питание (провода с порта 5 V и GND) подведены параллельно к каждой схеме. Для выполнения устройством поставленной задачи необходимо написать код. Воспользуемся кодом с файла fotoresistor.ino. В эту заготовку нужно
120 Введение в разработку устройств на Аrduino и программирование добавить переменную, отвечающую за порт 12, к которой подключен светодиод, и назначить для него свойство на прием команд. В цикле (void loop{}) мы должны проверять значения и давать команду светодиоду, если они отвечают некоторому условию. Условие описывается операторами: if, else if, else. Для корректной работы конструкции нужно определиться, при каком значении от фоторезистора светодиод будет загораться: они могут быть разными и не совпадать с теми, что описаны в книге. Сначала посмотри, какие значения выдает фоторезистор, когда он не закрыт, а затем прикрой и проверь еще раз. Зная минимальный и максимальный порог значений, выберем среднее значение и от него будем строить условие. Пример кода представлен ниже. int foto =A0; int svet =4; void setup() { pinMode(foto, INPUT); pinMode(svet, OUTPUT); Serial.begin(9600); } void loop() { if ( analogRead(foto)>750) { digitalWrite(svet,HIGH); } else { digitalWrite(svet,LOW); } Serial.println(analogRead(foto)); delay(300); } Код сохраним в файле под именем fotoresistor_svet.ino. Запустим и проверим работу устройства.
Датчик температуры и влажности воздуха 121 Рисунок 172. Видеообзор сборки умного светильника Аналогично программа в mBlock5 будет выглядеть вот так: Рисунок 173. Реализация алгоритма умного светильника в mBlock5 Датчик температуры и влажности воздуха Датчик температуры и влажности воздуха имеет прямое предназначение согласно наименованию. Существуют модели DHT11, DHT21, DHT22. Они бывают в виде готовых модулей со встроенным резистором или отдельными датчиками.
122 Введение в разработку устройств на Аrduino и программирование Рисунок 174. Датчик температуры и влажности воздуха DHT11 Для первоначальных задач можно использовать любую из этих моделей. Разберем схему подключения датчика, рис. 175. Рисунок 175. Схема подключения датчика DHT11 к Аrduino Как видно из схемы, для подключения датчика используют только три контакта («+», «-», «сигнал»). Резистор применяется здесь так же, как в схеме с фоторезистором. Реализованная схема представлена на рис. 175. На модулях для удобства пишут наименования контактов: — «+» часто обозначают VCC; — «-» — GND; — сигнал — «S».
Датчик температуры и влажности воздуха 123 Чтобы получить данные с датчика влажности воздуха, нужно загрузить соответствующую программу. Есть готовые библиотеки по работе со многими датчиками и модулями, их можно скачать. Так как это начальный уровень, мы не будем углубляться в математику, но без некоторых математических преобразований не обойтись. Мы пропустим этот момент и воспользуемся готовыми решениями, где все уже преобразовано до нас. Готовое решение содержится в библиотеке DHT-sensor-library-master (скачать можно в репозитории GitHub автора, указанном в книге). Рисунок 176. Код программы для датчика DHT11 #include “DHT.h” #define DHTPIN 2 // Digital pin connected to the DHT sensor // Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 -// Pin 15 can work but DHT must be disconnected during program upload. // Раскомментируйте нужную строку для вашего датчика. //#define DHTTYPE DHT11 // DHT 11
124 Введение в разработку устройств на Аrduino и программирование //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 #define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println(F(“DHTxx test!”)); dht.begin(); } void loop() { // Wait a few seconds between measurements. delay(2000); float h // Read float t // Read float f = dht.readHumidity(); temperature as Celsius (the default) = dht.readTemperature(); temperature as Fahrenheit (isFahrenheit = true) = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println(F(“Failed to read from DHT sensor!”)); return; } float hif = dht.computeHeatIndex(f, h); float hic = dht.computeHeatIndex(t, h, false); Serial.print(F(“Humidity: “)); Serial.print(h); Serial.print(F(“% Temperature: “)); Serial.print(t); Serial.print(F(“°C “)); Serial.print(f); Serial.print(F(“°F Heat index: “)); Serial.print(hic); Serial.print(F(“°C “)); }
Датчик температуры и влажности воздуха 125 Рисунок 177. Результат работы программы для датчика DHT11 Этот датчик применяется в создании умных теплиц, террариумов, домов, роботов-исследователей. Программа в mBlock5 В mBlock5 также есть расширения под разные датчики и модули, но они могут некорректно работать в связи с тем, что разрабатывают их не только организации, но и простые пользователи вроде нас с тобой. Поэтому иногда трудно найти нужное расширение. Я нашел работающее расширение под датчик DHT11; возможно, ты найдешь их и под другие модели датчиков. Вбиваем в поисковик расширений слово dht и подбираем нужное. В примере я использовал расширение Sensor DHT11 y DHT12, что на рисунке ниже. Составим программу для Arduino. Создадим три переменные с именами T, TF и H, которые будут хранить значения температуры в градусах Цельсия и по шкале Фаренгейта, а также влажность в процентах. Эти переменные будем поочередно отправлять через уже известное нам расширение каждые 0,5 секунды. Подключим Arduino и загрузим программу.
126 Введение в разработку устройств на Аrduino и программирование Рисунок 178. Добавляем расширение для DHT Рисунок 179. Выглядит так
Датчик температуры и влажности воздуха 127 Рисунок 180. Программа для Arduino Теперь перейдем во вкладку Персонаж и составим программу для приема сообщений с указанными именами. Рисунок 181. Программа для персонажа
128 Введение в разработку устройств на Аrduino и программирование Чтобы наблюдать за изменениями значений на экране, переходим во вкладку Устройства. Рисунок 182. Результат Датчик влажности почвы Рассмотрим еще один интересный датчик — датчик влажности почвы. Зачастую он используется в умной теплице, где необходимо поддерживать определенную влажность почвы для растений. Рассмотрим схему подключения этого датчика. Она аналогична фоторезистору. Рисунок 183. Схема подключения датчика влажности почвы с двумя контактами Эта схема подключения подходит для датчиков, у которых только два контакта. Но есть датчики влажности почвы, где уже встроен резистор или есть регулируемый потенциометр, тогда у них три контакта: «+» (VCC), «-» (GND), S.
Датчик влажности почвы 129 Рисунок 184. Схема подключения датчика влажности почвы с тремя контактами Программа для снятия данных с датчика аналогична программе для фоторезистора. int pochva =A0; void setup() { pinMode(pochva, INPUT); Serial.begin(9600); } void loop() { Serial.print(“Pochva “); Serial.println(analogRead(pochva)); delay(500); } Сохраним под именем pochva_sensor.ino. Схема подключения в реализации выглядит примерно так: Рисунок 185. Видеообзор подключения датчика влажности почвы
130 Введение в разработку устройств на Аrduino и программирование Программа в mBlock5: В mBlock5 программа будет такая же, как для фоторезистора. Рисунок 186. Программа для Персонажа Рисунок 187. Программа для Аrduino
Лазерный модуль У лазерного модуля множество вариантов применения: лазерный тир, сигнализация, дальномер, сканер, прицел и т. д. Рисунок 188. Лазерный модуль Лазерный модуль может работать по принципу включен-выключен. Ниже представлена простая схема подключения лазерного модуля. Рисунок 189. Схема подключения лазерного модуля Принимать сигналы он будет через десятый пин.
132 Лазерный модуль С помощью программы, идентичной управлению светодиодом, заставим наш модуль мигать через каждую секунду с длительностью в три секунды. int laz = 10; void setup() { pinMode(laz, OUTPUT); } void loop() { digitalWrite(laz, HIGH); delay(3000); digitalWrite(laz, LOW); delay(1000); } Сохраним под именем lazer_mod.ino. Программа в mBlock5: В mBlock5 программа будет аналогично управлению светодиодом. Рисунок 190. Программа по управлению лазерным модулем Пьезоэлемент Функция пьезоэлемента — издавать монотонные звуки на определенной частоте. Частотные звуки модуль может чередовать согласно программе.
Пьезоэлемент 133 Поэтому он часто используется в таких конструкциях, как сигнализация, будильник, музыкальный инструмент и т. д. Рисунок 191. Пьезоэлементы на 3 В Рисунок 192. Схема подключения пьезоэлемента на 3 В На рис. 192 представлена простая схема подключения этого элемента, если он рассчитан на напряжение в 3 В. Заметьте, что «+» — это пин 3.3 В. Пьезоэлемент обладает той же полярностью, что и светодиод, поэтому длинная ножка — это «+», короткая — «-». После подключения питания к Аrduino, пьезоэлемент начнет издавать достаточно громкие звуки определенной частоты. Чтобы управлять звучанием этого радиоэлемента, необходимо один из выводов подключить к цифровому пину. В основном подключают вывод, который идет на «+». Подключим его к десятому пину. Ниже представлена схема подключения пьезоэлемента и реализация этой схемы, рис. 193.
134 Лазерный модуль Рисунок 193. Схема подключения пьезоэлемента на 3 В к пину 10 Теперь создадим программу в среде Аrduino IDE для управления пьезоэлементом и сохраним под именем piezo1.ino. int piezo = 10; void setup() { pinMode(piezo, OUTPUT); } void loop() { tone(piezo, 200); delay(300); tone(piezo, 2000); delay(1000);
Пьезоэлемент 135 tone(piezo, -1); delay(1000); } Чтобы заставить данный радиоэлемент издавать звуки, достаточно прописать команду tone(), где указать, на какой порт посылать сигнал и с какой частотой. Мы можем создавать мелодию, зная, какой частоте соответствует нота. Есть специальная таблица. Рисунок 194. Таблица нот и частот Рисунок 195. Видеообзор подключения пьезоэлемента В среде mBlock5 для расширения Arduino Uno или Mega есть функция работы со звуком по нотам согласно данной таблице.
136 Лазерный модуль Рисунок 196. Реализация алгоритма в mBlock5 Кнопки и клавиатура Эти элементы часто используются для управления любым роботизированным устройством. В зависимости от количества функций робота используют либо одну-две кнопки, либо целые компактные клавиатуры. Рисунок 197. Кнопки с ножками (внешний монтаж) Рекомендую использовать кнопки с ножками: их легче подключать к плате.
Кнопки и клавиатура 137 Рисунок 198. Клавиатура Рисунок 199. Схема подключения кнопки со светодиодом К схеме с кнопкой подключен и светодиод: это нужно для демонстрации работы кнопки. Как только кнопка будет нажата, по ней пойдет ток и попадет на пин 2. Если на него придет сигнал, то сработает команда подать сигнал на светодиод. Программа для настройки корректной работы кнопки представлена ниже. Сохраним под именем button.ino. int button = 2; int led = 10; void setup() {
138 Лазерный модуль pinMode(led, OUTPUT); pinMode(button, INPUT); digitalWrite(led, LOW); } void loop(){ if (digitalRead(button) == HIGH) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } Рисунок 200. Видеообзор подключения кнопки и светодиода Программа в mBlock5: Рисунок 201. Программа для кнопки
Кнопки и клавиатура 139 Для управления устройством можно использовать как кнопки, так и целую мини-клавиатуру. Самые распространенные клавиатуры для Аrduino — это 4×4, см. рис. 202. Ниже представлена схема подключения этой клавиатуры. Рисунок 202. Схема подключения клавиатуры к Аrduino Создадим программу для взаимодействия с клавиатурой. Программа будет опираться на библиотеку Keypad.h. Она находится в открытом доступе на сайте Аrduino, в книге есть ссылка на нее. В программе необходим двумерный массив из используемых символов клавиатуры. Нужно указать столбцы и строки по пинам. По умолчанию контакты клавиатуры, помеченные черными линиями на шлейфе, определяют столбцы, а белыми линиями — строки. При нажатии клавиши на клавиатуре мы получим отклик в виде символа из двумерного массива. Нужно, чтобы условное обозначение на клавиатуре совпадало с условным значением элемента массива. Для самопроверки будем выводить значения, полученные от нажатия клавиши, на монитор порта с кодировкой 9600. #include <Keypad.h> const byte ROWS = 4; //число строк клавиатуры const byte COLS = 4; //число столбцов клавиатуры char hexaKeys[ROWS][COLS] = { {‘1’,’4’,’7’,’*’},
140 Лазерный модуль {‘2’,’5’,’8’,’0’}, {‘3’,’6’,’9’,’#’}, {‘A’,’B’,’C’,’D’} }; byte rowPins[ROWS] = {8,9,10,11}; //строки byte colPins[COLS] = {4,5,6,7}; //столбцы Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); int s1=12; int s2 =13; void setup(){ pinMode(s1, OUTPUT); pinMode(s2, OUTPUT); Serial.begin(9600); } void loop(){ char customKey = customKeypad.getKey(); if (customKey){ Serial.println(customKey);} if(customKey==’1’){ digitalWrite(s1,HIGH); } if(customKey==’2’){ digitalWrite(s1,LOW); } if(customKey==’5’){ digitalWrite(s2,HIGH); } if(customKey==’B’){ digitalWrite(s2,LOW); } } Сохраним программу под именем klava.ino.
Кнопки и клавиатура 141 Рисунок 203. Видеообзор подключения клавиатуры к Arduino Реализация программы в mBlock5 Для начала нужно убедиться, что мы подключили правильно клавиатуру к Arduino Uno. Для этого нужно создать две переменные: number и n. Переменные можно задать во вкладке Персонажи. Рисунок 204. Установка цифрового порта на значение Высокий Для этой вкладки загрузим расширение для получения данных через облако. Обрати внимание: у тебя должен быть аккаунт в mBlock5. После установки расширения для спрайта по передаче и приему сообщений создадим программу, которая будет отслеживать два сообщения — с именами message и mmm.
142 Лазерный модуль Рисунок 205. Установка бесконечного цикла При получении одного сообщения присваиваем его значение переменной n, а при получении второго — переменной number. Это нужно сделать, чтобы увидеть в режиме реального времени значения, которые будут считываться с клавиатуры. Рисунок 206. Получение сообщений спрайтом Следующий шаг — добавление расширения для Arduino для работы с сообщениями через облако.
Кнопки и клавиатура 143 Рисунок 207. Добавление расширения в Аrduino Рисунок 208. Расширение — Передача сообщений в облако Для работы с матричной клавиатурой необходимо добавить соответствующее расширение — Клавиатура 4×4. Вбей в поисковую строку слово Клавиатура или Key и, нажав Enter, увидишь нужное расширение. Нажми значок «+» и кликни Добавить.
144 Лазерный модуль Рисунок 209. Расширение работы с клавиатурой Добавим в нашу программу функцию настройки клавиатуры. Здесь укажем, к каким пинам подключили провода, отвечающие за строки, а к каким — за столбцы. Рисунок 210. Настраиваем клавиатуру
Кнопки и клавиатура 145 Теперь добавим оператор цикла, внутрь которого расположим условие. Условие будет проверять нажатие клавиши, отправлять сообщение с ее значением. Так можно проверить, правильно ли назначены пины в программе для клавиатуры. Рисунок 211. Отправка значений на ПК с клавиатуры Если при запуске программы и нажатии клавиш ты получаешь те же значения, что и указанные на клавише, соединение верно, и можно приступать к дополнению кода. В противном случае меняем значения пинов во второй строчке, пока не добьемся верного результата. Рисунок 212. Конечный вариант кода
146 Лазерный модуль Ультразвуковой датчик расстояния Широко применяется в робототехнике. Так как он может фиксировать изменение расстояния до объекта, его часто используют в качестве радара и технического зрения. Пример — мобильные роботы, движущиеся по лабиринту или собирающие предметы, автоматизация открывания дверей при приближении к устройству, локаторы. Рисунок 213. Ультразвуковой датчик HC-SR04 Есть множество разновидностей этих датчиков. Они отличаются качеством сигнала или наличием дополнительных функций. Датчик на рис. 213 — самый простой и дешевый вариант. Потренируемся с подключением его к плате Аrduino. На рис. 214 представлена схема подключения. Реализуем ее на практике. На пинах датчика есть условные обозначения по подключению. На рис. 214 представлена практическая реализация задачи. Если у нас все подключено согласно схеме, необходимо написать простую программу по вычислению расстояния от ультразвукового датчика до предмета. Дальность измерения датчика — 4 метра, а диапазон обзора составляет 30°. В программе для пинов 11 и 12 необходимо прописать их работу, так как они связаны с управлением приемника и источника ультразвука. К 12 пину подключен trig — это испускание ультразвука. К пину 11 подключен echo — это прием отраженного ультразвука. Необходимо настроить частоту испускания, чтобы приемник мог хорошо принять сигнал.
Ультразвуковой датчик расстояния Рисунок 214. Схема подключения ультразвукового датчика расстояния HC-SR04 Код программы: int trig = 12; int echo = 11; long dur, cm; void setup() { Serial.begin (9600); pinMode(trig, OUTPUT); pinMode(echo, INPUT); } 147
148 Лазерный модуль void loop(){ // Датчик генерирует импульсы шириной 10 мкс // Генерируем короткий LOW импульс, // чтобы обеспечить хороший импульс HIGH: digitalWrite(trig, LOW); delayMicroseconds(5); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); // Считываем данные с ультразвукового датчика: значение HIGH, которое // зависит от длительности (в микросекундах) между отправкой // акустической волны и ее обратном приеме на эхолокаторе. pinMode(echo, INPUT); dur = pulseIn(echo, HIGH); cm = (dur/2) / 29.1; Serial.print(cm); Serial.print(“cm”); Serial.println(); delay(300); } Сохраните код под именем ultrasonic.ino. Если программу загрузить на плату Аrduino, можно увидеть примерно такой результат работы датчика во вкладке Монитор порта. Рисунок 215. Видеообзор подключения ультразвукового датчика расстояния HC-SR04
Bluetooth-модуль 149 В среде mBlock5 программа будет выглядеть так. Рисунок 216. Программа для загрузки на Аrduino Рисунок 217. Программа для персонажа Здесь также есть переменная cm, которая присваивает значения функции, работающей с ультразвуковым датчиком. В расширении Аrduino уже есть отдельная вкладка Датчики, где эта функция присутствует. Bluetooth-модуль Для дистанционного взаимодействия с устройством часто применяют Bluetooth-соединение. На открытой местности дальность приема и получения сигнала может достигать 15 метров. Этого достаточно для управления различными устройствами в зоне прямой видимости. Одни из самых распространенных радиомодулей — HC-05, HC-06 и HC-10. Рисунок 218. Bluetooth-модуль
150 Лазерный модуль Соберем схему дистанционного управления и получения данных с фоторезистора на свой телефон, чтобы лучше разобраться в работе Bluetooth-модуля. Для дистанционного управления можно использовать телефон или планшет на операционной системе Аndroid или iOS: на этих устройствах есть Bluetooth-модуль, и они могут с легкостью подключиться к подобным модулям и настроить передачу и прием информации по радиоканалу. Рисунок 219. Схема фоторезистора со светодиодом и Вluetooth-модулем На рисунке 219 показан пример схемы с использованием Вluetooth-модуля. За основу взята схема для фоторезистора и светодиода. Красные провода — это распределение питания 5 В, а черные — распределение GND. Обратите внимание, что контакты модуля RX подключаются к пину Аrduino TX, а TX подключается к RX. Электронная реализация схемы подключения есть, теперь приступим к написанию кода для получения данных с фоторезистора по Вluetooth-модулю. Ничего нового придумывать и вводить мы не будем: код уже есть для фоторезистора. Сохраним под именем bluetooth.ino.
Bluetooth-модуль 151 int foto =A0; void setup() { pinMode(foto, INPUT); Serial.begin(9600); } void loop() { Serial.println(analogRead(foto)); delay(500); } } Так как Вluetooth-модуль распознается как устройство, подключенное к последовательному порту (COM), для передачи и получения данных достаточно класса Serial. Загрузи программу на Аrduino. Для получения данных и их отправки необходимо установить приложение Bluetooth Терминал. Такого вида приложения есть или в Google play, или App Store, или в магазине Windows для компьютера с Windows 10–11. Можно использовать разные ее вариации. Здесь рассмотрим программу Bluetooth Terminal для устройств на Аndroid. Рисунок 220. Программа на телефоне Bluetooth Тerminal
152 Лазерный модуль Сейчас нет активного подключения. Для нахождения модуля и его подключения к телефону необходимо сделать два основных шага: 1. Открыть на телефоне вкладку Bluetooth и запустить процедуру поиска модуля. Имя устройства будет соответствовать названию модели Bluetooth (HC-05, HC-06). Необходимо провести сопряжение с устройством. 2. Открыть Bluetooth Terminal и в правой вкладке выбрать Connect a device — Secure. Появится список устройств, к которым можно подключиться. Выбери устройство Bluetooth по названию и кликни по нему пальцем. Если все сделано правильно, на экране телефона появятся данные от фоторезистора. Все работает исправно. Теперь усложним программу так, чтобы при отправке с телефона команды «1» светодиод загорался, а пре отправки команды «2» — затухал. Дополним программу переменной, отвечающей за передачу сигнала на светодиод, и переменной, которая будет принимать значения 1 или 2. Для получения данных устройством Вluetooth на Аrduino необходимо применить подобную конструкцию: if ( Serial.available()) { x = Serial.read();} Допишем ее в программу для Bluetooth и укажем алгоритм ветвления на прием сигналов, которые будут включать или выключать свет. Сохраним программу под именем bluetooth1.ino. int x; int svet =12; int foto =A0; void setup() { pinMode(svet, OUTPUT); pinMode(foto, INPUT); Serial.begin(9600); } void loop() { if ( Serial.available()) { x = Serial.read();
Bluetooth-модуль if (x == ‘1’) { digitalWrite(svet, HIGH); } else if (x ==’2’){ digitalWrite(svet, LOW); } Serial.println(x); } } Рисунок 221. Видеообзор работы Bluetooth-терминала с модулем HC-06 Программа в mBlock5: Рисунок 222. Программа в mBlock5 153
154 Лазерный модуль Датчик линии Датчик линии необходим для определения яркости отраженного от поверхности света. На основе этих показаний можно определить границы между контрастными цветами. В основном это черная линия на белом фоне или белая линия на черном фоне. Можно создать мобильного робота, двигающегося по заданной траектории, с помощью линий или копирования нарисованных изображений. Нарисуем примерную схему подключения датчика линии. Рисунок 223. Схема подключения датчика линии Датчик линии можно подключать и к аналоговому выводу, и к цифровому. \ Рисунок 224. Датчик линии
Датчик линии 155 У датчика есть потенциометр для регулирования чувствительности. Приступим к созданию программы для нашего устройства. Датчик может выдавать и аналоговый сигнал, и цифровой, поэтому в программе опишем оба варианта. int line = A0; void setup() { Serial.begin(9600); pinMode(line, INPUT); Serial.begin(9600); } void loop(){ //Serial.println(digitalRead(line)); Serial.println(analogRead(line)); delay(300); } В случае с цифровым сигналом получаем данные с третьего пина. Если аналоговый сигнал — с пина A0. В цикле, соответственно, нужна программа для получения данных: — analogRead(line) — чтение аналоговых сигналов — digitalRead(line) — чтение цифровых сигналов Рисунок 225. Видеообзор работы датчика линии
156 Лазерный модуль Программа в mBlock5: Рисунок 226. Программа для Аrduino Рисунок 227. Программа для персонажа (компьютера) DC-мотор Любое устройство, которое совершает перемещение в пространстве или в котором совершают движения его части, содержит актуаторы — моторы. Это устройства, которые частично переводят энергию электрического тока в механическую работу. Для большинства проектов пользуются электромоторами от 3 В до 12 В. Выше было описано, что электромоторы могут быть разного типа. Рассмотрим DC-моторы — простые электромоторы, которые встречаются чаще всего. Почти все электронные игрушки, которые могут перемещаться, содержат такие моторы. Они есть в компьютерном дисководе, лифте, электромобилях и многих других устройствах. Чаще всего эти моторы содержат редукторы (сочетание зубчатых колес), которые либо замедляют вращение, либо ускоряют, и при этом влияют на механическую силу мотора. Это момент силы (крутящий момент). Единица измерения такой силы — Н/м (Ньютон на метр), или кг/см (килограмм на сантиметр). Пример. Момент силы мотора составляет 25 кг/см. Это означает, что на расстоянии в 1 см от центра оси вращения мотора сила, которую создает тело
DC-мотор 157 массой 25 кг, соответствует силе тяжести. Если расстояние до центра вращения увеличить в два раза (2 см), сила уменьшится ровно в два раза и станет равной 12,5 кг. Если использовать колесо радиусом в 5 см, сила мотора будет соответствовать 5 кг. Отсюда вытекает ограничение по массе самого устройства: оно должно быть таким, чтобы моторы были способны сдвинуть устройство с места. Это примерная схема расчета силовых нагрузок мотора, так как мы не учитывали трение о поверхность. Рассмотрим простую схему подключения мотора к плате Аrduino. Рисунок 228. Схема подключения мотора к Аrduino Рисунок 229. Видеообзор подключения мотора к Аrduino Как видно из схемы, это достаточно простой способ подключения мотора. Минусы такого подключения очевидны — отсутствие возможности
158 Лазерный модуль смены движения тока и отсутствие диода для ограничения индукционного тока от мотора. Намного интереснее другой способ — так, чтобы можно было управлять мотором без физической смены проводов. В этом случае используют микросхемы — драйверы двигателей, например, микросхему l293d. Структура микросхемы представлена на рис. 230. К ней можно подключить два DC-мотора или один шаговый двигатель. Рисунок 230. Микросхемаl293d Ниже представлена схема для управления DC-мотором с помощью микросхемы l293d. Рисунок 231. Схема подключения мотора к Аrduino c использованием l293d
DC-мотор 159 Мотор подключается либо к 3 и 6, либо к 11 и 14 выводам микросхемы. Выводы микросхемы 2 и 7 или 10 и 15 выводятся на пины Аrduino для передачи от него сигналов (HIGH или LOW). Выводы 4, 5, 12 и 13 — к пину GND. Вывод под номером 16 предназначен для питания микросхемы 3.3 В. Первый и девятый пины нужны для назначения мощности мотора (скорости вращения), поэтому им подают питание от 3.3 В или питают от любого незанятого пина. Рассмотрим программу motor1.ino для управления мотором через эту микросхему. int m1 = 12; int m2 = 11; void setup() { pinMode(m1,OUTPUT); pinMode(m2,OUTPUT); } void loop() { digitalWrite(m1, HIGH); digitalWrite(m2, LOW); delay(3000); digitalWrite(m1, LOW); digitalWrite(m2, HIGH); delay(3000); digitalWrite(m1, LOW); digitalWrite(m2, LOW); delay(3000); } Так как у нас задействованы два пина — 11 и 12, необходимо ввести две переменные с целочисленными значениями. В void setup() необходимо указать, что на эти пины будут отправляться сигналы. В void loop() код поделен на три абзаца: вращение оси мотора в одну сторону, вращение оси мотора в противоположную сторону, остановка мотора. Длительность каждого пункта — три секунды. Изменение вращения мотора обусловлено изменением сигналов на пины 11 и 12.
160 Лазерный модуль Рисунок 232. Видеообзор подключения мотора под управлением l293d Программа в mBlock5: Рисунок 233. Управление одним мотором Зачастую в устройствах применяется не один мотор, а несколько. Рассмотрим вариант, когда нам необходимо управлять двумя моторами. Ниже представлена схема их подключения. Эта схема ничем не отличается от предыдущей, кроме того, что в ней представлено подключение второго мотора по схеме первого.
DC-мотор Рисунок 234. Схема подключения двух моторов к Аrduino c использованием l293d Создадим программу motor2.ino для управления двумя моторами. int m11 = 11; int m12 = 10; int m21 = 13; int m22 = 12; void setup() { pinMode(m11,OUTPUT); pinMode(m12,OUTPUT); pinMode(m21,OUTPUT); pinMode(m22,OUTPUT); } void loop() { // motor forward digitalWrite(m11, HIGH); digitalWrite(m12, LOW); digitalWrite(m21, LOW); 161
162 Лазерный модуль digitalWrite(m22, HIGH); delay(3000); // motor backward digitalWrite(m11, digitalWrite(m12, digitalWrite(m21, digitalWrite(m22, delay(3000); LOW); HIGH); HIGH); LOW); // robo left digitalWrite(m11, LOW); digitalWrite(m12, HIGH); digitalWrite(m21, HIGH); digitalWrite(m22, LOW); delay(3000); // motor stop digitalWrite(m11, digitalWrite(m12, digitalWrite(m21, digitalWrite(m22, delay(3000); LOW); LOW); LOW); LOW); } Программа продемонстрирует нам, как можно по-разному сочетать вращение двух моторов. Если бы это была мобильная платформа с колесами, можно было бы заметить, как она перемещается вперед, затем назад, потом налево (или направо) и в конце останавливается, а затем процесс повторяется. У нас такая платформа не собрана, есть лишь собранная цепь, поэтому вращение осей моторов может отличаться от описанного. Рисунок 235. Видеообзор подключения двух моторов
DC-мотор 163 Программа в mBlock5: Рисунок 236 Эта микросхема, как было описано ранее, может управлять моторами, потребляющими ток до 36 В. Следовательно, ничто не мешает подключить моторы с потреблением тока 12 В. Рассмотрим схему подключения таких моторов.
164 Лазерный модуль Рисунок 237. Схема подключения двух мощных моторов к Аrduino c использованием l293d и дополнительным источником питания Сервопривод Кроме широко известного актуатора DC-мотора есть и другие, выполняющие более специфичные задачи. Например, сервоприводы — электромоторы с редуктором и встроенной микросхемой. Они предназначены для точного позиционирования подвижной оси, т. е. выполняют очень точные повороты, что определяется градусами. Полный оборот — это 360°. Сервоприводы различают по свободе поворотного механизма и мощности. Есть основные разновидности свободы поворота: 1. 0°–180° 2. 0°–270° 3. 0°–360° Здесь мы рассмотрим возможности сервопривода SG90 с поворотом от 0° до 180°. Он продается в радиомагазинах, обучающих наборах по Аrduino и интернет-магазинах электроники, связанной с робототехникой. У SG90 пластиковый редуктор, а момент силы — 2 кг/см.
Сервопривод 165 Рисунок 238. Сервопривод SG90 Рассмотрим схему подключения сервопривода. Рисунок 239. Схема подключения сервопривода SG90 Как видно, подключение не сложнее подключения DC-мотора. У SG90 есть три вывода: GND (черный провод), VCC (красный провод) и Signal (желтый провод). Рассмотрим программный код, который позволит поворачивать ось привода от 0° до 180°. Сохраним его под именем servo_motor.ino.
166 Лазерный модуль #include <Servo.h> Servo myservo; int s = 0; // variable to store the servo position void setup() { myservo.attach(12); // attaches the servo on pin 9 to the //servo object } void loop() { myservo.write(180); delay(1000); myservo.write(0); delay(1000); } Для управления сервоприводом можно воспользоваться разработанной библиотекой Servo.h. Эта библиотека уже входит в Аrduino IDE. Переменная s была взята для второго этапа погружения в программу и для этого варианта не играет никакой роли. Зададим в 12 пин для передачи сигналов. Для указания поворота в градусах воспользуемся функцией write(). Сохраним код в файл servo_motor.ino. Ниже представлена ссылка на видео по разбору подключения сервопривода к плате Аrduino. Рисунок 240. Видеообзор сервопривода SG90
Сервопривод 167 Программа в mBlock5: Рисунок 241. Управление сервоприводом Сделаем более плавным ход движения сервопривода. #include <Servo.h> Servo myservo; int s = 0; // variable to store the servo position void setup() { myservo.attach(12); // attaches the servo on pin 9 to the servo //object } void loop() { for (int i=10; i<120; i++ ){ myservo.write(i); delay(10); } for (int i=120; i>10; i-- ){ myservo.write(i); delay(10); } }
168 Лазерный модуль Ниже представлен видеофрагмент плавной работы сервопривода. Рисунок 242. Видео плавного движения сервопривода SG90 Программа в mBlock5: Рисунок 243. Плавное движение сервопривода
Шаговый двигатель 169 Шаговый двигатель Еще один известный актуатор — шаговый двигатель. Шаговым он называется потому, что полный оборот разбит на шаги. Внутри мотора находится множество катушек, которые расположены по окружности вокруг подвижной части мотора (ротора). Каждая из этих катушек поочередно включается и выключается (пропускает ток через себя и не пропускает). В результате возникает сила Ампера, которая заставляет ротор поворачиваться. Таких шагов может быть 24, 48, 72 и т. д. На рис. 244 представлен простой шаговый двигатель 28BYJ-48-5V. Продается он уже вместе с драйвером двигателей. Рисунок 244. Шаговый двигатель 28BYJ-48-5V Рассмотрим простую программу по управлению этим мотором. #include <Stepper.h> Stepper myStepp(200, 8, 9, 10, 11); void setup() { myStepp.setSpeed(70); Serial.begin(9600); } void loop() { Serial.println(“clockwise”); myStepp.step(1024);
170 Лазерный модуль delay(500); Serial.println(“counterclockwise”); myStepp.step(-1024); delay(500); } Напиши и сохрани под именем step_motor.ino. Рисунок 245. Видеообзор подключения шагового двигателя Программа на mBlock5: Для начала установим расширение для шагового двигателя, как на рисунке ниже. Рисунок 246. Расширение для шагового двигателя
Шаговый двигатель 171 Используя это расширение, составим программу. Рисунок 247. Программа вращения оси шагового двигателя Почти у каждого шагового двигателя есть разработанный драйвер, но это не значит, что мы не можем использовать свой драйвер. Для примера возьмем драйвер l293d и шаговый двигатель Nema 17, который применяется в 3Dпринтерах. Ниже представлена схема подключения такого двигателя. Рисунок 248. Схема подключения шагового двигателя Nema 17 Рассмотрим программу для управления им. int m11 = 11; int m12 = 10; int m21 = 13; int m22 = 12; void setup() {
172 Лазерный модуль pinMode(m11,OUTPUT); pinMode(m12,OUTPUT); pinMode(m21,OUTPUT); pinMode(m22,OUTPUT); } void loop() { // motor forward digitalWrite(m11, digitalWrite(m12, digitalWrite(m21, digitalWrite(m22, delay(3000); // motor stop digitalWrite(m11, digitalWrite(m12, digitalWrite(m21, digitalWrite(m22, delay(3000); HIGH); LOW); LOW); LOW); LOW); LOW); LOW); LOW); } Сохраним под именем motor_nema.ino. Программа в mBlock5: Рисунок 249. Программа по управлению шаговым двигателем
Дисплеи 173 Дисплеи Дисплеи — очень важные части устройства, если нужно получить обратную связь без использования компьютера. К плате Аrduino можно подключать как специально разработанные дисплеи, так и схожие по техническим характеристикам. Рисунок 250. Дисплей 1602 Дисплеи могут выводить информацию по датчикам или создавать определенный визуальный эффект. Рассмотрим подключение дисплея 1602. У него шестнадцать выводов. Применим вариант подключения по четырехбитному параллельному интерфейсу. Таблица обозначения подключений: Вывод Обозначение Пин на Аrduino 1 GND GND 2 Vcc 5V 3 Vo GND 4 RS 12 5 R/W GND 6 E 10 7 DB0 — 8 DB1 — 9 DB2 — 10 DB3 — 11 DB4 5 12 DB5 4 13 DB6 3 14 DB7 2 15 Vcc 5V 16 GND GND
174 Лазерный модуль Схема подключения дисплея к Аrduino uno: Рисунок 251. Схема подключения дисплея 1602 к плате Аrduino Перед тем, как собрать эту схему, необходимо припаять провода к выводам дисплея. Для удобства предлагаю использовать провода МГТФ самого малого диаметра. Их преимущества — в гибкости и прочности. С них легко снять изоляцию. Можно использовать акустические провода, но у них более толстая изоляция, они менее гибкие. Длина провода — не более 15 см для каждого вывода. Для теста возьмем пример из библиотеки LiquidCrystal.h — «Hello, world!». // include the library code: #include <LiquidCrystal.h> // initialize the library by associating any needed LCD interface pin // with the arduino pin number it is connected to const int rs = 12, en = 10, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Дисплеи 175 void setup() { // set up the LCD’s number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print(“hello, world!”); } void loop() { // set the cursor to column 0, line 1 // (note: line 1 is the second row, since counting begins with 0): lcd.setCursor(0, 1); // print the number of seconds since reset: lcd.print(millis() / 1000); } Обрати внимание: en подключен к десятому пину, а в примере может быть выбран одиннадцатый. Подадим питание на Аrduino и загрузим программу. Рисунок 252. Пример программы из библиотеки LiquidCrystal.h
176 Лазерный модуль Пример кода в mBlock5: Для реализации программы нам необходимо подключить расширение для дисплея 1602. Вбиваем номер дисплея и используем расширение, которое не завязано на I2C, так как мы его не используем. Ниже на рисунке представлено такое расширение. Рисунок 253. Выбор расширения для LCD 1602 Пример предыдущей программы будет выглядеть так: Рисунок 254. Вывод на дисплей слов Hello, world Электропроводящие нити Электропроводящие нити позволяют проводить ток без существенных потерь. У таких проводников есть все свойства обычных нитей, поэтому их
Электропроводящие нити 177 применяют в устройствах, вшитых в одежду. Нити завязываются на контактах или зажимаются, а не припаиваются. Рисунок 255. Электропроводящая нить Создадим схему цепи по управлению тремя светодиодами с помощью таких нитей. Рисунок 256. Схема для управления светодиодами, вшитыми в одежду Для управления светодиодами на одежде используют микроконтроллер LilyPad. Рисунок 257. Микроконтроллер LilyPad
178 Лазерный модуль На рис. 257 представлен такой микроконтроллер без USB-входа. Программу в него заливают с помощью USB-программатора. Начинающим рекомендую брать LilyPad c USB-входом, тогда процедура загрузки программы такая же, что и для всех Аrduino. Реализуем сначала схему подключения, так как в реальности выводов на плате больше, чем указано в схеме. С практической частью создания цепи мы разобрались. Важное замечание: так как нити проводят ток, нельзя допускать их пересечения. Перейдем к созданию программы. Сделаем так, чтобы светодиоды сначала поочередно загорались, затем гасли и в конце загорались одновременно. int svet1 = 10; int svet2 = 8; int svet3 = 6; void setup() { pinMode(svet1,OUTPUT); pinMode(svet2,OUTPUT); pinMode(svet3,OUTPUT); } void loop() { digitalWrite(svet1, HIGH); digitalWrite(svet2, LOW); digitalWrite(svet3, LOW); delay(1000); digitalWrite(svet1, LOW); digitalWrite(svet3, LOW); digitalWrite(svet2, HIGH); delay(1000); digitalWrite(svet2, LOW); digitalWrite(svet1, LOW); digitalWrite(svet3, HIGH); delay(1000); } В среде Аrduino IDE выбери плату LilyPad USB.
Пайка 179 Рисунок 258. Выбор платы LilyPad для загрузки Рисунок 259. Видеообзор работы с LilyPad Программы на Scratch для данной платы нет, так как нет соответствующего расширения. Пайка Рано или поздно ты можешь столкнуться с проблемой дизайна и стабильности работы устройства. Многие проблемы можно решить, если применить пайку электронных схем. То, что делалось на беспаечных платах, можно
180 Лазерный модуль реализовать и на платах для пайки или печатных платах. Мы рассмотрим пайку. Для нее хорошо подходят провода МГТФ или акустические провода. В этих случаях необходим инструмент для снятия изоляции и кусачки, смотри рис. 113–115. Чтобы контакты хорошо соединились и не могли разорваться при сильных нагрузках, используют припой с флюсом. Припой — сплав, например, олово со свинцом, или чисто олово. Могут быть другие металлы с оловом. Флюс — это жидкость, предназначенная для обеспечения лучшего соприкосновения контактов. Для удобства пайки используют держатель Третья рука, который помогает освободить руки от удержания мелких предметов. Процесс пайки: — очищается изоляция проводов; — оголенные контакты соприкасаются и удерживаются с помощью Третьей руки; — паяльник (или паяльная станция) нагревается до 240–260 градусов Цельсия; — флюсом обрабатываются контакты; — жалом паяльника расплавляется кусочек припоя так, чтобы он смог прилипнуть к жалу; — жалом с припоем проводят по месту касания контактов. Процесс пайки на этом заканчивается. Если используется флюс, в составе которого есть кислоты, лучше обработать место спайки мокрой ватой и дождаться высыхания. Рисунок 260. Видеообзор процедуры пайки С первого раза может не получиться сделать аккуратно, но многократная тренировка позволит тебе достичь мастерства. Я постарался охватить базовые возможности плат Аrduino и познакомить тебя с основами создания программы и электронных схем. Теперь настало время перейти к созданию проектов, используя полученные знания и навыки.
Простые роботизированные устройства Светофор с пешеходным переходом Этот проект один из легких — модель пешеходного перехода в уменьшенном размере. Для его реализации применим бумагу и картон. Ты можешь взять и другие материалы. Материал: бумага и картон, пенокартон, светодиоды, соединительные провода. Инструменты: канцелярский нож и ножницы, клей, карандаш, линейка. Схема электронной части представлена на рис. 260. Рисунок 261. Схема подключения светофора Как видно из рисунка, светофор снабжен не только тремя разноцветными световыми индикаторами, но и пьезоэлементом, который будет издавать звук, когда загорится красный свет. Светофор предназначен для автомобилей. Если горит красный, транспорт останавливается, и пешеходы могут перейти дорогу. Горит желтый — автомобили готовятся к движению либо притормаживают, пешеходы не переходят дорогу. Если горит зеленый, путь для транспорта свободен, пешеходы стоят на месте.
182 int int int int Простые роботизированные устройства piezo svet1 svet2 svet3 = = = = 13; 12; 11; 10; void setup() { pinMode(piezo,OUTPUT); pinMode(svet1,OUTPUT); pinMode(svet2,OUTPUT); pinMode(svet3,OUTPUT); } void loop() { digitalWrite(svet1, HIGH); digitalWrite(svet2, LOW); digitalWrite(svet3, LOW); tone(piezo, -1); delay(5000); digitalWrite(svet1, LOW); digitalWrite(svet3, LOW); digitalWrite(svet2, HIGH); delay(5000); digitalWrite(svet2, LOW); digitalWrite(svet1, LOW); digitalWrite(svet3, HIGH); delay(5000); for (int i =0; i<3; i++){ digitalWrite(svet3, HIGH); tone(piezo, 1000); delay(1000); digitalWrite(svet3, LOW); tone(piezo, 200); delay(1000); digitalWrite(svet3, HIGH); tone(piezo, 1000); delay(1000); digitalWrite(svet3, LOW); tone(piezo, 200); delay(1000); digitalWrite(svet3, HIGH); tone(piezo, 1000); delay(1000);
Светофор с пешеходным переходом 183 } tone(piezo, -1); digitalWrite(svet3, LOW); digitalWrite(svet1, LOW); digitalWrite(svet2, HIGH); delay(5000); } Частоту загорания светодиодов и тональность звучания, а также время звучания пьезоэлемента, можно изменить под свои задачи. Программа в mBlock5: Рисунок 262. Программа светофора
184 Простые роботизированные устройства Сборка модели. В качестве соединительных проводов можно использовать как провода, предназначенные не для пайки, так и те, которые можно припаивать. В инструкции представлен первый вариант. Рисунок 263. Материалы для создания светофора Рисунок 264. Реализация схемы устройства Подай питание на плату Аrduino и протестируй работу светофора.
Настольный вентилятор с подсветкой 185 Рисунок 265. Видеообзор светофора Настольный вентилятор с подсветкой Очень полезная конструкция — настольная подсветка (лампа), да еще и с вентилятором. Вентилятор и подсветка могут работать раздельно, так как не всегда в комнате одновременно жарко и темно. Для конструкции нужна прочная опора. Материал: деревянный брусок, фанера, вспененный ПВХ (рекламный пластик), саморезы. Инструменты: канцелярский нож и ножницы, клей, карандаш, линейка или штангенциркуль, отвертка, наждачная бумага, ножовка и лобзик. Сборка конструкции. Выберем материал для создания устройства. Рисунок 266. Материалы для создания
186 Простые роботизированные устройства В качестве опоры будем использовать кусок фанеры. Размер: 10×19×0,3 см. Для прочности конструкции используем брусок размером 19×4×1 см. Эти материалы можно купить в любом строительном магазине. Фанеру можно заменить на плотный картон, из которого делают коробки для бытовой техники или обуви. Для крепления светодиодов и мотора можно применить вспененный ПВХ — этот материал используют для рекламных вывесок. Размер 4×18×0,3 см. Он продается в рекламных агентствах или строительных магазинах. Очень легко обрабатывается и достаточно прочный для такой конструкции. Можно использовать и фанеру, и пенокартон. Проделаем шесть отверстий в одной из крайних сторон ПВХ, как показано на рисунке 266. Отверстия должны быть расположены так, чтобы можно было пропустить через них ножки светодиодов. Перейдем к созданию платформы. Склеим брусок и фанеру, как показано на рис. 266. Склеить можно клеем Момент кристалл, термоклеем или скрепить саморезами диаметром 2,5 мм и длиной 1 см. Возьмем DC-мотор на 3 В и закрепим его с помощью термоклея в куске пластикового уголка или вспененного ПВХ. Для крепления вырежем отверстие по размеру мотора в пластике или ПВХ, вставим мотор и зальем термоклей в места касания мотора с крепежным материалом. Размер крепежной рамки — 4×2 см. Чтобы мотор мог нагонять ветер, необходимо прикрепить на его ось винт. Можно сделать его самостоятельно, можно купить. Винт (рис. 266 и 267) куплен в интернет-магазине Аliexpress; это винт для квадрокоптеров. На рис. 266 показан вариант крепления мотора через пластиковый уголок, он закреплен на рейки из ПВХ. Размер рейки — 4×18×0,3 см. Дождись, пока клей на платформе застынет, потом прикрепи мотор с винтом и светодиодную подсветку саморезами диаметром 2,5 мм и длиной 1 см. Рисунок 267. Сборка основной части конструкции Теперь необходимо припаять провода для подачи питания. Можно использовать любые: соединительные для Аrduino, МГТФ, акустические.
Настольный вентилятор с подсветкой 187 Для светодиодов необходимо предварительно спаять плюсовые ножки и минусовые ножки — так, чтобы получилось параллельное подключение. Чтобы спаять все три контакта светодиодов, можно использовать кусок стальной проволоки или провода. Рисунок 268. Пайка проводов и штекеров к ним для светодиодов Создадим простую схему включения и выключения светильника и вентилятора. Рисунок 269. Схема подключения подсветки с вентилятором Светодиоды соединены последовательно, каждый рассчитан на 3В. В сумме они потребляют 9 В. Параллельно подключен DC-мотор. Включение и выключение происходит через кнопки (замыкание и размыкание). Программа для такого типа схемы не нужна. Рассмотрим схему, когда нужно использовать программу. Плата Аrduino будет посылать сигнал на светодиоды, соединенные параллельно, и на микросхему l293d, которая непосредственно дает команду на DC-мотор. Пин 11 взят для регулирования скорости вращения вентилятора.
188 Простые роботизированные устройства Рисунок 270. Схема подключения подсветки с вентилятором с использованием Аrduino Соберем конструкцию по схеме. Создадим программу для управления устройством и сохраним под именем ventil_svet.ino. Напишем программу на постоянное включение светодиодов и мотора. int m1 = 8; int m2 = 9; int v = 11; int svet = 10; void setup() { pinMode(m1, OUTPUT); pinMode(m2, OUTPUT); pinMode(svet, OUTPUT); pinMode(v, OUTPUT); analogWrite(v, 255); digitalWrite(m1, HIGH); digitalWrite(m2, LOW); digitalWrite(svet, HIGH); } void loop() { }
Настольный вентилятор с подсветкой 189 Программа в mBlock5: Рисунок 271. Программа на mBlock5 Нетрудно заметить, что у конструкции есть недостаток: при подаче питания на плату Аrduino заработают одновременно и подсветка, и вентилятор. Изменим этот вариант. Ниже представлена схема, где можно управлять процессом. Рисунок 272. Схема подключения подсветки с вентилятором с использованием Аrduino и кнопок При загруженной программе можно регулировать процессом: включать и выключать работу двух частей устройства. Есть и другое решение — использовать кнопки нажатия. Как видно, такие кнопки замыкают цепь, когда находятся в нажатом состоянии. Для их использования нужно дополнить программу.
190 Простые роботизированные устройства Рисунок 273. Схема подключения подсветки с вентилятором с использованием Аrduino и кнопок нажатия int int int int int int m1 = 8; m2 = 9; v = 11; svet = 10; button1 = 7; button2 = 6; void setup() { pinMode(m1, OUTPUT ); pinMode(m2, OUTPUT ); pinMode(svet, OUTPUT ); pinMode(button1, INPUT ); pinMode(button2, INPUT ); pinMode(v, OUTPUT ); analogWrite(v, 0); digitalWrite(svet, LOW ); } void loop() { if (digitalRead(button1) == HIGH ) { digitalWrite(svet, HIGH ); }
Настольный вентилятор с подсветкой else { digitalWrite(svet, LOW ); } if ( digitalRead(button2) == HIGH ) { digitalWrite(m1, HIGH); digitalWrite(m2, LOW); analogWrite(v, 255); } else { digitalWrite(m1, LOW); digitalWrite(m2, LOW); analogWrite(v, 0); } } Программа в mBlock5: Рисунок 274. Программа на mBlock5 191
192 Простые роботизированные устройства С какой из предложенных схем ты будешь работать, не важно; выбор за тобой. Схема в книге — на беспаечной плате, но ты можешь для надежности все спаять. Простой манипулятор Манипулятор — это роботизированное устройство, которое способно перемещать в пространстве захваченные объекты. Манипуляторы различаются по числу степеней свободы. Степень свободы — это возможность перемещения в определенной плоскости пространства. Здесь описан простой манипулятор с двумя степенями свободы, не считая захвата. Манипулятор сделан на сервоприводах, что позволяет более точно управлять роботом. Материал: пластик, фанера, пенокартон, вспененный ПВХ, деревянный брусок. Инструменты: канцелярский нож и ножницы, клей, карандаш, линейка или штангенциркуль, наждачная бумага, лобзик. Рассмотрим схему манипулятора. Рисунок 275. Схема двухосевого манипулятора Для несущей конструкции возьмем пластик — можно тот, что используют в рекламных вывесках (вспененный ПВХ толщиной 3 мм) или, например, пластик футляров для CD-дисков. Можно выбрать другой легкий и прочный
Простой манипулятор 193 материал. Важно: он должен быть легким, потому что будет нагрузка на сервоприводы, а прочность нужна для подъема и перемещения предметов до 100 г. Сборка устройства. Рисунок 276. Основание манипулятора Делаем несущую конструкцию. На нее будет крепиться поворотная платформа —параллелепипед без нижней грани. На рис. 276 показана такая платформа. Боковые стенки сделаны из вспененного ПВХ, верхняя грань — из прозрачного пластика прямоугольной формы от футляров CD-дисков. Высота платформы не должна быть больше высоты выпирающей части сервопривода. Чтобы надежно закрепить подвижную платформу на сервопривод, к верхней стенке с внутренней стороны прикрепим насадку. Она всегда идет с сервоприводом. Такой тип крепления надежен и удобен. Рисунок 277. Основание подвижной части манипулятора Затем вырежем из ПВХ или пластика элементы конструкции и скрепим их, как на рис.278.
194 Простые роботизированные устройства Рисунок 278. Основная часть манипулятора Вторая подвижная часть манипулятора жестко закрепляется на насадку сервопривода, помеченную 1. Подвижная часть захвата крепится к насадке сервопривода, помеченной 2. Примерная длина захвата 92 мм (тут можете пофантазировать над конструкцией и размером). Так как правое плечо манипулятора длиннее левого, в качестве противовеса можно жестко закрепить что-то тяжелое, что поможет уравновесить систему в центре крепления к сервоприводу 1. Для равновесия я воспользовался деревянным бруском габаритами 85×35×30 мм. Это облегчило работу сервопривода при подъеме деталей. Чтобы увеличить грузоподъемность манипулятора, можно увеличить противовес. А чтобы груз не соскальзывал, можно использовать резинки и дополнительную насадку. Для ручного управления манипулятором используем клавиатуру. Составим программу, которая реализует взаимодействие клавиатуры с сервоприводами через плату Аrduino, и сохраним ее под именем manipulate.ino. #include <Servo.h> #include <Keypad.h> Servo myservo; Servo myservo1; Servo myservo2; const byte ROWS = 4; //число строк клавиатуры const byte COLS = 4; //число столбцов клавиатуры char hexaKeys[ROWS][COLS] = {
Простой манипулятор 195 {‘1’,’4’,’7’,’*’}, {‘2’,’5’,’8’,’0’}, {‘3’,’6’,’9’,’#’}, {‘A’,’B’,’C’,’D’} }; byte rowPins[ROWS] = {8,9,10,11}; //строки byte colPins[COLS] = {4,5,6,7}; //столбцы Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); int int int int int int i =10; ii=30; iii=10; k=0; k1=0; k2=0; void setup() { myservo.attach(13); myservo1.attach(12); myservo2.attach(3); myservo.write(i); myservo1.write(ii); myservo2.write(iii); Serial.begin(9600); } void loop() { char customKey = customKeypad.getKey(); if (customKey){ Serial.println(customKey);} if(customKey==’1’){ i=i+15; k=k+1;
196 Простые роботизированные устройства myservo.write(i); Serial.println(i); delay(500); } if(customKey==’2’){ myservo.write(i); i=i-15 ; k=k-1; Serial.println(i); delay(500); } if(customKey==’3’){ myservo1.write(ii); Serial.println(ii); ii=ii+15 ; k1=k1+1 ; delay(500); } if(customKey==’4’){ myservo1.write(ii); Serial.println(ii); ii=ii-15 ; k1=k1-1; delay(500); } if(customKey==’5’){ myservo2.write(iii); iii=iii+15; k2=k2+1; Serial.println(iii); delay(100); } if(customKey==’6’){ myservo2.write(iii); iii=iii-15 ; k2=k2-1 ; Serial.println(iii ); delay(100); }
Простой манипулятор 197 // поставим ограничение на повороты if ( k>=12 ){ i=179; } else if( k<=0){ i=10; } if ( k1>=5 ){ ii=90; } else if ( k1<=0){ ii=30; } if ( k2>=10){ iii=179; } else if ( k2<=1){ iii=10; } } Переменные i, ii, и iii задают градусную меру угла поворота для каждого сервопривода (три сервопривода — три переменные). Переменные k, k1 и k2 — число шагов поворота, необходимых для ограничения положения сервоприводов, что позволяет более корректно управлять манипулятором. Рисунок 279. Видеообзор работы манипулятора
198 Простые роботизированные устройства Программа в mBlock5: Код выглядит громоздким, поэтому разбит на несколько частей. Но когда ты будешь его составлять, это должен быть единый код. Рисунок 280. Первая часть кода манипулятора Рисунок 281. Вторая часть кода манипулятора
Простой манипулятор Рисунок 282. Третья часть кода манипулятора Рисунок 283. Заключительная часть кода манипулятора 199
200 Простые роботизированные устройства Солнечный трекер Солнечный трекер — устройство, которое может отслеживать положение солнца. Трекеры ставят на солнечные панели, чтобы они могли аккумулировать больше энергии. Материал: пластик. Инструменты: канцелярский нож и ножницы, клей, карандаш, линейка или штангенциркуль, наждачная бумага, паяльная станция. Электрокомпоненты: Аrduino, два сервопривода, четыре фоторезистора, четыре резистора на 1 кОм, соединительные провода, плата для монтажа. Фоторезисторы в этом устройстве будут работать как датчики света. Располагаться они должны по краям подвижной платформы. С какой стороны более яркий свет, в ту сторону и поворачивается устройство. Рассмотрим схему конструкции. Рисунок 284. Схема двухосевого трекера Сборка конструкции. Ниже на рисунке представлен пример элементов для сборки. Плату Аrduino ты можешь заменить на ту, что есть у тебя: работа устройства от выбора платы не изменится (тестировал на Аrduino Uno и Аrduino Mega).
Солнечный трекер 201 Рисунок 285. Инструменты и детали для солнечного трекера Рисунок 286. Подключение сервоприводов и фоторезисторов согласно схеме Для быстрого монтажа к концам проводов, идущих от ножек фоторезистора, можно припаять штекеры. После сборки конструкции нужно отметить расположение фоторезисторов на панели относительно порядка подключения. Теперь определи границы поворота каждого сервопривода. Их предельный диапазон варьируется от 0° до 180°. В какой-то момент, в программе понадобится уменьшить предельный градус положения для лучшей работы устройства. Эта часть работы называется калибровкой. В моем случае первый сервопривод (находится в основании) имеет промежуток вращения 10°–180°, второй — интервал 10°–120°. Пометь, в какую сторону фоторезистора поворачивается сервопривод при крайних точках диапазона. В моей сборке второй сервопривод поворачивается от второго резистора в сторону четвертого, а первый — от первого фоторезистора в сторону третьего.
202 Простые роботизированные устройства Ниже представлен код программы; сохраним его как sun_trecer.ino. #include <Servo.h> // вводим переменные для фоторезисторов, углов и сервоприводов Servo myservo1; Servo myservo2; int int int int int int int foto1 =A0; foto2 =A1; foto3 =A2; foto4 =A3; i=10; j =20; k=0; void setup() { // назначение пинов и скорость передачи данных myservo1.attach(13); myservo2.attach(12); pinMode(foto1, INPUT); pinMode(foto2, INPUT); pinMode(foto3, INPUT); pinMode(foto4, INPUT); Serial.begin(9600); } void loop() { // проверяем условие между первым и третьем фоторезистором if ( analogRead(foto1)>analogRead(foto3)) { if (analogRead(foto1)-analogRead(foto3)>40){ i=i+1; myservo1.write(i); delay(20); } } else { if (analogRead(foto3)-analogRead(foto1)>40){ i=i-1 ; myservo1.write(i); delay(20); }
Солнечный трекер } // проверяем условие между вторым и четвертым фоторезистором if ( analogRead(foto2)>analogRead(foto4)) { if (analogRead(foto2)-analogRead(foto4)>40){ j=j+1; myservo2.write(j); delay(20); } } else { if (analogRead(foto4)-analogRead(foto2)>40){ j=j-1 ; myservo2.write(j); delay(20); } } // проверка граничных условий if (i<=10){ i=10; } else if (i>=180){ i=180; } if (j<=10){ j=10; } else if (j>=120){ j=120; } // вывод значений для самопроверки Serial.println(“i=”); Serial.println(i); Serial.println(“foto1 =”); Serial.println(analogRead(foto1)); delay(300); Serial.println(“foto3 =”); Serial.println(analogRead(foto3)); Serial.println(“j=”); Serial.println(j); Serial.println(“foto4 =”); 203
204 Простые роботизированные устройства Serial.println(analogRead(foto4)); Serial.println(“foto2 =”); Serial.println(analogRead(foto2)); } Загрузим программу и проверим работоспособность устройства. Твоя конструкция может не совпадать с конструкцией, представленной в книге, из-за ошибки подключения фоторезисторов. Рисунок 287. Видеообзор работы солнечного трекера Программа в mBlock5: Программа на языке Scratch громоздка, поэтому дана здесь по частям. Но когда ты ее соберешь, это должна быть цельная конструкция. Рисунок 288. Первая часть программы
Светодиодный куб 205 Рисунок 289. Вторая часть программы Светодиодный куб Электронное устройство, которое применяется в декоративных инсталляциях. Светодиодные кубы бывают размера 3×3×3, 4×4×4, 5×5×5 и т. д. (единицы измерения здесь — это количество светодиодов по длине, ширине и высоте). Изменяя скорость загорания и затухания светодиодов в кубе, мы создаем различные визуальные эффекты: бегущие огни, эквалайзер, 3D световая инсталляция. Материал: плата для пайки или беспаечная плата. Инструменты: инструмент для снятия изоляции, линейка или штангенциркуль, паяльная станция. Электрокомпоненты: Аrduino, 64 светодиода, соединительные провода. Рассмотрим схему. На рис. 290 представлена одна из сторон куба. Все четыре стороны соединяются по выводам плюсовой ножки светодиода в каждом ряду. В результате для всех ножек «+» будет четыре вывода. С их помощью можно управлять рядами светодиодов. Ножки с полюсом «-» соединяются между собой по вертикальным рядам куба. В результате получим 16 выводов, которые можно запитать на GND Аrduino.
206 Простые роботизированные устройства Рисунок 290. Схема одной стороны светодиодного куба Сборка модели. Соберем конструкцию с использованием паяльной станции и платы для монтажа. Можно воспользоваться как платой для пайки, так и без пайки. Используй плату для пайки, если уверен в правильности сборки. Рисунок 291. Количество светодиодов, необходимых для создания куба 4×4×4 Чтобы светодиоды образовали куб, их нужно спаять друг с другом согласно схеме на рис. 291. Получим одну из сторон куба. Для начала соберем вертикальный ряд из четырех светодиодов. Короткую ножку светодиода (знак «-») подогнем плоскогубцами. Длинную ножку сдвинем перпендикулярно короткой.
Светодиодный куб 207 Рисунок 292. Предварительная работа над светодиодами Используя Третью руку, спаяем светодиоды. Рисунок 293. Пайка одной стороны куба Как видно из рис. 293, короткие ножки мы спаяли, а длинные остались свободными. Сделайте так еще четыре раза. Получим четыре ряда светодиодов. Приступим к их соединению. Соединять будем с помощью длинных ножек (знак «+»), перекрещивая их. Постарайся уместить на одной длинной ножке светодиода четыре другие. Для удобства можно сделать пятый вертикальный ряд светодиодов, к которому припаяются четыре ряда. Так нужно сделать для трех сторон, с каждой стороны — не больше четырех вертикальных рядов. На рисунке выше четко видно, что длинные ножки светодиодов в каждом горизонтальном ряду образуют сетку.
208 Простые роботизированные устройства Рисунок 294. Видеообзор сборки куба Напишем простенькую программу, которая поочередно посылает сигналы на ряды куба. int svet0 = 8; int svet1 = 9; int svet2 = 10; int svet3 = 11; void setup() { pinMode(svet0, OUTPUT); pinMode(svet1, OUTPUT); pinMode(svet2, OUTPUT); pinMode(svet3, OUTPUT); } void loop() { digitalWrite(svet0, HIGH); digitalWrite(svet1, LOW); digitalWrite(svet2, LOW); digitalWrite(svet3, LOW); delay(500); digitalWrite(svet0, digitalWrite(svet1, digitalWrite(svet2, digitalWrite(svet3, delay(500); LOW); HIGH); LOW); LOW); digitalWrite(svet0, digitalWrite(svet1, digitalWrite(svet2, digitalWrite(svet3, LOW); LOW); HIGH); LOW);
Светодиодный куб 209 delay(500); digitalWrite(svet0, digitalWrite(svet1, digitalWrite(svet2, digitalWrite(svet3, delay(500); LOW); LOW); LOW); HIGH); digitalWrite(svet0, digitalWrite(svet1, digitalWrite(svet2, digitalWrite(svet3, delay(500); HIGH); LOW); LOW); HIGH); digitalWrite(svet0, digitalWrite(svet1, digitalWrite(svet2, digitalWrite(svet3, delay(500); } LOW); HIGH); HIGH); LOW); Код сохраним под именем svetocub.ino. С помощью этой программы можно чередовать загорание светодиодов в каждом ряду. Комбинируя с временной задержкой и разными вариациями подачи сигналов, можно добиться разных визуальных эффектов. Они смогут украсить не только рабочее место, но стать украшением на праздниках и робототехнических конкурсах. Перед тем как поставить четвертую стену куба, нужно припаять четыре провода к плюсовым выводам светодиодов каждого ряда. Рисунок 295. Вывод плюсовых контактов светодиодов Теперь припаяем четвертую сторону куба.
210 Простые роботизированные устройства Чтобы куб был устойчив, нужно закрепить его ножки-минусы на монтажной плате. Для надежности конструкции я взял плату для пайки. Свободные ножки светодиодов проталкиваем в ячейки платы. Процесс кропотливый; если концы погнутые, нужно их выпрямить. Как ножки расположить в ячейках, не имеет значения. Припаяем места соединения. Чтобы усложнить управление, можно взять сдвиговый регистр 74HС595. Эта микросхема способна управлять восемью светодиодами, т. е. посылать сигналы на восемь выводов, при этом сама занимает три вывода на Аrduino. Если все шестнадцать выводов GND светодиодов подключить к двум регистрам, совместно с питанием плюсовых выводов, можно регулировать свечение конкретного светодиода в кубе. Для начала рассмотрим управление восемью светодиодами через регистр. Рисунок 296. Схема подключения восьми светодиодов к микросхеме 74HC595 Программа по управлению светодиодами выглядит таким образом: int dataPin = 9; int latchPin = 10; int clockPin = 11; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, B01001100);
Светодиодный куб 211 digitalWrite(latchPin, HIGH); } void loop() { } Сохраним программу под именем registr.ino. Согласно программе, загорится второй, пятый и шестой светодиод. Управление светодиодами осуществляется битовой кодировкой B01101101 (сигнал для второго, третьего, пятого, шестого и восьмого светодиодов). Подключим шестнадцать выводов к двум регистрам и создадим программу для управления светодиодным кубом. Рисунок 297. Подключение выводов из микросхемы 74HC595 к плате Аrduino Рисунок 298. Видеообзор подключения куба к микросхеме 74HC595 У куба шестнадцать выводов, поэтому необходимо подключить второй сдвиговый регистр, но так, чтобы он был связан с первым. Сделав это, по аналогии подключим оставшиеся восемь выводов куба. Четыре плюсовых вывода подключим к пинам 2, 3, 4 и 5.
212 Простые роботизированные устройства Загрузим на плату программу, которая вызовет эффект бегущих огней. Сохраним под именем sveto_cube.ino. int dataPin = 9; //Пин подключен к DS входу 74HC595 int latchPin = 10; //Пин подключен к ST_CP входу 74HC595 int clockPin = 11; //Пин подключен к SH_CP входу 74HC595 int int int int s1 s2 s3 s4 = = = = 2; 3; 4; 5; byte path[1]= { B00000000}; void setup() { //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(s1, pinMode(s2, pinMode(s3, pinMode(s4, OUTPUT); OUTPUT); OUTPUT); OUTPUT); digitalWrite(s1, digitalWrite(s2, digitalWrite(s3, digitalWrite(s4, HIGH); HIGH); HIGH); HIGH); } void loop() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, path[1]); digitalWrite(latchPin, HIGH); delay(1); for (int i=0; i<4; i++) { if (i==0){ digitalWrite(s1, HIGH); digitalWrite(s2, LOW);
Светодиодный куб digitalWrite(s3, digitalWrite(s4, delay(200);} else if (i==1){ digitalWrite(s1, digitalWrite(s2, digitalWrite(s3, digitalWrite(s4, delay(200);} else if (i==2){ digitalWrite(s1, digitalWrite(s2, digitalWrite(s3, digitalWrite(s4, delay(200);} else if (i==3){ digitalWrite(s1, digitalWrite(s2, digitalWrite(s3, digitalWrite(s4, delay(200);} 213 LOW); LOW); LOW); HIGH); LOW); LOW); LOW); LOW); HIGH); LOW); LOW); LOW); LOW); HIGH); } } Как видно, есть третий сдвиговый регистр. Он может предназначаться для подачи сигналов на плюсовые контакты. В нашей ситуации все плюсовые контакты выведены напрямую на пины Аrduino. Предлагаю тебе самостоятельно попробовать подключить третий регистр к общей схеме регистров. Рисунок 299. Результат работы светодиодного куба
214 Простые роботизированные устройства Программа в mBlock5: Для начала нужно найти расширение под микросхему 74HС595. Введи первые четыре символа и найди расширение, указанное на рисунке ниже. Рисунок 300. Расширение 74HC595 Рисунок 301. Первая часть программы
Сейф 215 Рисунок 302. Вторая часть программы Сейф В этом проекте мы построим компактный сейф с электронным кодовым замком. Алгоритм программы достаточно прост: программа на Arduino постоянно считывает состояние кнопок на клавиатуре. Если кнопка нажата, проверяется ее значение и, если оно отвечает условию, открывается дверь сейфа. В сумме будет представлено три шага, т. е. нужно ввести трехзначный код. Для закрытия двери сейфа используют одну из клавиш клавиатуры; я возьму клавишу A. Материал: плата для пайки или беспаечная. Инструменты: инструмент для снятия изоляции, линейка или штангенциркуль, паяльная станция, если используем провода для пайки, термопистолет и термоклей.
216 Простые роботизированные устройства Электрокомпоненты: Arduino Uno, сервопривод SG90, матричная клавиатура 4×4, соединительные провода (папа-папа, 15 шт.), элемент питания (Крона на 9 В с насадкой), USB-шнур. Инструкция: Для реализации проекта понадобится кусок картона (размеры на рис. 303) с раскройкой по деталям. Рисунок 303. Картон, раскрой деталей На рис. 304 — размеры всех деталей отдельно. Рисунок 304. Комплектующие из картона
Сейф 217 Примерный вариант деталей из картона на рис. 305. Рисунок 305. Комплектующие из картона Для защиты платы Arduino от случайных внешних воздействий рекомендую поместить ее в корпус. Перед сборкой пробежимся по элементам, которые будут использованы. На рис. 306 — электронные компоненты для нашего проекта. Рисунок 306. Электронные компоненты
218 Простые роботизированные устройства Для умножения пинов и оптимизации сборки схемы можно воспользоваться макетной беспаечной платой, рис. 307. Рисунок 307. Макетная плата на 400 точек Основанием устройства станет картон размером 230×230 мм (деталь 1), рис. 308. Рисунок 308. Размер 3-й детали Приступаем к сборке.
Сейф Крепим стенки к основанию — деталь 3. Рисунок 309. Сборка конструкции сейфа Рисунок 310. Сборка конструкции сейфа 219
220 Простые роботизированные устройства Располагаем плату Arduino Uno (можно в корпусе), макетную плату и источник питания. Рисунок 311. Расположение Arduino, платы и Кроны на 9 В Закрепим элементы деталью 6. Рисунок 312. Крепление стенки
Сейф 221 Перейдем к креплению сервомотора. Закрепим деталь 8 на поворотном механизме сервопривода с помощью деталей 10, склеив их так, чтобы они обхватили плечо механизма и деталь 8. Рисунок 313. Сборка механизма на сервоприводе Для фиксации сервопривода используем деталь 7. Вырезанное отверстие имеет точный размер основания сервопривода — 24×12 мм. Рисунок 314. Сборка механизма на сервоприводе
222 Простые роботизированные устройства Правильно закрепи деталь 7 на сервоприводе. См. рис. 315 и 316. Рисунок 315. Сборка механизма на сервоприводе Место касания сервопривода с деталью 7 обработай термоклеем. Рисунок 316. Сборка механизма на сервоприводе Приклей деталь 7 к детали 6. Деталь 7 должна быть закреплена на высоте, чтобы плечо поворотного механизма не сталкивалось со стенкой детали 6. Деталь 7 не должна выступать за пределы границы открытой части сейфа.
Сейф 223 Чтобы клей успел высохнуть и зафиксировать положение детали, ее можно подпереть, см. рис. 317. Рисунок 317. Фиксация механизма замка Установим стенку (деталь 4), которая закроет электронную часть и выступит второй точкой опоры для детали 7. Обработайте термоклеем стык детали 7 с деталью 4. Деталь должна быть установлена так, чтобы отверстие находилось внизу и располагалось горизонтально. Размер отверстия — 20×5 мм. Рисунок 318. Фиксация механизма замка
224 Простые роботизированные устройства Рисунок 319. Фиксация механизма замка Теперь прикрепим матричную клавиатуру к детали 4. Просунем шлейф через отверстие и закрепим клавиатуру с помощью деталей 9. См. рис. 320–323. Рисунок 320. Крепление матричной клавиатуры
Сейф Рисунок 321. Крепление матричной клавиатуры Рисунок 322. Крепление матричной клавиатуры 225
226 Простые роботизированные устройства Рисунок 323. Крепление матричной клавиатуры Прикрепим деталь размером 50×30 мм к детали 8. Рисунок 324. Крепим держатель двери (деталь 50×30 мм)
Сейф 227 Рисунок 325. Крепим держатель двери (деталь 50×30 мм) Закрепляем дверь (деталь 5). Убедитесь перед креплением, что поворотный механизм крепите к двери так, что он параллелен поверхности пола и перпендикулярен двери. Рисунок 326. Крепим дверь
228 Простые роботизированные устройства Рисунок 327. Крепим дверь Вставляем шесть соединительных проводов папа-папа в пины шлейфа матричной клавиатуры. Рисунок 328. Соединительные провода в матричной клавиатуре Продолжим собирать проект. Проверь подключение всех контактов шлейфа. Три провода папа-папа подсоедини к шлейфу сервопривода. Провод, идущий от желтого провода (S), подключи к пину 10 на Arduino. Центральный
Сейф 229 провод подключи к дорожке «+» на макетной плате, а провод, идущий от GND (-), — к дорожке «-» на макетной плате. Рисунок 329. Соединительные провода в шлейфе матричной клавиатуры Присоединение проводов на матричной клавиатуре начинай с крайнего провода, подключенного к пину шлейфа, помеченного белой полоской. Начинай подключать со 2 пина — так, чтобы со 2 по 5 были подключены провода с белых пинов шлейфа, а с 6 по 9 — провода с пинов, помеченных черной полосой. Рисунок 330. Подключение проводов к Arduino uno
230 Простые роботизированные устройства Подадим питание на макетную плату, подсоединив провода с GND на дорожку со знаком «-», и с 5 V — на дорожку со знаком «+». Рисунок 331. Питание макетной платы Рассмотрим поподробнее электрическую схему нашего проекта. . Рисунок 332. Электрическая схема сейфа В бокс с электронными компонентами мы можем разместить как Крону на 9 В, так и power bank.
Сейф 231 Рисунок 333. Комплектование устройства Рисунок 334. Комплектование устройства Теперь закрепим крышку сейфа на подвижной части, чтобы можно было открывать и перепрограммировать Arduino Uno. Лист бумаги 230×60 мм сложим пополам вдоль длинной стороны и с помощью этой полоски приклеим крышку: половину — к крышке, вторую половину — к стенке сейфа.
232 Простые роботизированные устройства Рисунок 335. Крепление крышки сейфа Когда клей высохнет, проверь, как крышка открывается и закрывается. Рисунок 336. Подключение фоторезистора к пину A0 Конструкция готова. Перейдем к программированию. Программирование. Алгоритм прост: программа считывает состояние клавиш. Если клавиша нажата, проверяется ее значение. Если оно истинно для условия, переменная изменится на указанное значение, и нужно будет ввести три идущих друг за другом числа. Если комбинация цифр набрана правильно, дается команда сервоприводу повернуть плечо на определенный градус. В примере укажем, что для закрытой двери угол поворота сервопривода будет 10 градусов, а для открытой — 120.
Сейф 233 Программу будем писать в среде mBlock5. Она поддерживает язык Scratch, который интегрируем в Arduino. Рисунок 337. Выбираем Аrduino uno и кликаем OK Перед нами предстанет весь необходимый инструментарий. Рисунок 338. Инструментарий для программирования Arduino
234 Простые роботизированные устройства Так как многие знакомы с языком Scratch, мы не будем рассматривать тонкости программирования на нем. Перейдите во вкладку События и выберите команду при запуске Arduino Uno. Рисунок 339. Команда начала программы Для начала нужно убедиться, что мы правильно подключили клавиатуру к Arduino Uno. Для этого нужно создать две переменные: number и n. Переменные зададим во вкладке Персонажи. Рисунок 340. Установка цифрового порта на значение Высокий Для этой вкладки загрузим расширение для получения данных через облако. Обрати внимание: у тебя должен быть аккаунт в mBlock5.
Сейф 235 Рисунок 341. Установка бесконечного цикла После установки расширения для спрайта по передаче и приему сообщений создадим программу, которая будет отслеживать два сообщения с именами message и mmm. При получении одного сообщения присваиваем значение этого сообщения переменной n, а при получении второго — number. Это необходимо, чтобы увидеть в режиме реального времени значения, которые будут считываться с клавиатуры. Рисунок 342. Получение сообщений спрайтом Следующий шаг — добавить расширение для Arduino для работы с сообщениями через облако.
236 Простые роботизированные устройства Рисунок 343. Добавление расширения в Аrduino Рисунок 344. Расширение — Передача сообщений в облако Для работы с матричной клавиатурой необходимо добавить расширение Клавиатура 4×4. Вбей в поисковую строку слово Клавиатура или Key и, нажав Enter, увидишь нужное расширение. Нажми «+» и кликни Добавить.
Сейф 237 Рисунок 345. Расширение работы с клавиатурой Завершающим этапом станет установка светодиода на выключение, если показания фоторезистора не будут отвечать указанным условиям. Добавим в нашу программу функцию настройки клавиатуры. Укажем, к каким пинам подключили провода, отвечающие за строки, а к каким — за столбцы. Рисунок 346. Настраиваем клавиатуру Укажем начальное положение поворотного механизма сервопривода. В примере — угол 10, но он может не совпадать с твоим вариантом. Поэтому загружай программу, изменяя значения угла: нужно добиться, чтобы дверь закрывалась. Рисунок 347. Начальное положение сервопривода
238 Простые роботизированные устройства Подсоедини USB-шнур от Arduino к компьютеру и нажми кнопку Подключиться. Появится окно с выбором COM-порта (USB-порт). Поставь галочку, как указано на рис. 348, и выбери порт. Нажми кнопку Подключение. Если порт выбран правильно, появится текст как на рис. 349. Рисунок 348. Выбор порта подключения Рисунок 349. Устройство подключено
Сейф 239 Осталось кликнуть по кнопке Загрузить в и дождаться компиляции. Наблюдай за работой устройства. Переходим к основному циклу программы. Рисунок 350. Создаем бесконечный цикл Добавим функцию Сканировать нажатие кнопки из вкладки расширения Клавиатура. Рисунок 351. Отслеживаем нажатие клавиши Добавим условие в наш цикл. Рисунок 352. Условие
240 Простые роботизированные устройства В условии проверяем, нажата ли кнопка клавиатуры. Рисунок 353. Проверяем, нажата ли кнопка Если кнопка нажата, добавляем функцию передачи сообщения с указанным значением. Рисунок 354. Отправляем сообщение со значением 1 Рисунок 355. Передаем значение кнопки
Сейф 241 Протестируй программу и посмотри, правильно ли определены клавиши. Запустив программу, смотри, какие значения показывает number при нажатии на кнопки матричной клавиатуры. Если все совпадает, сборка прошла успешно. Если нет, проверь правильность подключения проводов и вернись к описанию, к началу сборки. Рисунок 356. Проверяем правильность работы клавиатуры
242 Простые роботизированные устройства Переменная n выступает триггером. Она будет принимать значения с клавиатуры и сравнивать с указанными числами. Но передаваемые значения — строковые (символьные типы данных). Поэтому нам нужно перевести строковую запись в число. За это отвечает функция Преобразование из вкладки данных. Рисунок 357. Преобразуем в целые числа Рисунок 358. Значение кнопки преобразуем в целые числа С этого момента n будет принимать только числа от 0 до 9. Для проверки отправим сообщение message со значением 1. Оно должно отобразиться в переменной n у спрайта. Можно сделать так, чтобы сообщение отправляло все значения со всех кнопок. Тогда используют преобразование данных с клавиатуры в международный стандарт кода ASCII, где каждому символу присвоен свой номер.
Сейф 243 Рисунок 359. Отправляем сообщение message Рисунок 360. Перевод в ASCII Рисунок 361. Перевод значения кнопки в ASCII Если загрузить код на данном этапе, при нажатии на клавиши, в том числе и буквенные, появятся числа в переменной n.
244 Простые роботизированные устройства Рисунок 362. Проверяем работу кода Это нужно, чтобы узнать кодировку клавиши А: это будет 65. Потом можно перейти к описанию условия, которое будет проверять нажатие клавиши А. После нажатия сервопривод должен вернуться в исходное положение, т. е. закрыть дверь. Рисунок 363. Второе условие для закрытия двери Рисунок 364. Второе условие для закрытия двери
Сейф Рисунок 365. Второе условие для закрытия двери Рисунок 366. Второе условие для закрытия двери Рисунок 367. Второе условие для закрытия двери 245
246 Простые роботизированные устройства Рисунок 368. Второе условие для закрытия двери Переменная number здесь выполняет роль ключа. Если ее значение не 3, дверь закрыта, а если 3 — открыта. Поэтому следующие три условия будут проверять правильность набранного кода. Для примера код для открытия двери будет 123. Рисунок 369. Если код набран правильно, дверь открывается
Футбол 247 Это окончательный код. Протестируй его на открытие и закрытие; если будет нужно, измени значение градусов поворота. Футбол Построим футбольные ворота с детектором прерывания (движения). Как только в ворота попадает мяч, загорается светодиод и раздается звук зуммера. Чтобы собрать проект, понадобится картон, желательно 2–3 мм толщиной. Примерный размер картона — 370×230 мм. Инструменты: термоклей и термопистолет Электроника: Arduino Uno (можно с корпусом), лазерный модуль KY-008, фоторезистор, зуммер на 3 В, резистор на 1–2 кОм , светодиод красный на 3 В, резистор на 256–560 Ом, элемент питания (Крона на 9 В) с насадкой, USBшнур, макетная беспаечная плата (400 точек или 170 точек), соединительные провода: мама-мама — 5 шт, мама-папа — 7 шт, папа-папа — 10 шт. Инструкция. Понадобится кусок картона, как на рис. 370. Здесь представлена раскройка картона по деталям. Рисунок 370. Раскройка картона по деталям На рис. 371 даны размеры деталей. Примерный вариант деталей из картона с электрокомпонентами на рис. 371. Для защиты платы Arduino от случайных внешних воздействий рекомендую поместить ее в корпус. Перед сборкой пробежимся по элементам, которые будут использованы.
248 Простые роботизированные устройства Рисунок 371. Комплектующие из картона Рисунок 372. Комплектующие из картона
Футбол 249 На рис. 372 представлен зуммер, который питается от 3 В. Его функция — издавать монотонные звуки определенной частоты через определенное время. Также здесь присутствуют светодиод, лазерный модуль, фоторезистор, резистор, соединительные провода, Аrduino. Основанием для устройства будет картон размером 230×230 мм, рис. 373. 230 мм 230 мм Рисунок 373. Размер детали Приступаем к сборке. Крепим плату Arduino и макетную плату. Используем детали 3, 2 и 8. Рисунок 374. Сборка плат
250 Простые роботизированные устройства Рисунок 375. Сборка плат Рисунок 376. Сборка плат Затем переходим к креплению источника питания. Он будет обеспечивать автономную работу устройства.
Футбол Рисунок 377. Крепление источника питания Рисунок 378. Крепление источника питания 251
252 Простые роботизированные устройства Рисунок 379. Крепление источника питания Переходим к креплению футбольных ворот, точнее, их границ, к которым будут прикреплены лазерный модуль и фоторезистор. Этими границами станут детали 6 и 7: там есть специальные отверстия. Рисунок 380. Боковые границы футбольных ворот Вставляем в эти детали фоторезистор и лазерный модуль.
Футбол Рисунок 381. Крепление лазерного модуля Рисунок 382. Крепление лазерного модуля Рисунок 383. Крепление лазера и фоторезистора Рисунок 384. Крепление лазера и фоторезистора 253
254 Простые роботизированные устройства Расположите деталь 6 рядом со стенкой макетной платы так, чтобы оставалось 34 мм до края основания. Воспользуйтесь деталью 5, чтобы определить точку расположения детали 7. Расположите детали 6 и 7 так, чтобы от основания до фоторезистора или лазерного модуля было 35 мм. Рисунок 385. Крепление деталей 6 и 7
Футбол 255 Рисунок 386. Крепление деталей 6 и 7 Рисунок 387. Крепление деталей 6, 7 и 5 Для стабильности конструкции ворот и чтобы укрыть провода от фоторезистора прикрепим детали 4 по бокам детали 5.
256 Простые роботизированные устройства Рисунок 388. Крепление деталей 4 Прикрепим провода мама-папа к фоторезистору, а концы — к пинам на макетной плате. Если провода не будут доставать до макетной платы, прикрепите еще два провода мама-папа. Рисунок 389. Крепление проводов к фоторезистору
Футбол Аккуратно укладываем провода. Рисунок 390. Укладываем провода Закрываем провода деталью 5. Рисунок 391. Крепим вторую деталь 5 Закрепляем термоклеем фоторезистор. 257
258 Простые роботизированные устройства Рисунок 392. Крепим фоторезистор термоклеем Небольшое пояснение: для соединения всех электрокомпонентов в единую цепь воспользуемся соединительными проводами. Продолжим собирать проект. Проверь, как закреплен фоторезистор: он должен смотреть так, как показано на рис. 392 и 393. Рисунок 393. Крепление фоторезистора Перед креплением лазерного модуля необходимо настроить его, чтобы лазерный луч попадал прямо в фоторезистор. Возьми три провода папа-мама и закрепи все контакты лазерного модуля. Второй конец провода, который идет с контакта «-», закрепи на макетной плате на дорожке со знаком «-». А концы остальных двух проводов — на дорожке со знаком «+».
Футбол 259 Рисунок 394. Крепим провода лазерного модуля для калибровки Выведем провода папа-папа из GND Arduino в дорожку «-» на макетной плате, из 3.3 В Arduino — в дорожку «+» макетной платы. Рисунок 395. Подаем питание на лазерный модуль
260 Простые роботизированные устройства Если подать питание на Arduino Uno, можно наблюдать свечение, исходящее из лазерного модуля. Сам лазерный луч не будет виден, только отсвет — там, где он касается каких-либо частей конструкции. Рисунок 396. Включение лазерного модуля Вращай лазерный модуль, пока его луч не попадет точно в фоторезистор. Как только все получится, смело фиксируй положение модуля термоклеем. Рисунок 397. Калибровка лазерного модуля Теперь настал момент сборки всей схемы. Перейдем к анализу схемы, см. рис. 398.
Футбол 261 Рисунок 398. Электрическая схема футбольных ворот Согласно схеме, контакт s лазерного модуля подключаем к 6 пину. Плюсовой контакт светодиода подключаем к пину 7, а плюсовой контакт зуммера — к пину 8. Один из контактов фоторезистора подключаем к пину A0. Начнем с фоторезистора. Подключим один из его контактов к пину A0. Рисунок 399. Подключение фоторезистора к пину A0 К этому контакту параллельно подключаем резистор на 2 кОм.
262 Простые роботизированные устройства Рисунок 400. Подключение резистора на 2 кОм Второй конец резистора запитываем на дорожке со знаком «-». Рисунок 401. Второй конец резистора запитываем на «-» Второй контакт фоторезистора запитаем на второй дорожке со знаком «+».
Футбол 263 Рисунок 402. Подключение фоторезистора к «+» Подадим питание в 5 В на вторую дорожку макетной платы со знаком «+» от Arduino с пина 5 В. Рисунок 403. Запитываем вторую дорожку макетной платы
264 Простые роботизированные устройства Теперь крепление пьезоэлемента (зуммера). У него два контакта разной длины: длинный подключается к «+», а короткий — к «-». Плюсом будет выступать пин 8. Рисунок 404. Подключение зуммера. Провод на «-» — от короткой ножки Переходим к подключению светодиодов. Короткая ножка подключается через резистор к дорожке «-», а длинная — к пину 7. Рисунок 405. Подключение светодиода
Футбол 265 Рисунок 406. Подключение зуммера и светодиода Если лазерный модуль держится нестабильно, можно для жесткости прикрепить к нему дополнительную деталь из картона размером 35×25 мм. Рисунок 407. Укрепление лазерного модуля
266 Простые роботизированные устройства Осталось перенаправить контакты лазерного модуля согласно схеме. Провод с контакта s перенаправляем на пин 6, провод, выходящий из середины, на вторую дорожку — «+». Рисунок 408. Окончательный результат Программирование. Алгоритм программы простой: лазерный модуль непрерывно испускает лазерный луч, направленный на фоторезистор. В это же время каждую тысячную долю секунды фоторезистор передает данные об интенсивности света на плату Arduino. Если лазерный луч прервется (например, его перекроют посторонним предметом), показания фоторезистора существенно изменятся; это будет учтено платой Arduino, последует команда на звуковой сигнал (зуммер) — и визуальный сигнал (загорится светодиод). Длительность горения установим в 1 секунду. Программу будем писать в среде mBlock5. Эта программа поддерживает Scratch — язык, который интегрируем для Arduino.
Футбол Рисунок 409. Выбираем Аrduino uno и кликаем OK Перед нами весь необходимый инструментарий. Рисунок 410. Инструментарий к программированию Arduino 267
268 Простые роботизированные устройства Перейди во вкладку События и выбери команду при запуске Arduino Uno. Рисунок 411. Команда начала программы Затем перейди во вкладку Контакты и выбери установить выход цифрового порта: порт 6 и значение высокий (hight). Это позволит запустить лазерный модуль. Рисунок 412. Установка цифрового порта на значение Высокий Перейди во вкладку Управление и выбери цикл Всегда. Рисунок 413. Установка бесконечного цикла
Футбол 269 Теперь добавим операторы условия для алгоритма ветвления, в котором будем проверять значения с фоторезистора. Рисунок 414. Добавляем ветвление Во вкладке Оператор выберем команду сравнения со знаком «<» и добавим к оператору если в нашем ветвлении. Установим предварительно значение 200. Рисунок 415. Добавление оператора сравнения Теперь настал момент считывать значения фоторезистора. Его показания отправляются на пин A0 согласно схеме. Перейдем во вкладку Контакты и выберем считать аналоговый порт (А).
270 Простые роботизированные устройства Рисунок 416. Полная версия программы Для выполнения этого условия подадим сигнал на зуммер, выбрав из той же вкладки команду порт … проигрывает ноту. Выберем ноту D3 и длительность 0,5. Рисунок 417. Команда на зуммер Следующий шаг — отправляем команду на светодиод, чтобы он загорелся. Рисунок 418. Включение светодиода
Футбол 271 Светодиод должен гореть 1 секунду. Выберем это во вкладке Управление. Рисунок 419. Ожидание 1 секунда По истечении этого времени подаем команду об отключении светодиода. Рисунок 420. Выключение светодиода В завершение — установка светодиода на выключение, если показания фоторезистора не будут отвечать указанным условиям. Подключим Arduino Uno к USB-порту компьютера и проведем сопряжение с mВlock5. Осталось кликнуть по кнопке Загрузить в и дождаться компиляции. Наблюдай за работой устройства.
272 Простые роботизированные устройства Рисунок 421. Итоговая программа Последний штрих — калибровка показаний фоторезистора на пороговое значение. Если после загрузки устройство включило красный светодиод и звуковой сигнал, но ты при этом не мешаешь лучу лазера попадать на фоторезистор, понизь показания в программе с 200 до 150. Если не поможет, понижайте еще. Если после загрузки устройство молчит и молчит, когда движение луча перекрывается, нужно повысить показания — например, с 200 до 300. И повторять до тех пор, пока не включится зуммер. Осталось создать мячик или взять подходящий по размерам — около 5 см.
Настольные роботизированные игры С 50-х годов XX столетия были популярны интерактивные электронно-механические игры с обратной связью, начиная с экзаменационных аппаратов и заканчивая различными симуляторами (транспорт, бой, соревновательные задачи). Давай попробуем создать популярные игры, в которые любили играть ваши папы и мамы, бабушки и дедушки. Гоночный симулятор Гоночный симулятор — достаточно простая конструкция, имитирующая управление автомобилем. За аналог возьмем советскую игру «За рулем» (игровой набор ОМ-4800). Создадим схему для этой модели. Рисунок 422. Схема гоночного симулятора Игровое поле вращает DC-мотор, который управляется через драйвер l293d. Мотор можно взять помощнее, он часто применяется в проектах Аrduino.
274 Настольные роботизированные игры Материал: пластик, фанера, вспененный ПВХ, пенополистирол, деревянные бруски, алюминиевый профиль, магниты. Инструменты: канцелярский нож и ножницы, клей, карандаш, линейка или штангенциркуль, наждачная бумага, дрель, паяльная станция, крепежный материал. Электрокомпоненты: Аrduino, DC-мотор, соединительные провода. Сборка модели. Рисунок 423. Расходные материалы для модели Рисунок 424. Дополнительные держатели из вспененного ПВХ Рисунок 425. Крепление бруска к мотору клеем. Добавление колеса
Гоночный симулятор 275 Рисунок 426. Управляющее колесо из пенополистирола Рисунок 427. Алюминиевая трубка Рисунок 428. Несущая конструкция Обрати внимание: алюминиевая трубка должна свободно вращаться. Для этого в месте крепления с доской просверли отверстие в 10 мм. Это нужно сделать как для нижней, так и для верхней опоры.
276 Настольные роботизированные игры Деревянные бруски (толщиной не более 10 мм) скрепляются саморезами или гвоздями, а места соединения проклеиваются. Рисунок 429. Резиновый ремень Рисунок 430. Крепим диск из ПВХ диаметром в 300 мм Диск из ПВХ необходимо жестко закрепить с диском из пенополистирола и алюминиевой трубкой с помощью клея. Рисунок 431. Элементы препятствия
Гоночный симулятор 277 Размеры отверстий и их количество можно выбрать самостоятельно. Главное — отверстия должны давать возможность пройти магнитику (магнитной насадке). Рисунок 432. Крепление верхней опоры Рисунок 433. Дополнительное крепление и столик для руля Далее вырежем руль из ПВХ и приклеим к нему неодимовый магнит. Длина руля 300 мм. Рисунок 434. Руль с неодимовым магнитом Теперь закрепим руль. Подберите оптимальный вариант крепления к столику, чтобы руль смог перемещать магнит на диске.
278 Настольные роботизированные игры Рисунок 435. Закрепление руля и добавление магнита После сборки основной части конструкции необходимо припаять провода к мотору и подключить его через микросхему L293D к плате Arduino. Не забудь подключить кнопки для включения разных скоростей и остановки мотора. Теперь составим программу для модели. Чтобы скорость была небольшой, поставим мощность 120 из 255. int m1 = 12; int m2 = 11; int v = 10; void setup() { pinMode(m1,OUTPUT); pinMode(m2,OUTPUT); pinMode(v,OUTPUT); analogWrite(v, 0); } void loop() { digitalWrite(m1, HIGH); digitalWrite(m2, LOW); analogWrite(v, 120); }
Симулятор Марио 279 Рисунок 436. Видеообзор автогонок Программа в mBlock5 такая же, как для управления мотором. Симулятор Марио Еще одна интерактивная игра — это игра по принципу платформера. Поле сделано в виде замкнутой ленты, на которой изображены препятствия. Для красочности можно изобразить фон. Принцип игры схож с игрой для браузера «Динозаврик и кактусы», только динозаврика мы заменим на человечка, а кактусы — на трубы разной высоты. Рассмотрим схему устройства.          Рисунок 437. Схема устройства Марио
280 Настольные роботизированные игры В схеме два DC-мотора. Один вращает ленту, на которой изображен фон с препятствиями, а второй перемещает персонажа с датчиком линии, прикрепленного ко второй ленте. Две кнопки нужны, чтобы регулировать перемещение персонажа, а третья — для остановки игры. Материал: пластик, фанера, бумага, картон. Инструменты: канцелярский нож и ножницы, клей, карандаш, линейка или штангенциркуль, наждачная бумага, паяльная станция, крепежный материал. Электрокомпоненты: Аrduino, DC-мотор, шаговый двигатель, пьезоэлемент, микросхема l293d, две кнопки, два резистора на 470 Ом, соединительные провода. Сборка конструкции. Чтобы равномерно и небыстро вращать ленту, можно использовать шаговый двигатель 28BYJ-48-5V. Подключаем согласно главе «Введение в разработку устройств на Аrduino и программирование». Рисунок 438. Шаговый двигатель, колесо с насадкой и плата Аrduino Колесо от DC-мотора хорошо крепится к шаговому двигателю. К этому колесу и будем крепить ролик; сделаем его из бумаги плотностью 80 г/м2. Чтобы ролик получился более плотным, склеим в два слоя два листа бумаги формата А4. Скручиваем склеенную бумагу по меньшей стороне — так, чтобы диаметр трубы оказался не больше 3 см. С помощью термоклея крепим ролик к колесу. Приступим к созданию корпуса устройства. В качестве несущей конструкции можно взять картон для переплета. Он достаточно плотный, до 3 мм в толщину. Нужны два листа размером 30×30 см. Такой материал продают в магазинах для рукоделия, например, в «Леонардо». В одной из боковых стенок вырежем отверстие под шаговый двигатель.
Симулятор Марио 281 Рисунок 439. Вырезаем стенки из картона толщиной 3 мм. Создаем ролик Чтобы ролик держался на одной высоте и свободно прокручивался, возьмем крышку от флакона диаметром не более 3 см. Точно замерь высоту ролика, чтобы правильно приклеить крышку. Приклеиваем крышку и надеваем ролик. Он должен свободно прокручиваться, но быть прочно закрепленным на колесе. Затем делаем такой же второй ролик, он тоже должен свободно прокручиваться на держателях. Держатели можно сделать из любых подручных средств. Главное, чтобы они были гладкими (меньше трения). Рисунок 440. Несущая конструкция Сделаем игровую ленту. Для этого на компьютере в любом графическом редакторе или текстовом редакторе Word рисуем вертикальные черные трубы разной высоты, которые расположены в разных местах поля. Распечатываем два листа А4 с этими рисунками. Чтобы закрепить их на ролики, возможно, понадобится половина третьего листа А4.
282 Настольные роботизированные игры Рисунок 441. Бумажная (клеенка) лента с черными полосами Игровую ленту обертываем вокруг двух роликов так, чтобы натяжение было несильным и достаточным для вращения роликами ленты. Для увеличения трения можно воспользоваться бухгалтерскими резинками, они закрепляются на главном ролике. Теперь необходимо сделать элемент управления персонажем. Управлять будем с помощью DC-мотора. Его крепят так, чтобы движение персонажа было перпендикулярно движению ленты. Как видно на рис. 444, необходимо сделать из картона два держателя размером 12×6,5 см и взять латунную трубку (можно алюминиевую) длиной 30 см. Рисунок 442. Добавляем ремень и DC-мотор Надеваем ремень, сплетенный из резинок: он будет перемещать персонажа. Чтобы фиксировать столкновение с трубами, нам понадобиться датчик линии. Для него соберем держатель, который закрепим на ремне. Ремень будет перемещать держатель с датчиком перпендикулярно ленте. Чтобы датчик оставался в одной плоскости и не переворачивался, необходимо закрепить держатель и на латунной трубке.
Симулятор Марио 283 Рисунок 443. Держатель для датчика линии В верхней части держателя проделаем отверстие, чтобы отверткой регулировать чувствительность датчика. Рисунок 444. Держатель для датчика линии Крепим держатель одним концом к ремню, второй кладем на трубку, но не закрепляем. Осталось с помощью соединительных проводов подключить электронику. Рисунок 445. Добавление датчика линии в общую конструкцию
284 Настольные роботизированные игры Подключим кнопки, датчик и моторы к плате Arduino. Если все заработает идеально, можно заботиться о красоте конструкции. Перейдем к программе. Для начала воспользуемся готовой программой для шагового двигателя. Сохраним под именем mario_din.ino. #include <Stepper.h> Stepper myStepp(255, 8, 9, 10, 11); void setup() { myStepp.setSpeed(100); Serial.begin(9600); } void loop() { Serial.println(“clockwise”); myStepp.step(64); delay(10); } Загрузи программу в Аrduino и проверь работу ленты. Если она не запустилась, значит, возникла ошибка в подключении шагового двигателя. Если результат устраивает, добавим управление DC-мотором с помощью кнопок, основываясь на информации главы «Введение в разработку устройств на Аrduino и программирование». #include <Stepper.h> Stepper myStepp(255, 8, 9, 10, 11); int int int int int int button1 = 7; button2 = 12; m1 = 5; m2 = 6; line=A0; p=13; void setup() {
Симулятор Марио myStepp.setSpeed(100); Serial.begin(9600); pinMode(m1, OUTPUT); pinMode(m2, OUTPUT); pinMode(button1, INPUT); pinMode(button2, INPUT); pinMode(line, INPUT); digitalWrite(m1, LOW); digitalWrite(m2, LOW); Serial.begin(9600); } void loop(){ if (digitalRead(button1) == HIGH) { digitalWrite(m1, HIGH); digitalWrite(m2, LOW); delay(200); } else { digitalWrite(m1, LOW); digitalWrite(m2, LOW); } if (digitalRead(button2) == HIGH) { digitalWrite(m1, LOW); digitalWrite(m2, HIGH); } else { digitalWrite(m1, LOW); digitalWrite(m2, LOW); } if (analogRead(line)>285) { tone (p, 100); delay(200); tone (p, -1); 285
286 Настольные роботизированные игры } Serial.println(analogRead(line)); myStepp.step(64); delay(10); } Зальем программу на плату Аrduino и проверим работу установки. Рисунок 446. Видеообзор симулятора Марио
Музыкальные аппараты В наше время существует множество электронных музыкальных инструментов. В этой главе мы попробуем создать такие устройства. Простое пианино Пианино — клавишный музыкальный инструмент: при нажатии клавиши издается звук. Создадим устройство, состоящее из восьми клавиш (кнопок), каждая из которых соответствует частоте ноты. Схема устройства: Рисунок 447. Схема электронного пианино Электрокомпоненты: Arduino, пьезоэлемент, восемь кнопок, восемь резисторов на 220–470 Ом, соединительные провода.
288 Музыкальные аппараты Рисунок 448. Компоненты схемы электронного пианино Создадим программу для устройства, для этого воспользуемся аналогичной программой для кнопки. В нашем случае нужно запрограммировать восемь кнопок под восемь нот. Для пьезоэлемента подобраны частоты тона согласно таблице нот для первой октавы. Сохраним файл под именем muz_klav.ino. int int int int int int int int b1 b2 b3 b4 b5 b6 b7 b8 = = = = = = = = 12; 11; 10; 9; 8; 7; 6; 5; int p = 13; void setup() { pinMode(b1, OUTPUT); pinMode(b2, OUTPUT); pinMode(b3, OUTPUT); pinMode(b4, OUTPUT); pinMode(b5, OUTPUT); pinMode(b6, OUTPUT); pinMode(b7, OUTPUT); pinMode(b8, OUTPUT);
Простое пианино pinMode(p, OUTPUT); Serial.begin(9600); } void loop() { if (digitalRead(b1)== HIGH) { tone(p, 261); delay(500); } else if (digitalRead(b2)== HIGH { tone(p, 293); delay(500); } else if (digitalRead(b3)== HIGH { tone(p, 329); delay(500); } else if (digitalRead(b4)== HIGH { tone(p,349 ); delay(500); } else if (digitalRead(b5)== HIGH { tone(p, 440); delay(500); } else if (digitalRead(b6)== HIGH { tone(p, 466); delay(500); } else if (digitalRead(b7)== HIGH { tone(p, 494); delay(500); } else if (digitalRead(b8)== HIGH { ) ) ) ) ) ) ) 289
290 Музыкальные аппараты tone(p, 554); delay(500); } tone(p, -1); } Рисунок 449. Видеообзор электронного пианино Лазерный синтезатор Это устройство схоже с предыдущим, но реализовано по-другому: вместо клавиш здесь используется прерывание сигнала от лазерного модуля к фоторезистору. Вариант интересен еще и тем, что позволяет увеличить скорость проигрывания мелодии. Схема устройства выглядит так. Рисунок 450. Схема лазерного синтезатора
Лазерный синтезатор 291 По умолчанию используем Аrduino Uno, поэтому ограничено количество фоторезисторов и лазерных модулей. Если есть возможность взять Аrduino Mega, можно будет увеличить до восьми и более элементов, чтобы получить полноценный синтезатор. Материал: картон, пенокартон, бумага. Инструменты: канцелярский нож и ножницы, клей, карандаш, линейка или штангенциркуль, паяльная станция. Электрокомпоненты: Аrduino, пьезоэлемент, пять лазерных модулей, пять резисторов на 1 кОм, пять фоторезисторов, соединительные провода. Рисунок 451. Компоненты лазерного синтезатора Чтобы лазерные модули строго светили на фоторезисторы, нужно сделать несущую конструкцию, в которой они будут закреплены. Мы используем плотный картон и пенокартон — четыре прямоугольника размером 2×10 см и два — по 2×8 см. Прямоугольники меньшего размера нужны для подставки, чтобы устройство не падало. Держателями лазерных модулей и фоторезисторов выступят прямоугольники, вырезанные из пенокартона. Элементы из картона должны выполнять роль прочного каркаса, который все это выдержит. Начни с крепления лазерных модулей. Для каждого выделена ячейка 2×2 см. Постарайся вырезать посередине ячеек. Зная расположение модулей и примерное направление луча, вырежи отверстия для фоторезисторов. К фоторезисторам припаяем провода длиной 15 см, к концам провода — штекер для работы с платой. Осталось все соединить проводами.
292 Музыкальные аппараты Рисунок 452. Реализация лазерного синтезатора согласно схеме Устройство собрано, теперь надо составить программу. int p = 13; int f1 = A1; int f2 = A2; int f3 = A3; int f4 = A4; int f5 = A5; void setup() { pinMode(p, OUTPUT); pinMode(f1, pinMode(f2, pinMode(f3, pinMode(f4, pinMode(f5, pinMode(f6, pinMode(f7, pinMode(f8, INPUT); INPUT); INPUT); INPUT); INPUT); INPUT); INPUT); INPUT); Serial.begin(9600); } void loop() { if (analogRead(f1)>320) { tone(p, 261);
Лазерный синтезатор delay(500); } else if (analogRead(f2)>350 ) { tone(p, 293); delay(500); } else if (analogRead(f3)>350 ) { tone(p, 329); delay(500); } else if (analogRead(f4)>350 ) { tone(p,349 ); delay(500); } else if (analogRead(f5)>350 ) { tone(p, 440); delay(500); } else if (analogRead(f6)>350 ) { tone(p, 540); delay(500); } else if (analogRead(f7)>350 ) { tone(p, 590); delay(500); } else if (analogRead(f8)>350 ) { tone(p, 680); delay(500); } tone(p, -1); Serial.println(analogRead(f1)); //Serial.println(analogRead(f2)); //Serial.println(analogRead(f3)); 293
294 Музыкальные аппараты //Serial.println(analogRead(f4)); //Serial.println(analogRead(f5)); //delay(500); } Рисунок 453. Видеообзор лазерного синтезатора
Умная одежда Одно из интересных и перспективных разработок в области робототехники — умная одежда. Она может выполнять как защитные, так и диагностические функции: с ее помощью можно снять ЭКГ или ЭЭГ, определить влажность и температуру под одеждой и в окружающей среде, измерить давление. Такая одежда включает дополнительные элементы для ориентирования в пространстве, когда плохая видимость, и сигнальные элементы, помогающие найти людей в толпе. Применяется умная одежда и для оповещения (скорая помощь, полиция, служба спасения, пожарная служба и т. д.). Рассмотрим принцип создания с сигнальными элементами. Умная подсветка одежды Иногда приходится идти по темным улицам. Это затрудняет движение и ориентацию в пространстве. Умная подсветка на одежде очень поможет в таком случае. Достаточно одного фоторезистора, нескольких светодиодов, самой ткани, электропроводящих нитей, платы LilyPad и источника питания. Все электрокомпоненты мы вошьем в ткань. Рассмотрим схему устройства. Рисунок 454. Схема для умной одежды
296 Умная одежда Материал: ткань. Инструменты: канцелярский нож и ножницы, иголка и нитка, ножницы, паяльная станция и припой. Электрокомпоненты: LilyPad, светодиоды, один резистор порядка 1 кОм, электропроводящая нить, источник питания. Сборка устройства: Рисунок 455. Материал для сборки устройства Для начала возьми кусок ткани, который легко надеть на пяльцы. Пяльцы — это деревянный двойной круг, позволяющий распрямлять участок ткани для удобства шитья. Они бывают разного диаметра. Если в семье кто-то шьет, пяльцы, скорее всего, у тебя уже есть. Можно использовать любой круг, а ткань закреплять либо на прищепки, либо степлером. Вставим в ткань светодиоды и спаяем ножки минус вместе. Закрепим фоторезистор в ткань и припаяем резистор на 1 кОм. Рисунок 456. Светодиоды и фоторезистор в ткани Теперь начнем пришивать LilyPad с помощью электропроводящей нити и иглы.
Умная подсветка одежды 297 Минусовые ножки светодиодов соединим нитью с минусом LilyPad. Спаяем плюсовые ножки светодиодов и соединим их с выводом 4 LilyPad. Ножку фоторезистора, где припаян резистор, соединим с пином A0 электропроводящей нитью. Ножку резистора соединяем с пином «+» LilyPad. Свободную ножку фоторезистора — с минусом (GND), через минусовые ножки светодиодов. Рисунок 457. Присоединяем все элементы к пинам LilyPad с помощью электронитей Создадим программу. Она будет один в один с программой из раздела «Подключение светодиода в цепь», с той лишь разницей, что изменится пин подключения светодиодов и порог чувствительности фоторезистора. int foto =A0; int svet =4; void setup() { pinMode(foto, INPUT); pinMode(svet, OUTPUT); Serial.begin(9600); } void loop() { if( analogRead(foto)>750) { digitalWrite(svet,HIGH); } else { digitalWrite(svet,LOW); }
298 Умная одежда Serial.println(analogRead(foto)); delay(300); } ВАЖНО! Перед подключением убедись, что нити не пересекаются. Если есть болтающиеся участки, их можно припаять: нить и припой хорошо взаимодействуют. У нитей малое сопротивление, поэтому если используется достаточно мощный источник питания, например, 5 В и от 1 до 2 А, лучше светодиодам припаять резистор на 220–470 Ом. Загрузим программу и проверим работоспособность устройства. Для калибровки понадобится через монитор порта отследить, как изменяются показания фоторезистора. Может возникнуть такая ошибка: Рисунок 458. Неправильная кодировка символов Это связано с тем, что микроконтроллер удваивает скорость передачи. Поэтому вместо 9600 в мониторе порта необходимо указать 19 200.
Умная подсветка одежды 299 Рисунок 459. Настройка кодировки Снимем ткань с пяльцев и обрежем нужную нам область. Теперь осталось пришить саму ткань к нужной одежде и подключить устройство к переносному источнику питания. Необходимо убедиться, что нити не контактируют между собой и с кожей человека. Рисунок 460. Видеообзор умной одежды
Мобильный робот Нам понадобится картон, желательно 2–3 мм толщиной и размерами листа 350x300 мм. Электронная начинка: Arduino Uno, DC-моторы с редукторами (2 шт.), ультразвуковой датчик расстояния (HC-SR04), датчик линии (TCRT5000), сервопривод (SG-90), драйвер моторов (L298N, можно и L293D), колеса на моторы (2 шт. — 65 мм в диаметре), рицинус (1 шт., третье колесо опорное), соединительные провода (папа-папа — 15 шт., мама-папа — 10 шт.), элемент питания — Крона на 9 В (2 шт.) с насадкой (2 шт.), USB-шнур. Несущая конструкция: картон 3×350×300 мм. Инструменты: термопистолет и термоклей. Робот будет выполнять несколько задач: перемещаться в пространстве, двигаться по линии, объезжать препятствия и перевозить предметы. Инструкция: Для начала нам понадобятся детали для несущей конструкции. Воспользуемся картоном. Рисунок 461. Детали для несущей конструкции
Мобильный робот 301 Рисунок 462. Материалы для робота Прикрепим два мотора с проводами (они заранее припаяны и на конце могут иметь штекеры) к детали №1 с помощью клея или термоклея. Рисунок 463. Крепление моторов Чтобы провода аккуратно располагались в конструкции, можно проделать два отверстия в картоне и продеть провода в них.
302 Мобильный робот Рисунок 464. Расположение проводов Теперь прикрепим колеса к моторам. Рисунок 465. Закрепляем колеса Если поставить платформу на колеса, можно заметить явный скос. Так не должно быть. Поэтому добавим рицинус (третье колесо). Оно может быть любой конструкции, главное — легкое и размером 4×4 см. Платформа робота должна быть строго горизонтальной, поэтому выровняй рицинус с помощью деталей из картона. На рисунках рицинус размером 3×2×1,5 см. Сделаем для него две детали из картона размером 2×4 см.
Мобильный робот Рисунок 466. Детали для рицинуса Рисунок 467. Пример детали для рицинуса 303
304 Мобильный робот Рисунок 468. Крепление рицинуса Рисунок 469. Крепление рицинуса Если все правильно, поставив на колеса платформу, получим результат, как на рис. 475.
Мобильный робот 305 Рисунок 470. Основная платформа мобильного робота Теперь подключим провода моторов к драйверу L298N, как показано на рисунке. Какой провод к какому пину подключать, не важно. Главное, чтобы два провода были с одной стороны. Порядок подключения будет влиять только на направление движения, а его можно настроить с помощью программы. Рисунок 471. Подключение моторов к драйверу
306 Мобильный робот Рисунок 472. Пины для подачи питания на драйвер Питать моторы будем через Крону на 9 В. Поэтому нужны клеммы GND и клемма с прочерком (это «+»). Сюда крепим насадку для Кроны с двумя открытыми контактами и проводами (красный и черный). Далее приступаем к креплению боковых стенок — это детали №3. Рисунок 473. Сборка конструкции робота
Мобильный робот 307 Подключим четыре провода (мама-мама или мама-папа) к пинам IN1, IN2, IN3, IN4. Эти провода пойдут на подключение к плате Arduino Uno для управления моторами. Рисунок 474. Подключения проводов для Arduino для управления моторами Далее приступаем к креплению ультразвукового датчика расстояния. Воспользуемся деталью №5 и с помощью термопистолета приклеим датчик так, чтобы четыре контакта выходили за пределы детали. Рисунок 475. Крепление ультразвукового датчика расстояния
308 Мобильный робот Рисунок 476. Крепление ультразвукового датчика расстояния Устанавливаем деталь №5 так, чтобы внизу был прогал для соединительных проводов — крепить датчик к Arduino Uno. Затем приступаем к креплению сервопривода, используем деталь №2. Рисунок 477. Крепление сервопривода
Мобильный робот 309 К сервоприводу необходимо прикрепить деталь №9. Это подвижная часть конструкции, задача которой — захватывать предметы. Рисунок 478. Крепление захватывающей детали Создаем второй ярус для Arduino Uno. Используем детали №4. Рисунок 479. Создаем второй ярус
310 Мобильный робот Рисунок 480. Создаем второй ярус Крепим второю часть захвата, используя детали № 8 и 9. Вторая часть жестко крепится к стенке детали №4. Рисунок 481. Захватывающий механизм На этом ярусе расположим плату Arduino Uno (можно в корпусе) и подключим провода, идущие от пинов драйвера l298N (IN1–IN4) последовательно к плате (к пинам 8–11). Можно использовать и драйвер l293D: мы уже умеем им пользоваться.
Мобильный робот Рисунок 482. Подключение проводов от L298N к плате Аrduino Рисунок 483. Провода от L298N к Аrduino Uno 311
312 Мобильный робот Теперь удлиним провода сервопривода с помощью проводов мама-папа. Рисунок 484. Удлиняем провода Рассмотрим электрическую схему. Рисунок 485. Схема мобильного робота
Мобильный робот 313 Обрати внимание на подключение драйвера двигателей L298N. От источника питания и Arduino должен идти общий провод GND (два черных провода на макетной плате объединяются и идут на GND драйвера). Только в этом случае моторы будут работать. Согласно схеме, сервопривод подключается к 12 пину, а его «-» идет на общий минус, как у драйвера L298N. Рисунок 486. Подключение сервопривода Подключим ультразвуковой датчик расстояния. Для этого возьмем четыре провода (можно их удлинить). Рисунок 487. Провода для ультразвукового датчика расстояния
314 Мобильный робот Рисунок 488. Подключение проводов к ультразвуковому датчику расстояния Протянем эти провода внутрь корпуса. Рисунок 489. Провода от ультразвукового датчика расстояния
Мобильный робот 315 Согласно схеме, провод от trig подключаем к 7 пину, а от echo — к 6 пину. Провод от GND — к GND Аrduino, а от VCC — к пину 3.3 В Arduino. Рисунок 490. Подключение проводом от датчика расстояния к Аrduino Теперь перейдем к креплению датчика линии: это дополнительный компонент, который крепится по желанию. Это один из самых капризных датчиков. Чтобы он корректно работал, необходимо расположить его над поверхностью не более чем 5 мм. Рисунок 491. Датчик линии Рисунок 492. Датчик линии
316 Мобильный робот Рисунок 493. Крепление датчика линии и подключение проводов Рисунок 494. Примерный вариант расположения датчика линии над поверхностью от 1 до 5 мм Пин VCC датчика линии отправится на пин 3 Аrduino, и на него мы подадим напряжение, так датчик будет питаться. Подключите для сигнала пин D0 у датчика линии с пином 5 Аrduino. В этом случае датчик будет выдавать только два значения 1 (черная линия) или 0 (белая линия). Ниже отдельно показано, как должен запитываться драйвер двигателей L298N от стороннего источника. От макетной платы можно отделить ее часть и использовать как переходник для общего минуса.
Мобильный робот 317 Рисунок 495. Наглядная схема подключения драйвера двигателей. Внизу изображения — часть беспаечной платы Для этого варианта может подойти дополнительная насадка для платы Arduino Uno. Рисунок 496. Удобная насадка для платы с макетной платой
318 Мобильный робот Рисунок 497. Провод и источник питания для драйвера двигателей Программирование Когда модули подключены, подключаем Arduino Uno к компьютеру через USB-шнур. Открываем mBlock5. Делаем следующие шаги. Рисунок 498. Выбираем устройство
Мобильный робот Рисунок 499. Выбираем Аrduino Uno и кликаем OK Перед нами предстанет весь необходимый инструментарий. Рисунок 500. Инструментарий к программированию Arduino 319
320 Мобильный робот Настроим программу на передачу данных с датчика. Для этого подключим расширение для Arduino по передаче сообщений по локальной системе. Рисунок 501. Расширение для передачи данных Такое же расширение нужно добавить к вкладке Персонаж. Рисунок 502. Расширение трансляции режима передачи данных персонажу
Мобильный робот 321 Напишем простую программу для Arduino, которая будет получать данные с датчика линии. Рисунок 503. Передача данных с порта А0 Чтобы данные отображались, необходимо, чтобы их получал персонаж. Для него напишем программу. Рисунок 504. Программа для персонажа Чтобы увидеть данные с датчика, необходимо использовать переменную. Назовем ее s. Рисунок 505. Переменная для всех персонажей Вернемся во вкладку Устройства. Завершив написание программы, нужно загрузить ее на Arduino Uno. Для этого подключи плату к компьютеру с помощью USB-шнура и выбери кнопку Подключение.
322 Мобильный робот Рисунок 506. Подключение устройства и загрузка программы После нажатия кнопки появится окно с выбором COM-порта (USB-порт). Поставь галочку, как указано на рис. 512, и выберите порт. Нажмите кнопку Подключение. Рисунок 507. Выбор порта подключения
Мобильный робот 323 Рисунок 508. Устройство подключено Осталось кликнуть по кнопке Загрузить в и дождаться компиляции. Наблюдай за работой устройства и отображением значений с датчика. Рисунок 509. Данные с датчика Рисунок 510. Датчик смотрит на белую линию
324 Мобильный робот Рисунок 511. Показания датчика при черной линии Рисунок 512. Датчик на черной линии Используя этот принцип, можно создать робота, двигающегося по линии. Ниже дан примерный вариант алгоритма. Если хотите, чтобы робот двигался долго, нужно использовать аккумулятор большей емкости именно для драйвера двигателей, так как моторы будут потреблять много электроэнергии. Движения его будут дергаными, но на ровной поверхности он будет двигаться по линии.
Мобильный робот 325 Рисунок 513. Теперь рассмотрим пример использования ультразвукового датчика расстояния. Для начала проверим правильность передачи расстояния с датчика. Для этого воспользуемся первоначальной программой, но с некоторыми изменениями.
326 Мобильный робот Рисунок 514. Программа для передачи данных с ультразвука Рисунок 515. Данные с датчика расстояния Теперь мы можем сделать программу, когда робот движется до тех пор, пока не увидит препятствие на расстоянии 30 см. Увидев препятствие, он остановится. Рисунок 516. Алгоритм движения робота с датчиком расстояния
Мобильный робот 327 Мы можем задействовать и сервопривод. Если перед датчиком будет препятствие, Аrduino даст команду раскрыть захватывающее устройство и его захват. Рисунок 517. Пример захвата устройства Данные в программе взяты на основе наших показаний. Проверь предварительно показания непосредственно со своих датчиков, чтобы скорректировать программу. Очень важна балансировка робота. Ведущие моторы с колесами можно ставить под робота — туда, где более высокая весовая нагрузка, тогда сцепление с поверхностью будет лучше. Можно использовать аккумуляторы с большей емкостью для более продолжительной работы.
Послесловие Дорогой читатель! Книга подошла к концу. В ней были представлены теория, задания и проекты по основам работы с микроконтроллерами семейства Аrduino. Надеюсь, эта информация оказалась полезной: перед тобой открылись двери в разные направления робототехники. Не останавливайся на достигнутом, развивай навыки в проектировании, программировании и разработке роботизированных устройств. Комбинируя простые устройства, можно создать более сложные; углубляясь в языки программирования, алгоритмы и математику, можно создать робота, способного выполнять самые разные действия. Роботы будущего ждут тебя!
Предметный указатель 5V, 94 G 28BYJ-48-5V, 169 GND, 94 A H analogRead, 111 HC-05, HC-06, 149 Arduino, 13 HIGH, 100 Arduino LilyPad, 14 I Arduino Mega, 13 Arduino Uno, 13 if, 120 INPUT, 100 B L Bluetooth терминал, 151 LOW, 100 D N DC моторы, 18 delay, 100 Nema 17, 171 DHT11, DHT21, DHT22, 121 digitalRead, 155 O OUTPUT, 100 digitalWrite, 100 R E RX, 150 else, 120 S else if, 120 Serial, 110 F Fritzing, 83 Serial.println, 111 SG90, 164
330 Предметный указатель T К tone, 135 Канцелярский нож, 85 TX, 150 Клеевой пистолет, 89 V VCC, 122 void loop, 100 void setup, 110 W Л Лазерный модуль, 15 Линейка, 89 М Металл, 88 write, 166 Микросхема 74HC595, 20 А Алессандро Вольта, 96 Микросхема L293D, 20 Монитор порта, 111 Аналоговый датчик, 14 Андре-Мари Ампер, 96 В Вспенённый пвх, 88 Г Георг Ом, 96 Д Н Наждачная бумага, 86 Напильник, 86 О Отвёртка, 84 П Датчик температуры и влажности воздуха, 15 Параллельное подключение цепи, 97 Деревянный брусок, 87 Паяльная станция, 89 Дисплей, 17 Пенокартон, 87 Дисплея 1602, 173 Дрель, 90 Пластик, 87 Плата для монтажа, 86 И Изоляционная лента, 91 Инструмент для снятия изоляции, 85 Последовательное подключение цепи, 95 Припой, 180 Пьезоэлемент (Зумер), 16
Предметный указатель С 331 Ф Саморез, 186 Фанера, 87 Светодиод, 17 Флюс, 180 Сервопривод (Сервомотор), 18 Соединительные провода, 84 Т Термоклей, 89 Третья рука, 91 Ц Цифровой датчик, 14 Ш Штангенциркуль, 89 У Ультразвуковой датчик расстояния, 16 Э Электроприводы (Актуаторы), 18
Все права защищены. Книга или любая ее часть не может быть скопирована, воспроизведена в электронной или механической форме, в виде фотокопии, записи в память ЭВМ, репродукции или каким-либо иным способом, а также использована в любой информационной системе без получения разрешения от издателя. Копирование, воспроизведение и иное использование книги или ее части без согласия издателя является незаконным и влечет уголовную, административную и гражданскую ответственность. Производственно-практическое издание Электроника для начинающих Корягин Андрей Владимирович УМНАЯ РОБОТОТЕХНИКА ДЛЯ НАЧИНАЮЩИХ РАЗРАБОТКА НА ARDUINO Главный редактор Р. Фасхутдинов Руководитель направления В. Обручев Ответственный редактор Л. Салихова Научный консультант В. Архипова Литературный редактор О. Кубышкина Младший редактор П. Смирнов Художественный редактор Е. Каменева Компьютерная верстка Е. Матусовская Корректоры Е. Пригородова, Е. Ерошкина Страна происхождения: Российская Федерация Шы)арушы ел: Ресей Федерациясы ООО «Издательство «Эксмо» 123308, Россия, г. Москва, ул. Зорге, д. 1, стр. 1, эт. 20, каб. 2013. Тел.: 8 (495) 411-68-86. Home page: www.eksmo.ru E-mail: info@eksmo.ru ндіруші: «Издательство «Эксмо» ЖШ" 123308, Ресей, М$скеу %аласы, Зорге к'шесі, 1-*й, 1-%+рылыс, 20 %абат, 2013-каб. Тел.: 8 (495) 411-68-86. Home page: www.eksmo.ru E-mail: info@eksmo.ru. Тауар белгісі: «Эксмо» Интернет-магазин : www.book24.ru Интернет-магазин : www.book24.kz Интернет-д+кен : www.book24.kz Импортёр в Республику Казахстан ТОО «РДЦ-Алматы». "аза%стан Республикасына импорттаушы «РДЦ-Алматы» ЖШС. Дистрибьютор и представитель по приему претензий на продукцию в Республике Казахстан: ТОО «РДЦ-Алматы» Дистрибьютор ж$не "аза%стан Республикасында 'німге шаGымдар %абылдау ж'ніндегі 'кіл: «РДЦ-Алматы» ЖШС. Алматы %., Домбровский к'ш., 3 «а», литер Б, офис 1. Тел.: 8 (727) 251-59-90/91/92. E-mail: RDC-Almaty@eksmo.kz Сведения о подтверждении соответствия издания согласно законодательству РФ о техническом регулировании можно получить на сайте Издательства «Эксмо»: www.eksmo.ru/certification Техникалы% реттеу туралы РФ заSнамасына сай басылымныS с$йкестігін растау туралы м$ліметтерді мына адрес бойынша алуGа болады: http://eksmo.ru/certification/ Произведено в Российской Федерации Ресей Федерациясында 'ндірілген СертификаттауGа жатпайды Дата изготовления / Подписано в печать 11.11.2024. Формат 70x1001/16. Печать офсетная. Усл. печ. л. 27,22. Тираж экз. Заказ 12+
Москва. ООО «Торговый Дом «Эксмо» Адрес: 123308, г. Москва, ул. Зорге, д.1, строение 1. Телефон: +7 (495) 411-50-74. E-mail: reception@eksmo-sale.ru По вопросам приобретения книг «Эксмо» зарубежными оптовыми покупателями обращаться в отдел зарубежных продаж ТД «Эксмо» E-mail: international@eksmo-sale.ru International Sales: International wholesale customers should contact Foreign Sales Department of Trading House «Eksmo» for their orders. international@eksmo-sale.ru По вопросам заказа книг корпоративным клиентам, в том числе в специальном оформлении, обращаться по тел.: +7 (495) 411-68-59, доб. 2151. E-mail: borodkin.da@eksmo.ru Оптовая торговля бумажно-беловыми и канцелярскими товарами для школы и офиса «Канц-Эксмо»: Компания «Канц-Эксмо»: 142702, Московская обл., Ленинский р-н, г. Видное-2, Белокаменное ш., д. 1, а/я 5. Тел./факс: +7 (495) 745-28-87 (многоканальный). e-mail: kanc@eksmo-sale.ru, сайт: www.kanc-eksmo.ru Филиал «Торгового Дома «Эксмо» в Нижнем Новгороде Адрес: 603094, г. Нижний Новгород, улица Карпинского, д. 29, бизнес-парк «Грин Плаза» Телефон: +7 (831) 216-15-91 (92, 93, 94). E-mail: reception@eksmonn.ru Филиал OOO «Издательство «Эксмо» в г. Санкт-Петербурге Адрес: 192029, г. Санкт-Петербург, пр. Обуховской обороны, д. 84, лит. «Е» Телефон: +7 (812) 365-46-03 / 04. E-mail: server@szko.ru Филиал ООО «Издательство «Эксмо» в г. Екатеринбурге Адрес: 620024, г. Екатеринбург, ул. Новинская, д. 2щ Телефон: +7 (343) 272-72-01 (02/03/04/05/06/08) Филиал ООО «Издательство «Эксмо» в г. Самаре Адрес: 443052, г. Самара, пр-т Кирова, д. 75/1, лит. «Е» Телефон: +7 (846) 207-55-50. E-mail: RDC-samara@mail.ru Филиал ООО «Издательство «Эксмо» в г. Ростове-на-Дону Адрес: 344023, г. Ростов-на-Дону, ул. Страны Советов, 44А Телефон: +7(863) 303-62-10. E-mail: info@rnd.eksmo.ru Филиал ООО «Издательство «Эксмо» в г. Новосибирске Адрес: 630015, г. Новосибирск, Комбинатский пер., д. 3 Телефон: +7(383) 289-91-42. E-mail: eksmo-nsk@yandex.ru Обособленное подразделение в г. Хабаровске Фактический адрес: 680000, г. Хабаровск, ул. Фрунзе, 22, оф. 703 Почтовый адрес: 680020, г. Хабаровск, А/Я 1006 Телефон: (4212) 910-120, 910-211. E-mail: eksmo-khv@mail.ru Республика Беларусь: ООО «ЭКСМО АСТ Си энд Си» Центр оптово-розничных продаж Cash&Carry в г. Минске Адрес: 220014, Республика Беларусь, г. Минск, проспект Жукова, 44, пом. 1-17, ТЦ «Outleto» Телефон: +375 17 251-40-23; +375 44 581-81-92 Режим работы: с 10.00 до 22.00. E-mail: exmoast@yandex.by Казахстан: «РДЦ Алматы» Адрес: 050039, г. Алматы, ул. Домбровского, 3А Телефон: +7 (727) 251-58-12, 251-59-90 (91,92,99). E-mail: RDC-Almaty@eksmo.kz Полный ассортимент продукции ООО «Издательство «Эксмо» можно приобрести в книжных магазинах «Читай-город» и заказать в интернет-магазине: www.chitai-gorod.ru. Телефон единой справочной службы: 8 (800) 444-8-444. Звонок по России бесплатный. Интернет-магазин ООО «Издательство «Эксмо» www.eksmo.ru Розничная продажа книг с доставкой по всему миру. Тел.: +7 (495) 745-89-14. E-mail: imarket@eksmo-sale.ru