Текст
                    В. В. Кангин

КОНТРОЛЛЕРЫ

ARDUINO

В СИСТЕМАХ АВТОМАТИЗАЦИИ,

УПРАВЛЕНИЯ И КОНТРОЛЯ.

ВВОДНЫЙ КУРС

В. В. КАНГИН КОНТРОЛЛЕРЫ ARDUINO В СИСТЕМАХ АВТОМАТИЗАЦИИ, УПРАВЛЕНИЯ И КОНТРОЛЯ ВВОДНЫЙ КУРС Ди пущено Учебно-методическим объединением вузов но образованию в области автоматизированного машиностроения (УМО АМ) в качестве учебного пособия для студентов высших учебных заведений, обучающихся но направлению «Конструкторско-технологическое обеспечение маши н ос троите л ьн ых производств» Старый Оскол тнт 2026
УДК 681.5(075) ББК 22.965n7 К19 Рецензенты: диктор технических наук, профессор С. ?/. АГору гни док гор педагогических наук, профессор И. £., Воелгрокнутов Кангин В. В. К 19 Контроллеры Arduino l системах автоматизации, управ- ления и контроля. Вводный курс: учебное пособие / В. В. Кангин. — Старый Оскол : 'ГИТ, 2026, 276 с. : ил. ISBN 978-5-94178-641-1 В учебном пособии рассмотрены вопросы проектирова- ния компьютерных систем управления, контроля, автомати- зации технологических процессов, робототехники на основе контроллеров (плат) семейства Arduino. Книга снабжена ком- пакт-диском, на котором находится используемые при про- граммировании библиотеки и почти все примеры программ. Издание предназначено для студенте и вузов, обучающих- ся по направлениям подготовки «Автоматизация технологи ческих процессов и производств & и $ Конструкторски-техно- логическое обеспечение машиностроительных производства, всех форм обучения. Будет полезно для специалистов-прак- тиков, занимающихся автоматизацией технологических про> цесеов, системной интеграцией, разработкой и эксплуатацией компьютерных систем управления. Может1 быть использовано при курсовом и дипломном проектировании студентами соот- ветст ву ю иди х Hai i ра в лен и и. LSBN 97Я-5-<М176-611 -1 УДК 681.5(975) ББК 22.965и7 i1 Кангин В. В., 2026 0 Оформление. ООО фТТТТ*, 2026
Оглавление Введение ................................... . Глава 1. КОНТРОЛЛЕРЫ СЕМЕЙСТВА ARDUINO ............. 12 1.1. Модели контроллеров Anduiпа ............... 12 1.2. Платы расширения — шилды.................. ..22 Глава 2. СРЕДА РАЗРАБОТКИ ПРОГРАММ ARDUINO IDE И ЯЗЫК ПРОГРАММИРОВАНИЯ КОНТРОЛЛЕРОВ ................. 29 2.1. Установка Arduino IDE в Windows ........ 29 2.2. Работа в среде Arduino IDE ...................31 2.3. Программирование Arduino .....................39 2.3.1. Цифровые пины .............. ....... 39 2.3.2. Аналоговые нины ................... 40 2.3.3. Широтно-импульсная модуляция ........... 40 2.3.4. Функции setupO и 1оор() ........... 41 2.3.5. Управляющие операторы ............... 42 2.3.6. Синтаксис ........................... 48 2.3.7. Комментарии ..................... 49 2.3.8. Арифметические операторы ............ 50 2.3.9. Операторы сравнения ................. 51 2.3.10. Логические операторы ....................51 2.3.11. Унарные операторы ................. 52 2.3.12. Операторы с короткий записью действий (+=,-=,*=т /=) .......................... 52 2.3.13. Типы данных ...................... 52 2.3.14. Константы ....................... 57 2.3.15. Переменные ............................ 58 2.3.16. Преобразование типов данных ........ 60 2.3.17. Функции цифрового в вода/выв од а... 61 2.3.18. Функции аналогового ввода/вывода ..... 63 2.3.19. Дополнительные функции ввода/вывода ....66 2.3.20. Функции работы со временем .......... 67
2.3.21. Математические функции ......... ........ 71 2.3.22. Тригонометрические функции................. 75 2.3.23. Генераторы случайных значений ......... 75 2.3.24. Операции с битами и байтами ......... 7 7 2.3.25. Внешние прерывания ...................... 79 2.3.26. Управление портами через регистры ATmega ...81 2.3.27. Библиотека Serial .................... 82 2.3.28. Библиотека SoItwareSerial ................ 87 Глава 3. СХЕМЫ И СИСТЕМЫ .......................... 90 3.1. Работа со светодиодами....................... 90 3.2. Работа с кнопками.................................93 3.3. Работа с потенциометром...................._......97 3.4. Управление сервоприводом............................. 100 3.5. Трехцветный светодиод........................... 103 3.6. Работа с льезоэ-ле ментом...................... 100 3.7. Работа с фоторезистором.................. 107 3.8. Работа с матричной клавиатурой ............. .,109 3.9. Датчик вибрации — модуль KY-002............. .113 3.10. Цифровой датчик холла — K.Y-003 .............. 115 3.11. Модуль с кнопкой — KY-004 ................ ..116 3.12. Инфракрасный светодиод — KY-005 ................117 3.13. Модуль с пассивным звуковым излучателем KY 006.............................................118 3.14. Лазерным модуль с длиной волны 650 нм — KY-008............................................ 120 3.15. Грехи ватный RGB модуль с ЗМ1>света диодом KY 009 .............................................121 3.16. Модуль с оптическим прерывателем — К ¥-010......122 3.1 7. Двухцветный, светодиодный модуль KY 011 .......123 3.18. Активный звуковой модуль (зуммер) — KY-012 _...124 3.19. Аналоговый температурный сенсор KY-013 ........... 125 3.20. Модуль с датчиком температуры и влажности DIIT11 — KY 015 ........................... 126 3.21. Трех цвети ый RGB светодиодный модуль KY 016................................... ..127 3.22. Датчик наклона — KY-017 .................... 129
3.23. Светочувствительный датчик на фоторезисторе — KY-018.............................................. 130 3.24. Одноканальный модуль реле KY 019.................131 3.25. Дач чин наклона KY-ОЙО...............................133 3.26. Модуль с герконом — K.Y-021... .................134 3.27. Модуль ИК-приемника KY-022 .............. .....135 3.28. Двухосевой джойстик KY 023..................... 141 3.29. Комбинированные линейный датчик Холла — KY-024........................................... 142 3.30. Модуль с герконом— KY-025................... 143 3.31. Датчик пламени инфракрасный KY-O26.............145 3.32. Дат чик нак лона со с вето ди одом К Y -0 2 7 ....146 3.33. Температурный датчик с цифровым выходом — KY-028 .............................................. 148 3.34. Модуль с двухцветным светодиодом — KY-029....... 150 3.35. Датчик удара KY-031 .......................... 151 3.36. Модуль с инфракрасным датчиком обнаружении препятствий -= KY-032.......... ...............153 3.37. ИК-модуль датчика, отслеживающего линию KY-033............................................... 154 3.38. Мигающий семицветный светодиодным модуль KY-034 ........................................... 156 3.39. Аналоговый датчик холла — К Y 035...... 15 7 3.40. Сенсорный модуль с металлическим контактом - KY-036 ................................................159 3.41, Модуль микрофона KY-037 ...................... 161 3.42. Звуковой сенсор с конденсаторным микрофоном KY-038............................................... 164 3.43. Датчик длн измерения пульса в пальце KY-039......166 3.44. Модуль с эн кодером — KY 040 ............... 167 3.45. Ультразвуковой датчик расстояния - 1IC-SR04_.....176 3.46. Шаговый двигатель 28BYJ 48 и драйвер ULN 2003 ......182 3.47. Светодиодный дисплеи 1588BS .....................196 3.48. Считыватель информации с пластиковых карт и брелоков RC522 ......................... ............202 3.49. Датчики температуры и влажности Dili111 и DIIT22 ..................................................223 3.50. Датчик уровня жидкости ........................ 229
3.51. Пассивный датчик движения................. 232 3.52. Семисегментный индикатор ................ 237 3.53. Четырёхрас рндный семисегментный индикатор ..241 3.54. Инфракрасный пульт дистанционного управления..253 3.55. Часы реального времени DS1302.......... ..260 Контрольные вопросы.......................... 263 Библиографический список .................... 275
Введение Контроллеры семейства Arduino поистине представляют собой великолепный строительный материал современных си- стем автоматизации, управления, контроля, автоматики, ин- фокоммуникаций, связи. И дело даже не в уникально низкой стоимости и широком ассортименте продаваемых комплектов контроллеров и компонентов для их расширения. Дело в том, что фактически полностью разработана и действует инфра- структура, которая позволяет быстро освоить этот аппарат- но-программный продукт и добиться требуемых результатов за минимальное время при минимальной стоимости проекта. В эту инфраструктуру входят: — широкий ассортимент контроллеров семейства Arduino и плат расширения (шилдов), в значительной степени повышающих функциональность контроллеров; — большое количество стартовых учебных наборов Arduino; — бесплатная и простая среда программирования Arduino IDE на русском языке и удобный язык программирова- ния на базе языка C++; — большое количество датчиков и исполнительных меха- низмов, которые специально созданы для платформы Arduino и легко к ней подключаются; — огромное количество описаний конкретных действую- щих проектов, примеров программирования, библио- тек, советов и рекомендаций, справочного материала, фото- и видеоматериалов, блогов по данной теме, име= ющихся в Интернете; — значительное количество учебной и справочной лите- ратуры по вопросам проектирования систем на основе контроллеров Arduino и их программирования. Всё это создаёт условия для массового использования кон- троллеров Arduino в промышленности, быту, образовании.
Возникает закономерный вопрос. Если всё есть, то зачем на- писана эта книга? К сожалению, литература по этой теме име- ет множество недостатков: — очень небольшое количество готовых разработанных примеров: — перегруженность материала зачастую ненужными под- робностями; — материал книг не адаптирован к объёмам практиче- ских занятий (2 учебных часа) и лабораторных работ (4 учебных часа); — не соблюдается принцип «от простого к сложному*. Кроме этого, в Интернете я встречал запросы на учебное пособие для высших учебных заведении с вариантами лабо- раторных работ. В учебном пособии приведены результаты построения кон- троллерных систем с более чем 50-ю подключёнными внешни- ми устройствами: датчиками (сенсорами) и исполнительными устройствами (механизмами). Все примеры проверены, отла- жены и готовы к работе. Целью данного учебного пособия является формирование у бакалавров и магистров направления подготовки $ Автома- тизация технологических процессов и производств* следую- щих компетенций: ОК-5 — способность к самоорганизации и самообразованию; ОИК-2 — способность решать стандартные задачи профес- сиональной деятельности на основе информационной и библи- ографической культуры с применением информационно-ком- муникационных технологий и с учётом основных требований информа ц ион н ой бе зопасн ости; О11К-3 — способность использовать современные инфор- мационные технологии, технику, прикладные программные средства при решении задач профессиональной деятельности; О11К-4 — способность участвовать в разработке обобщён- ных вариантов решения проблем, связанных с автоматиза- цией производств, выборе на основе анализа вариантов опти- мального прогнозирования последствий решения;
ОПК-5 — способность участвовать в разработке техниче- ской документации, связанной с профессиональной деятель- ностью; ПК-1 — способность собирать и анализировать исходные ин- формационные данные для проектирования технологических процессов изготовления продукции, средств и систем автомати- зации, контроля, технологического оснащения, диагностики, испытаний, управления процессами, жизненным циклом про- дукции и её качеством; участвовать в работах по расчёту и про- ектированию процессов изготовления продукции и указанных средств и систем с использованием современных информацион- ных технологий, методов и средств проектирования; ПК-3 — готовность применять способы рационального ис- пользования сырьевых, энергетических и других видов ре- сурсов, современные методы разработки малоотходных, энер- госберегающих и экологически чистых технологий, средства автоматизации технологических процессов и производств; ПК-5 — способность участвовать в разработке (на основе действующих стандартов и другой нормативной документа- ции) проектной и рабочей технической документации в обла- сти автоматизации технологических процессов и производств, их эксплуатационного обслуживания, управления жизнен- ным циклом продукции и её качеством, в мероприятиях по контролю соответствия разрабатываемых проектов и техни- ческой документации действующим стандартам, техническим условиям и другим нормативным документам; ПК-7 — способность участвовать в разработке проектов по автоматизации производственных и технологических процес- сов, технических средств и систем автоматизации, контроля, диагностики, испытаний, управления процессами, жизненным циклом продукции и её качеством, в. практическом освоении и совершенствовании данных процессов, средств и систем; ПК-8 — способность выполнять работы по автоматиза- ции технологических процессов и производств, их обеспече- нию средствами автоматизации и управления, готовностью использовать современные методы и средства автоматизации,
контроля,, диагностики, испытании и управления процесса- ми, жизненным циклом продукции и её качеством; ПК-9 — способность определять номенклатуру параме- тров продукции и технологических процессов её изготовле- ния, подлежащих контролю и измерению, устанавливать оптимальные нормы точности продукции, измерений и до- стоверности контроля, разрабатывать локальные поверочные схемы и выполнять проверку и отладку систем и средств ав- томатизации технологических процессов, контроля, диагно- стики, испытаний, управления процессами, жизненным ци- клом продукции и её качеством, а также их ремонт и выбор; осваивать средства обеспечения автоматизации и управления; ПК-18 — способность аккумулировать научно-техниче- скую информацию, отечественный и зарубежный опыт в об- ласти автоматизации технологических процессов и произ- водств, автоматизированного управления жизненным циклом продукции, компьютерных систем управления её качеством. Кроме этого, учебное пособие формирует у бакалавров и магистров направления подготовки ^Конструкторско-техно- логическое обеспечение машиностроительных производства следующие компетенции: ОК-5 — способность к самоорганизации и самообразованию; ОПК-2 — способность решать стандартные задачи профес- сиональной деятельности на основе информационной и библи- ографической культуры с применением информационно-ком- му ни каи ионных технологии и с учётом основных требований информационной безопасности; ОПК-З — способность использовать современные инфор- мационные технологии, прикладные программные средства при решении задач профессиональной деятельности; ОПК-5 — способность участвовать в разработке техниче- ской документации, связанной с профессиональной деятель- ностью; ПК-4 — способность участвовать в разработке проектов изделий машиностроения, средств технологического оснаще- ния, автоматизации и диагностики машиностроительных про-
изводств, технологических процессов их изготовления и мо- дернизации с учётом технологических, эксплуатационных, эстетических, экономических, управленческих параметров и использованием, современных информационных технологий и вычислительной техники, а также выбирать эти средства и проводить диагностику объектов машиностроительных произ- водств с применением необходимых методов и средств анализа; 1IK-6 — способность участвовать в организации процессов разработки и изготовления изделий машиностроительных про- изводств, средств их технологического оснащения и автомати- зации,. выборе технологий и указанных средств вычислительной техники для реализации процессов проектирования, изготов- ления , диагностирования и программных испытаний изделий: ПК 10 — способность к пополнению знаний за счёт науч- но-технической информации отечественного и зарубежного опыта по направлению исследования в области разработки, эксплуатации, автоматизации и реорганизации машиностро- ительных производств; ПК-17 — способность участвовать в организации на ма- шиностроительных производствах рабочих мест, их техниче- ского оснащения, размещения оборудования, средств автома- тизации, управления, контроля и испытаний, эффективного контроля качества материалов, технологических процессов, готовой продукции; ПК-19 — способность осваивать и применять современные методы организации и управления машиностроительными про- изводствами, выполнять работы по доводке и освоению техноло- гических процессов, средств и систем технологического оснаще- ния, автоматизации, управления, контроля, диагностики в ходе подготовки производства новой продукции, оценке их иннова- ционного потенциала, по определению соответствия выпускае- мой продукции требованиям регламентирующей документации, по стандартизации, унификации технологических процессов, средств и систем технологического оснащения, диагностики, ав- томатизации и управления выпускаемой продукцией. Удачи вам в деле освоения этой перспективной техники!
Глава 1. КОНТРОЛЛЕРЫ СЕМЕЙСТВА ARDUINO Контроллер — это вычислительное устройство, предна- значенное для управления оборудованием в реальном масшта- бе времени- Поэтому контроллеры обязательно имеют порты ввода и вывода цифровых (двоичных) и аналоговых сигналов. Arduino представляет собой одноплатный контроллер, поэто- му слово «контроллер» часто в литературе заменяется словом «плата». Получается: платя Arduino. В тексте данного издания будут встречаться и ^контрол- лер» и оплата». Речь идёт об одном и том же. 1.1. Модели контроллеров Arduino • Due — плата на базе 32-битного ARM-микропроцессора Cortex М3 ARM SAM3U4E. • Leonardo — плата на микроконтроллере ATmega32L:4. * Uno — самая популярная версия базовой платформы Arduino. • Duemilanove — плата на микроконтроллере ATmega 168 или ATmega328. • Dietimtla — версия базовой платформы Arduino USB. • Nano — компактная платформа с подключением к пер- сональному компьютеру (ПК) с помощью кабеля USB Mini-B. * Mega ADK — версия платы Mega 2560 с поддержкой ин- терфейса USB-host для связи с телефонами ня Android и дру- гими устройствами с интерфейсом USB. * Mega2560 — плата на базе микроконтроллера ATmega2560 с использованием чипа ATMega8U2 для последовательного сое- динения через I'SB-порт. * Mega — версия серии Mega ня базе микроконтроллера ATmega 1280.
• Arduino ВТ — платформа с модулем Bluetooth для беспроводной связи и программирования. • LilyPad — платформа, разработанная для переноски, мо- жет зашиваться в ткань. Fio — платформа разработана для беспроводных приме- нений. Fio содержит разъём для радио ХВее, разъём для ба- тареи LiPo и встроенную схему подзарядки. • Mini — самая маленькая платформа Arduino. • Pro — платформа, разработанная для опытных пользова- телей, может являться частью большого проекта. * Pro Mini — как и платформа Pro, разработана для опыт- ных пользователей, которым требуется низкая цена, меньшие размеры и дополнительная функциональность. Рассмотрим более подробно некоторые из этих плат. Ardut/ю Pro jfirei Arduino Pro Mini (рис. 1.1) построена на микроконтрол- лере ATmegal68. Её характеристики представлены в табли- це 1.1. Таблица 1.1 Характеристики Arduino Pro Alini Микро контрол лер ATmc|jal&8 Рабочее напряжение Й, 3 В или 5 В Входное напряжение 3,35.. Л 2 Б (модель 3+3 В) или 5-12 В (модель 5 В) Цифровые ах оды/d ы- ходы 14 (6 из пнх могут использоваться как выходы ШИМ) Аналоговые входы 6 Постоянный ток через вход/выход 40 мА Флеш-память 16 Кбайт (2 используются для загрузчика) ОЗУ 1 Кбайт EEPROM 512 байтов Тактовая частота 8 МГц (модель 3.3 В) или 16 .МГц (модель 5 В)
Рис. 1.1. Внешний вид платы Arduiito Pro Mini Arduino Pro Mini может получать питание разными способами: — через кабель FTD1; — от платы-конвертера; — от регулируемого источника питания 3,3 В или 5 В (за- висит от модели платформы) через вывод VCC; — от нерегулируемого источника через вывод RAW. Выводы питания: * RAW — для подключения нерегулируемого напряжения. • VCC — для подключения регулируемых 3,3 В или 5 В. • GXD — выводы заземления. Arduino Duemilanove (рис. 1.2) построена на одном из ми- кроконтроллеров: ATmegal68 или ATmega328. Характеристи- ки платы представлены в таблице 1.2. Таблица L2 Характеристики платы Ardiiino Duemilanove Микроконтроллер ATmegal68 или ATmega328 Рабочее напряжение 5 В Входное напряжение 7...12 В Цифровые входы/вы- ходы 14 (6 из них могут использоваться как выходы ШИМ) Аналоговые входы 6
Окончание гябл. 1.2 Постоянный ток через вход/выход 40 мА Флеш-память 16 Кбайт {ATmega 168) пли 32 Кбайт (ATmega328h при этом 2 Кбайт используются для загрузчика ОЗУ 1 Кбайт (ATmega 16-8) или 2 Кбайт (ATmega328) EEPROM 512 байтов (ATmegal68) или 1 Кбайт (ATmega323) Такт-опал частота 16 МГц Рис. 1.2. Внешний лид платы Ard пню Dutniilanuve Arduino Nano Платформа Nano (рис. 1.3) построена на микроконтрол- лере ATmega328 (Arduino Nano 3.0) или ATmegal68 (Arduino Nano 2.x) и имеет небольшие размеры. Arduino Nano может получать питание несколькими спо- собами: — через разъём USB Mini-B от ПК; — от нерегулируемого 6 ...20 В (вывод 30) источника пи- тания; — от регулируемого 5 В (вывод 27) источника питания. Автоматически выбирается источник с самым высоким напряжением. Характеристики платы Arduino Nano пред- ставлены в таблице 1.3.
Априклнеристнкм ллйты Л rd ur no Nuno Микроконтроллер ATmcgalfiB или ATniega328 Рабочее напряжение 5 В Входное напряжен нс 7...12В{6...20 В предельное) Цифровые входы/выходы 14 (6 из пик могут использоваться как выхо- ды ШИМ) Аналоговые входы в Постоянный ток через вход/вы ход 40 мА Флеш-память 1G Кбайт (ATmegalSS) млн 32 Кбайт (ATinega328), при этом 2 Кбайт используют- ся для загрузчика ОЗУ 1 Кбайт (ATmegalfiS) или 2 Кбайт (ATmcga328) ВЕРНОМ 512 байтов (ATmegalfiS) или 1 Кбайт (ATmcga328) Тактовая частота 16 МГц Постоянный ток для выво- да 3,3 В 50 мА Рис. 1.3. Внешний вид платы Arduino Nano Arduini Lily Pad Платформа Arduino LilyPad (рис. 1.4) разработана с це- лью использования в качестве части одежды. Она может быть зашита в ткань со встроенными источником питания, датчи-
ками и приводами с проводкой. Платформа построена на ми- кроконтроллере ATmegal68. Характеристики платы Arduino Lily Pad представлены в таблице 1.4. Таблица 1.4 Характеристики платы Arduino Lily Pad Микроконтроллер ATmegalSS или ATmega328 Рабочее напряжение 2,7...6.5 В Входное напряжение 2,7...5,5 В Цифровые еходы/выходы 14 (6 из них могут использоваться как выходы ШИМ) Аналоговые входы в Постоянный ток через вход/ выход 40 мА Флеш-память 16 Кбайт (АТше^я168) или 32 Кбайт (ATmega32@)i, при этом 2 Кбайт использу- ются для загрузчика ОЗУ 1 Кбайт (ATmegal68) или 2 Кбайт (ЛТте^аЗЙб) EEPROM 512 байтов (АТте^а 168) или 1 Кбайт (ЛТте₽*а328) Тактовая частота 16 МГц Рис. 1.4. Внешний вид платы Arduino LilyPad Arduino Uno Контроллер Arduino Uno (рис, 1.5) построен на микрокон- троллере ATniega328. В отличие от всех предыдущих плат? использовавших для связи с ПК через L’SB-микроконтроллер
FTDL USBT новый Arduino Uno использует микроконтроллер ATmeg'a8U2., Характеристики платы Arduino Uno представ- лены в таблице 1.5» Таблица 1.5 Характеристики платы Arduino L}n.u Микроконтроллер ATmoga328 Рабочее напряжение 5 Б Входное напряжение 7..,.12 В (6.. .20 Б предельное) Цифровые входы/выходы L4 (6 из них могут иг пользоваться как вы- ходы ШИМ) Аналоговые входы & Постоянный ток через вход/ выход 40 мА Флеш-память 32 Кбайт, при атом 0+5 Кбайт используются для загрузчика ОЗУ 2 Кбайт ЕЕPROM 1 Кбайт Тактовая частота 16 МГн Постоянный ток для выпа- да 3,3 В 50 мА Рис. 1.5. Внешний вид платы Ard ш ни Ъпо Arduino Al eg560 Arduino Mega (рис. 1.6) построена на микроконтроллере ATmega2560. Характеристики платы Arduino M.ega2560 пред- ставлены в таблице 1.6.
Таблицы 1.6 п Arditiino АГ^йЗЛбО Ми кро контроллер ATmega2560 Рабочее напряжение 5 Б Входное напряжение 7...12 В (G...20 Б предельное) Цифровые входы/выходы 54(14 нз них могут использоваться как выхо- ды ШИМ) Аналоговые входы 16 Постоянный ток через вход/выход 40 мА Флеш-память 25G Кбайт, при этом 8 Кбайт используются для загрузчика ОЗУ 8 Кбайт EEPROM 4 Кбайт Тактовая частота 16 МГц Постоянный ток для вы- вода Sh3 Б .10 мА Ри-с. 1.6. Внешиий ниц платы Arduino Mega2560 Arduino Leonardo Построен на базе микроконтроллера ATmega32U4, имеюще- го встроенную поддержку для USB-соединения (рис. 1.7). Харак- теристики платы Arduino Leonardo представлены в таблице 1.7. Таблица 1.7 Хйрикт£/Н1.етил£ь1 п/шти Агсйнпи Leonardo Микро контроллер ATmega82U4 Рабочее напряжение о В ]Ч
Входное напряжение 7...12 В (6...20 В продольное) Цифровые входы/вы- ходы 20(7 из них могут использоваться как выходы ШИМ) Аналоговые входы 12 Постоянный ток через вход/вы ход 40 мА Флвш-памятъ 32 Кбайт, при этом 4 Кбайт используются для загрузчика ОЗУ 2 Кбайт EEPROM I Кбайт Тактовая частота 16 МГц Постоянный ток для вы- вода 3,3 В 50 мА Рис. 1.7. Внешний вид платы Arduini и Leonardo Arduino Due Arduino Due (рис. 1.8) — контроллер на базе процессора Atmel SAM3X8E ARM Cortex-МЗ. Это первая плата Arduino на основе 32-битного процессора с ARM-ядром. В отличие от других плат, Arduino Due работает от 3,3 В. Максимальное напряжение, которое выдерживают входы/выходы, состав- ляет 3,3 В. Характеристики платы Arduino Due представле- ны в таблице 1.8.
.Характерыстшш1 платы Attain о Duc Ми кро контрол лер AT91SAM3X8E Рабочее напряжение 3+3 В Входное напряжение 7...12 В (6...20 В предельное) Цифровые входы/вы- ходы 54 (12 из них могут использоваться как выхо- ды ШИМ) Аналоговые входы 12 Аналоговые выходы 2 (ЦЛП) Постоянный ток через вход/выход 50 мА Флеш-паиять 512 Кбайт ОЗУ 96 Кбайт Постоянный ток для вы- вода 5 В 300 мА Тактовая частота 34 МГц Постоянный ток для вы- вода ЗкЗ В 300 мА Рис. 1.8. Внешний над платы Arduiao Due
1.2. Платы расширения — шилды Шилд (Shield) для Arduino — это вид плат расширения, которые состыкуется с Arduino как «бутерброд» (рис. 1.9). Как правило, большинство шилдов изготавливается под кон- кретный форм-фактор платы. В большинстве случаев — это микроконтроллеры Arduino Uno. Идея шилдов состоит в том, что вы покупаете отдельный модуль, который всадится» свер- ху ня ваш микроконтроллер. Можно использовать несколько шилдов одновременно, устанавливая их один на другой. Рис. 1.9. Внешний вид Proto Shield Шилды можно разделить на два типа: пассивные и актив- ные. Пассивные не несут особой смысловой нагрузки и созда- ны для удобства пользователей. Примеры пассивных шилдов приведены ниже. Sensor Shield Данный шилд предназначен для лёгкого подключения всего и вся к Arduino. Ня борту имеет колодки для подключе- ния рвдиомодуля АРС220, Bluetoo th-модул я, модуля SD кар- ты, ультразвукового модуля, RS232 С ОМ-модуля, 12Счюрта, LCD-параллельного и последовательного портов, 6 цифровых и 12 аналоговых портов с подведённым питанием и землёй, также имеется зажимная клемма для питания, светодиод 13-го пина и кнопка reset (рис. 1 ЛО).
Рис. 1Л0. Внешний вид Sensor Shield Proto Shield Представляет собой макетную плату. На неё можно при- паять необходимые для проекта детали и получить свой шилд с требуемым функционалом (рис. 1.9). Активные шилды значительно расширяют возможности Arduino. Они содержат конкретное устройство: — драйвер двигателей; — Ethernet’к онт роллер; — дисплей и т. п. со всей необходимой обвязкой для работы. В отличие от модулей, которые можно подключить к про- извольным пинам Arduino, выводы шилда в большинстве слу- чаев жёстко привязаны к выводам Arduino. Это расплата за очень простое и удобное подключение. Ес- ли свой проект вы хотите собрать в виде бутерброда из шил- дов, то необходимо заранее обратить внимание на это и про- верить, чтобы платы не задействовали одноимённые выводы. Примеры активных шилдов приведены ниже. Mofor Shield Даёт возможность подключить к Arduino разнообраз- ные моторы (рис. 1.11). Может управлять: 2 шаговых двигателя + 2 с ерв о-двигателя или 4 двигателя постоянно- го тока. Сила тока на канал 0,6 ампера и 1,2 ампера в пике, максимальное напряжение 36 вольт.
Рис. К11. Внешний нид Motor Shield Ethernet Shield Позволяет управлять контроллером Arduino через локаль- ную сеть или Интернет (рис. 1.12). Это отличный вариант, чтобы обеспечить независимость вашего проекта от вашего персонального компьютера, так как он даёт возможность на- ладить связь Arduino с Интернетом. 111илд содержит слот для MicroSD-карты. Так что если в вашем проекте обрабатывает- ся большой объём информации (mp3 файлы или видео; такие проекты, как светодиодный куб), хранить данные вы можете именно на SD-карте, Можно обеспечить работу хостинга для веб-сервера с использованием Ethernet-шилдя. Рис. 1.12. Внешний вид Ethernet Shield
LCD Keypad Shield Это плата вывода информации на текстовый 1602 дисплей. Она дополнительно оборудована кнопками (рис. 1.13). В этом LCD-шилде используется протокол передачи данных 12С, то есть для его подключения задействуются лишь 2 пина. Кроме того, па- раллельно к этим же контактам можно подключить другое обо- рудование, работающее по тому же протоколу передачи данных. На LCD-шилде ещё установлено 4 кнопки и кнопка * selects (вы- бор). Благодаря этому появляется дополнительный интерактив- ный интерфейс и нет необходимости подключения Arduino к ПК. Put:. 1.13. Внешний вид LCD Keypad Shield USB HOST Shield Позволит подключить Arduino к телефону с поддержкой Android, а также подключать различные устройства с USB-ин- терфейсом (рис. 1.14). Рис. 1.14. Внешний вид USB HOST Shield
TVano Uno shield Позволяет превратить плату Nano в Uno. Шилд имеет множество колодок для подключения, кнопку сброса и гнез- до для внешнего питания. Колодки под шилды придётся рас- паивать самостоятельно. Рис. 1.15. Внешний инд Г<апо Uno Shield 4 Relay Shield Реле — основой узел многих устройств автоматизации. Реле используются в проектах Arduino, в которых необхо- димо включение-отключение мощных электрических цепей. 4 Relay Shield содержит 4 мощных реле. Каждое реле даёт воз- можность подключать оборудование, которое работает тока- ми до 3 ампер. Energy Shield Energy shield расширяет возможности с точки зрения обеспечения питания проектов на Arduino. Шилд позволя- ет подключать различные источники питания и обеспечи- вать их работу с Arduino. Одна из самых распространённых сфер применения — обеспечение подзарядки мобильных те- лефонов и гаджетов.
SB Card Shield Во многих проектах необходимо обрабатывать большие массивы информации, для хранения которой недостаточно встроенной в Arduino памяти. Именно в этом случае может понадобится SD Card Shield. Он совместим с картами нам я- ти форматов SD, SDHC и MicroSD. Sd Card-шилд использует простой SPI-интерфейс для подключения и передачи данных. IVc-fi Shield Этот шилд предоставляет огромные возможности, позво- ляя организовать передачу данных от Arduino с использова- нием Wi-Fi-технологий, типичные примеры: дистанционное управление приводами в роботизированных проектах и пере- дача данных с датчиков и сенсоров о состоянии того или ино- го объекта в режиме реального времени. GPRS Shield GPRS Shield даёт Arduino возможность применять сети GSM/GPRS, которые используются для мобильных телефо- нов. В результате можно делать и принимать звонки и тек- стовые сообщения. Как правило, GPRS-шилды оснащаются антеннами. E-ink Shield E4nk shield — очень интересная разработка, которая ис- пользует технологию электронных чернил (та же технология используется е электронных книгах). Основное преимущество E-hik-шилда — вы получаете дисплей, который требует мини- мум энергии для питания и предоставляет отличный формат для отображения и чтения текста. Подобные шилды могут отобразить текст даже без использования внешнего питания! Music Shield Music Shield даёт возможность воспроизводить музы- ку в отличном качестве через Arduino. Шилд поддержива-
ет широкий диапазон музыкальных форматов для воспроиз- ведения. Естественно» в Music-шилде предусмотрен слот для SD-карты. Так что можно загрузить медиатеку без использо- вания дополнительного SB-шилда. Dafa Logging Shield Можно использовать как файловое хранилище и как ча- сы реального времени. Для шилда есть специальная библиоте- ка, которая помогает легировать данные на карточку памяти FAT 16 (приоритетно) и FAT32. Так же шилд имеет макетную плату на НО дырок. Комплектация не включает батарейку и карту памяти. Стоимость шилда начинается от 175 рублей. IV7-F/ модуль ESP8266 Ещё один способ передачи информации по беспроводной связи — это передача по WI-FL Для такого случая есть не- большой модуль W 1 Fl ESP8266. Характеристики: — беспроводной интерфейс: Wi-Fi 802.11 b/g/n 2»4 ГГц; — режимы: P2P (клиент), soft-АР (точка доступа); — максимальная выходная мощность: 19,5 дБ мВт (89 мВт); — номинальное напряжение: 3,3 В; — портов ввода-вывода свободного назначения: 2; — частота процессора: 80 МГц. KS485 Shield-модель интерфейса. PS-LS5 Интерфейс RS-4S5 является промышленной витой парой для соединения различных промышленных модулей. Шина работает с протоколом ModBUS RTU и ModBUS ASCII. Характеристики: — питание 5 В; — 16 цифровой порт ввода-вывода (в том числе интер- фейс I2C); — 6 аналоговых I/O портов: — переключатель в режим программирования;
— автоматический / ручной переключатель режима тран- сивера; — стандартный интерфейс RS485, мини-интерфейс RS185 (РН2.0) и выводы RS485. Количество плат расширения (шилдов) постоянно растёт. Ознакомиться с их списком можно на официальном сайте про- екта Arduino по адресу http://playground.arduino.cc/Main' SimilarBoardstfgoShie. Имеется также и ещё один ресурс: http://shieldlist.org/, где представлено описание 244 шилдов для Arduino. Глава 2. СРЕДА РАЗРАБОТКИ ПРОГРАММ ARDUINO IDE И ЯЗЫК ПРОГРАММИРОВАНИЯ КОНТРОЛЛЕРОВ 2Л. Установка Arduino IDE в Windows Разработка программ (скетчей) для контроллеров Arduino выполняется в официальной бесплатной среде программиро- вания Arduino IDE. Среда предназначена для написания, ком- пиляции и загрузки скетчей в память контроллера. Программирование выполняется ня языке Processing/ Wiring . Это, по сути, обычный C++, дополненный простыми и понятными функциями для управления в вод ом /вы в одам на контактах (пинах) контроллера. Существуют версии среды для операционных систем Windows, Mac OS и Linux. Послед- нюю версию среды можно скачать со страницы загрузки офи- циального сайта http://arduino.cc/en/Main/Software. Итак, установка Arduino IDE в Windows. 1. Отправляемся на страницу http://arduino.cc/en/Main/ Software (рис. 2.1). Выбираем версию для операционной системы Windows и скачиваем архивный файл. Он занимает чуть более 80 Мбайт и содержит все необходимое, в том числе и драйверы.
- In»1, т ARDUINO IE. 4 |*t bXfl-MUFH AhJjTO Sfllpwe I]DE|mjlH n«fl HI ATT I mS J'J НГ1ЭД1 n i z IIh t-слг:1 h rjn<41 Щ№к4Н.МкСХ-КвгоЬ«ш Ччел^эггнгчн ft'Cifi > |№й M’d Di’i-d Oil ый JCW ЙИП- ШГГЛ м+гл III Tie whww tin w wed wnh inf arrtupo bawd Wil Ю Itri C.rCli 4 Е-ГлГСтА Ий Jib*l ru’diiiri. ^ярц[4Г. E^ 1ч ДРЕ LhSI L-rmlE лдд1!г~чг- i n ft - Рис. 2.1. Страница http://arduine.ee/en/Main/Software По окончании загрузки распаковываем скачанный файл в удобное место на своём ПК (рис. 2.2). ф - LJ * IkibJJ-'ic. b i-Hb.rf-4j4rt " E^lni/h id u-^--jjJ Шш Н«Мй IUAU | »J- 4 Krtpibri» ' *** " J| Ьфдо 4 ийыО1 и; ЛИЛИ? 11И! Па ^нцдаиси™ > „г гмптолюм ги I" t-1 It Г 1 4 П- | 1 1 L Ьпа. П1ГГ ТПЛТЛ Т1 П. В Рис. 2.2. Папка arduino-1.К.2 дли размещения среды Arduino IDE 2. Теперь необходимо установить драйверы. Подключа- ем плату Arduino к компьютеру. На контроллере должен за- гореться индикатор питания — зелёный светодиод. Windows начинает попытку установки драйвера, которая заканчива- ется сообщением Программное обеспечение драйвера не бы- ло установлено, 3, Открываем Диспетчер устройств. В составе устройств находим значок Arduino Uno. Устройство отмечено воск ли-
цательным знаком. Щёлкаем правой кнопкой мыши на знач- ке Arduino Uno и в открывшемся окне выбираем пункт Обно- вить драйверы и далее пункт Выполнить поиск драйверов на этом компьютере. Указываем путь к драйверу. Это папка на вашем ПК, куда распаковывали скачанный архив. Пусть это будет папка D: arduino-1.8.2. Игнорируем все предупрежде- ния Windows и получаем в результате сообщение Обновление программного обеспечения для данного устройства успеш- но завершено. Впрочем, всё может произойти не так гладко. Мне, напри- мер, понадобилось скачать и запустить на своём ИК програм- му СИ 341SER.EXE. Только после этого мой ноутбук <прозрел и увидел'о плату Arduino. Если установка сразу не пошла, то потребуется часа полтора метаний по блогам и сайтам с реко- мендациями. Хорошо освежает. 2.2. Работа в среде Arduino IDE Содержимое папки D: .arduino-1.8.2, содержащей среду программирования Arduino IDE и ваши скетчи, будет при- мерно таким, как на рисунке 2.3. В папке examples (рис. 2.4) хранятся ^фирменные? примеры скетчей с комментариями на английском языке. В папке libraries (рис. 2.5) хранятся библиотеки, подключаемые при необходимости к программ- ному коду ваших скетчей. Некоторые библиотеки отсутству- ют, поэтому вам самостоятельно придётся скачивать их и по- мещать в эту папку. Ну и наконец — файл arduino.exe. При его исполнении запускается среда Arduino IDE.. Она состоит из следующих элементов (рис. 2.6): — редактора программного кода; — области сообщений; — окна вывода текста; — панели инструментов с кнопками часто используемых команд; — меню.
«Th* /IqfiepHih G 9 Общий дрггуп ’ Jfinwc.ytf* на зггти1.кекмй диск Нпвдя патина fH№ * Ими Д^а изменения * S ККГ ardunul?7_ER 1ЙД4.3И7 1050 эим икта driwrs 22.012017 13 31 шй стал Jl «х wioimm examples 22j032tn T 11I12 7ГГ&Г 4 hardware 22D13M7 1112 э jjIVfl Z2WW 13:35 .<йЦТЫ lib 22JCB.2fll7 1132 рвения libraries 151082017 11!D3 Bbitiept're файл дон ЦЛ njfercfltx 27012017 13:JJ i tools 22012017 13:12 IHRH группа tools builder 22О12Й1? 13:31 0 arduliKXBoe П01Й017 13:32 ЮТВр nrriuiiKKl*i.iw 22012017 НИ м IC:) 0 nrduino_drtxjpc4c 220120171132 < (DO arduinc.'Mtxjg.^p-ni 2201201? 13:32 И{£) .J и f II bJ. i- Элементов: 21 Рис. 2.3. Содержимое папки ardninu-l.S.2 после раепакоькк ь Ксмпы&тер > WOft ’P>j и агсЫпо-иа2 ► екапчй5 ► * | Li/Tb - Добввитъ в бибднле*у ' ОЬшиД лостур ~ Эаг^сптг.. Lia опти*чский диск Нсяая пегаса данное S^MA Дате KatenewiR Тиг РУ5КЛ OLBasIcs 22.MJD17 13-31 "ai 1Л5ННГ мгггя (Plb^ital 2J.aa.2D17 112? Лл зВДИЙ СТОН Г11Дги1иу ?afl3.wi7m? Лл ), OJXofrenuniGfrltcm 2-Э.-ПЗ 2017 Ш? Ген ьаотеш OlContral 22.ЙЗЖ7 Ш? *Tai ObSerTMrs Z3.332D17 133? "lai сумгнгы 07 Display 27.DL2D17 1137 Ttai абрамсмий (JtSlnng> п.взжпш? TLai Выберите файл доп зыка u о&ия 22.P.3L2O17 IB? Ofll 10 SbirtorKi* 22.<Н2И7Ш2 Пд| эыния Проппа . 11 AndhjinolSf1 22.032017 Hi? Rai ЧьюГер Рис. 2.4. Содержимое лапки examples
ь ’ Добавить в библиотеку * Общий дис гртр ’ Загвдсдть мл омический ди-..к Новая г ice к*1 AzcelStepper <г1- "tA~d ^JarruiLCirciKtPiaygFOurd сто- ± Bridge Encoder ге*и EspSora i Elterrtfft -м™ Eirmata Лапа изыеменид Тип, Д. 26.052017 9:41 Папка DB 11.2016 0:52 ГТв<На । 2S 08.2015 17:20 Папщ 2105.2017 9.10 Папка 20.062015 17:10 Паппа ZZ.O“1201713:32 Плпка 19.032017 U47 ГЕаЛкв . (Зул 0 i larciulinc-jJi-iT iarduinOjRTC 1пя группа IRremote i Keyboard |T*P Keypad 1 LiquidCrystaE LiqiidCiyrtaEJ2t 1- (&J у Моще 5W-M17 12:12 Папка - 20Л7.Й1713:2Э 2СО7.2«1718:29 Па^га 26СН2Э1710:К Папка OaiBJOlfi 17X35 Палка 10:11 Палка 22.0320171332 Папка 23Л7 JO17 13.00 Папка ОаДЗЖО 17ХМ Палка i rfitf-msster k rf id maJLerl RcbdljComrcii Rrw'JRrerrcHe SD I Servo < _ irr 1W.2O1712:26 Папка 14Л72Й17 1232 Папка 1ЬХШЙ17103» Папка 10.06.201515Я» Пдлхд 1006201515:00 Папка 0501201713:00 Папка 20032017 17:42 Папка * к Рис. 2.5. СйД'ЁржимО'Ё папки libraries Программа, написанная в среде Arduino, носит назва- ние скетч. Скетч пишется в текстовом редакторе, который имеет цветовую подсветку создаваемого программного ко- да (рис. 2.6). Во время сохранения и компиляции проекта в области сообщений появляются пояснения и информа- ция об ошибках {рис. 2.6). Окно вывода текста показыва- ет сообщения, включающие полные отчёты об ошибках и другую информацию (рис. 2.6). В примере, показанном на рисунке Й.6, специально сделана ошибка {не подключена
к ПК плата Arduino) для того, чтобы была понятна роль области сообщений. Редактор программного кода Редактор программного кода занимает центральную часть (рис. 2.6) среды подготовки скетчей. Здесь записывается скетч на языке С4-+. Ilncludb ^иг#л1г»_ВТС. tu 1<ггЬ1па_№: Lt^BK_MiSfij,a,?rBj; 712'1 d BtCVDlb г dtlijtMDk tavtaCNMO I raid Irnypil t if йчИи | fl LiiM— 0) ft tc."ui проаы i «куши I Serkil-prlbEln [tin .ij*cclw ГH:i:kr ?/ влиин врыл /7 npSKTjnje ВЛИПНЕМ Н*ч 1 НС, ттэб К BdEZUDfTb грТНД W^3tMbPU] ff 3MLr * lie: d±14^UI г 1 Г^авПчн-J 1н1гтт»||* Г*ЧТ( r^WJUfr Ч-HiftriFf FdUf^.taW£41a4ff>-0Jtte4h0afc40Upl0M Рис. 2.6. Текстовый редактор пршрашшиги
A’ho jiku панели инструментов Это кнопки быстрого доступа. Они (рис. 2.7) позволяют (слева направо): — проверить скетч на правильность, — записать скетч в плату Arduino, — создать новый скетч, — открыть новый скетч, — сохранить готовый скетч, — открыть монитор порта. I >О EIE3Q Рис. 2.7. Кнопки быстрого доступа Область сообщений Сюда выводятся все сообщения, связанные с компиляци- ей и загрузкой скетча в плату (рис. 2.8). Brtsj, firjN // *MI // птФикт-анкализвеи нч 1 J*r, срезп ччсзс // раз за 1нс ЬйильНкапипь Lia, к> fJCiki-i Рис. 2.8. Область сообщений Леню Содержит пять разделов, которые выполняют все не- обходимые действия с проектом. Команды меню разделов Файл, Правка и Скетч приведены на рисунке 2.9. Коман^ ды меню разделов Инструменты и Помощь приведены на рисунке 2.10.
Рис. 2.9. Меню разделив Файл, Пранка и Скетч Рис. 2.10. Меню разделов Инструменты и Пи мощь Монитор порта Представляет собой окно (рис. 2.11), в которое обычно выво- дятся результаты работы скетча. Окно можно вызвать через ме- ню Инструменты | Монитор порта или щелчком по крайней пра- вой кнопке панели инструментов- В языке программирования имеются необходимые операторы для работы с монитором порта. Рис. 2.11. Монитор порта
Библиотеки Библиотеки в значительной степени упрощают разработку скетчей. Действительно, зачем изобретать колесо? Ведь много программного кода написано до вас. Наиболее значимые, тру- доёмкие и логически законченные программные коды оформ- лены в виде функций, которые хранятся в библиотеках. Хо- рошо программировать — это не только писать правильные скетчи, но и умело пользоваться функциями из библиотек. Каждый может написать свою библиотеку и применять её множество раз в различных скетчах. Таким образом, библио- тека представляет собой специальным образом оформленный программный код, реализующий некоторый функционал, ко- торый можно * подключить & к создаваемому проекту и поль- зоваться им, не вникая в его подробности. Специализирован- ных библиотек существует множество. Среда Arduino IDE поставляется с набором стандартных библиотек: Serial, ЕEI5КОМ, SPI, Wire и др. Они находятся в подкаталоге libraries каталога установки Arduino. Необхо- димые библиотеки могут быть также загружены с различных ресурсов. Папка библиотеки копируется в каталог стандарт- ных библиотек libraries. Внутри каталога с именем библиоте- ки находятся файлы *.срр, *.h. Многие библиотеки снабжа- ются примерами, расположенными в папке examples. Если библиотека установлена правильно, то она появляет- ся е меню Скетч Подключить библиотеку (рис. 2.12}. Выбор библиотеки в меню приведёт к добавлении в исход- ный код строчки: # include <имя библиотеки. h>. Эти директива подключает заголовочный файл с описани- ем объектов, функций и констант библиотеки, которые теперь могут быть использованы н проекте. Среда Arduino будет ком- пилировать создаваемый проект вместе с указанной библи- отекой. Перед загрузкой скетча требуется задать необходи- мые параметры в меню Инструменты Плата (Tools I Board), как показано на рисунке 2.13, и Инструменты | Порт (Tools | Port) (рис. 2.14).
Рис. 2.12. При см игр подключённые библиотек Jtd-иш Itn • *Г"1 AjJ.-'j hkflidKM a №J»i±a Лпкск* Ч.н1 n:-pia LQl.Vrfli-M П^ТТГР n-r. r.i hj-.^ii wiji cjainrii ug nrii-3«i-i L WVrU>] Гни —i llrfwi /r4t*u^n|nl №g.F rr Ui-цл ;'/fl 4'2 -v. I4e$a ARC fc'jLlf Асаиле-1juomilc LF11 Art.VqVjfnj JX1 hAfJWI AXIHiFHfCij ls₽1 И+>.<IHMLHU U UUli' ferrtjTifpwir#l JLrt-nj "Л Wd Aldrf.] А**» *л wl A'JwH'fjjh'lhWj Aitir^Ginini mi Ни TK. мвЛп.и- LkrpeJ ЫiliLil rjn-jtr №h^vtri4-n Jtairo hhMTHl Iftl IlijHJJ .L'p 1Ш II Ifl IV Chiu DMtHJ CUT1 iKlfTiHVL 1№раышм1 ‘JfrftbF nt » k*ij>L", л ailti 1 Рис,. 2.13. Указание используемой платы Arduino
Рис. 2.14. Указание порта ПК, к к ото рил: у подключена плата Arduino Современные платформы Arduino перезагружаются авто- матически перед загрузкой. На старых платформах необхо- димо нажать кнопку перезагрузки. На большинстве плат во время процесса загрузки будут мигать светодиоды КХ и ГХ. 2.3. Программирование Arduino 2.3.1. Цифровые пины Цифровые пины платы Arduino могут работать как на ввод, так II на вывод цифровой информации. Для этого достаточно их программно сконфигурировать соответствующим образом. В плате Arduino Uno таких пинов 11. Их номера от 0 до 13. Кроме этого» имеющиеся б аналоговых пинов могут быть сконфигурированы под ввод/вывод цифровой информации. Исходно цифровые пины Arduino настроены на ввод и на- ходятся в высокоимпедансном состоянии. Это означает, что пин ввода даёт очень малую нагрузку на схему, к которой он подключён. Если к пину ничего не подключено, то на него наводятся электрические помехи. В этом случае рекомендуется задать
пину определённое состояние. Это делается добавлением под* тягивающих резисторов 10 кОм, подключающих пин либо к питанию 4-5 В. либо к земле. Микроконтроллер ATmega, например, имеет программи- руемые встроенные подтягивающие резисторы 20 кОм. Про- граммирование данных резисторов осуществляется так: prnMode (pin, INPUT) // настроить пин на ввод digital Write (pin, HIGH) //включить подтягивающий резистор. Пины, сконфигурированные на вывод, находятся в низ- коимпедансном состоянии. Данные выводы могут пропускать через себя достаточно большой ток. Например, выводы Arduino ATmega могут быть источни- ком тока до 40 мА. Однако такого значения тока недостаточ- но для большинства реле, соленоидов и двигателей. Короткие замыкания выводов Arduino или попытки под- ключить энергоёмкие устройства могут повредить выходные транзисторы канала или весь контроллер. 2.3.2. Аналоговые /шны Входной аналоговый сигнал с помощью аналого-цифро- вого преобразователя (АЦП) преобразуется в 10-разрядный цифровой код, что позволяет получать целые значения от 0 до 1023. Для Arduino Uno аналоговые пины обозначаются как АО...Аб. Аналоговые пины могут использоваться как цифро- вые пины ввода/вывода. Пример: pinMode(AO,OUTPUT); //настроить пин АО на вывод digitalWrite(AO, HIGH); //вывести сигнал высокого уровня - 1. 2.3.3. Широлпно-илшульенля люЗг/ляция Большинство плат Arduino не имеет возможности выво- дить аналоговые сигналы. Для этой цели можно использо- вать цифровые пины, выводя на них импульсы с раз личной скважностью — широтно-импульсная модуляция (ШИМ) (рис. 2.15). Далее, конечно, эти импульсы должны поступать на интегрирующие устройства, которые производят усредне-
ние выходных импульсных сигналов и формируют аналого- вый сигнал. Простейшим интегрирующим устройством явля- ется интегрирующая КС-цепочка. Таким образом, для вывода различных аналого- вых напряжений необходимо изменять ширину импуль- са на цифровом пине. Это реализуется вызовом функции analogWrite(x). Здесь х — целое число в диапазоне 0...255. Число О соответствует (J В выходного напряжения, число 127-2,5 В выходного напряжения, а число 255-5 В выход- ного напряжения. 2.3.4. Функции setup() и loopf) Структура скетча состоит по меньшей мере из двух обя- зательных частей: функций setupO и 1оор(). Перед функци- ей setup() идёт объявление переменных, подключение би- блиотек.
Функция setup( ) Выполняет подготовительные действия и запускается один раз после каждого включения питания или сброса пла- ты Arduino. Она используется для инициализации перемен- ных, установки режимов работы пинов и прочих подготови- тельных действий для основной функции 1оор(). Эта функция обязательно должна быть включена в скетч, даже если не вы- полняет никаких действий. Функция 1оор( ) Является основной функцией скетча. Выполняется цикли- чески и последовательно исполняет команды* которые описа- ны в её теле. Эта функция выполняется основную работу. Пример простейшей программы: void sctup() { Serial.begin (9600); } void loop() { Serial.prlntln(mills()); delay (1000); } 2.3.5. Л Управляющие операторы Оператор if (условие) и операторы сравнения =“=, Л-* < . > Оператор if используется в. сочетании с операторами срав- нения. Он проверяет* достигнута ли истинность условия, за- писанного в круглых скобках. Пример записи оператора if: if (sv > 12) { операторы } Здесь значение переменной sv сравнивается с числом 12. Если sv > 12, то выполняются операторы в фигурных скоб- ках. В противном случае они выполнены не будут. В опсра-
торе if могут использоваться следующие операторы срав- нения: • х *== у (х равно у); * х ! у (х не равно у); • х < у (х меньше у); * х > у (х больше у); • х <— у (х меньше или равно у); • х >—у (х больше или равно у). Оператор if...else Конструкция if.*.else предоставляет большие возможно- сти, чем базовый оператор if. Она позволяет сделать выбор * либо., .либо*. Синтаксис: if (условие) Операторы 1 } else < Операторы 2 Если условие в скобках истинно, то выполняются Опера- торы 1. В противном случае выполняются Операторы 2. Пример: if (pin 13== HIGH) { Funl(); } else { Fun2(); } Конструкция if ...else позволяет произвести проверку мно- жества условий. Для этого после else нужно поставить другой оператор — if...else и т. д.
Пример: if (pinAnaloglnput < 100) { Funl (); > else iff pinAnaloglnput >= 150) { Fun2(); } else { Fun3{); } Другой способ создания переходов со взаимоисключаю- щими проверками использует оператора switch...case. Оператор suritch...case Конструкция switch., .case позволяет реализовать один из нескольких вариантов программных кодов, которые будет вы- полняться при разных условиях. Синтаксис: switch (var) { case label 1: операторы 1 break; case label 2: операторы 2 break; case label n: операторы n break; default: операторы n+1 break; }
Оператор switch...case сравнивает значение переменной var со значениями label 1...label и. Выполнится та группа опе- раторов, для которых выполнится равенство var = label к. Ес- ли var не равна ни одному из выражений label, то будут вы- полняться операторы п+1 после служебного слова default. Оператор цикла for Оператор for используется для повторения блока операто- ров, заключённых в фигурные скобки. Синтаксис: for (ИСЦ; УПЦ; ИЗСЦ) { операторы, выполняющиеся в цикле (тело цикла) } Здесь: ИСЦ — инициализация счётчика цикла, УПЦ — условие продолжения цикла, ИЗСЦ — изменение счётчика цикла. ИСЦ выполняется самой первой и один раз. В ней зада- ётся и получает начальное значение переменная — счётчик цикла. У11Ц проверяется на истинность в каждом цикле. Если оно истинно, то выполняется следующий цикл. В противном случае цикл заканчивается. ИЗСЦ — в каждом цикле счётчик цикла модифицирует- ся — изменяется. Обычно он инкрементируется — увеличи- вается на 1. Важно, что бы цикл не превратился в * вечный цикл*, т. е. никогда не оканчивающийся. Поэтому важно тщательно про- верять выбор параметров оператора цикла. Пример: // постепенное зажигание светодиода int PWMpin - 10; // свеггодиод последовательно с R=47u Ом на 10 пине void setup() {;}
void loop (J { for (int i=0; i <= 255; i++) { analogwrite (PWMpin, i); delay (10) ; } } Здесь с интервалом в 10 миллисекунд на пин 10, к кото- рому подключён светодиод, выводится напряжение в диапа- зоне от 0 В до 5 В. Оператор цикла while Синтаксис: while(ycnOBwe) { Операторы — тело цикла } Операторы в теле цикла будут выполняться, пока усло- вие в круглых скобках истинно. Цикл заканчивается, когда условие станет ложным. Возможно появление «вечного цик- ла*. Поэтому в теле цикла должны быть операторы, влияю- щие на значение условия. Пример: var i=0; whilc(i< 00) { операторы i + + ; } Оператор цикла do....while Цикл do...while работает так же, как и цикл while, за ис- ключением того, что условие проверяется в конце цикла. Та ким обратом, цикл do...while будет всегда выполняться хотя бы один раз.
Синтаксис: do < Операторы — тело цикла } while( условие); Пример: i=0; do { delay (50); i++ } while (i < 100); Оператор break Оператор break используется дли принудительного выхода из циклов for, while, do...while, не дожидаясь завершения цикла по условию. Он также используется для выхода из оператора switch. Пример: for (х = 0; х < 255; х ++) { if (х > 123} { х = 0; break; } delay( 50); } Опер « т ар con t i п ие Оператор continue пропускает операторы, расположенные после него, в текущем шаге цикла и сразу выполняется пере- ход к следующему шагу (итерации) цикла. Пример: for (х =0; х < 255; х + + } { if (х > 40 && х < 120)
{ continue; digjta1Writc(pinlOr x); delay(50); } Оператор return Оператор return прекращает вычисления в данной функ- ции и, если это нужно, возвращает значение из прерванной функции в вызывающую.. Пример: int checkSensor() { if (analogRead(AO) > 200) return 1; else < return 0; } } Функция checkSensort) возвращает значение 1, если зна- чение на аналоговом входе AU больше 200, и 0 — в против- ном случае. 2.3.6. Синтаксис Точка с запятой- Используется для обозначения конца оператора. Пример: int а = 13; Фигурные скобки Фигурные скобки { } — важный элемент языка програм- мирования C++. Открывающая скобка [ должна всегда со- провождаться закрывающей скобкой — парность фигурных скобок.
Основные способы использования фигурных скобок: * в функциях void название функции (тип аргумента) < оператор (ы) }; * в циклях — while (логическое выражение) { оператор(ы) }; — da { опсратор(ы) }; while (логическое выражение); — fur (инициализация; условие окончания цикла; приращения цикла) { оператор(ы) }; • в условных операторах if (логическое выражение) { оператор(ы) }; 2.3.7- КолллЕентармн. Комментарии — это строки в скетче, которые используют- ся для информирования о том, как работает программа. Они иг- норируются компилятором и не занимают место в памяти кон^ троллера. Имеются два способа поместить строку комментария: — однострочный комментарий идёт после двойного сле- ша: // это комментарий — много строчный комментарий : /* это многострочный комментарий*/ . Пример: х = 5; // это однострочный комментарий; работает только до // конца строки
/* это многострочный комментарий; часто используется для скрытия целых кусков кода */ 2.3.8. Арифметические операторы Оператор присваивания — Присваивает переменной слева от оператора значение пе- ременной или выражения, находящееся справа. Примеры: int sensVal; // объявление переменной типа integer senVal=analagRead(O) ; // присваивание переменной sensVal // значение, считанное с аналогового входа О,. Переменная слева от оператора присваивания = должна быть способна сохранить присваиваемое значение., Если оно выходит за диапазон допустимых значений, то сохранённое значение будет неверно. Необходимо различать оператор при- сваивания в и оператор сравнения == (двойной знак равен- ства}, который осуществляет проверку на равенство. Операторы сложения. вычитания. умножения. деления (+. ; Операторы +, * и / возвращают результат выполнения арифметических действий над двумя операндами (числами). Воз- вращаемый результат будет зависеть от типа операндов, напри- мер 9/4 возвратит 2, т. к,, операнды S и 4 имеют тип int. Также следует следить за тем., чтобы результат не вышел за диапазон до- пустимых значений для используемого типа данных. Так, сложе- ние 1 с переменной а - 32 767 типа int возвратит -32 768. Если операнды имеют разные типы, то для вычислений будет исполь- зован тип с более а широким* диапазоном. Если один из операн- дов имеет тип float или double, то для вычислений будет исполь- зована арифметика «с плавающей запятой*. Оператор остаток от деления целого числа на целое число (%) Возвращает остаток от деления одного целого (int) операн- да на другой» Нельзя применить к типу float.
Примеры: х = 9 % 5; // х имеет значение 4 х = 5 % 5; // х имеет значение 0. 2.3.9. Операторы сравнения х == у (х равно у); х Е= у (х не равно у); х < у (х меньше у): х > у (х больше у); х <- у (х меньше или равно у); х >= у (х больше или равно у). 2.3.10. Логические операторы Логические операторы чаще всего используются в уело- виях оператора if. Оператор алогическое И» (&&) Результат истинен, если оба операнда истинны (true}. Пример: if (digitalRead(2) == HIGH && digitalRead(3) == LOW) { Serial. println( «ok»); Оператор алогическое ИЛИ» ( Результат истинен, если хотя бы один операнд истинен. Пример: if (digitalRcad(2) --LOW || digitalRead(3>-HIGH) { Serial, printin ("ok"); Опер a m op * л оги ч еское о три и а н ие » (!) Результат истиненf если операнд falset и наоборот. Пример: if ((digitalRead(2>= HIGH)) { Serial.printin ("uk1": ; }
2.3.11. .Унарные операторы Унарные операторы работают только с одним операндом. Операторы увеличения значения ( 4—h ) Х+4-; увеличивает значение х на единицу и возвращает старое значение х; ++х; увеличивает значение х на единицу и возвращает но- вое значение х. Операторы уменьшения значения (-) х--; уменьшает значение х на единицу и возвращает ста- рое значение х; —х; уменьшает значение х на единицу и возвращает но- вое значение х. 2.3.12. Операторы с короткой записью действий (+=, —. *- м Реализуют короткий способ записи арифметических дей- ствий над переменной и одним операндом. х + = у; эквивалент записи х = х + у; х - = у; эквивалент записи х = х - у; х * = у; эквивалент записи х = х + у; х / = у; эквивалент записи х = х / у. 2.3.13. Типы данных В C-F+ имеются следующие типы данных: boolean; un- signed long; char; float; byte; double; mt; string; unsigned int; long; array (массив); void. boolean Логический (булевый) тип данных. Может принимать од- но из двух значений: true (истина) или false (ложь). Данные типа boolean занимают в памяти один байт. char Переменная типа char занимает 1 байт памяти и может хранить один алфавитно-цифровой символ (литеру). При
объявлении литеры используются одиночные кавычки: 'А'. Символ хранится в памяти как число, соответствующее коду символа в таблице кодировки символов ASCII. Поэтому над символами можно производить арифметические действия Х='А' + 2; //х будет равно 67т т. к. ASCll-код для СА’ // равен 65. Коды символов лежат в диапазоне от -128 до 127. Пример: char simv='A'; char simv = 65; // варианты эквивалентны. byte Хранит 8-битовое числовое значение без десятичной точ- ки. Имеет диапазон от 0 до 255. Пример: byte s=123; //объявление переменной s, имеющей тип byte. int Тип данных int — один из наиболее часто используемых типов данных для хранения чисел. Данные этого типа зани- мают 2 байта памяти и могут принимать значения от -32 768 до 32 767. Когда переменная типа int, вследствие арифмети- ческой операции, достигает своего максимального значения, она «перескакиваете на минимальное значение, и наоборот (см. пример). Пример: int х; х= - 32768; х = х - 1; // х равен 32767 х = 32 767; х = х + 1; // х равен -32768. unsigned int Тип данных unsigned int — это беззнаковое целое число. Оно занимает в памяти 2 байта. Данные этого типа лежат в ди- апазоне от 0 до 65 535.
Когда переменная типа unsigned int вследствие арифме- тической операции превышает своё максимальное значение, то она « перескакивает а на минимальное значение, и наобо- рот (см. пример). Пример: unsigned int х; х = 0; х = х - 1; // х равен 65535 х = х + 1; //х равен 0. long Тип данных long используется для представления целых чи- сел в расширенном диапазоне от -2 147 483 648 до 2 147 483 647 . Данные этого типа занимают 4 байта в памяти. Пример: long varl2 = -178002. unsigned tong Тип данных unsigned long используется для представления положительных целых чисел в диапазоне от 0 до 4 Й94 967 295 и занимает 32 бита (4 байта) в памяти. Пример: // вывод в миллисекундах (мс) времени с начала выпол- //нения скетча void 1оор() { Serial.print ("Time: ") ; time = millis (}; Seda l.printLn (time); function2(); } float Тип данных float служит для хранения чисел с плаваю- щей запятой. Этот тип очень часто используется для операций с данными, принимаемыми с аналоговых входов. Диапазон значений — от -3,40Й8235Е+38 до 3 Д028235Е+38. Перемен-
ная типа float занимает 32 бита (4 байта) в памяти. Для уве- личения точности используют тип double, но на платформе Arduino double и float имеют одинаковую точность» double Тип данных double, в отличие от большинства языков про- граммирования, имеет ту же точность, что и тип float, зани- мая 4 байта памяти.. Тип double поддерживается в Arduino для совместимости кода с другими платформами. string Этот тип определяет текстовые строки. Текстовые строки в Arduino объявляются как массив (array) символов (char), оканчивающийся символом «конец строки». Возможны сле- дующие варианты объявления текстовых строк: — объявить массив символов без присваивания значений; — объявить массив символов и присвоить значения всем элементам, кроме последнего; компилятор автоматиче- ски добавит символ конца строки; — явно объявить завершающий символ; — инициализировать массив строковой константой в двой- ных кавычках; компилятор автоматически задаст тре- буемый размер массива, равный количеству символов плюс завершающий символ конца строки; — инициализировать массив с явным заданием размера и присвоением строковой константы; — инициализировать массив с явным заданием дополни- тельного размера (с запасом), превышающего размер строковой константы при начальном присвоении» Примеры объявления строк: char Strl(15); char Str2[8] = fa; У, 'd; T, 'n', 'o'}; char str3[8] = {'а', Г, 'drf V, Tr Jn\ Jo'r char Str4[ ] = ftrarduino,,r; char Str5[8] = "arduino"; char Str6[l5] - "arduino"
Обычно строки оканчиваются нулевым символом (код О в ASCII). Это позволяет функциям, таким как Serial.print (), выявлять окончание строки» В противном случае могут счи- таться байты памяти, не принадлежащие переменной. Массив символов, выделяемый под строку, должен иметь одни дополнительный элемент для символа конца строки. Если объявить строку без символа окончания строки, то это приведёт к некорректной работе функций, оперирующих строками. Строки всегда объявляются внутри двойных ка- вычек (яАЬс^). При работе с большими объёмами текстовой информации удобно использовать массивы строк. Гак как строки сами по себе массивы, массив, строк будет двумерным массивом. В примере, приведённом ниже, символ звёздочки по- сле объявления типа char* указывает на то, что это мас- сив указателей. Это необходимо дня задания двумерного массива. Пример: char* nip[ |={"string "string 2*, "string "string 4", "string "string 6"}; void setup () { Serial.begin ^9600); } void loop () { for int i = 0; i < 6; I++) { Serial.printin (nipFil); delay (500); } } Массивы Массивы (array) — именованный набор однотипных пере- менных с возможностью доступа к отдельным элементам по их номеру — индексу» Существует несколько вариантов объ- явления массива:
• без непосредственной инициализации элементов массива: int mas[6]; * без явного задания размера; компилятор сам посчитает фактическое количество элементов и создаст в памяти массив необходимого размера: int Pins[ ' = {2, 4, 8Г 3, 6}; • при объявлении массива размер может быть задан явно, одновременно с инициализацией элементов массива, при соз- дании массива типа char необходим дополнительный элемент массива для нулевого символа: intvdls [6] = {2, 4, -9, 3, 2}; char message [61 = "hello". Индексация массива начинается с 0. Присваивание значе- ния элементу массива происходит следующим образом: my Sen s Vais [О' = 10. Получение значения из массива: х = mySensVals [4]. Чаще всего для перебора элементов цикла используется цикл for.. Счётчик цикла при этом используется как индекс для доступа к каждому элементу массива. Например, для вы- вода массива в монитор последовательного порта можно ис- пользовать следующий код: int i; for (i = 0; I < 5; i = i + 1) { Serial.prlntlnfPins [i]); } void Ключевое слово void используется при объявлении функ- ций, если эта функция не возвращает никаких значений при её вызове. 2.3.11. Константы Часто в программах используются данные которые не из- меняются в процессе выполнения этих программ. Это могут быть какие-то физические или математические константы,
исходные данные, коэффициенты и т. д. Константы могут быть предопределёнными и собственными. 1 iредо предел ён н ы е кон стан т ы Они уже существуют в языке программирования. К ним относятся: * булевы константы; они принимают значения true (1} или false (0): ^define true 0x1 # d efine false 0x0; • уровни сигналов цис^ровых пинов; они принимают зна- чения HIGH или LOW: ^define HIGH 0x1 # define LOW 0x0; • настройка цифровых пинов на ввод (INPUT) или вывод (OUTPUT) # define INPUT 0x0 # define OUTPUT 0x1. Цифровые пины могут использоваться на ввод или вывод сигналов. Настройка пина на ввод или вывод производится при помощи функции pinMode(): ptnMode(13r OUTPU Г); // пин 13 настроен на вывод pinMode (12, INPUT); // пин 12 настроен на ввод Собствен н ыс кон стан т ы В программе можно создавать собственные константы: #define LEFT 0x95 # define mess "поворот влево1*; 2.3.15. //временные Переменные — это способ именовать и хранить данные для последующего использования их программой. Значения пере- менных могут меняться в процессе выполнения скетча. Это их отличает от констант, чьё значение никогда не меняется. Ка- ждую переменные нужно обязательно объявлять — деклари- ровать. Следующий код объявляет переменную inpvar, а затем присваивает ей значение, полученное от 2-го аналогового порта:
int inpvor^O; inpvar =analogRead(2). Переменные могут быть названы любыми именами, кото- рые не являются ключевыми словами языка программирова- ния C++. Объявление переменных Все переменные должны быть задекларированы до того, как они могут использоваться. Объявление переменной оз- начнет: — задание её типа: int, long» float и т. д.; — задание уникального имени переменной; — присвоить ей начальное значение (не обязательно). Всё это следует делать только один раз в программе, но значение может меняться в любое время при использовании арифметических операций или операций другого типа. Сле- дующий пример показывает, что объявленная переменная iv имеет тип int, а её начальное значение равно нулю. Это назы- вается простым присваиванием. int iv = 0; Переменная может быть объявлена в разных местах про- граммы. То, где это сделано, определяет, какие части про- граммы могут использовать эту переменную. Границы переменных Переменные могут быть объявлены: — в начале программы перед функцией void setup(), — локально внутри функций, — в блоке выражений, таком как цикл for. То, где объявлена переменная, определяет границы её применения — область видимости, т. е. возможность разных частей скетча её использовать. Глобальные переменные таковы, что их могут видеть и ис- пользовать любые функции и выражения скетча. Такие пере- менные декларируются в начале программы перед функци- ей setup().
Локальные переменные определяются внутри функций или таких частей, как цикл for. Они видимы и могут исполь- зоваться только внутри функции, к которой объявлены. Та- ким образом, могут существовать несколько переменных с одинаковыми именами в разных частях одной программы, ко- торые содержат разные значения. Уверенность, что только одна функция имеет доступ к её переменной, упрощает программу и уменьшает потенциаль- ную опасность возникновения ошибок. 2.3. Преобразование типов данных char( ) Приводит значение к типу char. Синтаксис: char (х); где х — переменная любого типа. byte( ) Приводит значение к типу byte. Синтаксис: byte(x); где х — переменная любого типа. Приводит значение к типу int. Синтаксис: int (х); где х — переменная любого типа. long() Приводит значение к типу long, Синтаксис: 1опд(х); где х — переменная любого типа.
float ( ) Приводит значение к типу float, Синтаксис: Поз(х); где х — переменная любого типа. 2-3.17. Функции цифрового ввода/вывода К ним относятся: — pinMdde {); — digital Write (}; — digital Read(). Функция pwiModef ) Устанавливает режим работы заданного пина на вход (ввод) или ня выход (вывод). Синтаксис: pin Mode (pin, mode). Параметры: — pm — номер пина; — mode — режим: IN P t T (ввод) или OUTPUT (вывод). Пример: ledPin = 13; // Сиетодиод подключён к пину 13 void setup () { pinMode {ledPin, OUTPUT); // устанавливает режим работы — // выход } Функция digit atWntef ) Выводит ня цифровой пин сигнал высокого уровня (HIGH) или низкого уровня (LOW). Перед выводом сигналов пин дол- жен быть настроен функцией pinMode на вывод (OUTPUT). Значению HIGH соответствует напряжение 5 В или 3,3 В для плат с питанием 3,3 В. Значению LOW соответствует О В (земля). Если пин был установлен на ввод (INPUT), то функция digital Writef) со значением HIGH будет активировать внутреН’
ний нагрузочный резистор 20 Ком. Подача LOW, в свою оче- редь, отключает этот резистор. Нагрузочного резистора доста- точно, чтобы светодиод, подключённый к пину, светил тускло. Если вдруг светодиод работает, но очень тускло, необходимо функцией pinModef) установить режим выводя (OUTPUT). Синтаксис: digitalWrite(pin, value). Параметры: pin — номер пина; value — HIGH или LOW. Пример: int IcdPin = 13; // светодиод подключён к пину 13 void setup() { pin Modeled Pin, OUTPUT); // режим работы пина — вывод } void Io op () { digitalWrite (ledPin, HIGH); // включаем светодиод delay(lOOO); // ждём секунду digitalWrite (ledPinT LOW); // выключаем светодиод delay (1000); // ждём секунду } Функция digitalReadf ) Функция считывает с заданного пина значение HIGH или LOW . Синтаксис: digitalRead(pin). Параметр pin — номер пина, который необходимо считать. Пример: int kdPin =13; // светодиод подключён к пину 13 int inPin = 7; // кнопка подключена к пину 7 int val = 0; // вспомогательная переменная void setup () { pinMode (ledPin, OUTPUT); // пин 13 — вывод pinModc (inPin, INPUT); // пин 7 — ввод
void loop() { val = digitalRead(lnPin} ; // считываем сигнал с пина 7 digits I Writef led Pin, val); // выводим такой же сигнал на пин 13 } Если вход не подключён, то digitalRead может возвращать значения HIGH или ЕОДУслучайным образом. Аналоговые входы (analog' pins) могут быть использованы как цифровые пины (digital pins). Обращение к ним идёт по номерам от 14 (для аналогового входа АО) до 19 (для аналогового входа Аб), 2.3.78. Функции аналогового вво&а/вывода К ним относятся: analogResd(); snalogReference(); analogWrite(). Функция analog Read ( ) Функция считывает значение с указанного аналогового пи- на. Большинство плат Arduino имеют 6 аналоговых пинов (8 шь нов у плат Mini и Nano, 16 — у Mega). Вввод осуществляется спсь мощью 10-битного аналого-цифрового преобразователя (АЦП^. Напряжение, поданное на аналоговый пин (обычно от О до 5 вольт}, будет преобразовано в значение от О до 1023. Это 1024 шага с разрешением 0,0049 В. Разброс напряжения и шаг могут быть изменены функцией analogReference(). Считы- вание значения с аналогового входа занимает примерно 100 ми- кросекунд (0,0001 с). Таким образом, максимальная частота считывания сигналов с аналоговых пинов не должна превы- шать 10 000 раз в секунду. Синтаксис: analog Read (pin). Параметр pin — номер пина аналогового ввода, с которого будет производиться считывание: 0..5 для большинства плат, 0..7 для Mini и Nano и О.. 15 для Mega.
Возвращаемое функцией значение — целое число от О до 1023. Если аналоговый вход не подключён, то значения, воз- вращаемые функцией analogReadQ , могут быть случайными. Пример: int analogPin =3; //номер порта, к которому подключён потенциометр int val — 0; // переменная для хранения считываемого значения void setup () { Serial beg in (9 600); // установка скорости работы монитора // порта serial } void loop() { val = analogRead (analogPin) ; // считываем значение Serial.printin (val); // выводим полученное значение } Функция analogiteferencef ) Функция analogReference() позволяет изменять диапа- зон измеряемого напряжения, увеличивая или уменьшая его. Этот диапазон определяется величиной опорного напряже- ния, поступающего на АЦП. Синтаксис: — analogReference( DEFAULT) — стандартное опорное на- пряжение 5 В на платформах с напряжением питания 5 В или 3,3 В на платформах с напряжением питания 3,3 В; — analogReference(lNTERNAL) — встроенное опорное напряжение 1,1 В на микроконтроллерах ATmegal68, ATmega328 и 2,56 В на ATmega8; — ana logReference( EXTERNAL) — используется внеш- ний источник опорного напряжения, подключённый к выводу AREF. Внешнее напряжение рекомендуется подключать к выво- ду AREF через резистор 5 кОм.
analogWritef ) Выдаёт псевдояня лотовую величину (ШИМ-сигнал) на пин входа,-выхода. Функция может быть полезна для управления яркостью подключённого светодиода или скоростью враще- ния ротора электродвигателя. После вызова analogWrite{) ня выход будет выводиться последовательность прямоугольных импульсов с заданной шириной импульса до следующего вы- зова analog Write, digitalWrite или digitnlRead на том же пине входа/выхода. Частота ШИМ-снгнала приблизительно 490 Гц. На большинстве плат Arduino на базе микроконтроллера ATmegal68 или ATmega328 ШИМ поддерживают пины 3, 5, 6, 9, 10 и 11. Ня плате Arduino Mega — пины с 2 по 13. На бо- лее ранних версиях плат Arduino inalogWrite() работал толь- ко ня пинах 9, 10 и 11. Для вызова я па log Write () нет необходимости устанав- ливать тип входа/выхода функцией pinMode (). Функция analogWrite{ ) никак не связана с аналоговыми входами и с функцией analogRead (). Синтаксис: analog Write (pin., value). Параметры: • pin — пин, на который подаётся ШИМ -си гнал; • value — значение между 0 — полностью выключено и 255 — сигнал подан постоянно. Пример: //задание яркости светодиода пропорционально значению, // снимаемому с потенциометра int led Pin = 9; // светодиод подключён к пину 9 int а па log Pin = 14; // потенциометр, подключён к пину АО int vai =0; // переменная для хранения значения void setup*;') < pinMode (ledPin, OUTPUT); // установка пина 9 на выход } void Ioop() { val - analogRead(analogPin); // считываем значение с пина 14
// analogRcad выдаёт от 0 до 1023, a ana log Write должно быть от 0 до 255 analogWrite(ledPin, val/4); 2.3.19. Дополнительные функции еео^а/еыеоЙл tonef) Выводит на заданный пин последовательность импуль- сов типа < меандр* (с 50 % заполнением) заданной частоты. Длительность последовательности может быть задана пара- метром. В противном случае сигнал генерируется до тех пор, пока не будет вызвана функция поТопе(). К пину может быть подключён пьезо- или иной динамик для воспроизведения сигнала,. Воспроизводиться может только один сигнал. Если сигнал уже воспроизводится на одном пине, то вызов tone() с номе- ром другого пина ни к чему не приведёт. Если же tone() будет вызвана с тем же номером пина, то будет установлена новая частота сигнала. Использование функции tone() помешает использовать ШИМ на пинах 3 и 11 (кроме платы Arduino Mega). Синтаксис: tone(prn, frequency); tone(pinf frequency, duration). Параметры: pin — номер пина, на который будет выводиться сигнал, frequency — частота сигнала в герцах, duration — длительность сигнала в миллисекундах. noTone () Останавливает сигнал, генерируемый на пине, вызван- ный функцией tone(). Если сигнал не генерировался, то вы- зов поТоиеО ни к чему не приводит. Если необходимы сигналы на разных пинах, то следует сначала остановить один сигнал функцией noTone()t а лишь затем создавать новый сигнал на другом пине функцией tone(J.
Синтаксис: noToncfpin). Параметр pin — номер пина, на котором прекращается сигнал. shiftOut() Выводит байт информации на пин последовательно побит- но. Вывод может осуществляться как с первого (левого), так и с последнего (правого) бита. Каждый бит последовательно по- даётся на заданный пин. После этого подаётся сигнал на син- хронизирующий пин, информируя о возможности считыва- ния бита. Такой способ передачи данных называется последователь- ным протоколом с синхронизацией. Он часто используется для взаимодействия контроллеров с датчиками и другими контрол- лерами. Последовательная передача с синхронизацией позво- ляет устройствам связываться на максимальной скорости. Синтаксис: shiftOut (data Pin, dock Pin, bitOrder, value). Параметры: * dataPin — номер пина, на который выводятся информа- ционные биты (int), * clock Pin — номер пина, на который выводятся сигналы синхронизации (int), • bitOrder — используемая последовательность вывода би- тов: MSBP1RST — слева или LSBF1RST — справа, * value — значение (байт) для вывода (byte). Пин вывода dataPin и синхронизирующий пин clockPin должны быть предварительно сконфигурированы как порты вывода с помощью функции pinMode(). Функция shiftOut() может выводить только один байт (8 битов) информации, поэтому, чтобы вывести значения больше 255, необходимо произвести несколько действий. Пример: // выеодим MSBFIRST с первого (левого) бита int data = 500; //выводимое число
// выводим старший бит shiftOut (dataPin, clock, MSBFIRST, (data >> 8)); // выводим младший бит shiftOutfdataPin, clock, LSBFIRST, data); // выводим старший бит shiftOut (dataPin, clock, LSBFIRST, (data >> 8)). pulse Inf ) Считывает длину сигнала (HIGH или LOW) на заданном пине. Например, если задано считывание HIGH, функция рп1ве1п() ожидает, пока на заданном пине не появится HIGH. Когда HIGH получен, включается таймер, который будет остановлен, когда на пине появится LOW. Функция pulselnf) возвращает длину сигнала в микросекундах. Функция возвра- щает 0, если в течение заданного времени (тайм-аута) не был зафиксирован нужный сигнал, на пине. Возможны некоторые погрешности в измерении длинных сигналов . Функция может измерять сигналы длиной от 10 ми- кросекунд до 3 минут. Синтаксис: pulseln (pin, value); pulseln (pin, value, timeout). Параметры: • pin — номер пина, на котором будет ожидаться сигнал; * value — тип ожидаемого сигнала: HIGH или LOW; • timeout — время ожидания сигнала (тайм-аут) в секун- дах (unsigned long). Возвращаемые значения — длина сигнала в микросекун- дах или О, если сигнал не получен до истечения тайм-аута. Пример: int pin = 7; unsigned long duration; void setup() { pinMode (pin, INPUT) ; } void loop() { duration = pulseln(pin, HIGH);
2.3.20. Функции работы со временем Функция miliisf J Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это ко- личество сбрасывается в ноль приблизительно через 50 дней. Параметров нет. Возвращаемое значение — количество мил- лисекунд с момента начала выполнения. Пример: unsigned long time; void setupf) { SeriaLbegin{9600) ; } void loopf) { SeriaLprint("Tirne: time = mlllis(); // выводит число миллисекунд с момента начала выполнения скетча Serial, printin (time) ; //ждём секунду перед следующей итерацией цикла delay (1000); } mZerosfJ Эта функция возвращает количество микросекунд с момен- та начала выполнения текущей программы на плате Arduino. Значение переполняется и сбрасывается в ноль приблизитель- но через ТО минут. На платах Arduino с 16 MIYt (Duemilanove и Nano) функция micros() имеет разрешение 4 секунды. Возвра- щаемое значение всегда кратно 4. На платах с И МГц (Arduino Lilypad) разрешение функции — 8 секунд. Параметров нет. Возвращаемое значение — количество микросекунд с момента начала выполнения программы (unsigned long). Пример: unsigned long time; void setup Q
{ Serial. Bcgin(9600); } void 1dop() { Serial.print: (* I ime: “) ; time = micros( ); // выводит количество микросекунд с момента начала // выполнения скетча Se ria I. pri ntl n{ ti me); // ждём секунду перед следующей итерацией цикла delay (1000); } cfefayf J Эта функция останавливает выполнение скетча на задан- ное в параметре количество миллисекунд (1 000 миллисекунд в 1 секунде). Синтаксис: delay (ms); Параметр ms типа unsigned long есть количество милли- секунд, на которое приостанавливается выполнение скетча. Пример: int ledPin =13; // светодиод подключён на пину 13 void setup () { pinMode (ledPin, OUTPUI}; // пин 13 - на выход } void loop () < digital Write (led Pin, HIGH); //включаем светодиод delay(lOOO); //ожидаем секунду digital Write (led Pin, LOW); // выключаем светодиод delay(lOOO); // ожидаем секунду } He рекомендуется использовать эту функцию для событий длиннее 10 миллисекунд, т. к. во время останова не могут быть произведены манипуляции с пинами, не могут быть считаны сенсоры или произведены математические операции. В каче~
стве альтернативного подхода возможно контролирование вре- мени выполнения тех или иных действий с помощью функции пй111э(). При использовании функции delay() механизм преры- ваний не останавливается, продолжается запись последователь- но (serial) передаваемых данных в монитор порта, ШИМ-сигнал продолжает генерироваться (функция analogWrite). de I ay M i c rosecon ds( ) Останавливает выполнение программы на заданное в параме- тре количество микросекунд (1000 000 микросекунд в 1 секунде). В данной версии Arduino максимальная пауза,, воспроиз- водимая корректно, равна 16 383 мкс. Возможно, это будет изменено в следующих версиях Arduino. Для остановки вы- полнения программы более чем на несколько тысяч микросе- кунд рекомендуется использовать функцию delay(). Синтаксис: delay Microseconds (t); Параметр t типа unsigned int — количество микросекунд, на которое приостанавливается выполнение скетча. Пример: int out Pin = 8; //пин 8 void sctup() { pinMode (outPin, OUTPUT); // пин 8 - на вывод } void loop() { digital Writc(outPin, HIGH); // подаём HIGH на пин 8 delay Mi его seco nds (50); // ожидаем 50 микросекунд digital Write (outPin, LOW) ; // подаём LOW на пин 8 delay Microseconds (50); // ожидаем 50 микросекунд } 2.3.21. Математические функции В языке представлены следующие математические функции* constraint), min(), max (), abs(), map(), pow()T sq(), sqrt().
min(x, у) Эта функция возвращает наименьшее из двух чисел. Параметры: х — первое число, любой тип, у — второе число, любой тип. Возвращаемое значение: возвращает меньшее из двух сравниваемых значений. Пример: // если sensVaJ больше 100 г то sensVal будет присвоено 100 sensVal = min (sensVal, 100); Nitijrfx, у) Возвращает большее из двух чисел. Параметры: х — первое число, любой тип, у — второе число, любой тип. Возвращаемое значение: возвращает большее из двух сравниваемых значений. Пример: // если sensVal меньше 20, то sensVaJ будет присвоено 20 sensVal = max(sensVal t 20). Функция max(} часто используется для задания нижней границы значений переменной. Функцией min() задаёт верх- нюю границу значений переменной. В силу специфики реали- зации функции тпах() следует избегать использования других функций в качестве параметров. Пример: max (а—, 0); // может привести к некорректным результатам а-; гпах(а, 0); // так корректно. absf } Эта функция возвращает модуль числа. Параметр: х — число. Возвращаемые значения: — х — если х больше или равен 0, — х — если х меньше D.
В силу специфики реализации функции abs() следует из- бегать использования других функций в качестве параметров. Пример: abs (а++); // может привести к некорректным результатам а++; abs (а); // так корректно. can strain t ( xr at b) Функция проверяет переменную и, если необходимо, при- сваивает ей новое значение так, чтобы оно было в области до- пустимых значений, заданной параметрами. Параметры: • х — проверяемое значение, любой тип; * а — нижняя граница области допустимых значений, лю- бой тип; * Ь — верхняя граница области допустимых значений, лю- бой тип. Возвращаемое значение: • х — если х входит в область значений а...Ь; • а — если х меньше а; * Ь — если х больше Ь. Пример: // ограничиваем значения sensVal диапазоном от 10 до 150 sensVal = constrain(sensVal, 10, 150). тар( value ? from Low, fromHigh,. toLoiv, Эта функция пропорционально переносит value из теку- щего диапазона значений (fromLow ... froniHigh) в новый ди- апазон (toLow ... toHigh). Функция 1пяр() не ограничивает значение переменной рам- ками диапазона, как это делает функция constraint). Обратите внимание, что нижняя граница может быть как меньше, так и больше верхней границы. Это может быть ис- пользовано, чтобы * перевернуть^ диапазон. Синтаксис: ma р( value, fromLow, from High, to Low r toHigh).
Параметры: • value — значение для переноса; * fromLow — нижняя граница текущего диапазона; • f тот High — верхняя граница текущего диапазона; * toLow — нижняя граница нового диапазона, в который переносится значение; * to High — верхняя: граница нового диапазона. Возвращаемое значение — значение в новом диапазоне. Пример: у = mapfXj 1, 50; 50, 1); Возможно использование отрицательных значений: у = map(x, 1, 50; 50, -100); Функция niap() оперирует целыми числами. При пропор- циональном переносе дробная часть не округляется по прави- лам, а просто отбрасывается. Пример: // переносим значение с аналогового входа (0...1023) в 8 бит (О...255) void setup() {;} void loop() { int val = analogRead(O) ; val = map(val# 0, 1023, 0, 255); ana log Write (9; val); } poit'(base, exponent) Эта функция вычисляет значение, возведённое в. задан- ную степень. Функция pow() может возводить и в дробную степень. Параметры: • base — число типа float; * exponent — степень типа float, в которую будет возво- диться число. Возвращаемое значение — результат возведения в сте- пень, число типа double.
S(]( Aj Функция возвращает квадрат числа, заданного параметром. Параметр х — число любого типа. Возвращаемое значение: квадрат числа. sgrtfx ) Функция вычисляет квадратный корень числа. Параметр х — число любого типа. Возвращаемое значение: квадратным корень ’тела (тип double). 2.3.22. Тригонометрические функции В языке представлены следующие тригонометрические функции: sin(), cos()t tan(). smf rad J Возвращает синус угла rad, заданного в радианах. Резуль- тат функции находится в диапазоне —1...+1. Параметр rad — угол в радианах (float). Возвращаемое значение: синус угла {тип double). cos( rod ) Возвращает косинус угла rad, заданного в радианах. Ре- зультат функции находится в диапазоне — Параметр rad — угол в радианах (тип float). Возвращаемое значение: косинус угла (тип double). tan ( rad) Возвращает тангенс угла rad, заданного в радианах в пере- даваемом параметре. Результат функции находится в диапа- зоне от минус бесконечности до плюс бесконечности. Параметр rad — угол в радианах (тип float). Возвращаемое значение: тангенс угла (тип double). 2.3.23. Генераторы случайных значений Функции формирования случайных чисел: randoniSeed(), random().
randomSeed( seed ) Функция randomSeed() инициализирует генератор псев- дослучайных чисел. Генерируемая последовательность слу- чайных чисел очень длинная и всегда одна и та же. Параметр seed (тип int, long) задаёт начало выдачи псев- дослучайных значений. random( ) Функция random{) возвращает псевдослучайное число. Синтаксис: * random(max); • random(min, max); Параметры: • min — нижняя граница случайных значений; * max — верхняя граница случайных значений. Возвращаемое значение: случайное число между min и гпах — I (тип long). Если при каждом запуске программы необходимо полу- чать разные последовательности значений, генерируемых функцией random(), то необходимо инициализировать гене- ратор псевдослучайных чисел со случайным параметром. На- пример, можно использовать значение, получаемое функци- ей analogRead() с неподключённого пина аналогового ввода. В некоторых случаях необходимо получать одинаковую после- довательность при каждом запуске программы на Arduino. Тогда инициализировать генератор псевдослучайных чисел следует вы- зовом функции randomSeedO с фиксированным параметром. Пример: long rand Number; void setupJ { Serial ±ед1п(9600); } void loopO { // выводим случайное число из диапазона 0..400 randNumber - random(400);
Serial. pnntln( га nd Numb or); // выводим случайное число из диапазона 10..-20 rand Number = random(10, 20); Serial, р ri п tin ( randNumber); dclay(SO); } 2.3.24. Операции с битами u бай шалей Функции, реализующие эти операции: lowByte()T high- Byte()T bit Rea d(), bitWrite(), bitSet(), bitCLear(),bit(). low Byte ( ; Извлекает младший (правый) байт переменной, напри- мер типа word. Синтаксис: lowByte(x); Параметр х — величина любого типа. Возвращает байт. highBytef ) Извлекает старший (левый) байт слова или второй млад- ший байт большего типа данных. Синтаксис: highByte(x); Параметр х — величина любого типа. Возвращает байт. bit Read ( ) Читает определённый бит переменной. Синтаксис: bit Read ( х, п / Параметры: * х — число, из которого необходимо прочитать бит, • п — номер бита, который необходимо прочитать, начи- ная с О для младшего (правого) бита. Возвращает значение бита (0 или 1).
bit W rite ( ) Записывает бит числовой переменной. Синтаксис: bitWritcfx, пи b); Параметры: * х — числовая переменная, в которую необходимо записать; * п — номер бита, в. который необходимо записать, начи- ная с О для младшего (правого) бита: * b — значение, которое необходимо записать в бит (0 или 1). Устанавливает (записывает 1) бит в числовой переменной. Синтаксис: bitSettXj п); Параметры: * х — числовая переменная, в которую необходимо записать; * п — номер бита, который необходимо установить; млад- ший бит имеет номер 0. bitClearf ) Сбрасывает (записывает 0) бит числовой переменной. Синтаксис: bitClear(x, п); Параметры: * х — числовая переменная, в которую необходимо записать; * п — номер бита, который необходимо установить; млад- ший бит имеет номер 0. Вычисляет значение указанного бита. Бит 0 — это 1Т бит 1 — это 2, бит 2 — это 4 и т. д. Синтаксис: bit (п); Параметр п — номер бита, который необходимо вычис- лить. Возвращает значение бита.
2.3,25. Внешние прерывания Прерывание (англ, interrupt) — сигнал, сообщающий про- цессору о наступлении какого-либо события. При этом вы- полнение текущей последовательности команд приостанав- ливается и управление передаётся обработчику прерывания (Oli). ОН выполняет работу по обработке события и возвраща- ет управление в прерванную программу. Имеются две функции для работы с прерываниями: — at ta chin ter rupt(), — detachlnterriipt(). at tachinterrupt ( ) Задаёт функцию для обработки внешнего прерывания, т. е. функцию, которая будет вызвана по внешнему прерыванию. Ес- ли до этого была задана другая функция, то назначается новая. Синтаксис: stta ch Interrupt interrupt, function, mode); Параметры: — interrupt — номер прерывания: • 0 — на цифровом порту 2; • 1 — на цифровом порту 3;. • 2 — на цифровом порту 21 (для Arduino Mega); • 3 — на цифровом порту 21 (для Arduino Mega); • 4 — на цифровом порту 21 (для Arduino Mega); • 5 — на цифровом порту 21 (для Arduino Mega); — function — функция, вызываемая прерыванием; долж- на быть без параметров и не возвращать значений; — mode — задаёт режим обработки прерывания; допусти- мо использование следующих констант: • LOW — прерывание вызывается, когда на пине LOW; * CHANGE — прерывание вызывается при смене значения на пине с LOW на HIGH и наоборот; * RISING — прерывание вызывается только при смене зна- чения на пине с LOW ня HIGH; • FALLING — прерывание вызывается только при смене значения на пине с HIGH на LOW.
Возвращаемого значения нет. Особенности: — внутри функции обработки прерывания не работает функция delay(); — значения, возвращаемые функцией millis(), не изменя- ются; — возможна потеря данных, передаваемых по последова- тельному соединению (Serial data); — переменные, изменяемые в функции, должны быть объявлены как volatile. det ас hl nt err и pt () Выключает обработку внешнего прерывания. Синтаксис: detach Interrupt Interrupt); Параметр interrupt — номер прерывания (О или 1}, для Arduino Mega ещё 2, 3, 4 или 5. Возвращаемого значения нет. Пример: // при наступлении события CHANGE на пине 2 (прерывание 0). // светодиод на пине 13 при каждом прерывании меняет статус //(горит либо гаснет) int pin = 13; volatile int state = LOW; void setup() { pinModefpin, OUTPUT); attach In tert upt (0, blink, CHANGE) ; } void loopf) { digital Writefp in, state); } // функция обработки прерывания void blink () { state = 'state; so
2.3.26. У правление портами через регистры ATmega Использование встроенных функций Arduino для работы с пинами очень удобно. Однако за удобство приходится платить быстродействием. В большинстве скетчей это не принципиаль- но, но иногда имеет решающее значение. В таких случаях не- обходимо управлять пинами Arduino напрямую через регистры процессора ATmega. При этом мы не только увеличивается бы- стродействие, но ещё уменьшаем размер скетча. Рассмотрим таблицу соответствия выводов Arduino пор- там микроконтроллера ATmegal68 (рис. 2.16). Д|йШдй1Ье Pim Mapping А"Ж1тт-з-: *4WU kA'si!1 кч. -'фэж. u-ь^: I ТК| «Фроммы! П И7Д 1 ^V*U| W ЗИП jatf n .-i'zp i i f u iM ! E-hVLIi .фмк? к. I - L(RMM| .71:+:,! I |.гтнгичи1; пзГ < i ir «wnwnffifPtii-1 /fjUllk-.T-rk w^l - » iPCMTffUWWWnFWL । * iPCrUTll-lEKTif ^t4L i I* vcdE3 1ЛГ1 L’ 7СТТЕЧСГ.Ч.1ЛСИСП™Г 1 * ^ЗЛЧ' riKMLTLIb.L3i rfnT ** +Стч№СМй*Т1Ь*ИГ * ^ihVa.ri^Hr^L .r rcjfrfiuJHI.pprE a [FqfcrnmKJTEFI'iFWL 4 =1 □та lAtKVMSjKiiii i> □ =C*l*Dtv3IiKPCrtriil □43i*MWM?hi □₽СЭ iWKWOifTlw □Ы |Ы>с*РС*чтЧ j тл.аопн: th ЗОЛ Лтипк (слцЗ ! rma-n.riu. v 1 >WV№"lc*M I l-in-nil.r I l-B№ Mil «1 .'J - 3M1 - 1Н£ H >— tn : -мы 011134 в А DTH1.' '1*VCC ™ |^rirWhl5- ОЧр»М1сФУ11 □ «и-тЯ£Х1пггит71 *<{:*>* rr*:c i? rViW J«B1 rCCIJUTtliril vs I^V*T. 'HWf 11 1] 4 1> lh№>i М'^да'вЗ 4 it Itv 131 пфгом CV mj-—i:^Ht«HI3Z L+31 3CK Jilfi*! PH • ku i ’i< rtUWcaMbtw 'trt4 CW Рис. 2.16. Таблица соответствия выводов Arduino портам ATmega 168 Из рисунке 2.16 видно, что микроконтроллер имеет три порта, которые объединяют по 8 пинов контроллера Arduino: • PORTD — цифровые пины Arduino 0...7; • PORTB — цифровые пины Arduino 8... 13; • PORTC — аналоговые пины Arduino АО...Аб; А6...А7 до- ступны в Arduino Mini и Arduino Nano. Для установки выводов и чтения записи данных исполь- зуются следующие команды: * DDRD, DDRB, DDRC — настройка пинов на ввод или вы- вод (0 — INPUT, 1 — OUTPUT) соответствующих портов; * PORTD, PORTE, PORTC — вывод двоичных данных на пины соответствующих портов;
• PlNDt PINB, PINC — считывание данных всех пинов со- ответствующего портя. Используя эти команды, можно изменить стандартные функции Arduino. Пример: //рЁпМойс(13л INPUT) DDRB = DDRB & В11011111 // pin Mod е{ ^OUTPUT) DDRD = DDRD | B00100000 // digitalWrite (7, HIGH) PORTB= PORTB | B10000000 // digital Read (10, HIGH.) PINB = (PINB & B00000100) >>2. Команда analogWrite() выдаёт ШИМ-сигнал на пин вво- да /вывода. Частота ШИМ-сигналя равна приблизительно 490 Гц. Если требуется иметь ШИМ с большим разрешени- ем или другой частотой, чем позволяет стандартная функция analogWrite(), или необходимо организовать ШИМ-сигнал на других пинах, можно написать замену функции analogWrite(), используя прямой вывод на порты. Пример: int time 1=124; for (int k=O;k<timel;k++) PORTA^BOOOOOOOl; for (int k=0;k<256-timel;k++) PORTA=BOOOOOOOOi 2.3.27. Библиотека Serial Набор функций библиотеки Serial служит для связи платы Arduino с компьютером или другими устройствами, поддержива- ющими последовательный интерфейс обмена данными. Все пла- ты Arduino имеют хотя бы один последовательный порт UAKT. Для обмена данными Serial служат цифровые пины вво- да/вывода 0 (RX) и 1 (ТХ), а также порт USB. Если мы ис- пользуем функции Serial, то нельзя одновременно с этим за- действовать пины 0 и 1 для других целей. Среда разработки Arduino имеет встроенный монитор по- следовательного интерфейса (монитор последовательного пор- та, монитор порта), показанный на рисунке 2.11. Дня начала обмена данными необходимо запустить монитор через меню
Инструменты | Монитор порта и выставить такую же скорость связи (baud rate), что и в функции Serial.begin О в скетче. Плата Arduino Mega имеет три последовательных порта: — Serial на пинах 19 (RX) и 18 (ТХ), — Serial2 на пинах 17 (КХ) и 16 (ТХ), — SerialS на пинах 15 (КХ) и 14 (ТХ). Для того чтобы использовать эти порты для связи с компью- тером, понадобятся дополнительные адаптеры USB-to-serial, т. к. они не подключены к встроенному адаптеру платы Mega. Serial.begin ( J Функция Serial .begin() инициирует последовательное сое- динение и задаёт скорость передачи данных в бит/с (бод).. Для обмена данными с компьютером используйте следующие значе- ния: 300,1200,2100, 1800,9600, 14100,19200,28800, 38100, 57600 или 115200. При соединении через пины 0 и 1 могут быть использованы другие значения скорости, определяемые устройством, с которым будет осуществляться обмен данными.. Синтаксис функции: Scrial.begin(speed); Для Arduino Mega и Arduino Due: Sc rial I. beg i n (speed); Sc rial 2. beg in (speed); Sc rial 3. beg in (speed); Параметр speed типа long — скорость в бит/с (бод). Возвращаемого значения нет. Sertal.endf) Функция Serial.end() закрывает последовательное соеди- нение, пины КХ и ТХ освобождаются и могут быть использо- ваны для ввода/вывод а.. Синтаксис: Serial.end(); Для Arduino Mega и Arduino Due: SerialLendQ; Serial2.end(); Seria!3Jend(); Параметра нет. Возвращаемого значения нет.
SeriaLauat table () Функция Serial, available!) получает количество байтов (символов), доступных для чтения из последовательного ин- терфейса связи. Это те байты, которые уже поступили и запи- саны в буфер последовательного порта. Буфер может хранить до 128 байтов. Синтаксис: Sc rial, availably); Для Arduino Mega и Arduino Due: Seriall.avails ble{); Serial2.avails bie{); Serial3. avails ble(); Параметра нет. Возвращаемое значение — количество бантов, доступных для чтения (int). Seri at. read f ) Функция Serial.readQ считывает очередной доступный байт из буфера последовательного соединения. Синтаксис: Serial. read(); Для Arduino Mega и Arduino Due: Seriall.read(); Serial2.read(); Serial3.read(); Параметра нет. Возвращаемое значение (int) — следую- щий доступный байт из буфера последовательного соедине- ния или —1, если его нет. Пример: int in—0; // переменная для хранения полученного байта void sctup() { Serial.begin(9600); // устанавливаем последовательное соединение } void loop() { If (Serial.availably) > 0) // если есть доступные данные { // считываем байт
in - Serial.rt?ad(); // отсылаем в монитор порта то, что получили Serial.println(in, DEC} ; } Serial,flutt/if ) Функция Serial.flush() ожидает окончания передачи исхо- дящих данных. До версии Arduino 1.0 функция очищала бу- фер последовательного соединения. Синтаксис: Serialflushf}; Для Arduino Mega и Arduino Due: Seriail.fi ush(); Serial2.flush(); So rial3 J ush(); Параметра нет. Boa вращаем ого значения нет. Serial.print( ) Функция Serial.print() передаёт данные через последо- вательный порт как текст ASCII. Эта функция может при- нимать различные типы данных. С помощью второго опцио- нального параметра можно задать базис (систему счисления) для чисел. Синтаксис: Serial.print(val); или So rial.print( valP format}; Для Arduino Mega и Arduino Due: Seriall, Serial^, Serial^. Параметры: * val — данные для передачи через последовательное сое- динение; * format — базис (система счисления) для целых чисел или количество знаков после запятой для вещественных: — BYTE; — BLN (двоичный); — ОСТ (восьмеричный);
— DEC (десятеричный}; — HEX (шестнадцатеричный); — для вещественных (дробных) чисел второй параметр за- даёт количество знаков после запятой. Возвращаемого значения нет. SeriaLprintbi() Функция Serial, print 1п() передаёт данные через последова- тельный порт в виде текста ASCII вместе со следующим за ним символом перенося строки (символ ASCII с кодом 13 - *\г’| и символом новой строки (символ ASCII с кодом 10 или 1\пт)- Периметры и типы данных для этой функции такие же, что и для функции Serial, print ().. Seri aLw rite ( ) Функция Serial ..writef) передаст данные через последова- тельный интерфейс как бинарный код. Данные посылаются единичным байтом или серией байтов. Синтаксис: Serial.write(val); Serial.write(str); SeriaLwritctbuf, len); Для Arduino Mega: Seriall, Serial2, SerialB. Параметры: * val — один байт; • str — строка как серия байтов; • buf — массив байтов; * 1еп — длина массива. Возвращаемого значения нет, Serial.peek( ) Функция Serial.реек() возвращает следующий доступный байт (символ) из буфера входящего последовательно интер- фейса, не удаляя его из этого буфера. То есть успешный вы- зов этой функции вернёт то же значение, что и следующий за ним вызов функции Serial, г ead().
Синтаксис функции serial.реек(): Serial, ре ек(); Для Arduino Mega и Arduino Due: Se rial 1 _ pee k(); Sc rial 2. pec k(); Se rial 3 □ pee k(}; Параметра нет. Возвращаемое значение (int) — следую- щий доступный байт или -1, если его нет. 2.3.2S» Библиотека Softwar eSerial Библиотека SoftwareSerial позволяет осуществить после- довательную передачу данных через другие цифровые контак- ты Arduino. Можно иметь несколько последовательных пор- тов со скоростью передачи до 115 200 €итог/сек. SoftwareSerial копирует функции библиотеки Serial, но с н е к ото р ым и о гр аничени я м и: — при использовании нескольких последовательных пор- тов только один может принимать данные одновременно; — на платах Mega и Mega 2560 для RX могут быть ис- пользованы только следующие контакты 10, 11,, 12, 13, 11, 15, 50, 51, 52, 53, А8(62), А9(63), А1О(64), А11(65), А12(66), А13(67), А14(68), А15(69); — на плате Leonardo для JIX могут быть использованы только следующие контакты: 8, 9, 10, 11, 14{MIS0), 15(SCK), 16(MOS1). Библиотека SoftwareSerial включает следующие функ- ции: SoftwareSerialQ, availableQ, begin(), isListeningf), over- flown, peek{), readQ, printQ, printlnQ, listenQ, writeQ. Б целом функции аналогичны функциям библиотеки Serial, поэтому рассмотрим только функции, уникальные для библиотеки SoftwareSerial. SoftwareSerialf ) Создаёт экземпляр объекта последовательного порта Softwa- reSerial. Для запуска последовательного порта на выводах rxPin, txPin необходимо выполнить функцию SoftwareSerial .beginf)»
Синтаксис: SoftwareSerial(rxPin, txPin); Параметры: • rxPin — пин для получения последовательных данных; • txPin — пин для отправки последовательных данных. Возвращаемое значение — экземпляр объекта SoftwareSerial. ST о /' tuu reSe ria I. li ste n( ) Функция SoftwareSerial.listen() назначает выбранный порт в качестве «слушателям данных. Данные, которые при- ходят для других портов, будут проигнорированы. Синтаксис: SoftwareSeriaL listen (port); Параметра нет. Возвращаемого значения нет. SaftivareSe ri a I.isLis te п i ng ( ) Функция SoftwareSerial.isListening() проверяет, выступа- ет ли выбранный порт в данный момент в качестве «слушате- ля* данных. Синтаксис: So ft wa reSeri al. isLi steni n g (}; Параметра нет. Возвращаемое значение: false или true. Пример: //назначения порта слушателем и проверка его состояния # include <SoftwareSerial.h> // software serial: TX = digital pin 10Л RX - digital pin 11 SoftwareSerial portOneflOj 11); // software serial : TX -digital pin 8Л RX = digital pin 9 SoftwareSerial portTwo(8f 9); void setup() { Serial.begin (9600); // Start both software serial ports portOne.begin(9600); portT wo.begin{9600); } void loop() { portOne.listenf);
if (portOne.isUsterling ()) { Serial, printin ("Port One is listening'"J; } else < Sen al. printin ("Port One is not listening"); } if (portTwo.isListening {)) { Se rial, pr in tin (tf Port Two is listening^); } else { Serial, printing Port Two is not listening'); } S oft wa reSeri a • .overflow ( } Функция SoftwareSerial. overflow!Проверяет, произошло ли переполнение буфера для данного экземпляра последова- тельного порта. Размер буфера 61 байта. Вызов этой функции очищает флаг переполнения. Синтаксис: So ft wa reSeri a L о v егПо w (); Параметра нет. Возвращаемое значение — false или true. Резюме. Arduino (Ардуино) — популярная аппаратная вычислительная платформа, основными компонентами кото- рой являются: — плата контроллера (микроЭВМ) Arduino, — программная среда разработки программ (скетчей) Arduino IDE. Arduino может использоваться как для создания автоном- ных интерактивных компьютерных управляющих устройств, так и подключаться к программному обеспечению, выпол- няемому на компьютере. Платы Arduino имеют аналоговые и цифровые линии (пины), к которым можно подключить практически любые устройства: кнопки, датчики, моторы, экраны и прочее оборудование.
Глава 3. СХЕМЫ И СИСТЕМЫ 3.1. Работа го светодиодами Для подключения светодиода к плате Arduino и управле- ния им понадобятся: • плата Arduino, • макетная плата (breadboard), * 2 провода « папа-папа * светодиод, * резистор 1U кОм (килоОм). Все эти комплектующие входят в большинство начальных комплектов. Их также можно приобрести по отдельности. На- боры Arduino можно купить на официальном сайте и в интер- нет-магазинах. Наиболее привлекательные цены, постоянные спецпредложения и бесплатная доставка имеются на сайтах AliExpress и De al Extreme. Если нет времени ждать посылку из Китая, то подойдёт интернет-магазин DESSY. Breadboard представляет из себя сетку из гнезд, которые обычно соединяются так, как показано на рисунке 3.1. Так- же потребуется среда разработки скетчей Arduino IDE, кото- рую можно скачать с сайта Arduino. Пример 3.1. Светодиод должен включаться и выключать- ся на 1 секунду. На рисунке 3.2 приведена схема подключе- ния светодиода к плате Arduino. Скетч этого примера имеет вид: int led = 8; void &etup() { pinMode(ledr OUTPUT); } void loop() { digitalWritefled, HIGH); delay(lOOO); digitalWritefled, LOW); delay(lOOO); }
IIIIElllllllllllllO!ll!!lllllilllOlllllillllllHllllfjllllHI Рис. 8.1. Макетная плата (breadboard) Рис. 3.2. Схема подключения светодиода к плате Arduino Этот же скетч, но с комментариями имеет вид: /^объявление переменной целого типа, содержащей номер цифровой линии (пина) ввода/вывода, к которой подключен второй провод */ int led = 8; /^обязательная процедура, setup, запускаемая в начале программы; объявление процедур начинается словом void */ void setupQ { ^объявление используемого порта, fed — номер линии, второй аргумент — тип использования линии: на ввод — INPU Г, на вывод — OUTPUT*/ pinMode(led, OUTPUT); } /*обязательная процедура loop; выполняется циклично после процедуры setup и содержит собственно программу */ void 1оор() { /* включение или выключение напряжения на цифровой линии;
led — номер линии; второй аргумент: включение - HIGH, выключение - LOW */ digitalWhte(led, HIGH); /* ожидание (задержка) между действиями, аргумент — время ожидания в миллисекундах */ delay(WOO); digitalWhtefled, LOW); delay(lOOO); } Пример 3.2. Этот пример Fade находится в примерах сре- ды разработки скетчей IDE. Светодиод через гасящий рези- стор подключается к пину 9 (рис. 3.3 и 3.4 J. Свечение свето- диода плавно увеличивается, затем — плавно уменьшается. Этот процесс носит периодический характер. Скетч примера имеет вид: /* Fade. Этот пример показывает, как плавно поменять напряжение на пине 9, используя функцию analog Write (). Пины, на которых это возможно помечены знаком ^5, ^6, ^9, -10 и —11, Этот пример общедоступен. */ int led = 9; // подключим светодиод к пину 9 int brightness = 0; // начальное значение выводимого напряжения int fadeAmount = 5; // величина приращения void setup() < // настраиваем пин 9 на вывод pinMode(led, OUTPUT); } // основная процедура, выполняется циклически void 1оор() { // выводим напряжение на пин 9 analogWrite(led, brightness); // даём приращение brightness = brightness + FadeAmount; // реверсируем приращение if (brightness <= 0 I brightness >= 1000) { fade Amount = -fade Amount; } // задержка на 30 мс delay (30); }
Рис. 3.3. Внешний ниц макета Arriuinnl m sv vin RST PuWer AREF Arduino A0> Al g A2 q □q A3 a A 4 A5 - D13 D12 Dll Did DC S.D8 J D" g Dfi ^D5 D4 Ve D3 ъс D2 a DI DO PWM R1 ПУМ PWM I4YM TX* Ra 4 LED1 GND Рис. 3.4. Схема нодклм1ченич светодиода к плате Arduino 3-2. Работа с кнопками Это одна из базовых схем, которая неоднократно исполь- зуется для управления различными устройствами с помощью Arduino.
Пример 3.3. Требуется, чтобы нажатие кнопки сопрово- ждалось свечением светодиода. Для сборки устройства потре- буется (рис. 3.5): * плата Arduino, • Breadboard, * 5 перемычек типа « папа-папа • светодиод, • кнопка, * резисторы на 10 кОм и 220 Ом. Рис. 3.5. Комплект для макетирования Схема подключения кнопки и светодиода к Arduino при- ведена ня рисунке 3.6,. Рис. 3.6. Схема подключении кнопки и светодиода к плате Arduino
Скетч имеет вид: int button = 2; //к пину 2 подключим кнопку int ted = 8; //к пину 8 подключим светодиод void setupQ { pin Mode (led, OUTPUT); //настроим пин 8 на бьевод pinModetbuttorij INPUT); //настроим пин 2 на ввод > void 1оор() < if (digitaiRead(button) == HIGH) { digitalWrite(led, HIGH); } else { digital Write (led, LOW); } } Кнопка подключается к пину 2, я светодиод — к пину 8. Нин 2 настраивается на ввод, а пин 8 — на вывод. К светодио- ду последовательно подключается гасящее сопротивление но- миналом в 10 кОмт а к кнопке — гасящее сопротивление но- миналом 220 Ом. Пример 3.4. Информация о состоянии кнопки (0 или 1} вы- водится в порт мониторя для просмотра. Кнопка подключается к цифровому пину 2. Внешний вид макета и схема его подключения к плате Arduino приведены ня рисунках 3.7 и 3.8 соответственно. Рис. 3.7, Внешний иид макета
Риг. 3.8. Схема подключения кнопки к плате Arduino Скетч этого примера имеет вид: /* Пример: DigitalReadSerial находится в разделе 01.Basics примеров, расположенных непосредственно в среде програм- мирования IDE. Читает сигнал ня пине 2. Результат (числа 0 или 1) можно посмотреть в Инструменты -> Монитор порта. Код этого примера общедоступен: */ int pushbutton = 2; void setup() { Serial. begiin(9600); pinMode(pushButton, INPUT); 7 void loop() { int buttonstate = digitalRead(pushButton); Seri a I. p rintl n (bu tto n State}; dclay(l);
3.3. Работа с потенциометром Потенциометр (рис. 3.9) — это переменный резистор с ре- гулируемым сопротивлением. Потенциометры используются в различных отраслях электронной промышленности как ре- гуляторы различных параметров — громкости звук а, мощно- сти, напряжения, освещения и т. п. Рис. 3.9. Внешний вид потенциометра Пример 3.5. В этом примере от поворота ручки потенцио- метра будет зависеть яркость свечения светодиода.. Для сборки устройства нам потребуется (рис.. 3.10): * плата Arduino (или аналоги), * Breadboard, * 6 перемычек * папа-папаj» , * светодиод, • потенциометр (переменный резистор), • резистор на 220 Ом. Рис. 3.10. Комплект для макетировании
Схема подключения потенциометра и светодиода к плате Arduino приведена на рисунке 3.11. Рис. 3.11. Внешний вид макета Скетч примера имеет вид: /* задаём имена пинов со светодиодом и потенциометром: 8-й цифровой пин назовём led и подключим к нему светодиод; пин АО аналогового ввода назовём pot и подключим к нему потенциометр*/. ^define led 8 ^define pot АО void setup J { // пин co светодиодом настроим на вывод pinMode(ledr OUTPUT); // пин с потенциометром настроим на ввод pinModefpot, INPUT); } void loopQ < int x; // объявляем переменную x /* считываем напряжение с потенциометра; будет получено число от 0 до 1023; делим его на 4Г получится число в диапазоне 0...255, дробная часть его будет отброшена */ х = analogRead(pot) / 4; // выдаём результат на светодиод analog Writefled, х); }
Пример 3.fi, Он называется Analog'ReadSeria] в разделе 01.Basics примеров, расположенных непосредственно в сре- де программирования IDE. К плате подключается потенцио- метр (рис. 3.12,3.13). Рис. 3.12. Внешним вид макета Рис. 3.13. Схема подключения потен цл и метро! к плате Arduino Скетч примера имеет вид: /* Пример AnalogReadSerial. Читает аналоговый сигнал на пине АО. Результат (числа от 0 до 1023) можно посмотреть в Инструменты -> Монитор порта. Код этого примера общедоступен: V void sotup() { // инициализируем последовательную связь в 9600 битах // в секунду Serial, begin (9600);
// программа выполняется циклически void 1оор() { int sensorValue = analog Read (АО); // читает сигнал на пине АО Serial.printin(sensorValuc); // печать результата в мониторе порта. delay(l); // задержка в чтении для устойчивости } Пример 3.7. Он называется Head Analog V oltage в разделе 01.Basics примеров, расположенных непосредственно в среде программирования IDE. К плате подключается потенциометр (рис. 3.12, 3.13). /* ReadAnalog Voltage Читает аналоговый сигнал на пине АО. Результат в воль- тах (числа от 0 до 5) можно посмотреть в Инструменты -> Мо- нитор» порта. Код этого примера общедоступен: void setupf) { // инициализируем последовательную связь в 9600 битах // в секунду Serial.begin(9600); } void 1оор() // программа выполняется циклически { int scnsorYaiue = analogRead(AO); // читаем сигнал на пине АО Преобразование аналогового сигнала (числа в диапазоне 0 - 1023) в напряжение- (0 - 5V) */ float voltage = sensorValue * (5.0 / 1023.0); // печать результата Serial.println(voltage); } 3.4. Управление сервоприводом Сервопривод (рис. 3.14} — это мотор, положением валя которого мы можем управлять. От обычного мотора он отли- чается тем, что ему можно точно в градусах задать положе- на
ние, в которое встанет вал. Сервоприводы широко использу- ются в системах автоматизации технологических процессов и системах управления оборудованием. Рис. 3.14. Внешний вид сервопривода (Серсо-машинки) Для сборки системы с сервоприводом потребуется: • плата Arduino, * 3 перемычки «папа-папа * сервопривод. Компоненты для сборки системы «Arduino — сервопри- вод* приведены на рисунке 3.15. Рис,, 3.15. Комплект для макетирования Схема подключения сервопривода к плате Arduino пока- зана на рисунке 3.16
Рис. 3.1 (к Внешний вид минета Библиотека — это набор дополнительных команд (функ- ций}, который разработан вами или кем-то ранее, позволяю- щий значительно упростить программу. Для работы с серво- приводами мы используем библиотеку Servo.h. Скетч имеет вид: //подключаем библиотеку Servo.h для работы с сервоприводом # include < Servo. h> Servo servo; //объявляем переменную servo типа Servo void setup() //процедура setup { servo.attach(lO); //привязываем привод к пину 10 } void loopQ { se rvo. write (0); //ставим зал под 0 delay(2000); //ждем 2 секунды servo, write (180); //ставим вал под 180 delay (2000); //ждем 2 секунды } Последние четыре команды программы задают угол пово- рота валя сервопривода и время ожидания в миллисекундах доследующего поворота. В этом примере мы впервые исполь- зуем библиотеки.
3.5. Трехцветным светодиод Трехцветный светодиод (rgb led) — это три светодиода раз- ных цветов в одном корпусе. Они бывают как с небольшой пе- чатной платой, на которой расположены резисторы, так и без встроенных резисторов. Мы рассмотрим оба варианта. Вариант без встроенных резисторов Компоненты для сборки системы a Arduino — сервопри- вод* приведены на рисунке 3.17. Это: • плата Arduino, • breadboard, * 4 провода $ папа-папа »т * 3 резистора на 220 Ом, • трехцветный светодиод. Рис. 3.17. Комплект для макетирования При работе с трехцветным светодиодом без встроенных ре- зисторов необходимо знать, что назначение ножки светодиода можно определить по ее длине (рис. 3.18). Самая длинная — земля (OND), короче — зеленый (G), еще короче — голу- бой (В), а самая короткая — красный (К).
U Grepji Рис. 3.18. Внешний вид светодиода Схема подключения к плате Arduino трех цветы tiro свето- диода без встроенных резисторов приведена на рисунке 3.19. Рис. 3.19. Схема подключения к плате Arduino трехцветного светодиода беа встроенных резистор он Вариант со встроенными резисторами Компоненты для сборки системы Arduino следующие: • плата Arduino, * breadboard, * 4 перемычки «.папа-папа#, * трехцветный светодиод со встроенными резисторами.
Схема подключения к плате Arduino трехцветного све- тодиода со встроенными резисторами приведена на рисун- ке 3.20. Рис. 3.20. Схема подключения к плате Arduino трехцнетного свете диода со встроенными резисторами Скетч для обоих вариантов имеет вид: //объявляем переменные с номерами пинов int г = 13; int g = 12; int b = 11; void sctLip() //процедура setup { //объявляем используемые порты pinMode(r, OUTPUT); ’ pinMode(g, OUTPUT); pinMcdofb. OUTPUT); } void loop() //основная процедура { digital Write (г, HIGH); //включаем красный delay(500); //ждем 500 Me digital Write(r, LOW); //выключаем красный digitalWrite(gr HIGH); //включаем зеленый del ay (500); //ждем 500 Me digitalWrite(gf LOW); //выключаем зеленый digitalWrite(bf HIGH); //включаем синий delay(SOO); //ждем 500 Me digital Write(br LOW); //выключаем синий }
3.6. Работа с пьезоэлсмеитом Пьезоэлемент — электромеханический преобразователь, одним из разновидностей которого является пьезоизлуча- тель звука,, который также называют пьез о ди нами ком, про- сто звонком или английским buzzer. Пьезодинамик преобра- зует электрическое напряжение в колебание мембраны.. Эти колебания создают звук (звуковую волну). В нашем примере частоту звука можно регулировать, за- давая соответствующие параметры в программе. Пьезоэле- мент понадобится, когда имеется необходимость вырабаты- вать звуковые сигналы (транспорт, охранные системы и т. д.). На рисунке 3.21 показаны необходимые комплектующие элементы- Это: * плата Arduino, • breadboard, • две перемычки зпапя-папя>, • пьезоэлемент. Рис. 3.21. Комплект для макетирования Схема подключения пьезоэлементя к плате Arduino при- ведена ня рисунке 3.22.
Скетч имеет вид: jnt р - 3; // номер пина, к которому подключили пьезоэлсмент void setupQ //процедура setup { pinMode(pj OUTPUT); //объявляем пин как выход } void 1оор() //основная процедура loop < tone (pf 500); //включаем звук в 500 ц delay (100); //ждем 100 Мс tonefp, 1000); //включаем звук в 1000 Ги delay(lOO); //ждем 100 Мс } Рис. 3.22. Внешним вид макета Попробуйте поменять в программе частоты звука и вре- мя звучания. 3.7. Работа с фоторсзистором Фоторезистор — резистор, сопротивление которого зави- сит от яркости света, падающего на него. В нашей модели све- тодиод горит, только если яркость света над фоторезистором меньше определенной, эту яркость можно регулировать про- грамм но.
Фото резисторы используются в различных устройствах автоматики и автоматизации техно логических процессов как датчики освещенности. Фото резне тор позволяет определять степень освещенности, определять белые или черные участ- ки на поверхности и в соответствии с этим выполнять опреде- ленные действия. Для сборки модели с сервоприводом потребуются (рис. 3.23): * плата Arduino, * 6 перемычек «папа-папа*, * фоторезистор, • светодиод, * резистор ня 220 Ом, • резистор на 10 кОм. Рис. 3.23. Комплект для макет л ри ванн л Схема подключения фоторезистора к плате Arduino при- ведена ня рисунке 3.24.
Рие. 3.24. Внешний вид макета Скетч примера имеет вид: int led - 13; // светодиод подключен к пину 13 int Idr = 0; // фото резистор подключен к пину АО void sctup() //процедура setup { pinMode(Sed, OUTPUT); //пин 13 настраиваем на вывод } void 1оор() //основная процедура { //если показатель освещенности больше 100д включаем светодиод if (analogRead(ldr) > 100) digital Writefled, HIGH); else digitalWrite(led, LOW); //иначе выключаем } Если светодиод не реагирует на изменение освещенности, то попробуйте поменять число 100 в программе. Если он все время горит — увеличьте, если не горит — уменьшите. 3.8. Работа с матричной клавиатурой Для того чтобы подключить к плате одну кнопку, нужно использовать один цифровой пин и « землю £ — GND. Нажа- тием такой кнопки можно выполнить определенное действие, например можно управлять светодиодом, различными при- водами, механизмами и так далее. А что делать, если нам не- обходимо подключить много кнопок? Тогда придется задей-
ствовать большее число пинов и большее число проводов. Для того чтобы не увеличивать число пинов и придумали клавиа- туру (рис. 3.25). Рис. 3.25. Внешний вид макета Здесь видно, что для подключения 16-ти кнопок требует- ся всего 6 пинов, а не 16, как при обычном подключении. Для подключения 25-ти кнопок потребуется 10 пинов. Для под- ключения 36-ти кнопок потребуется 12 пинов ит. д. Налицо экономия пинов и соединительных проводов. Такая организация кнопок в матрицу имеет место в кла- виатурах компьютеров, калькуляторах и так далее. Внешний вид матричной клавиатуры из набора Arduino может быть такой, как показан на рисунке 3.26. Следующий пример будет ориентироваться именно на такую клавиатуру. Рйс. 3.26. Внешний имд матричной клавиатуры из набора
Подключим клавиатуру в соответствии с рисунками 3.25 и 3.27 к цифровым пинам 2...9. Нулевой и первый пины тро- гать не желательно, поскольку они предназначены для UART интерфейса, например, для подключения блютуэ-модуля. Рис. 3.27. Устройство и сборе Пример 3.8. Требуется определить нажатую кнопку ня клавиатуре и вывести соответствующий символ в монитор порта на компьютере. Скетч примера имеет вид: # include <Keypad.h> // подключаем библиотеку const byte ROWS = 4; //число строк у клавиатуры const byte COLS = 4; //число столбцов у клавиатуры //массив символов, расположенных на клавиатуре char hexaKeys[ROWS][COLS] = { {'Г/4777 *'}, // левый столбец клавиатуры {J275*/8\.'O'},// второй столбец клавиатуры {Л376'/9Г/#Г},// третий столбец клавиатуры {JA\JB7Cr/D*}// правый столбец клавиатуры }; // пины, к которым подключаем столбцы кнопок byte rowPins[ROWS] = {5, 4, 3, 2}; //пины, к которым подключаем строки (ряды) кнопок byte colPins[CCLS] = {9, 8, 7r 6}; //инициализируем экземпляр класса New Keypad Keypad custom Keypad = Keypad ( makeKcymap( hexa Keys), rowPins, coIPins, ROWS, COLS); void setup() { Serial. begin(9600); }
void loop() { char custom Key = custom Key pa d.getKey(); if (customKey) { Seri aLprintfln (custom Key); } } Если все выполнено верно, то в мониторе порта отобразит- ся символ кнопки, на которую нажимали.. Не забудьте в мо- ниторе порта внизу справа указать скорость передачи данных такую же, как в скетче. Пример 3.9. При нажатии кнопки «А? на клавиатуре тре- буется включить светодиод, а при нажатии кнопки с В» — вы- ключить его. Подключим клавиатуру по схеме, приведенной на рисунке 3.25, а светодиод — по схеме, приведенной на ри- сунке 3.2. < ’ветодиод в примере подключен к пину 10 через ре- зистор в 220 Ом. Скетч примера имеет вид: # include <Kcypadh> //подключим нужную библиотеку const byte ROWS = 4; // четыре ряда const byte COLS = 4; // четыре колонки //массив кнопок char keys [ROWS] [COLS] = { {'A'/B'/C'/D'}, //первая (левая) колонка кнопок {Tr/Fr/Gr/H'^ //вторая колонка кнопок {Т/У/К ;L'}f //третья колонка кнопок {'NJ/Nr/GJ/Pr} //четвертая (последняя) колонка кнопок }; // пины, к которым подключаем столбцы кнопок byte nowPins[ROWS] = { 5r 4, 3, 2 }; //пины, к которым подключаем строки (ряды) кнопок byte colPins[COLS] = { 9, 8, 7 ,6}; //создаем клавиатуру Keypad kpd = Keypad( irakcKcymap(kcys), rowPins, cqRds,. ROWS, COLS); #define ledpin 10 //светодиод подключим к пину 10 void setup() { pinMode(ledpin,OUTPUT); //настроим пин 10 на вывод Serial.begin(9600); }
void loop() char key = kpd.getKeyQ; //считываем нажатую кнопку iff key) // проверка на достоверность { switch (key) { //если нажата кнопка то включим светодиод case 'А4: d igita IW rite( led pi п, HIGH); break; //если нажата кнопка «В», то выключим светодиод case Ъг: digitalWrite(ledpir\ LOW); break; } } } 3.9. Датчик вибрации — модуль KY-002 Модуль KY-002 представ- ляет собой вибровыключатель (рис. 3.28). Внутри модуля на- ходятся два шарика. При ви- брации шарики прыгают по трубке и контакт размыкает- ся. На плате уже распаян под- тягивающий резистор для под- ключения напрямую к пину Arduino. Работает как обыкно- Рмс. 3.28. Внешний пид модуля KY-002 венная кнопка. KY-002 имеет на плате датчик вибрации (удара) и выда- ет на выход низкий уровень напряжения при срабатывании. Сенсор может работать при установке под любым углом и лег- ко подключается к Arduino. Также существует похожий дат- чик удара.
Подключение (рис. 3.29): * — цифровой выход (высокий/низкий уровень); * передний контакта — +5 В с платы Arduino; • «-» — общий. Рис. 3.29. Схема датчика вибраций Скетч примера имеет вид: //KY-002 вибродатчик int led = 13 ; // подключим светодиод к пину 13 int vlbrationSensor -10; // пин для подключения вибродатчика int value; // переменная состояния датчика void setup () { pinMode (led, OUTPUT) ; // на вывод pinMode (vibration Sense r, INPUT) ; // на ввод } void loop (} { // чтение состояния датчика value - digitalRead (vlbrationSensor) : // когда датчик вибрирует, светодиод загорается if (value == HIGH) { digitalWrite (led, LOW); } else { digitalWrite (led, HIGH}; > }
Сенсор можно использовать в системе охраны, системе ав- томатики дома или для контроля оборудования. ЗЛО. Цифровой датчик холла — KY-003 «KY-ООЗ» (рис™ 3.30) — дат- чик Холла (Hall sensor), являю- щийся, по сути, магнитным пе- реключателем™ Если рядом с ним нет магнитного поля, то ня сиг- нальном выходе датчика имеется высокий уровень. Ес- ли магнитное поле присутству- ет, то ня выходе имеет место низ- кий уровень напряжения. Таким образом, сенсор имеет цифровой Рис. 3.30. Внеш ими вид модули KY-003 выход. На плате есть светодиод, который горит, когда есть маг- нитное воздействие. Существуют также аналоговый и комби- нированный датчики Холла. Подключение датчика Холла: • *S* — цифровой выход; • «средний контакта — 4-5 В (можно подключить к 4-5 В на плате Arduino); * «-s> — общий. Датчик чувствителен к полярности магнитного поля. Пример 3.10. Подключим вывод датчика к пину 10 платы Arduino, а вывод «-& к пину GND-платы. Средний кон- такт датчика не используем. Подключим светодиод через га- сящее сопротивление в 220 Ом между пином GN D-платы и пином 13 платы, соблюдая полярность светодиода. Скетч при- мера имеет вид: int Led = 13 ; int SENSOR = 10 ; int vai ; void setup ()
pinMode (Led, OUTPUT) ; pinModo (SENSOR, INPUT) ; } void loop (} { vdl = digital Read (SENSOR) ; // читаем сенсор if (val == LOW) { digitalWrite (Led. HIGH); } else { digitalWrite (Led, LOW); } } 3.11* Модуль с кнопкой — KY-004 KY-001 — модуль с кнопкой выполнен на печатной плате и имеет нормально разомкнутые контакты и (рис. 3.31). При нажатии на кнопку контакты замыкаются, а на выхо- де появляется напряжение низкого уровня. Между контакта’ ми «8^ и «средний контакта впаян подтягивающий резистор 10 кОм. Подключение: • — выход; Рис. 3.31. Внешний сид модуля KY-004 средний контакт * — к не- му нужно подключить +5 В с платы Arduino; * — общий. Пример 3.11. При нажатии на кнопку должен загореться светодиод. Светодиод подклю- чим к пину 13 через гасящий резистор в 220 Ом. Выход кноп- ки подключим к пину 10. Скетч примера имеет вид:
// KY-004 модуль с кнопкой int Jed = 13 ; // пин для светодиода int buttonPin = 10; // пин для кнопки int value ; // переменная для хранения состояния кнопки void setup () { pinMode (led, OUTPUT) ; // пин светодиода — на вывод pinMode (buttonPin, INPUT) ; // пин кнопки — на ввод } void loop () { value - digitalRead (buttonPin); // чтение значения с кнопки // когда кнопка нажата, светодиод загорается if (value == HIGH) digitalWrite (led, LOW); else { digitalWrite (led, HIGH); } } 3.12. Инфракрасный светодиод — KY-005 KY-005 (рис. 3.32) — этот модуль имеет инфракрасный из- лучающий светодиод и может работать в качестве пульта дис- танционного управления быто- вой техникой в доме по ИК-кана- лу. Этот ИК-передатчик можно использовать для передачи ко- манд на ИК-приемник. На плате распаян резистор из расчета питающего напряже- ния 4 5 В. Рис. 3.32. Внешний вид модуля KY-005
Подключение KY-005: * — общий провод; * ♦В» — сигнальный провод; * ♦средний^ — + 5В. При подключении к плате Arduino общий провод подклю- чается к минусу, подключается к цифровому пину. 3.13. Модуль с пассивным звуковым излучателем — KY-006 Рис. 3.33. Внешний вид модули KY-006 KY-006 (рис. 3.33) — модуль с пассивным звуковым излучателем представляет собой зуммер (buzzer). В отличие от активного зуммера, пассивному нужен внешний звуко- вом генератор, в качестве которого может работать плата Arduino. Зато появляется возможность регулиро- вать частоту звука. Модуль KY-0U6 ещё называ- ют пассивной пищалкой. Визуаль- на пассивная от активной пищалки ничем не отличается. Лишь на активной пищалке наклеена белая наклейка, защищающая мембрану. Подключение: • ♦-»— общий провод; * ♦S» — сигнальный провод; * ♦Средний» — 4- эВ. Пример 3.12. Подключим модуль между пином 10 и G\D. Будем формировать звуковые колебания постоянной частоты. Скетч (KY-006.1. то) этого примера имеет вид: int buzzer = 10; void setup () pinMode (buzzer, OU I PUT);
void loop () { unsigned char i; while (1) { // генерируем звук(1 КГц), частота задается задержками for (i = 0; i <80; i + + ) { digital Write (buzzer, HIGH); // Звук есть delay (1); // 1 мс digital Write (buzzer, LOW); // Звука нет delay (1) ; // 1мс } } Пример 3.13. Подключим модуль между пином 10 и GND, Будем формировать звуковые колебания разных частот. Скетч (KY-006.2.ino) этого примера имеет вид: // KY-006 пьезосирена int piezoSiren = 10 ; // назначение пина для сирены int i, j ; // переменные циклов void setup () pinMode (piezoSiren, OUTPUT) ; // пин работает на вывод } void loop () { for (i - 0; i <300; i-ы-) // цикл для звука высокой частоты { // вкл. напряжение высокого уровня digital Write (piezoSiren^ HIGH) ; delay (1); // задержка // вкл. напряжение низкого уровня digital Write (piezoSinen, LOW) ; delay (1) ; // задержка. } for (i = 0; i <100; I++) // цикл для звука низкой частоты {
// бкл . напряжение высокого уровня digitalWrite (piezoSiren, HIGH) ; delay (2) ; // задержка // вкл. напряжение низкого уровня digitalWrite {piezoSiren, LOW) ; delay (2) ; // задержка } 3.14- Лазерный модуль с длиной волны 650 им —KY-008 Рие. 3.34. Внешний вид модуля KY-008 Предназначен для генерации лазерного луча (рис. 3.34). Рабочий ток составляет 30 мА. Подключение: • «-♦ — общий провод; * <S» — сигнальный провод; * * средний» — + 5 В. На плате распаян токоограничи- вающий резистор. Можно работать, как с обычным светодиодом. Пример 3.14. Подключим модуль между пинами 13 и G ND-платы. Будем формировать лазерные излучения. Скетч (KY-008.mo) этого примера имеет вид: // KY-008 int led = 13 ; // пин для светодиода void setup () { pinMode (led. OUTPUT) ; // пин — на вывод } void loop (} { digitalWrite led, LOW); delay (WOO); digitalWrite (led, HIGH); }
3.15. Трехцвстиый RGB-модуль с SMD-светодиодом — КУ-009 Внешний вид модуля приведен ня рисунке 3.35. К Л -009 — модуль вы- полнен на печатной плате с уставов- ленным трехцветным RGB ЭМВ-све- тодиодом (модель 5050) и имеет три входа для управления и получения нужного цвета излучения светоди- ода (красный, зеленый и синий). На плате нет токоограничитель- Рис. 3.35. Внешний вид ных резисторов, поэтому их нуж- модули KY-009 но подключить последовательно со входами управления самостоятельно. Например, при под- ключении к платам Arduino или питании от 5 В нужны та- кие резисторы: • 180 Ом для входа; • 100 Ом для «О* входа; • 100 Ом для -аВ* входа. Характеристики: • прямой ток: 20 мА; • прямое напряжение для входа: 1,3 В; * прямое напряжение для cG^ входа: 2,8 В; * прямое напряжение для входа: 2,8 В; * рабочие температуры: -25...+ 85. Подключение: * — плюс управления красным цветом.; • $Gfr — плюс управления зеленым цветом; мВ» — плюс управления синим цветом; • —общий. Существует похожий трехцветный светодиодный модуль с обычным светодиодом и установленными на плату резисто- рами.
3.16. Модуль с оптическим прерывателем — KY-010 Рис. 3.36. Внешний вид модули KY-OLO Внешний вид модуля приве- ден на рисунке 3.3Б, а его схема — на рисунке 3.37. KY-010 — модуль с оптиче- ским прерывателем определяет наличие или отсутствие светово- го потока между светодиодом и фототран листа ром. Когда поток не перекрыт, то на выходе мо- дуля присутствует напряжение низкого уровня. Датчик можно использовать для контроля частоты враще- ния двигателей или определения, наличия объекта между све- тодиодом и фототранзистором. Рис. 3x37. Схема модуля K.Y-O1O Подключение: • sS* — выход, подключается к цифровому входу Arduino; • ^средний контакт* — питание «4-5 В*; * — общий.. Пример 3.15. Подключим модуль к пинам 10. GND и &V платы Arduino. Подключим обычный светодиод, соблюдая по- лярность, с гасящим резистором в 220 Ом между пинами 10 и GND платы Arduino. При перекрытии светового потока в датчи-
ке будет загораться светодиод. Скетч (KY-010.ino) этого при- мера имеет вид: int Led - 13 ; // светодиод int buttonpin = 10; // датчик int val ; void setup () { pinMode (Led, OUTPUT) ; pinMode (buttonpin, INPU Г) ; } void loop () { val = digitalRead (buttonpin) ; // читаем состояние датчика if (val == HIGH) { digital Write (Led, HIGH); // включаем светодиод } else { digitalWrite (Led, LOW); } ЗЛ7» Двухцветный светодиодный модуль — KY-011 Внешний вид модуля приве- ден на рисунке 3.38„ Подключение KY-011: * < — > — катод светодиодов; * «.средний контакта — анод {+) красного светодиода; * tfSfr — анод (+) зеленого светодиода. Характеристики KY-011: * свечение: красный и зеле- ный; Рис. 3.38. Внешний вид модуля КЛ -011
• диаметр: 5 мм; * напряжение: 2,0...2,5 В; * ток: 10 мА; • подключение через токоограничительные резисторы в 330 Ом. Пример 3.16. Подключим средний контакт модуля через гасящий резистор 330 Ом к пину 10 платы Arduino. Подклю- чим контакт модуля через гасящий резистор 330 Ом к пи- ну 11 платы Arduino. Подключим контакт модуля к пи- ну GND платы Arduino. Заставим мигать светодиоды.. Скетч (KY-011.ino) этого примера имеет вид: int Led 1 = 10 ; // светодиод 1 int Led? =11; // светодиод 2 void setup () { pinMode (Ledl, OUTPUT) ; pinMode (Led?, OUTPUT) ; } void loop () { digitalWrite (Ledl, HIGH); digitalWrite (Led2. LOW); delay (500); digital Write (Ledlr LOW); digitalWrite {Led?, HIGH); delay (500); } 3.18. Активный звуковой модуль (зуммер) — KY-012 Внешний вид модуля приведен на рисунке 3.39. Подключение KY-U12: * — общий: • *8^ — плюс питания (внимание: попадаются модули с перепутанной полярностью);
KY-012 — активный звуко- вой модуль (зуммер) представляет собой печатную плату с 5-вольто- вой пьезосиреной. Для включения звука нужно просто подать пита- ние 5 В ня излучатель, например с выхода Arduino. Характеристики: • напряжение питания:-I-5 В; Рис. 3.39. Внешний вид модуля K.Y-012 * регулировка частоты: нет. Достоинства: * для ее работы на вход надо просто подать 4-5 В. Недостатки: • невозможность менять частоту звука. 3.19. Аналоговый температурный сенсор — KY-013 Внешний вид модуля приведен на рисунке 3.40. На выходе имеется напряже- ние, пропорциональное температу- ре. Измеряет температуру в диапа- зоне -55 DC... + 125a с точностью 4- / -0,5 “С. Подключение: • —общий; * «средний контакт* — +5 В; * «S* — сигнальный. Похожие модули: Рис. 3.40. Внешний вид • DS18B20 — цифровой термо- модули KY-013 метр (1-Wire интерфейс); * KY-001 — модуль датчика температуры на базе DS18B20; • KY-028 — температурный датчик с цифровым выхо- дом;
* KY-015 — модуль с датчиком температуры и влажно- сти DHT11. Пример 3.17. Вывести в монитор порта показания датчи- ка. Скетч примера (KY-OlS.ino) имеет вид: #indude <math.h> int sensor Pin = A5; // подключаем датчик на аналоговый вход double Thermistor; int Raw A DC) double Temp; Temp - log(10000.0*((1024.0/RawADC-l))); Temp = 1/ (0.001129148 + (0.000234125 + (0.0000000676741 + Temp * Temp ))* Temp ); Temp = Temp -273.15; // преобразуем Кельвин в Цельсий return Temp; } void setupf) < Serial.begin(9600); void loop() { int readVal=analogRead(sensorPin); double temp - ThermistorfreadVal); Serial, print Inf temp); // выводим температуру в монитор порта dclay(500); 3.20. Модуль с датчиком температуры и влажности DHT11 — KY-015 Внешний вид модуля приведен на рисунке 3.41. Харак те ристики: * напряжение питания. В: 3,3...5; • выход: цифровой; * диапазон измерения влажности, % КН: 20...90; * диапазон измерения температуры, ЦС: 0...50; * точность измерения влажности, % НН: + / - 5;
* точность измерения те мне р ату - рыт °C: -+ / - 2; • разрешающая способность при измерении влажности, % КН: 1; разрешающая способность при измерении температуры, Ч?: 1; • долгосрочная стабильность, % КН / год: < ± 1; * размеры, мм: 32x14. Похожие модули: * DS18B20 — цифровой термометр (1 Wire интерфейс); Рис. 3.41. Внешний вид модули KY-015 • KY-001 — модуль датчика температуры на базе DS18B20; • KY-028 — температурный датчик с цифровым выходом; • KY-013 — аналоговый температурный сенсор. Подключение: • — общий; * передний контакта — 4 5 В; мЙ» —сигнальный.. Для работы используется библиотека DHYLib. Ее описа- ние можно найти по ссылке: http://playground.ardiiino.ee/ Main/DHTLib. 3.21. Трех цветным RGB-светодиодный модуль — KY-Olfi Внешний вид модуля приведен на рисунке 3.42. Содержит KGB-светодиод с тремя входами, что позволяет получать нужный цвет излучения с помощью подачи нужно- го напряжения на входы. Светодиод имеет общий катод. Огра- ничительные резисторы установлены на плате. Подключение: • о К* — плюс 5 В (красный); • «G* — плюс 5 В (зеленый); • В» — плюс 5 В (синий):
Phc. 3.42. Внешний имд модуля KY-01B • $-»— общий источника пи- тания. Пример 3.18. Подключим светодиод и заставим его све- титься. Скетч примера (KY-016. то) имеет вид: //KY-016 3-соЮг LED module int redpin = 11; // выбор пина // для красного светодиода int bluepin = 10; // выбор пина // для синего светодиода int greenpin = 9 ; // выбор липа для зеленого светодиода int val; void setup () { pinMode {redpin, OUTPUT); pinMode (bluepin, OUTPUT); pinMode (greenpin, OUTPU Г); Serial.begin (9600); } void loop () { for (val = 255; val> 0; val —1 { analog Write (redpin, val); analogWrite (bluepin, 255-val); analogWrite (greenpin, 128-val); delay (50); Serial.printin (val, DEC); } for (val = 0; val <255; val +4-} { analogWrite (redpin, val); analogWrite (bluepin, 255-val); analogWrite (greenpin, 255-val); delay (50); Serial.printin (val, DEC); } analogWrite (redpin, 0);
analog Wnte (bluepin, 0); analogWrite (greonpin, 0}; anatogWrite (redpin, 255); delay (3000); analogWrite (redpin, 0); analog Write (bluepin, 255); delay (3000); analogWrite (bluepin, 0); analogWrite (greenpin, 255); delay (3000); analogWrite (greenpin, 0); delay (1000); } 3*22. Датчик наклона — KY-017 KY-017 — переключа- тель, срабатывающий в. за- висимости от его наклона. Переключение происходит шариком ртути, который находится в герметичной сте- клянной колбе (рис. 3.43}. Работает как обычная кноп- ка. Рис. 3.43. Внешний вид модуля KY-017 Подключение: • «—» — общий; • ^средний контакта — 4-5 В; * —сигнальный. На плате датчика имеется светодиод, который при замы- кании горит красным. Пример 3.19. Информацию о состоянии датчика бу- дем отображать в мониторе порта,. Вывод датчика подключаем к пину 2 платы. Скетч примера (KY-017.ino) имеет вид: int push Button = 2; void sctup()
{ Serial. Ьсд₽п(960С); plnMode(pushButton, INPUT); } void loop() { int buttonState - digital Read (push Button); Serial. printin (button State); delay(lO); } 3.23. Светочувствительный датчик на фоторезисторе — KY’()18 Рис. 3.44. Внешни!! вид модуля КЛ 01S KY-018 — модуль (рис. 3.44) со- держит фоторезистор (датчик осве- щенности), который может приме- няться для измерения интенсивности света или определения его наличия/ отсутствия. При отсутствии света со- противление фоторезистора большое и доходит до 1 мОм, а при его освеще- нии падает до нескольких Ом. Фоторезисторы — это полупро- водниковые фоточу ветвите л ьные устройства, которые имеют высокую чувствительность, бы- стрый отклик, устойчивые спектральные характеристики. Они широко применяются в видеокамерах, в садовых све- тильниках на солнечных батареях, датчиках освещенности. ночниках и других устройствах контроля освещения. Подключение: * «S# — аналоговый выход; * «средний контакт* — +5 В (можно с платы Arduino}; * «-»— общий. Между выводами «8^ и «средний контакт* датчика впа- ян резистор 10 кОм, который вместе с самим фот о резистором образует делитель напряжения.
Пример 3.20. Программа выводит в монитор порта значе- ние, приходящее с фоторезистора и включает/выключает све- тодиод с задержкой, которая зависит от значения выходного сигнала на датчике. При хорошем освещении фоторезистора светодиод мигает быстро, при плохом — медленно. Скетч это- го примера (KY-018.ino) имеет вид: // Программа для KY-018 int photoresistorPin - Al; // пин для датчика int tedPin = 13; // пин для светодиода int photocellstorValue - 0: // значение, принятое от датчика void setupf) { pinMode{ledPinf OUTPUT); Serial. begin(9600); } void loop() { photonesistor Value = ana I ogRcad{ photorcsistorP'in); digitalWrite(ledPin, HIGH); del a у (photores i storVa I u e); digitalWrite(ladPin, LOW); delay {photoresistorValue); // выводим значение в монитор порта Serial.println(photorcsistorValuc, DEC); } 3.24. Одпоканальный модуль реле — KY-019 KY-019 — одноканальный модуль реле (рис. 3.15), име- ющий один нормально замкнутый и один нормально разом- кнутый контакты. Устройство может работать как с платами Arduino, так и с другими микроконтроллерами. Для коммутации нагруз- ки, работающей на постоянном токе с возможностью приме- нения ШИМ, можно использовать силовой ключ на полевом транзисторе IRF520.
Рис. 3.43. Внешний ынд модуля K.Y-019 Используется для коммутации нагрузки с большим напряжением или током. Коммутируемая нагрузка: 1 Переменного тока: 10А/250 В. 1 Постоянного тока: 10А/Э0 В. Ня плате распаян транзистор, защитный диод и светодиод, пока- зывающий срабатывание реле. Подключение модуля: #8» — управляющий сигнал +ЗЛ..12В; • «+»— + 5 В источника питания; • — минус источника питания; * — нормально замкнутый контакт реле; • — нормально разомкнутый контакт реле: * * COMMON » — общий контакт реле. Пример 26.1. Включаем и выключаем реле с периодом 2 се- кунды. Модуль подключим к пину 9 платы. Скетч этого при- мера (KY-019..ino) имеет вид: //KY-019 - одно канальный модуль реле int ControSRelay = 9; // пин для модуля void setup () { pinMode (ControlRelay, OUTPUT); // пин — на вывод } void loop () digitalWrite (ControlRelay, HIGH); // включение реле delay (2000); digitalWrite (ControlRelay, LOW); // выключение реле delay (2000); }
3.25. Датчик наклона — KY-020 KY-020 (рис. 3.46) — это пере- ключатель, срабатывающий от на- клона модуля и имеющий цифровой интерфейс. При наклоне датчика в одну сторону контакты и за- мыкаются с помощью встроенного небольшого металлического шарика, при наклоне в. другую сторону — раз- мыкаются. Модуль позволяет опреде- лять только 2 положения и не изме- Рие.. 3.46. Внешний вид мод ул st KY-020 ряет угол наклона. Между контактами ^средний* и впаян резистор 10 кО, Подключение модуля: • — выход; • <с+& — -I- 5 В источника питания; • «-» — минус источника питания. Пример 3.21. Состояние датчика наклона определяется по свечению светодиода. Скетч этого примера (KY-020. in о) имеет вид: // KY-020 датчик, переключающий контакты при наклоне int ied = 13 ; // пин для светодиода iint tiltSensorPin = 10; // пин для датчика наклона int value ; // переменная для хранения состояния датчика void setup () { pinMode led, OU I'PU I} ;// пин светодиода — на вывод pinMode (tiltSensorPin. INPU Г) ; //пин дачика — на ввод } void loop () { value = digital Read (tiltScnsorPin) ; // чтение состояния датчика if (value == HIGH) // зажигаем светодиод < digital Write (led, HIGH); } else
{ digitalWrite (ledr LOW); } } 3.26. Модуль с герконом — KY-021 Рис. 3.47. Внешний вид модули KY-021 Модуль KY-021 (рис, 3.47) имеет небольшой нормально открытый гер- кон (герметизированный контакт), который замыкается при поднесении магнита. При этом на выходе моду- ля появляется низкий уровень напря- жения. Подключение модуля: • <rS» — выход; * <+» — 4- 5 В источника питания; * «с-* — минус источника питания. На плате установлен резистор 10 кОм между контактом л + » и контактом $8^. Устройство может использоваться как датчик охранной сигнализации при открывании двери или окна. Работает как обычная кнопка. Пример 3.22. При срабатывании геркона будет загорать- ся светодиод. Светодиод подключим через резистор в 220 Ом. Скетч этого примера {KY-021.ino) имеет вид. // KY-021 небольшой геркон int led = 13 ; // пин светодиода int mini Reed SensorPin - 10; // пин геркона int value ; // состояние геркона void setup () { pinMode (Gedr OUTPUT) ; // пин светодиода — на вывод pinMode (miniReedSensorPin, INPUT); // пин геркона — на ввод } void loop (J { // чтение значения с геркона
value = digitalRead (mini ReedSensorPin J ; if (value == HIGH) {// когда геркон замыкается, светодиод гаснет digitalWrite (led, LOW); } el so { digitalWrite (led, HLGH1; } } 3,27. Модуль ИК-приёмника — KY-022 Модуль KY-022 ИК-приёмника (рис. 3.48) выполнен ни базе датчи- ка VS1838В (рабочая частота 38 кГц) и предназначен для приема данных по инфракрасному каналу от пуль- тов дистанционного управления те- левизором и от другого оборудова- ния в доме. На плате имеется светодиод с то- коограничивающим резистором рнС. 3.48. Внешний вид 1 кОм, который находится между модуля KY-022 контактами « + * и «Sfr. Те х ни че ск ие х а р ак те р исти к и: * несущая частота: 38 кГц; * дистанция приема от обычного пульта: 18...20 м; • угол приема: 90 градусов; * напряжение питания постоянного тока: 4-2,7...+5 В; • диапазон рабочих температур: -20°...+85° С.. Подключение модуля: * «В* — выход; • <ос+« — + 5В источника питания; * я—» — минус источника питания.
Применение: управление устройствами через пульт дистанционного управления по ИК-кяналу. Этот ИК-при- ёмник может работать вместе с излучающим ПК-светоди- одом- Принципиальная схема KY-022 приведена на рисун- ке 3.49- LED1 Рис. 3-49. Схема модули К4 -4)22 Структурная схема датчика VS1838В приведена на рисун- ке 3.50. Рис. 3.50. Структурна л схема датчика VS1838B
Пример 3.23. Скетч примера (КY -022-1 Лио} позволя- ет принимать команды от инфракрасного пульта и показы- вать их в мониторе порта. В коде используется библиотека IRremote. ИК-приёмник подключается к пину 11 платы. #indude <IRrcmote..h> // подключение библиотеки int RECV PIN = 11; // пин для приемника IRrecv imecv{RECV_PIN); deoode_results results; void setup() { Serial. begin(9600); rrecv.enableIRIn(); // инициализация приемника } void юор() < if (irrecv.d ecod e(8iresij Its)) { //вывод результатов в монитор порта Seгтal.print Iп(resuIts.vaIue, HEX); // прием следующего значения lrrecv.resume(); } } Пример 3.24. Скетч примера (КА-022-2.hio) позволяет принимать команды от инфракрасного пульта телевизора, по- казывать их в мониторе порта и управлять серво-машинкой. В коде используется библиотека IRremote.h. Её необходимо скачать из Интернета в папку libraries (библиотеки) папки ar- duino, в которой расположено всё, что связано с программи- рованием плат Arduino. ИК-приёмник подключается к пину 11 платы, а серво-машинка — к пину 10. Следует сказать несколько слов про ИК-пульт дистанци- онного управления. Подойдёт от любого телевизора, но не- обходимо с помощью монитора порта посмотреть коды, ко- торые он генерирует при нажатии той пли иной кнопки. У меня подошел пульт от телевизора Philips. Я решил для рабо- ты использовать кнопки з1^ и #2* пульта. В мониторе порта я определил, что нажатие кнопки «1 > дает к од 801, а её у дер-
жание — код 1- Нажатие кнопки «2* даёт код 802, а её удер- жание — код 2. С учётом этого я и строил скетч. Скетч примера имеет вид: # include < Servo, h> ^include <IRremote.h> IRrecv irrecv(ll); // ИК-приёмник присоединен к пину 11 decode_results results; Servo servoMain; int servPoz = 90; //начальное положение сервомашинки int lastPoz - 0; void setupQ { Serial.begin(960Q); Irnecv. enable! RI n (); servoMain.attadi( W); // ссрво-машинкз присоединена к пину 10 servoM a i п. w rite( servPoz); } void loop() { if (rrrecv.dccodc!(&results)) < int res = results.value; Serial.pnntln(resr HEX); if ((res= = 0x801)or(nes==0xl)) // если нажата кнопка "Г7 { lastPoz-rcs; servPoz+ + ; servoM a i n. w rite( servPo z); } else If((res==0x802)or(res==0x2)) // если нажата кнопка '‘2"' { servPoz-’; lastPoz=res; servoM a i n. w rite( servPoz); } irnecv. re sume(); delay(lO); } } 13И
Пример 3.25. Это, по сути, предыдущий пример» но ма- шинка вращается быстрее в 10 раз. ИК-приёмник подключа- ется к пину 11 платы, а серво-машинка — к пину 10. Скетч примера (KY-022-ЗЛпо) позволяет принимать команды от ин- фракрасного пульта, показывать их в мониторе порта и управ- лять серво-машинкой: # include <Servo.h> #inctudc <IRremote.h> IRrccv irrecv(ll); // ИК-приёмник присоединен к пину 11 decode_results results; Servo servoMain; int servPoz = 90; // начальное положение серво-машинки int lastPoz = 0; void setupQ { Serial. begin(9600); i rrecv . e nablel RI n(); // сервисна шинка присоединена к пину 10 servoMain .attach( 10); servoMain. write (servPoz); } void JoopO { if (rrecv.d ecod e(&resu Its)) { int res - results, value; Serial. println(nes, HEX); if ((res==0x801)or(nes==0xl)) //если нажата кнопка Tr { lastPoz=res; servPoz=servPoz+10; se rvoM a in. wnite{ servPoz}: } else if( (res=-0x802)or(res==0x2)) // если нажата кнопка "2" { servPoz=servPoz’ 10; lastPoz=res.; serv о Ma i n. wri te (se rv Poz);
irrccv.resume(); delay(lOO); } } Пример 3.26. С помощью пульта от телевизора будем управлять мощным реле — модуль КУ-019. ИК-приемник подключается к пину 11 платы, a KY-U19 — к пину 9. Скетч примера (KY-022-3.inc} позволяет принимать команды от ин- фракрасного пульта, показывать их в мониторе порта и управ- лять реле: # include <IRremote.h> IRrecv irrecv(ll): decode_results results; int ControlRelay=9; //пин реле void setup() { Serial.begin(9600); ir necv. ела blel RIn(); //пин репе настроим на вывод pinMode (Control Re I ay, OUTPUT); > void loop() { if (irnecv.decode(&results)) { int res = results.value; Serial, printin (res, HEX); if ((res==0x8i01)or(nes-=0xl)) // если нажата кнопка '’V { digital Write (ControlRelay, HIGH); } else if((res==0x&02)or(res==0x2)} // если нажата кнопка "2" { digitalWrite (ControIRclay, LOW); } irnecv.resumef}; delay(lOO); } }
3*28. Двухосеиой джойстик — KY-023 Рис. З.а£. Внешний вид модуля KY-O23 KY’023 (рис. 3.51) — представляет собой двухосевой джойстик (Joystick) и содержит потенциометр оси X, по- тенциометр оси Y и кнопку. Модуль можно использовать, например, для дистанционного управления двухко- ординатным поворотным устройством видеокамеры, которое можно вращать в двух плоскостях. X а рак тер истин и: • напряжение питания, В: +5; * размеры, мм: 10 х 26 х 32. Подключение джойстика* «GlMlb — общий провод; < +-5\> — 45 В питания: ♦VRx# — аналоговый выход потенциометра оси X; < VKyfr — аналоговый выход потенциометра оси I; — цифровой выход кнопки. Пример 3.27* Вывести в монитор порта аналоговую ин- формацию, снимаемую с осей X и У джойстика, и состояние кнопки. Положение ручки джойстика определяется числами от О до 1023 по каждой оси. Состояние кнопки определяется чис- лами О и 1. Скетч примера (KY-023) имеет вид: int Joystick _Х = АО; // ось х int Joystick_¥ = Al; // ось у int JoyStick._Z - 3; // кнопка void setup () { pinMode (JoyStick_Xr INPUT); pinMode (JoyStick_Y, INPUT); pinMode (JoyStick_Zf INPUT_PULLUP); Serial.begin (9600); // 9600 bps } void loop ()
{ int x, у, z; x = analogRead (JoyStick_X); у = analog Read (JoyStick_Y); z = digitalRead (Joystick _Z); Seri a I. print (xT DEC); Serial.print (V'); Serial.print (yd DEC); Serial.print (V); Serial.print In (z, DEC); delay (WO); } 3,29. Комбинированным линейный датчик Холла — KY-024 Рис. 3.52. Внешний вид модули KY-024 Подключение: KY-O24 (рис. 3.52) — модуль содержит магнитный датчик Хол- ла, компаратор и имеет универ- сальную конструкцию с двумя выходами: цифровым и аналого- вым. Может использоваться для определения магнитного поля ря- дом с датчиком. Модуль легко подсоединяется к платам Arduino и другим микроконтроллерам. Существуют и другие датчики Холла: аналоговый и цифровой. • «АСЬ — выходное напряжение в реальном времени (ана- логовый выход); * — общий источника питания; • #+» — -1-5 В источника питания; * «DO» — цифровой выход, пороговое напряжение регули- руется потенциометром. На плате имеется светодиод, который загорается при де- тектировании магнитного поля.
Пример 3.28. Вывести в монитор порта аналоговую и цифровую информацию,, снимаемую с датчика. Аналоговый сигнал лежит в диапазоне О „.1023, причем при отсутствии магнитного поля он равен 511. Таким обра- зом, видно, что датчик реагирует не только на величину, но и на полярность внешнего магнитного поля. Цифровой сиг- нал представлен числами 0 и 1. Скетч примера (KY-024) име- ет вид: int ап = АО; // пин для ввода аналогового сигнала int zif- 2; // пин для ввода цифрового сигнала void setup () { pinMode (an, INPUT); pinMode (zif, INPUT); Serial.begin (9600); // 9600 bps } void loop () { mt a, z; a = analogRead (an); z = digital Read (ziT); Serial.print (a, DEC); Serial.print ("/); Serial.printin (z, DEC); delay (100); } 3.30, Модуль с герконом — KY-025 Внешний вид модуля KY-025 приведен ня рисунке 3.53. Геркон реагирует ня присутствие магнитного поля замыкани- ем своего контакта. При замыкании загорается красный светодиод ня плате. В отличие от модуля с простым герконом, у этой платы имеют- ся четыре вывода. С помощью построечного резистора можно отрегулировать порог срабатывания датчика. Светодиод заго- рается при срабатывании геркона.
Подключение: «АСЬ — выходное напряжение в реальном времени (ана₽ логоеый выход); «G* — общий источника питания;. « + *— 4-э В источника питания; «DO» — цифровой выход, пороговое напряжение регулИ’ руется потенциометром. Рис. 3.53. Внешний вид модуля КА -025 Пример 3.29. Вывести в монитор порта аналоговую и циф- ровую информацию, снимаемую с датчика. Аналоговый сигнал лежит в диапазоне 0...1023, причем при отсутствии магнитного поля он равен 1023, а при его по- явлении он становится равным 1. Датчик реагирует на поляр- ность внешнего магнитного поля. Цифровой сигнал представ- лен числами 0 и 1. Скетч примеря (KY-025) имеет вид: int ап - АО; // пин для ввода аналогового сигнала int zif= 2; // пин для ввода цифрового сигнала void setup () { pinMode (ап, INPUT); pinMode (zif, INPUT); Seri a I. beg in (9600); // 9600 bps } void loop () { int a, z; a = analogRead (an); z - digitalRead (zif);
Serial.print (af DEC); Serial.print ("/')? Serial.printin (zf DEC); delay (IDO); } 3.31. Датчик пламени инфракрасный — KY-026 KY-026 (рис. 3.54) — датчик пламени реагирует на инфра- красное излучение (открытый огонь) и наиболее чувствителен к длинам волн от 760 нм до 1 100 нм. Рис. 3.54. Внешний вид модуля ICY-026 Этот детектор огня имеет два выхода — цифровой и ана- логовый и легко подключается к платам Arduino и другим микроконтроллерам, На плате имеются два светодиода — ин- дикации питания и индикации выхода с компаратора при об- наружении огня. Модуль выполнен на микросхеме LM393. Характер исти к и: * угол обнаружения пламени, град: 60; * напряжение питаният В: 3..5,5; * размеры (длина х ширина), мм : 36 х 16. Подключение датчика: * *А(Ь — выходное напряжение в реальном времени (ана- логовый выход); • -G » — GND (общий); • «+» — плюс питания;
• ^DCb — цифровой выход; когда температура пламени превысит определенный порог, на нем появляется напряже- ние высокого уровня (порог срабатывания регулируется по- тенциометром). Пример ЗЛО. Вывести в монитор портя аналоговую ин- формацию, снимаемую с датчика. При отсутствии огня выходной аналоговый сигнал ле- жит в диапазоне Н00...900. При наличии огня — в диапазоне 100.. .200. Реагирует на пламя зажигалки на расстоянии в 70 см. Скетч примера (KV-026) имеет вид: //KY-026 датчик пламени int flam&DigitalPin - 2; // пин цифрового выхода датчика int flameAnalogPin = АО;. // пин аналогового выхода датчика int val не Digital; // переменная для цифрового значения float valueAnalog; //переменная для аналогового значения void setup () { pinMode (flameDigitalPin, INPUT) ; pinMode (flameAnalogPin, INPUT) ; Serial.begin(9600); } void loop Q { va ueAnalog = anaiogRead(flameAnalogPin); / / вывод аналогового значения в монитор порта Serial.println(valueAnalog); delay(lOOO); } 3.32. Датчик наклона со светодиодом — KY-027 Внешний вид датчика приведен на рисунке 3.55. Содер- жит стеклянную колбу, в которой перемещается ртутный ша- рик. Имеет светодиод. Применяется в системах контроля и безопасности. Модуль датчика наклона можно установить на крышках, дверцах,
люках, закрывающих доступ в контролируемое пространство. Зарегистрировать малые углы наклона с его помощью нель- зя. Корпус датчика, размещенного на плате, представляет со- бой колбу из стекла. Внутри колбы расположены два электро- да и ртутный шарик. Злектроды расположены рядом, ближе к торцу колбы. При наклоне в сторону электродов шарик ска- тывается и замыкает их. При наклоне в противоположную сторону шарик перемещается на противоположный конец колбы, размыкая электроды. Рис. 3.55. Внешний вид модуля К Л -027 Подключение датчика (рис. 3.56): — выходное напряжение в реаль- ном времени; <.G» — общий источника питания; *+*> — + 5 В источника питания; — вход для управления свето- диодом, расположенном на плате дат- чика. Рис. 3.56. Схема датчика наклона Пример 3.31. Вывести в монитор пор- та информацию, снимаемую с датчика. Скетч примера (KV-027} имеет вид: int dat = 3; // пин для ввода сигнала с датчика int svet= 8; // пин для вывода сигнала на светодиод void setup ()
{ pinMode (dat, INPUT); pinMode (svetj OUTPUT); Serial.begin (9600); // 9600 bps } void loop Q < int a; a = digitalRead (dat); if (a==l) { digitalWrite (svet, HIGH); } else < digitalWrite (svet, LOW); } Serial.printin (a, DEC); delay (100); } 3.33. Температурный датчик с цифровым выходом — KY-028 KY-028 (рис. 3.57) — температурный датчик с цифровым выходом.. У этого датчика на выходе имеется напряжение вы- сокого или низкого уровня. Порог срабатывания регулирует- ся потенциометром. Рис. 3.57. Внешний вид модуля KY-028 14М
KY-028 (рис. 3.57) — температурный датчик с цифровым и аналоговым выходами. У этого датчика на цифровом выхо- де имеется напряжение высокого или низкого уровня. Порог срабатывания регулируется потенциометром. Похожие датчики: • DS18B20 — цифровой термометр (1-Wire интерфейс); • KY-001 — модуль датчика температуры на базе DS18B20; • KY-015 — модуль с датчиком температуры и влажности DHT11; * KY-013 — аналоговый температурный сенсор. Датчик применяется для контроля температуры воздуха в помещении. Используется в следующих случаях: регулятор температуры, автоматика систем отопления, автоматизация систем вентиляции. Определяет превышение температурой установленного порога и одновременно позволяет грубо оце- нивать величину температуры. Модуль датчика температуры удобно использовать в схе- мах на дискретных элементах без использования микро- контроллера., Например, выход DO можно использовать для включения вентилятора, работающего ст 12 В. X я р ак те р исти к и: * Напряжение питания 3,3... 5,5 В; * Рабочая температура 0.. .70 ,:1С. Подключение: • зАСЬ — величина аналогового сигнала — соответствует температуре; * aG » — общий провод источника питания; • $+$— 4-5 В источника питания; • <DLD — выход логического сигнала. Проверка и настройка При включении на выходе DO присутствует напряже- ние, соответствующее температуре в комнате. Эта темпе- ратура известна лишь приблизительно. Есть способы точно определить, какой температуре соответствует то или иное напряжение на выходе DO. Сожмите терморезистор пяль- цами — так можно узнать напряжение аналогового выхо-
дп при температуре 36,6 ПС. На эти данные можно опирать- ся в дальнейшем. Еще одна точка зависимости — О °C. Используйте надеж- ный пленочный пакетик с таящим льдом, снегом из холо- дильника. Получим новое значение напряжения, которому можно верить.. Пример 3.32. Вывести в монитор порта информацию, сни- маемую с датчика. Скетч примера (KY-028) имеет вид: int ап= АО; // пин для ввода аналогового сигнала сдатчика int di= 8; // пин для ввода цифрового сигнала с датчика void setup () { pinMode (an, INPUT); pinMode (di, INPUT); Serial.begin (9600); // 9600 bps } void loop () { int z; float a, t; a - analogRead (an); z = digitalRead (di); //эта формула получена экспериментально и грубо t=22+(557-a}/6.64; Serial.print (t); Serial.print Serial.printin (z); delay (1000); } 3.34. Модуль с двухцветным светодиодом — KY-029 KY-029 (рис. 3.58) — модуль с двух цветным 3 мм свето- диодом с общим катодом (зеленый и красный). Есть также мо- дуль с 5 мм светодиодом.
Подключение: * (GND) — катод светодиода; • средний контакт — анод (Т) красного светодиода; • — анод (+) зеленого свето- диода. Последовательно с анодами вклю- чаются резисторы в 330 Ом. Пример 3.33. Мигаем светодио- дами. Скетч примера (KY-O29) име- ет вид: int dot = 9; // пин для вывода // сигнала на светодиод int svet= 8; // пин для вывода // сигнала на светодиод void setup {) { pinMode (datf OUTPUT); pinMode (svetj OUTPUT); } void loop () { digitalWrite (svet, HIGH); digitalWrite (dot, LOW); delay (1000); digitalWrite (svet, LOW); digitalWrite (dal, HIGH); delay (1000); } Рис. 3.58. Внешний ннд модуля KY-029 3.35. Датчик удара — KY-031 KY’031 (рис. 3.59) —датчик, который позволяет регистри- ровать тряску или удары. Представляет собой контакт, кото- рый замыкается или размыкается. Сенсор можно использовать в сигнализации, системе автоматики дома или для контроля оборудования. Схема датчика приведена на рисунке 3.60.
Рис.. 3.59. Внешний аид модули KY-O31 Рис. 3.60- Схема датчика удара Подключение: • — общий источника питания; * «средний контакт# — -1-5 В источника питания: • $S# — выход: высокий / низкий уровень напряжения. Между контактами «S* и «средний контакт» впаян ре- зистор 10 кОм. В отличие от сенсора вибрации, этот датчик имеет лучшую чувствительность, если удар происходит пер- пендикулярно плоскости платы. В других направлениях чув- ствительность сенсора хуже из-за особенностей крепления пружинки^ замыкающейся на контакт при тряске или стуке. Пример 3.34. Выводим состояние датчика в монитор пор- та. Скетч примера (KY-031) имеет вид: //KY’031 датчик удара int shockSensor = 8; // пин для датчика int v; // состояние датчика void setup () { pinMode (shockSensor, INPUT) ; // пин — на ввод Serial.begin (9600); // 9600 bps } void loop Q { v = digitalRead (sho-ckSensor) ; // чтение состояния датчика Serial.printin (v); // вывод в монитор порта }
3.36. Модуль с инфракрасным датчиком обнаружения препятствий — KY-032 KY-032 (рис. 3.61) — модуль представляет собой инфра- красный датчик обнаружения препятствий. При приближе- нии какого-либо предмета к сенсору (близость регулируется потенциометром) на выходе «ОПТ* появляется низкий уро- вень напряжения и включается светодиод на плате модуля. Рис. 3.61. Внешнии вид модуля КЛ -032 X а рякте ристи к и: • дальность срабатывания, см: 2..,40; • угол работы, гряд: 35; * напряжение питания. В: 3,3... 5; • размеры (длина х ширина), мм: 40 х 15. Подключение: * <iGND> — общий источника питания; * e+fr — -F5 В источника питания: * «OUT» — выход: высокий / низкий уровень напряжения • яEN >. Пример 3.35. Состояние датчика определяет свечение внешнего светодиода. Светодиод подключается к пину че- рез сопротивление в 220 Ом. Скетч примера (KY-032) име- ет вид:
//KY-032 И К-датчи к обнаружения препятствий int led -9 ; // пин светодиода int sensorObstaclesPin = 10; // пин датчика int value ; // значение датчика void setup () { pinMode (led, OUTPUT) ; pinMode (so nsorObsta dcsPin, INPUT); } void loop () { // чтение датчика value = digital Read (sen so-rOb start esPin) ; if (value == LOW) { // если датчик нашел препятствие, светодиод горит digitalWrite (led, HIGH); } else { digitalWrite (led, LOW); } } 3.37 . ИК-модуль датчика, отслеживающею линию — K.Y-033 KY-033 (рис. 3.62) представляет собой датчик отраже- ния инфракрасного излучения близко расположенным пре- пятствием. Благодаря работе фотоэлемента в инфракрасном диапазоне излучения восприятие оттенков становится более контрастным, чем в видимом диапазоне света. Это облегчает применение модуля KY-033 для различения белых и черных участков поверхности. Конструктивные особенности позволя- ют использовать модуль датчика линии в классической задаче учебной робототехники - движение вдоль линии на полу. Ес- ли нанести полоски на вращающийся диск, то датчик можно использовать для измерения скорости оборотов вала двигате- ля, колеса или других вращающихся деталей.
Рис. 3.62, Внешний вид модуля КЛ -033 X арактеристи к и: • напряжение питания — 3,3...5,5 В; • ток — 20 мА; * угол обзора — 35°; • рабочая температура — 0...50 *С; • размеры — 77 х 48 х 12 мм. Модуль датчика линии имеет широкий круг применения. Требуемая чувствительность зависит от расстояния до поверх- ности, оттенка светлых и темных участков. При работе в со- ставе тахометра настройка проводится под ширину линий на вращающейся поверхности. Датчик хорошо подходит для управления движением робота по черной или белой полосе. Отражение от белых участков. значительно большее, чем от черных участков. Настройка работы осуществляется потен- циометром. Подключение: * < Ci fr — общий провод источника питания; • — +5 В источника питания; • «8» — выходной сигнал. Пример 3.36. Состояние датчика определяет свечение внешнего светодиода. Светодиод подключается к пину через сопротивление в 220 Ом. Скетч примера (K.Y-033) имеет вид: //KY-G33 ИК датчик обнаружения черного и белого int led = 9 ; //пин светодиода
int sensorObstaclesPin = 10; // пин датчика int value ; // значение датчика void setup () { pinMode (led, OUTPUT) ; pinMode (sensorObstaclesPin, INPUT); } void loop () { // чтение датчика value = digital Read (sensorObstadesPin) ; if (value == LOW) {// белая полоса, светодиод горит digitalWrite (led, HIGH); } else {// черная полоса, светодиод не горит “digitalWrite (ted, LOW); } } 3.38 * Мигающий семицветный светодиодный модуль — KY-034 Рис. 3.63. Внешний вид модули KY-034 KV-034 (рис. 3.63) — автоматически мигающий яркий се- мицветный светодиодный модуль диаметром & мм. На плате напаян токоограничительный резистор, Не требует подключе- ния к плате микроконтроллера Arduino. Необходимо подклю- чить лишь питающее напряжение в 5 В. Очень опасен при работе совмест- но с платами Arduino, поскольку имеет нестандартное для датчиков Arduino подключение, Подключение: • — не используется; * а средний вывод s> — общий источ- ника питания; * — 4 5 В источника питания.
Характери стик и: • Напряжение: 3...5 В. • Ток: 40 мА. * Цвет: желтый,, зеленый, синий, красный, розовый, фио- летовый, оранжевый. * Угол обзора: 150. • Длина волны (НМ): розовый, желтый: 590 нм, зеленый: 525...530 нм. • Сила света (MCD): розовый: 200 мкд, желтый: 600 мкд, зеленый: 1 600 мкд. * Размеры (Д/Д с пинами/Ш В): 25 мм/30 мм/15' мм/5 мм. 3.39. Айа лотовый датчик холла — KY-035 KY035 (рис. 3.64) — это ана- логовый датчик магнитного поля. Линейное напряжение на контак- те <sSv будет пропорционально си- ле магнитного поля, в котором на- ходится сенсор. Имеются также цифровой и комбинированный датчики Холла. Подключение: * — общий источника пи- Рис. 3.64. Внешний вид модуля Ю -035 тания; • ^средний контакта — 4-5 В источника питания; • ей» — сигнальный аналоговый выход. X аряктер исти к и: * потребление,. мА: 8; * напряжение питания, В: 5. Пример 3.37. Частоту миганий светодиода нужно сделать обратно пропорциональной величине магнитного поля, т. е. чем слабее поле, тем выше частота миганий светодиода. Кро- ме этого, необходимо выводить информацию о величине маг-
нити ого поля в монитор порта. Светодиод подключается к пла- те через сопротивление в 220 Ом. Скетч примера (KY-035.1) имеет вид: // KY-035 аналоговый линейный датчик Холла int linearHallSensorPin = АО; // пин для датчика int ledPrn = 13; // пин для светодиода int linearHallSensorValue - 0; // переменная значения сдатчика void setup () < pinMode (led Pin, OUTPUT); Serial.begin (9600); } void loop () { // чтение датчика linearHallSensorValue = analogRead (linearHallSensorPin); digitalWrite (ledPin, HIGH); //задержка пропорциональна величине поля delay (linearHallSensorValue); digitalWrite (ledPin, LOW); //задержка пропорциональна величине поля delay (linearHallSensorValue); //вывод в монитор порта Serial.printin (linearHallSensorValue, DEC;; } Пример 3.38. Частота миганий светодиода постоянна. Ин- формация о величине магнитного поля выводится в монитор портя. Светодиод подключается к плате через сопротивление в 220 Ом. Скетч примера (KY-035.2) имеет вид: int sensor Pin = АО; // пин датчика int IcdPrn = 13; //пин светодиода int sensorValue = 0; // данные с датчика void setup () { pinMode (ledPin, OUTPUT); Serial.begin (9600); void loop () { sensorValue = analogRead (sensorPin);
digitalWrite (ledPin, HIGH); delay (100); digitalWrite (ledPin, LOW); delay (100); //выводим данные с датчика в монитор порта Serial.printin (senisorValue, DEC); } 3.40. Сенсорный модуль с металлическим контактом — KY-036 KY-036 (рис. 3.65) — сенсорный модуль, имеющий ме- таллический контакт для определения касания человека. На плате расположены два светодиода — питания и срабатыва- ния датчика. Устройство КУ-036 позволяет оснастить какой-либо прибор сен- сорной кнопкой. В качестве сен- сорной кнопки можно использо- вать корпус электроприбора или другие металлические элементы конструкции. Металлическая сенсорная по- верхность обладает большим за- пасом прочности, что важно Рис. 3.65, Внешний вид модули КЛ -036 в аппаратуре с антиванда льны ми требованиями. В отличие от механических кнопок, ресурс сен- сорных кнопок не ограничен. Модуль датчика касания также применяется в оборудова- нии, используемом при опасных видах работ для снижения риска несчастного случая. Характеристики: * Питание — + 5 В. • Размеры — 16 х 43 х 15 мм.
На торце платы модуля KY-036 (на компоненте) располо- жен контакт» соединяемый с сенсорной металлической поверх- ностью. Прикосновение к поверхности способствует приему электромагнитных волн частотой 50 Гц, излучаемых электро- проводкой помещения. Гело человека при этом служит антен- ной, а входная часть модуля — радиоприемником. Сигнал ча- стотой 50 Гц усиливается микросхемой LM393YD и подается на выходы устройства,. Модуль датчика касания содержит пе- ременный резистор» с помощью которого устанавливается чув- ствительность датчика KY-036. На плате есть светодиод индика- ции включения питания и светодиод» мигающий при касании. Подключение: • * АО» — инвертированный сигнал 50 Гц. • — общий провод источника питания. * 414-» — +5 В источника питания.. • — основной сигнал 50 Гц. При касании рукой на выходе DU формируется импуль- сный сигнал с частотой 50 Гц (рис. 3.66). Длительность каж- дого импульса — 4,8 мс. Инвертированный сигнал на выходе АО имеет вид, пока- занный на рисунке 3.67. Риг. 3.66. Сигнал на выходе D0 модуля КЛ -036 Рис. 3.67. Сигнал на выходе АО модуля KY-036 Пример 3.39. Информация о состоянии датчика выводит- ся в монитор порта. Светодиод просто мигает с постоянной ча- стотой и подключается к плате через сопротивление в 220 Ом. Скетч примера (KY-036) имеет вид: int sensor Pt n - АБ; //пин датчика int tedPin = 13; // пин светодиода
int sensorValue = 0; // данные сдатчика void setup () { pinMode (led Pin, OUTPUT); Seri a I. begi n (9600); } void loop () { sensorValue = ana log Read (sensor Pin); digital Write (ledPin, HIGH); delay (100); digital Write (ledPin, LOW); delay (100); //выводим данные с датчика в монитор порта Serial.printin (sensorVaiue, DEC); } Если касания датчика пальцем нет, то на выходе АО датчи- ка постоянно присутствует число 1023. При касании датчика пальцем на выходе имеет место чередование групп чисел 112 и 1023 с частотой в 50 Гц. 3.41- Модуль микрофона — KY-037 KY-037 (рис. 3.68) — модуль микрофона с высокой чув- ст в ите леностью. Он имеет два выхода: цифровой и аналого- вый. Также существует похожий звуковой сенсор с конденсаторным микрофоном. Подключение: • — цифровой выход; при превышении порога на выходе *DCb появляется уровень логической 1, в остальное время — логический 0; * <?+>>— +5 В источника питания; * — общий источника пита- ния; Рис. 3.68. Внешний вид модуля КУ-037
• *А(Ъ — аналоговый выход — уровень громкости окру- жающих звуков. Датчик срабатывает при звуках громкостью выше уста- новленного порога. Модуль датчика звука применяется в при- борах, содержащих аналоговую, цифровую электронику и ми- кроконтроллеры. Он может служить датчиком присутствия в охранных системах. Реагирует на звуки шагов, щелчки зам^ к а, шум двигателя автомобиля и другие шумы. Может приме- няется в автоматике управления освещением. Характеристики: * Питание — Й,3...5,5 В; * Пределы температуры воздуха при работе — 0...70 аС. Модуль KY-037 содержит микрофон. Определение пре- вышения порога громкости звука происходит с помощью ми- кросхемы компаратора LM393YD. Настройка порога срабаты- вания выполняется потенциометром, находящимся на плате модуля. Если порог громкости звука превышен, то ня выхо- де D(J появляется высокий уровень напряжения. Уровень на- пряжения на аналоговом выходе АО соответствует уровню громкости окружающих шумов. Если применяется микро- контроллер, то возможна программная обработка колебаний уровня напряжения на выходе АО и сравнение с имеющейся базой в памяти МК колебаний аналогового сигнала, что по- зволяет распознавать некоторые события, происходящие ря- дом с датчиком. Индикация: • Индикатор Ы — включение питания; • Индикатор L2 — превышение шумом установленного звукового порога. Пример 3.40. Этот пример иллюстрирует работу с цифро- вым выходом $D0* модуля. Когда микрофон принимает звук с определенной громкостью, на выходе появляется вы- сокий уровень напряжения. Порог срабатывания можно отре- гулировать потенциометром на плате модуля. Внешний све- тодиод подключаем к плате через сопротивление в 220 Ом. Скетч примера (KY-037.1) имеет вид:
//KY’037.1 — микрофон с высокой чувствительностью int led - 13 ; // пин светодиода int microphonePin = 3; // пин для микрофона int microphoneValue = 0; // переменная для сигнала void setup () { pinMode (led, OUTPUT) ; pinMode (microphonepin, INPUT) ; } void loop () {// чтение сигнала с микрофона microphone Value = digitalRead(microphonePin); if (microphoneValue == HIGH) {//есть звук — светодиод горит digitalWrite (led, HIGH); } else {//нет звука — светодиод не горит digitalWrite (led, LOW); } } Пример 3.41. Этот пример демонстрирует работу с анало- говым выходом «АСЬ модуля. Внешний светодиод подключа- ем к плате через сопротивление в 220 Ом» Чем выше уровень звука, тем с большим периодом происходит свечение светоди- ода. Скетч примера (KY 037.2) имеет вид: //KY-037.2 микрофонный модуль — аналоговый выход АО int microphonePin - АО; // пин микрофона int lodP;п = 13; // пин для светодиода int micro pho ne Value = 0; // значение сигнала микрофона void setup () { pinMode (ledPin, OUTPUT); Serial.begin (9600); } void loop () { //чтение значения с аналогового входа microphone Value = analogRead (microphonePin); digitalWrite (IcdPin, HIGH); delay (micro pho ne Value);
digitalWrite (ledPin, LOW); delay (micro phone Value); // вывод значения в монитор порта Serial.println (microphoneValue, DEC); } 3.42. Звуковой сенсор с конденсаторным микрофоном — K.Y-038 KY-038 (рис. 3.69) — звуковой сенсор с конденсаторным микрофоном. Имеет аналоговый и цифровой выходы. Также существует похожий микрофонный датчик. Рис. 3.69. Внешний вид модули К. ¥-038 Подключение: • «АО* — аналоговый выход; * djfr — общий (минус) источ- ника питания; * «+» — + б В источника шь тан ия; * *D0> — цифровой выход. Платя имеет два выхода: * цифровой выход «D0*; при превышении порога сраба- тывания на выходе формирует- ся логическая 1; • аналоговый выход «А0^ — сигнал напрямую с микро- фона. Чувствительность срабатывания регулируется подстроеч- ным резистором. Ня плате имеются два с вето диод я. Первый индицирует наличие питания, второй индицирует превыше- ние порога срабатывания. Пример 3.42. Этот пример иллюстрирует работу с цифро- вым выходом «D0* модуля. Когда микрофон принимает звук с определенной громкостью, на выходе появляется вы- сокий уровень напряжения. Порог срабатывания можно отре- гулировать потенциометром на плате модуля. Внешний све-
тодиод подключаем к плате через сопротивление в 220 Ом. Скетч примера (KY-038.1) имеет вид: //KY-038.1 — конденсаторный микрофон int Jed = 13 ; // пин светодиода int microphonePin =3; // пин микрофона int microphoneValue = 0; // переменная для сигнала void setup () { pinMode (led, OUTPUT) ; pinMode (microphonePin, INPUT) ; } void loop () { // чтение сигнала с микрофона microphoneValue = digitalRead(miorophonePin); rf (microphoneValue == HIGH) { digital Write (led, HIGH); //есть звук — светодиод горит } else { digital Write (led, LOW); //нет звука — светодиод не горит } } Пример 3.43. Этот пример демонстрирует работу с анало- говым выходом модуля. Внешний светодиод подключа- ем к плате через сопротивление в 220 Ом.. Чем выше уровень звука, тем с большим периодом происходит свечение светоди- ода. Скетч примера (КY-038.2) имеет вид: //KY-038.2 микрофонный модуль — аналоговый выход АО int microphonePin = АО; // пин микрофона int ledPin = 13; // пин для светодиода int mFCrophoneValue - 0; // значение сигнала микрофона void setup () { pinMode (ledPin, OUTPUT); Serial.begin (9600); } void loop ()
{ //чтение значения с аналогового входа micnophoneValiie = analogRead (microphonePin); digitalWrite (ledPin. HIGH); delay (m icro p ho ne Va I ue); digitalWrite (ledPinj LOW); delay (microphoneValue); // вывод значения в монитор порта Serial.printin (microphoncValLre, DEC); } 3.43. Датчик для измерения пульса в пальце — KY-039 Рис. 3.70. Внешний нлд модуля KY-039 KY-039 (рис. 3.70) состоит из ин- фракрасного светодиода и фото тран- зистора, с помощью которых мож- но измерять частоту сердцебиения. Монитор сердечного ритма работает следующим образом: палец распола- гается между ИК-светодиодом и фо- тотранзистором, который получает поток инфракрасного излучения. Когда в пальце пульсирует кро- вяное давление, то сопротивление фототранзистора меняется. Для ис- ключения нежелательных помех при измерениях пульса необходимо, чтобы фототранзистор был защищен от попадания прямого солнечного или искус- ственного света. Подключение: * *S* — аналоговый выход; * ^средний контакт* — +5 В источника питания; * — общий (минус) источника питания. Пример 3.44. Этот пример демонстрирует работу с анало- говым выходом «S* модуля. Информация о пульсе публику-
ется в мониторе порта. Пример не очень хороший, поскольку не даёт ожидаемого результата. Но в мониторе порта значение переменной raw Value при установке пальца между светодио- дом и фототранзистором изменяется временами на 1-2 едини- цу. Этот датчик и этот «фирменный * пример сильно критику- ют в Интернете. Скетч примера (KY-039) имеет вид: int sensorPin = АО; double alpha = 0.75; int period = 100; double oldValuc-0 ; void setup •() { Serial.begin [9600); } void loop () { int raw Value = analog Read (sensorPin); double value = alpha * oldValuc + (1 - alpha) * rawValue; Seri a I. p ri nt (ra w Va I u c); Serial.print (V); Serial.printin (value).; old Value = value; delay (period); } 3.44. Модуль с энкодером — KY-040 Энкодор (или датчик угла поворота) — устройство, кото- рое нужно для преобразования угла поворота в электриче- ский сигнал. Таким образом можно определить угол его по- ворота. Энкодеры очень широко применяются в раз личных видах устройств. Они применяются в сервоприводах, робото- технике, электронике, машиностроении. Энкодеры бывают двух типов: абсолютные и накапливающие. Абсолютные — позволяют определить угол поворота непосредственно по положению нала датчика. Основным отличием данного типа датчиков является то, что уже при 167
включении они могут определить угол поворота.. Накапливающие — формируют импульсы, по числу которых можно определить положение вала. Сразу же после включения положение вала та- кого типа датчиков неизвестно. Рассматриваемый энкодер отно- сится к датчикам накапливающего Рис. 3.71. Внешний вид типа. Размеры: 31x19x31 мм. Удо- модуля KY-040 бен для использования в проектах с определением угла поворота. В энко- дер встроена кнопка. В датчиках данного типа невозможно определить угол поворота сразу же после включения Библиотека для работы с модулем — Encoder. Энкодер (рис. 3.71) при вращении ручки выдает двухбито- вый двоичный код на двух выходах (контакты «и 11о этому коду можно определить направление вращения. Под- считав количество всех кодов, можно определить и угол по- ворота ручки эн кодер а. Обычно на полный оборот приходится 24 кодов (импульсов). Кроме этого, нажатие на ручку приво- дит к срабатыванию кнопки. Это удобно при установке ручки энкодера в начальное состояние перед началом подсчёта им- пульсов. Размеры модуля показаны на рисунке 3,72, а цоко- лёвка энкодера — на рисунке 3.73. Подключение: * tCLKfr — контакт «А*; * «ВТ» — контакт «В»; * «SW» — кнопка; * «+»— +5 В источника питания; • «GND?> — общий (минус) источника питания. Энкодер служит для ручного управления приборами и применяется в широком спектре электронной аппаратуры. Управление происходит с помощью вращения оператором ру- коятки, находящейся на штоке энкодера. В отличие от пе- ня
ременных резисторов, у которых угол поворота рукоятки составляет около трех четвертей окружности, здесь выпол- няется полный оборот. Принципиальное отличие: возмож- ность вращения полными оборотами неограниченное количе- ство раз — непрерывный поворотный кодер. Это очень удобно, т. к. позволяет выполнять точную настройку регулируемого параметра. Нод штоком ротора расположена кнопка. Для за- мыкания контактов кнопки нажимают на рукоятку. Наличие у эн кодера кнопки упрощает переднюю панель прибора, где он используется., Энкодер работает в составе цифровых схем, например с применением микроконтроллеров. Рис. '4.73. Цоколёвка эн кодера Характер исти к и: • Предельное напряжение на контактах — эВ. • Предельный ток через контакты — 10 мА. * Формат выходного сигнала: квадратурный код — 2 бит. * На один оборот — 24 импульса. • Температура эксплуатации — 30... 70 “С. * Ресурс оборотов — не менее 30 000. • Ресурс нажатий кнопки — не менее 20 000.
Характеристики кнопки: • контакты — ня замыкание; * предназначена для кратковременного нажатия; • перемещение штока при нажатии — 0,5 =ь 0,3 мм; • сопротивление контактов — 100 миллнОм. С нижней стороны платы расположены два резистора по 10 кОм. Соединитель содержит 5 штыревых контактов (рис. 3.71). Не обязательно использовать все контакты: два контакта отведены под кнопку, а три — под выход импульсов энкодера. Схема KY-040 приведена на рисунке 3.75. Encoder Pin А Encoder Pin В NO Pushbutton Switch 5 V Supply Encoder Pin C Рис. 3.74. Цикилёвка модуля KY-040 Рис. 8.75. Схема модуля НА -040 Если контакты энкодера разомкнуты, то на выходе будет уровень напряжения питания при замыкании — 0 вольт. При вращении вала с выхода модуля KY-010 будут поступать им- пульсы. Резисторы R2 и R3 выполняют «под тяжкую выходов механического энкодера.
Внутри энкодера есть две контактные группы (рис. 3.76). При вращении после соединения контактов А и С происходит соединение В и С. На электрической схеме показано соедине- ние выводов энкодера А, В, С с соединителем модуля KY-040. При вращении вала энкодера с выходов CLK и DT поступа- ют прямоугольные импульсы, сдвинутые друг относительно друга на фазовый угол 90<г (рис. 3.77). При вращении в одну сторону задний фронт импульса на выходе CLK соответству- ет паузе между импульсами на выходе DT. При вращении в противоположную сторону задний фронт импульса на выхо- де CLK совпадает по времени с «крышкой импульса на вы- ходе DT. Рис. 3.76. Контактные группы в энк-одере CW Rotation CCW Rotation A Id С Switch Open Clo&pd I f i I I i I I j t J i I I I I В to G Зи itch Open Cfosed Рис. 3.77. Сигналы на выходе энкодера Анализируя эти сигналы, соединенная с модулем KY-040 электроника подсчитывает количество импульсов, учитывая направление вращения. Контакты кнопки под штоком соеди- няют контакт SW с общим проводом. Для лучшего понимания закономерности формирова- ния сигналов модулем K.Y-040 соберём следующую схему (рис. 3.78). Включим питание. Очень медленно вращаем шток энкоде- ра по часовой стрелке, затем — против часовой стрелки. На- блюдаем за работой светодиодов.
Рис. 3.78. Одна из схем подключения эн кодера Подключение модуля к контроллеру Arduino: все, что нужно сделать» — это подключить четыре проводя к модулю (рис. 3.79). РнС- 3.79. Внешний вид минета Пример 3.45. Этот пример демонстрирует работу с эн ко- дером. Б монитор порта передается информация о положении вяля эн кодера и направлении его вращения. Скетч примера (KY-010.1) имеет вид: int pinA - 3; //пин для подключения CLK эн кодера int pinB = 4; // пин для подключения DT знкодера.
int encoderPosCount = 0; // положение вала эн кодера int pinALast: // новое значение сигнала на пине 3 int aVal; // старое значение сигнала на пине 3 boolean bCW; // направление вращения void setup() { pinMode (pinAJNPUT); pinMode (pinBJNPUT); /' Считываем значение на выводе А и запоминаем его как последнее значение на этом выводе */ pinALast = digitaIRcadfpinA); Serial.begin (9600); } void loop() { //вводим новое значение сигнала на пине 3 aVal = digitalRead(pinA); /* проверка на изменение значения на выводе А по сравнению с предыдущим запомненным, что означает, что вал повернулся, а для того, чтобы определить направление вращения, нам понадобится вывод В */ if (aVal != pinALast) { // если вывод А изменился первым — вращение по часовой стрелке if (digitalRead(pinB) ! = aVal) { encoderPosCount + + ; bCW = true; } // иначе В изменился первым — вращение против часовой стрелки else { bCW - false; е п coderPosCo u n t—; } Serial.print ('"Вращение: if (bCW) { Serial.printin ("no часовой стрелке''); } else
< Se rial println( "против часовой стрелки"); } Se ria l.printf" Положение энкодера: "); Se ria I. pri n tl n ( en coderPosC о u nt); } pinALast - aVal; } Скетч работает весьма посредственно. Теряются импуль- сы. Следующий пример работает замечательно. Пример 3.46. Значения угла поворота выводятся на мони- тор порта. Используется библиотека Encoder.h. Скетч приме- ра (KY-040.2) имеет вид: //Подключение библиотеки для энкодера #include <Encodenh> //пины const int CLK_PIN = 10; const int DT_PIN = 9; //установка значения переменной для хранения старого // значения позиции long position - -999; //создание объекта типа энкодер Encoder myEnc(DT_PIN, CLK_PIN); void setup() { Serial.begin(9600); //инициализация Serial-noprai } void loop() { long new Position = myEnc.readQ; //считать новую позицию if (newPosition != position) { //если значение отличается от старого position = newPosition; //установить новое текущее значение Se ria kprintln( position); //вывести значение в Serial-порт } // Если в код добавить существенную задержку, // энкодер сможет отследить только очень медленное //движение. // Для проверки можно раскомментировать нижнюю строчку: //delay(50); }
Пример 3.47. Б примере иллюстрируется определение текущего значения поворота и также проверяется нажатие кнопки энкодера. Значения поворота и нажатия кнопки вы- водятся в монитор Serial-портя. Схема подключения энкодера приведена на рисунке 3.80. Этот пример, как и предыдущий, работает отлично. Следует только тщательно собрать схему, представленную на рисунке 3.80. Скетч примера (К Y-040.3) имеет вид: # include <Encoder.h> //подключение библиотеки энкодера //пины const int CLК_PIN = 10; const int DT_PIN = 9; const int SW _PIN = 8; //исходное значение переменной, хранящей старое знамение //позиции long position = -999; //создание объекта типа эн кодер Encoder myEnc(DT_PIN, CUK_PIN); void SCtLipO { Serial. begin(9600); //инициализация Serial-nopra pinMode (SW_PIN,1NPUT); } void loop() { //считать новую позицию long new Position = myEnc.read(); if (newPositlon ! = position) { // новое значение отличается1 от старого position - newPosition; //установить новое текущее значение Serial, р ri ntln( position); //вывести значение в Serial-порт } // если б код добавить существенную задержку, // знкодер сможет отследить только очень медленное движение; // для проверки можно ра сегментировать следующую строчку //delay (50); if (digital Read (SW_PIN) == LOW) //проверка нажатия на кнопку { Serial, printing Нажато"); //вывод сообщения
Рис. 3.80. Внешним вид макета ЗЛ5. Ультразвуковой датчик расстояния — HC-SR04 Действие ультразвукового дальномера HC-SR04 основа- но на принципе эхолокации (рис. 3.81). Он излучает звуковые импульсы в пространство и принимает отражённые от препят- ствия сигналы. Ио времени распространения звуковой волны к препятствию и обратно определяется расстояние до объекта. Запуск звуковой волны начинается с подачи положитель- ного импульса длительностью не менее 10 микросекунд на ножку 1 RLG дальномера. Как только импульс заканчивает- ся, дальномер излучает в пространство перед собой пачку зву- ковых импульсов частотой 40 кГц, В это же время на ножке ECHO дальномера появляется логическая единица. Как толь- ко датчик улавливает отражённый сигнал, на выводе ECHO появляется логический ноль. По длительности логической единицы на ножке ECHO (^задержка эхо» на рисунке) опре- деляется расстояние до препятствия.
TRIG ECHO Рис. 3.81. Принцип работы ультразвукового дальномера HC-SR04 Преият^тэиг Xарякте ристи ки: • измерения расстояния — до 4 метров с разрешением 0,3 см; • угол наблюдения — 30а, эффективный угол — 15"; * ток потребления в режиме ожидания — 2 мА, при рабо- те — 15 мА. Подключение: • $Vcc» — +5 В источника питания; • sGnd& — общий (минус) источника питания; • «Trig* — импульс запуска; * а Ес ho* —принимаемый сигнал. Схема подключения датчика расстояния показана на ри- сунке 3.82. Питание ультразвукового дальномера осущест- вляется напряжением +5 В. Рис. 3.82. Внешний вид макета
Внешний вид собранного устройства показан на рисун- ке 3.83. Рис. 3x83. Устройство и сборе Пример 3.48. Разработать скетч, определяющий расстояние до препятствия и выводящий его в монитор портя. Сначала за- даём номера выводов TRIG и ECHO — это 12 и 11 пины соответ- ственно. Затем объявляем триггер как выход, а эхо — как вход. Инициализируем последовательный порт на скорость 96 UU Йод. В каждом повторении цикла 1оор() считываем дистанцию и вы- водим в порт. Скетч примера (HC-SR04.1) имеет вид: const int IrigPin = 12; const int echoPin = 11; void setup() { pinMode;IrigPin. OUTPUT); // пин для Trig pinMode(echoPinf INPUT); // пин для Echo Serial.begin(9600); // инициализация послед, порта } void ioop() { // получаем дистанцию сдатчика long distance = gctDrstancef); if (distance <- 400) // убираем помехи {// выводим результат в монитор порта Serial..printing distance); } deiay(lOO); }
// функция определения дистанции до объекта в см long getDistance() { long distacne_cm = getEchoTimingQ * 1.7 * 0.01; return distacne_cm; } // функция определения времени задержки long getEchoTirningO { digital Write(trigPin, LOW); delayMioroseconds(2); // генерируем импульс запуска digits I Write (trig Pin, HIGH); delay Mioroseconds( 10); digital Write(trigPin, LOW); // определение на пине echoPin длительности // уровня HIGH в мксек long duration = pulseIn(cchoPin, HIGH); return duration; } Функция getEchoTimingO генерирует импульс запуска. Она создаёт тот Ю-микросекундный импульс, который запу- скает начало излучения дальномером звукового пакета в про- странство. Далее она запоминает время от начала передачи звуковой волны до прихода эха. Функция getDistanceQ рассчитывает дистанцию до объ- екта. Из школьного курса физики мы знаем, что расстояние определяется как скорость, умноженная на время: S = V Скорость звука в воздухе 340 м/сек. Время в микросекун- дах мы знаем — переменная duratuion. Чтобы получить время duratuion в секундах, нужно разделить его на 1 000 000. Так как звук проходит двойное расстояние — до объекта и обрат- но — нужно ещё разделить результат пополам. Вот и пол да- ется, что расстояние до объекта S = 34 000 см/сек ‘ duration . 1 000 000 сек / 2 = 1,7 см/сек . 100.
Это мы и написали в скетче. Операцию умножения микроконтроллер выполняет бы- стрее, чем операцию деления, поэтому деление на 100 заме- нили на эквивалентное умножение на 0,01. Для работы с ультразвуковым дальномером написано мно- жество библиотек. Например, библиотека Ultrasonic. Уста- новка библиотеки происходит стандартна: скачать, разархи- вировать в директорию /libraries/, которая находится в папке с Arduino IDE. После этого библиотекой можно пользоваться. Пример 3.49. Разработать скетч, определяющий рас- стояние до препятствия и выводящий его б монитор пор- та. Использовать библиотеку Ultrasonic. Скетч примера (HC-SROd.2) имеет вид: ^include <и11гагоп[С.Ь> // подключаем библиотеку Ultrasonic ultrasonic(12f 11); // Trig -пин 12, Echo - пин 11 void setupQ { Serial.begiin(9600); // инициализация послед, порта } void loop() {// дистанция в см float dist_cm = ultrasonic. Ranging (CM); if (dist_cm <=400) // устраняем помехи {// выводим дистанцию в монитор порта Serial. print!n(dist_crn); dclay(lOO); } Результат его работы тот же, что и в предыдущем приме- ре — в монитор последовательного порта выводится дистан- ция до объекта в сантиметрах. Если в скетче записать float dist cm = ultrasonic. Ranging(lNC), то дистанция будет отображаться в дюймах. Итак, мы подключили к Arduino ультразвуковой дальномер HC-SR04 и получили с него данные двумя разными способами: с использованием специальной библиотеки и без. Преимущество использования библиотеки в том, что размер кода значитель- но сокращается и улучшается читаемость программы, также не 180
приходится вникать в тонкости работы устройства. Но в этом же кроется и недостаток: вы. хуже понимаете, как работает устрой- ство и какие в нём происходят процессы. В любом случае, каким способом пользоваться — решать только вам. И в заключение ещё один пример, когда дальномер ис- пользуется в качестве охранной системы. Для индикации факта обнаружения какого-либо объекта будем использовать светодиод, подключённый к пину 10 контроллера. Пример 3.50. Разработать скетч, определяющий расстоя- ние до препятствия и выводящий его в монитор порта. Обна- ружение внешнего объекта индицировать с помощью светоди- ода. Скетч примера (HC-SR0-1.3) имеет вид: const int trigPin = 12; //пин для запуска const int echoPin = 11; //пин для приёма эхо-сигнала const int s = 10; //пин для с вот од иод а void sctupQ { pinMode(trigPinT OU 1 PUT}; // пин — на вывод pin Mode (echo Pin, INPUT); // пин — на ввод pinMode(s, OUTPU Г); // пин — на вывод Serial. begin(9600); // инициализация послед. порта } void loopf) { // получаем дистанцию с датчика long distance = getDistance(); if (distance <= 400) // устраняем помехи {// выводим в монитор порта Seri а I. р ri ntl п( d i sta псе); } //проверка на обнаружение объекта if ( (distance <=2S5) ) { digita Write(s, HIGH); } else { digitalWrite(s, LOW); }
delay(lO); } // функция определения дистанции до объекта в см Song qotDistance() { long distacne_cm = gctEchoTiming() * 1.7 * 0.01; return distacne_cm; } // функция определения времени задержки long getEchoTiming() { ' digital Write (trig Pin, LOW); delay Microseconds( 2); // генерируем импульс запуска digital Write (trig Pin, HIGH); delay Microsecond^ 10); digital Write (trig Pin, LOW); // определение на пине edhoPin //длительности уровня HIGH, мксек: long duration = pulseln(echo Pin, HIGH); return duration; } Анализ, результатов работы этого примера показал, что ультразвуковой датчик отлично реагирует на твердые предме- ты: металл, дерево, пластик и т. д. и довольно плохо на мяг- кие — материя, человек. 3.46. Шаговый двигатель 28BYJ-48 и драйвер ULN2003 Общие сведения Шаговые двигатели (ШД) — основа точной работы стан- ков, роботов и других устройств, в которых требуется ли- нейное или круговое перемещение. В отличие от двигателей постоянного вращения, один оборот ШД состоит из множе- ства микроперемещений, которые и называют шагами. 111Д применяют там, где требуется очень точно дозировать пере-
мещение рабочего органа. Самый очевидный пример — ро- бот-манипулятор. Для того чтобы механическая рука кос- нулась рабочим инструментом нужной точки, необходимо чтобы каждый из узлов руки повернулся на строго заданный угол. Отклонение в доли градуса в основании руки приведет к огромной погрешности. Другим известным примером может служить станок с числовым программным управлением (ЧПУ). Взять тот же ЗВ-принтер. Для точного перемещения печатающей головки применяют именно ШД. В старых дисководах ШД использо- вались для перемощения магнитной головки. А в. современных фотоаппаратах микроминиатюрные ШД перемещают линзы. Внешний вид ШД типа 28BYJ-48 приведен на рисунке 3.84.. 28BYJ-48 — это маленький, дешёвый, 5-вол ьтовый ШД с редуктором. Передаточное число редуктора у него пример- но 64:1, что позволяет получить вполне достойный крутящий момент для ШД такого размера и скорость порядка 15 об/мин. С некоторыми программными хитростями для постепенного ускорения можно достичь более 25 об/мин. Дешевизна и миниатюрность делает 28BYJ-48 идеальным ва- риантом для небольших робототехнических приложений. Такие двигатели разработаны для применения в механизмах, где дета- ли поворачиваются точно на требуемый угол. Чаще всего мы ви- дим результат работы маломощного шагового двигателя, глядя на стрелки циферблата электромеханических часов. Работа бо- лее мощных ШД нам видна, когда мы следим за перемещени- ем каретки матричного или струйного принтера. Одно из множества применений 28BYJ-48-5V в любительской робото- технике — использование для привода колес шасси. Используя 28BYJ-48-5V, легко получить модель электро при - вода робота, относящегося к классу «мотор — колесо*. Это позволяет со- Рис. 3.84. Внешний вид бирать роботов , способных развер- ШД типа 28BYJ-48
нуться на месте и обладающих точным позиционированием в пространстве благодаря цифровому управлению двигателем. Используя шаговый двигатель* можно собрать локатор для обнаружения препятствий движению робота. Ультразву- ковой или ИК=датчик, расположенные ня поворачивающейся платформе, вращаемой ШД 28BYJ-48, могут поворачиваться в обоих направлениях в пределах требуемого угла поворота. При этом будет происходить сканирование сектора окружа- ющего пространства. Зная положение вала мотора и дистан- цию до препятствия, получаемую от датчика, можно сформи- ровать картину расположения окружающих предметов. Существует модификация 24BYJ-48, предназначенная для питания от 12 вольт, используемая в кондиционерах для тяги шторок. Ниже представлена детальная спецификация шагового двигателя 28BYJ-48. Тип мотора Униполярный шаговый двигатель Число фаз 4 1Тод к л ючение 5 выводок (к контроллеру двигателя) Рабочее напряжение 5... 12 вольт Частота 100 Гц Сопротивление по посто- янному току 50 Ом ± 7 % (25 'С) Частота под нагрузкой 600 Гц Частота на холостом ходу > 1 000 Гц Крутящий момент 34,3 мН м (120 Гц) Момент само позициони- рования > 34,3 мН м (Стопорящий момент 600...1 200 г - см Тяга 300 г см Сопротивление изоляции 10 МОм (500 В) Класе изоляции А
Шум < 35 дБ (120 Гцт без нагрузки, 10 см} Режим шага Рекомендован пол у шаговый режим [8-шаговая управляющая сигнальная последовательность) Угол шага Полу шаговый режим: 8-шаговая управ- ляющая сигнальная последовательность (рекомендовано). 5,625 градусов на шаг, 64 шага на оборот внутреннего вала мо- тора. Режим полного шага: 4-шаговая управляющая сигнальная последователь- ность. 11,25 "/шаг, 32 шага на оборот вну- траннего вала двигателя Передаточное отноше- ние редуктора Производителем заявлено 64; 1. В дей- ствительности передаточное число рав - но 63,68395:1. Зто означает, что в ре- комендованном полушаговом режиме мы имеем: 64 шага на обо рог мотора, помноженные на передаточное чис- ло 63,684 «= 4076 шагов ня полный оборот Подключение к кон- троллеру ULN2003 А (синий), В (розовый), С (желтый), D (оранжевый), В (красный, средний вывод обмоток) Вес 30 г Двигатель имеет четыре об- мотки, которые запитываются последовательно, чтобы повер- нуть вал с магнитом (рис. 3.85). Режимы работы ШД Когда используется пол- ношаговый метод управления, две из четырех обмоток запиты- ваются на каждом шаге. Иду- щая вместе с Arduino IDE би- блиотека Stepper использует такой способ. В техническом ру- (3) (1) Рис. 8.85. Обмотки ШД типа 28BYJ-48
ново детве к 28BYJ-48 сказано, что предпочтительным являет- ся использование метода полушага, при котором сначала запи- тывается только первая обмотка, затем вместе первая и вторая обмотки, затем только вторая обмотка и так далее. С 4 обмотка- ми это дает 8 различных сигналов, как показано в таблице 3.1. Таблица 3.1 Таблица Зйлитки облгошок ШД в полу шаговом режиме Провод Направление вращения по часовой стрелке (1-2 фазы) 1 2 3 4 5 6 7 Й 4. Оранжевый 3J Желтый 2. Разовый 1. Синий Драйвер (плата управления) Для сопряжения ШД с контроллером используется плата управления, называемая драйвером. В качестве драйвера для двигателя используется микросхема ULN2003, которую часто продают в паре с 28В YJ - 48. Внешний вид платы драйвера по- казан на рисунке 3.86. Рис. 3.86. Внешний вид платы драйвера На плате имеются: 1 входа для подключения к ми- кроконтроллеру: 1N1...1N4; 5 выходов на ШД; 2 контакта питания. Плата драйвера ШД на базе ми- кросхемы ULN2003 представляет собой массив транзисторов, вклю- ченных по схеме Дарлингтона. Она позволяет достаточно просто управ- лять мотором 28BYJ-48, используя микроконтроллер. Помимо самой микросхемы ULN2003AN, на пла-
те имеется пятиконтактный разъем для подключения к ШД и четыре светодиода, показывающих, какая из обмоток запи- тана б текущий момент времени (рис. 3.86). Как правило, кабель двигателя 28ВУе1-48уже имеет разъ- ем, который вставляется в плату’ драйвера. Если разъем от- сутствует, при подключении необходимо следовать схеме, показанной на рисунке 3.87. Контакты IN1...IN4 нужно под- ключить к любым цифровым выходам контроллера. На ри- сунке 3.87 они подключены к пинам 5, 4, 3 и 2 соответственно. Внизу платы расположена перемычка (джампер) — два вывода рядом с четырьмя резисторами. Установка джам- пера позволяет подавать питание на светодиоды индика- ции шагов. Запитывать ШД непосредственно от платы контроллера не рекомендуется, так как ШД может потреблять ток, пре- вышающий возможности контроллера. Лучше использовать внешний 5... 12 В источник питания, выдающий ток не ме- нее 1 А. Если для питания платы Arduino и ШД использу- ются различные источники питания, то необходимо объеди- нить выводы «земля* источников вместе. Управляющие сигналы с микроконтроллере (к цифровым пиыам Arduino) IN? Св&тодиоды и мд гк един п:ага Перемычка ДЛЯ упрямлян ия □сдачей питания на дьшятелъ Выводы для подключения йиёшлйго источника питянмя 5...12 Н Рис. 3.87. Выводы, перемычки, еветодиоды платы драйвера
Рис. 3.88. Схема подключения ШД к плате Arduino через млату драйвера Пример 3.51. Собрать схему в соответствии с рисунком 3.89, однако настоятельно рекомендуем в своих проектах использо- вать отдельное питание для ШД от другого блока питания, а не от контроллера. Это связано с тем, что если дать серьезную нагрузку на ШД, то на плате контроллера может перегреться микросхема, отвечающая за питание. Требуется разработать скетч, выполняющий вращение вала ШД. Что нужно сделать, чтобы шаговый двигатель сделал один оборот? Нужно подавать напряжение на его обмотки в строго определенной последовательности- Мы реализуем одну из не- скольких схем коммутации, называемую полушаговой. Для этого обратим внимание на таблицу 3.2 коммутации обмоток ШД, которая приведена ниже. Рис.. 3.89. Внешний нид платы драйвера, подключенной к плате _\rduino ]ЙК
Таблица 3.2 Таблица кол€ЛЕ1/тац[Ш облюшок ШД г)ля данного примера Пплуш аго вая пмледо вателытость ШАГ INS IN4 INI IN2 0 1 1 0 0 ] 0 1 0 0 2 0 1 1 0 3 0 0 1 0 4 0 0 1 1 5 0 □ 0 1 6 1 0 0 1 7 1 0 0 0 Скетч примера (2SBYJ-48.1) имеет вид: //пины для обмоток ШД int ini = 2; int in2 - 3; int in3 = 4; int in4 = 5; const int dl = 5; //задержка void setupf) { pinModefinl, OUTPUT); pinMode(in2, OUTPUT); pjnMode(in3, OUTPUT); pinMode(in4, OUTPUT); } void locpf) { digitalWritef inlf LOW ); digitalWritef in2, LOW ); digitalWritef in3f HIGH ;; digital Write^ in4, HIGH ); delay(dl);
digitalWrite! inif LOW }; digitalWrite! in2f LOW }; digitalWrite! in3r HIGH ); digitalWrite! in4j LOW ); delay(dl); digitalWrite! in-lr LOW }; digitalWrite! ^2, HIGH ); digitalWrite! HIGH ); digitalWrite! in4r LOW }; delay(dl); digitalWrite! LOW }; digitalWrite! in2, HIGH ); digitalWrite! in3r LOW ); digitalWrite! LOW ); delay(dl); digitalWrite! iftlr HIGH ); digitalWrite! in2r HIGH ); digitalWrite! LOW ); digitalWrite! LOW' ); delay(dl); digitalWrite! HIGH ); digitalWrite! in2, LOW ); digitalWrite! ^3, LOW }; digitalWrite! i^4, LOW ); delay(dl); digitalWrite! inlr HIGH ); digitalWrite! ^2, LOW }; digitalWrite! LOW ); digitalWrite! HIGH ); delay(dl); digitalWrite! irilr LOW ); digitalWrite! LOW }; digitalWrite! LOW ); digitalWrite! HIGH ); delay(dl); }
Переменная dl здесь — это время между соседними ком- мутациями обмоток. Для того чтобы заставить двигатель дви- гаться быстрее или медленнее, необходимо будет изменить переменную dl. Увеличиваем паузу между коммутациями — вал вращается медленнее. Уменьшаем паузу — вращается бы- стрее. Для управления шаговым двигателем в Arduino имеет- ся стандартная библиотека Stepper.h. Библиотека Stepper.h. Набор функций у нее следующий: * Stepper(); • setSpeed(); • stepQ. Функция Stepper() Функция StepperQ создает новый объект класса Stepper, привязанный к одному шаговому двигателю, подключенно- му к контроллеру Arduino. Конструктор следует использовать при объявлении переменной класса Stepper, обычно в самом начале — вне setup() и 1оор(). Количество параметров зависит от способа подключения — 2 или 4 выхода используются для управления двигателем. Синтаксис: Steppor( steps, pint, pjn2); или Stcppor(stcps, pinl, pin2, pin3, pin4); Параметры: — steps — количество шагов в полном обороте использу- емого двигателя.. Если в документации к двигателю указан угол одного шага, то следует разделить 360" на этот угол, что даст нам искомое количество шагов; — pinl, pin2, pinB, pin-1 — выходы Arduino для подклю- чения шагового двигателя. Возвращаемое значение: новый экземпляр объекта класса Stepper. Функция setSpeed(rpm) Функция setSpeed(rpm) устанавливает скорость вращения в оборотах в минуту. Эта функция не заставляет двигатель
вращаться, а лишь устанавливает скорость вращения, кото- рая будет использована при вызове функции stepQ. Синтаксис: Stepper, sets peed(rpm); Параметр rpm — скорость, на которой будет производиться вращение шагового двигателя, выражается в оборотах в минуту.. Возвращаемого значения нет. Функция step (steps) Функция step(steps) вращает вял двигателя на опреде- ленное количество шагов на скорости, заданной функци- ей setSpeed(). Эта функция блокирующая, т. е. она ожидает окончания вращения двигателя, прежде чем передать управ- ление в следующую строку кода. Во избежание длительной блокировки выполнения кода скетча, управление необходимо организовывать так, чтобы скорость была высокая, а за один вызов step() делалось всего несколько шагов. Синтаксис: Stc р per. ste р (ste ps); Параметр: steps — количество шагов: — положительное число вызывает вращение в одну сторону; — отрицательное — в противоположную. Возвращаемого значения нет. Пример 3.52. Для управления ШД в Arduino IDE имеет- ся. стандартная библиотека Stepper .h, которая осуществляет только полно шаговый режим коммутации. Подключим дви- гатель к драйверу. Драйвер, в свою очередь, подключим к плате arduino к цифровым пинам 2, 3, 4, 5. Скетч примера (_28BYJ-48.2) имеет вид: # include < Stepper. h> const int steps PerRevo I u lion = 512; Stepper myStepperf steps Perfle volution, 2, 4, 3, 5); void setupQ { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4T OUTPUT);
pinMude(5, OUTPUT); myStepper. setspeed (70); //управление скоростью Serial. begin(9600); } void loop() { Seri a I. p ri ntl n(w в перёд"); // задаем перемещение на 2048 шага my St epper.step(stepsPerRe volution * 4); //для экономии энергии снимаем напряжение с // контактов 2 и 3. контакты по умолчанию были // активны для удержания тяги на валу digitalWrlte(2, LOW); digltalWrite(3, LOW); digltalWrite(4, LOW); digital Writer LOW); delay(2000); Serial, printing назад1'); // задаем перемещение на -2048 шага myStepper. step (-steps PerRevolution ' 4); digitalWrite^, LOW); digitalWrite(3f LOW); digital Write(4, LOW); digitalWrite(5# LOW); delay{2000); } Здесь один оборот вала составляет 2048 шагов. Библиотека Асе el Stepper Ji Стандартная библиотека Stepper, идущая с Arduino IDE, поддерживает только полношаговый метод управления и име- ет сильно ограниченные возможности. Использовать ее мож- но только в очень простых приложениях, в которых исполь- зуется только один ШД. Применение библиотеки Stepper для управления 28BYJ-48 является не самым эффективным ре- шением. Есть лучшее решение — это использовать библиотеку AccelStepper. Эта библиотека очень хорошо работает совместно с шаговым мотором 28BYJ-48 (мотор почти не греется), я так-
же поддерживает ускорение, что позволяет заставить мотор вращаться быстрее. Библиотека использует код, неблокирую- щий шаги, и включает немало других приятных особенностей: * объектно-ориентированный интерфейс для 2, 3 или 4-вы- вод ных ШД; * поддержка ускорения и замедления; • поддержка одновременно нескольких ШД с независимой работой для каждого; * функции API не используют функцию delay и не преры- вают работу; * поддержка выбора функции для реализации шага позво- ляет работать совместно с библиотекой AFMotor; • поддержка контроллеров ШДТ таких как Sparkfun EasyDriver {основанных на микросхеме драйвера 3967); • поддержка низких скоростей; * расширяемый API; * поддержка подклассов. Рассмотрим основные функции библиотеки AccelStepper. h. Функции определения и конфигурации моторов Шаговый двигатель, управляемый выделенной платой: AccelStepper mystepper (1, pinStep, pinDirection}. Биполярный шаговый двигатель, управляемый Н-моегом: AccelStepper mystepper (2, pinA, pinB). Униполярный двигатель, управляемый четырьмя тран- зисторами: AccelStepper mystepper (4, pinAl, pinA2T pinBI, pinB2). Установка максимальной скорости: скорость по умолча- нию очень низкая, так что её требуется переопределить. При движении ШД будет ускоряться до этой максимальной скоро- сти и замедляться при подходе к концу движения. mystepper.setMaxSpeed(stepsPerSecond).
Установка ускорения, б шагах в секунду за секунду: my steppe г. set Ас се lerati о n (steps PerSecon dSquared). Функции управления положением Переместиться в абсолютно указанное положение: my steppe г. move Го (targe tPo в Шоп). Само движение запускается функцией гпп(). Переместиться в относительно указанное положение: my steppe г. move {distanc е). Само движение запускается функцией гшп(). Значение distance может быть больше или меньше нуля. Вернуть текущее абсолютное положение: 1 пу steppe г. си г ген tPosi tiorif). Вернуть расстояние до указанного положения: 1 пу steppe г. dis tan с еТ о&о (). Может использоваться для проверки того, достиг ли дви- гатель указанной конечной точки. Начать движение: 1 пу s te рре г. ги п(). Для продолжения движения двигателя следует вызывать функцию повторно. Начать движение и подождать, когда двигатель достиг- нет указанной точки: 1 пуsteppe г. ru riToPosition(). Функция не осуществляет возврата, пока двигатель не остановится,. Функция управления скоростью Л становить скорость в шагах за секунду: mystepper.setSpeed(stepsPerSecond) Само движение запускается функцией runSpeedf),.
Начать движение: mystepper.runSpeed(); Для продолжения движения двигателя следует вызывать функцию повторно. Пример 3.53. Представленный ниже скетч (28BYJ-28.3) медленно ускоряет вал мотора 28BYJ-28 в одном направле- нии. Затем вал замедляется до остановки и вновь ускоряется, но уже вращаясь в противоположном направлении: # i п cl ude < Acts I Steppe г. h > # define HALFSTEP 8 // пины для управления двигателем ^define motorPinl #define motorPin2 # d efi ne m oto rPun 3 # define motorPiin4 2 3 4 5 // пин для INI // пин для IN3 // пин для IN2 // пин для IN4 // инициализируем с последовательностью выводов // IN1-IN3-IN2-IN4 для использования AccelStepper с 28BYJ-48 AccelStepper stepperl (HALFSTEP, motorPinI, motorPin3, motorPini, motorPin4); void setup() { stepperl. setM a xSp' eed (1000. 0); stepperl.setAccelerationflOO .0); stepperl. s etS p eed(200); stepperl, m о veTo(20000); } void loopf) { // изменяем направление, если ШД достиг заданного положения iffstepperl .dista nceToGo() ==0) stepperl. m о veT o( -sic p per 1 ,cu rren tPosi ti on ()); stepperl.njn(); } 3.47. Светодиодный дисплей 1588BS Светодиодные дисплеи (LED-дисплеи) (рис. 3.90) часто представляют собой матрицу, состоящей из группы с в ото-
диодов с общими анодами в ря- дах и общими катодами в столбцах (или наоборот). На рисунке 3.91 приведена принципиальная схема дисплея с указанием выводов этого устрой- ства. Например, колонка (COL) 1 подключена к выводу 13 этого устройства, а 3-й ряд (ROW) — к выводу 8. Рис. 3.90. Свети диодный: дисплеи 1588ВS Рис.. 3.91. Схема светодиод него дисплея 1588В 8 Такие дисплеи очень удобны. Чтобы управлять этой ма- трицей, нужно подключить все ее ряды и столбцы к микро- контроллеру. Столбцы должны быть подключены к катодам светодиодов. Для того чтобы включить светодиод, на соответ- ствующий ему столбец нужно отправить значение LOW. Ряды подключаются к анодам светодиодов. Поэтому для того, что- бы включить светодиод, на соответствующий ему ряд нужно отправить значение HIGH.
Если светодиоды, будь они хоть в рядах, хоть в столбцах, будут получать только значение HIGH или только значение LOW, разницы потенциалов не возникнет, поэтому в итоге светодиоды так и останутся не включенными. Таким образом, чтобы включить какой-нибудь светоди- од, его столбцу нужно отправить значение LOW. а его ряду — HIGH. Чтобы включить сразу несколько светодиодов в ряду, всем им нужно подать значение HIGH, а затем по мере надоб- ности задавать тем или иным столбцам значение LOW. В ито- ге в столбцах со значением LOW светодиод включится, а в столбцах с HIGH — нет. Контакты, которые при помощи функции pinModeQ задали как выходные (OUTPUT), по умолчанию имеют значение LOW. На рисунке 3.92 показана цоколёвка этой микросхемы. В некото- рых источниках рекомендуют подключать рядам или колонкам светодиодов последовательно резисторы номиналом 220.„470 Ом. С8 07 R2 Cl R4 06C4 R1 .. лпя Ra R7 С2 СЗ R3 С5 R6R3 Рис. 3.92. Выводы (пины) свегод иодного дисплея 1588BS 19Й
Пример 3.54. Б этом примере светящийся огонь « бежит * по экрану слева направо, начиная с первого ряда и кончая четвёртым рядом. Несложный подсчет показывает, что для засветки четырёх рядов матрицы нам понадобится 12 пинов контроллера: 4 пина идут на ряды и 8 — ня столбцы. Будем использовать для этих целей цифровые пины 2-13 в соответ- ствии с таблицей 3.3 соединений и рисунком 3.92. Таблица 3.3 Таблиц а соединений л иное контроллера ы лгик/ч>схел1Ь( дисплея Номер пипа контроллера Номер пипа микросхемы дисплея Назначение 2 9 Ряд 1 (R1) 3 14 Ряд Й (R2) 4 8 Ряд 3 (КЗ) 5 12 Ряд 4 (К4) G 13 Колонка 1 (С1) 7 3 Колонка 2 (С2) 8 4 Колой кд 3 (СЗ) 9 10 Колонка 4 (С4) 10 в Колонка 5 (С5) 11 11 Колонка 6 (С6) 12 15 Колонка 7 (С 7) 13 16 Колонка 8 (С8) Скетч этого примера (_1588BS.l) приведен ниже: //бегущий огонь // массив пинов для рядов const int rowf4] = { // массив пинов дня столбцов const int col[8] - { 6,7,8,9,10,11,12,13 };
// 2-мерный массив из 32 пикселей int pixels[4][8]; void setupQ < // настраиваем столбцовые пины на вывод // и устанавливаем их в HIGH for (int i = 0; i < 8; + + ) { pinMods(col[i], OUTPUT); digitalWrite(co3[i]f HIGH); } // настраиваем рядные пины на вывод // и устанавливаем их в LOW for (int j = 0; j < 4; j++) { pinMode(row[j], OUTPUT); digitalWritefrowfj], LOW); } } void loop() for (int y=0; y<4; y++) {//включаем очередной ряд digital Writcfrowf у\ HIGH); for (int x - 0; x < 8; x+ + ) {//включаем светодиод digitalWrite(col[x]f LOW); delay (500); //выключаем светодиод digitalWrite(col[x]f HIGH); } //отключаем отработавший ряд digitalWrite(now[y],LOW); } } Пример 3.55. В этом примере светящийся огонь «бежит» по экрану слева направо, начиная с первого ряда и кончая четвёртым рядом, однако засветившиеся светодиоды в ряду не гасятся до тех пор, пока не начнется засветка светодиодов следующего ряда, llo-прежнему будем использовать для этих 20U
целей цифровые пины 2-13 контроллера б соответствии с та- блицей 3.3 соединений и рисунком 3.92. Скетч этого примера ( 1588BS.2) приведен ниже: //бегущий ОГОНЬ 1 // массив пинов для рядов const int row [4] - { 23Л5 }; // массив пинов дня столбцов const int col[8] = { 6,7,8,9Д0Д1Д2ДЗ }; void setup() { // настраиваем столбцовые пины на вывод // и устанавливаем их в HIGH for (int i = 0; i < 8; 1+ +) < pinMode(col[i], OUTPUT); digitalWrite(col । t HIGH); } // настраиваем рядные пины на вывод // и устанавливаем их в LOW for (int j = 0; j < 4; j++) { pinMode(row[j]r OUTPUT); digitalWrite(now[j]; LOW); } } void loopQ { for(inty=0; y<4; y+ + ) {//включаем очередной ряд digitalWntcfrowiv], HIGH); for (int x = 0; x < 8; x + + ) {//включаем светодиод digitalWrite(col[x], LOW); delay (500); //выключаем очередной ряд digitalWrite(now.[y]T LOW);
//гасим светодиоды отработавшего ряда for (int i - 0; । < 8; i++) { digital Writc(col[i], HIGH); 1 } 3.48. Считыватель информации с пластиковых карт и брелоков RC522 Рис. 3.93. Комплект считыватели информации с пластиконых карт н брелоков КС522 Считыватель предназна- чен для считывания инфор- мации — радиометки с пла- стиковых карт, брелоков и прочих носителей. Ком- плект содержит набор дета- лей, позволяющий создать основу небольшой систе- мы радиочастотной иденти- фикации. Радиочастотная идентификация RFID (Radio Frequency IDentification) ос- нована при обмене данными на протоколе Mifare 1К. Эта технология позволяет авто- матически опознавать объ- екты, содержащие RF1D-метки — транспондеры. Из меток дан- ные могут не только читаться, но и записываться. В комплект вошли (рис. 3.93): — пластиковая карточка и брелок, содержащие RFID-ра- диометки; — плата модуля RFID RC522 считывания-записи радио- метки; — штыревые контакты.
Как правило, считыватель RF1D КС522 является перифе- рийным сложным устройством, которое может быть постро- ено на базе контроллера. Обмен данными по радио происходит через рамочные ан- тенны, находящиеся в карточке и в модуле. Сигнал модуля служит источником энергии для метки. Считыватель К FID RC522 срабатывает при поднесении метки. Основа модуля — микросхема MFKC522. Он может обрабатывать информацию одновременно от нескольких меток. Для считывания инфор- мации достаточно ненадолго попасть карте в зону регистра- ции даже при перемещении на большой скорости. В наше время проис ходит бурное внедрение RF1D-техноло- гий в различных областях жизни. RFID-системы используют- ся для оплаты общественного транспорта в Москве,. Санкт-Пе- тербурге, Казани, Минске, Баку и в других городах. Вошли в употребление бесконтактные проездные билеты метро, пред- ставляющие собой карточку с RFID-меткой. Радиочастотная идентификация зародилась как альтернатива жетонам и бу- мажным билетам общественного транспорта, пропускам, все- возможным талонам. Сейчас она шагнула в складской учёт и автоматизацию конвейерного производства. Нашлось приме- нение карточек для малых платежей в школьных и студенче- ских столовых. Но по-прежнему главным применением RFID является опознавание * свой-чужой* в авиации, судоходстве, на транспорте, космонавтике, военном деле. Характеристики считывателя RFID RC522 • Напряжение питания 3,3 В. • Ток потребления в режимах. — дежурный — 80 мкА; — ожидания — 12 мА; — обычный — не более 26 мА; — наибольший — 30 мА. • Частота HF 13,56 МГц. * Частотная полоса 13,56... 13,57 МГц. * Расстояние считывания 0...25 мм. • Сопровождаемые карты:
— классы S50, STO, Ultralight, Pro, DESFire; — типы Mil are S50, Mifare S70, Mifare UltraLight, Mifare Pro, Mifare DESfire. * Скорость передачи информации — 106,212,424,848 кбит/c.. * Стандарт протокола MFC Reader ISO 11443 A Mifare clas- sic protocol. • Шифрование Security Features Mifare classicrM. * Размеры — 10 x 60 мм. * Температура: — рабочая -20...SO rC; — хранения -40...S5 Г'С. * Относительная влажность — 5...95 % . Контакты и сигналы платы RFID RC522 Вся необходимая информация приведена на рисунке 3.94: * SDA (SS, CS, MSS) выбор ведомого, вход SP1. * SCK тактовый сигнал SP1, вход. • MOST передача от мастера к помощнику, вход SP1. • MISO передача от помощника к мастеру, выход ЙР1. * IRQ прерывание, выход. * GND общий. * RST сброс, вход. * 3.3 V питание Рйс. 3.94L Контакты и сигналы платы RFID КС 522 Считыватель поддерживает интерфейсы SP1, UART и 121’, через которые происходит обмен данными с другими прибо- рами. На плате модуля RFID RC522 установкой логических
уровней на специальных выводах микросхемы выбран интер- есно SP1. С одним контроллером Arduino могут работать не- сколько устройств, подключённых к шине SPI. Соединение Множество устройств, к которым подключается считы- ватель, имеют питание 5 В. При соединении устройств с раз- ной величиной питания одними линиями следует применять меры согласования. Схема согласования считывателя RF1D RC522 с контроллером Arduino, питающимся от 5 В, приве- дена на рисунке 3.95. AVCC 3.3V s vcc R2 R3 R1 JF1 RFID-EC522 XL flST GND Rd____ Mosi XT SCK 1 SDA/SPISS ARDUINO 3.3V ARDUINO DIGITAL 9 1N4146 ARDUINO DIGITAL 12 ARDUINO DIGITAL 11 ARDUINO DIGITAL 13 ARDUINO DIGITAL 10 Ы-рг 1N4148 [XI D3 1N4I48 (ЧЬИl_ 1N4L4 ARDUINO GND GND GND Рие. 3.95, Схема согласованна считывателя RFID КС 52 2 с контроллером Arduino Сигнал сброса, поступающий на контакт RST считывателя, должен поступать от цифрового выхода контроллера и форми- руется программно. При подаче логического О происходит пе- резагрузка считывателя. Низким уровнем на RST считыватель сообщает, что находится в режиме сна. Для того чтобы его яряз- будитьнеобходимо туда же подать сигнал высокого уровня. На рисунках 3.96 и 3.97 показаны схемы подключения считы- вателя к плате контроллера. Подключение считывателя к раз- личным платам семейства Arduino приведено в таблице 3.4.
Таблица 3.4 Подключение считывателя к различным плитам семейства Arduino Тип кон- троллера Arduino Arduino Mega Ardui- DO Uno и Nano v3 Arduino Leonardo и Micro Arduino Pro Micro CraftDuino Raspberry Pi B+ MISO 50 12 ICS P-1 14 12 21 MOSI 51 11 ICSP-4 16 11 19 sc к 52 13 ICSP-3 15 13 23 SDA 53 10 24 ?JV AST 8?& MISO MOSI Рис. 3.96. Схема подключения считывателя RF1D КС 5 22 к плате контроллера Modulo RFID RCS22 Aidulnd 33 Pino 3.1V ftST Pino$ GNO ИпдG4D NC Mio eGficctado MISO Pino 12 MOSI Pino 11 SCK Pino 13 50Д Pino 10 RFID-RC522 with Arduino Рис. 3.97. Схема подключения считывателя Rl'lD RC522 к плате контроллера
Контакт главного модуля для подключения к контакту SDA указывается как SS P1N в программе. Контакт глав- ного модуля для подключения к контакту RST указывается как RST_P1N в программе. Это выполняется с помощью ко- манд: #define SS_PIN номер контакта и #define RST_PIN номер контакта. Все контакты модуля, кроме IRQ, обязательно подключа- ются. Сигнал от контакта IRQ обрабатывается программно. Запись с помощью считывателя RFID RC522 Устройство может применяться как программатор карто- чек. С его помощью можно не только читать хранящиеся дан- ные, но корректировать их и записывать вновь. Кроме этого, можно изменить идентификационный код. Пластиковая карта В комплект входит белая пластиковая карта Mifare 1К, на которую можно нанести цветное изображение. Внутри неё находятся антенна и микросхема Mifare S50, содержащая па- мять и радиочасть. Размер памяти 1 килобайт, тип ВЕР ROM. Она разделена на 16 секторов, состоящих из 1 разделов. В ка- ждом разделе три информационных части и одна для клю- чей. Внутри одной части есть 16 байт памяти. Срок хранения данных — 10 лет, количество циклов перезаписи — 100000. Уникальность карточки Mifare обеспечивается присвое- нием изготовителем номера. Он используется в качестве иден- тификационного кода. Для защиты хранящихся данных в ми- кросхеме карты использовано аппаратное шифрование. При работе данные с пластиковой карточки поступают на считы- ватель только после взаимной идентификации кода, записан- ного в сектор памяти карточки и хранящегося в считывателе. Характеристики карты: * Тип Mifare Standard 1k (тонкая). * Время транзакции 0,164 с™
• Температура — рабочая — 30... 75 аС : — хранения — 40...85 ИС. * Размеры: 86 х 54 х 0,8 мм. Пример 3.56. Считать номер карты или брелока и выве- сти его в монитор порта. Если карта уже была считана ранее, то вывести просто точку. В скетче используются функции би- блиотек SPI.h и RFID.h, поэтому необходимо заранее побеспо- коиться о загрузке этих библиотек в ваш компьютер. Хранят- ся они обычно в папке rfid-master, которая, в свою очередь, должна храниться в папке libraries среды программирования IDE, установленной на вашем компьютере. Скетч примера (RC522_l.ino) приведён ниже. Этот пример не выдаёт данные из карты, а только её номер, чего обычно бывает достаточно для многих задач. Библиотеки лучше всего скачивать с сай- та http: //iardnino.ru. ^include <SPLh> ^include "RFID.h'' ^define SS PIN 10 ^define RST PIN 9 RFID rfid(SS_PINf RST-PIN); /*данные о номере карты хранятся в этих 5 переменных, будем запоминать их, чтобы проверять^ считывали ли мы уже эту карту */ int serNurnO; int serNunril; int serNum2; int serNum3; int serNiiin4; void setup() { Serial.bogin(9600); SPLbeginQ; Serial, printing 12"); rfid.initf); } void loop() // сравниваем номер карты с номером предыдущей карты {
if (rfid.isCard()) { if (rfid.madCardSerialO) { if (rfid.serNum 0} ! = serNumO && rfid.serNumf Г != serNunil &8i rfid.serNum[2] 1= serNum2 rfid.serNum[3] 1= serNum3 && rfid.serN'um[4] != serNum4) { // карта — новая, выполняем считывание се номера Serial.printing «); Serial, printing «Карта определена^); serNumO = rfid.serNum 0 ; serNuml = rfid.serNum[l]; scrNum2 = rfid.serNum[2]; serNum3 = rfid.serNum[3]; serNurn4 = rfid.serNum[4]; /* выводим номер карты в монитор порта в десятичной и шестнадцатиричной формах Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а Seri а .printingНомер карты:**); .print( «Десятичное представление: «); .piint(rfid.5erNum[0]rDEC); .рппЦ"г "); .print( rfid.se rIMumf l]fDEC); .pnntc; .pri ntCrfid.serNum^ljDEC); .pnntr, . print( rfid .БСгМиггТЗ] rDEC); .pnntc; . print( rfid .serNuirJ 4] ,DEC); .printing «); .print(«Шестнадцатеричное представление: «}; .pnnt(rfid.serNum[O]fHEX); prints . printf rfid-serNurnf 1 ] rHEX); Serial.print(jrr Serial.printtrfid.serNum^jHEX); Serial.prints, Serial. print(ifid.scrNum[3]r HEX);
Serial. print(\ Serial. print(rfid.serNum [4] ТНЕХ); Serial, printing } else /*т карта была уже считана, поэтому выводим в монитор порта точку */ { Serial.print(".w); } } } rfid.halt(); } На рисунке 3.98 приведён результат работы скетча, когда к считывателю сначала была поднесена карта, потом — бре- лок, потом —снова карта. Точки печатаются, когда карта или брелок долго держатся возле считывателя. Последнее число в каждой строке — контрольная сумма. Хйрта *лг«лелека Уин&р Jtapia: Aj±c£i№Dkie □рЕ^^1.93леьи±: 192, 1D6, 1QQ, 12 4 и ДТЁ Ее йтка.сд^'те ручное пре-вставление г СС, fJ, 7СР В? Црп СЗ^МЛЙЛЖМЯ карта.: Дебютное пре д ci явление-: ICS, 149, 194, 1Й-7, "i Еестньжит^ричшк прмсг&щкниг: Аб, 3S, СЗ, SB, 4А Тар?а штрепйЛЕШ Яав*р к.эетн: Дзр^еичзше □рел^Арлеиие: 1S3, 1D<, 100, 134, 17S ййстнп^итчтгис стреи^грплк-т*! СЙ, ЬА, £4, ТС, В2 лагоприир/тчй Рис. 3.98. Результат работы скетча в мониторе порта
RFID метки работают в трёх частотных диапазонах: * диапазон LF — 125.Л34 кГц: • диапазон НК — 13,56 МГц; * диапазон UHF — 860..960 МГц. RC522 работает в диапазоне 13,56 МГц и с протоколом MIFARE. Для работы с модулем можно использовать стандартную библиотеку RFID, входящую в Arduino IDE, однако имеет- ся более удобная библиотека MFRC522 (1 Мб). Обе библиоте- ки вполне удобны, однако в MFRC522 больше специальных функций, позволяющих максимально сократить итоговый код программы. Можно столкнуться с такой проблемой, как название пи- нов. Если в скетчах указан пин SS, а ня вашем модуле его нет, то, скорее всего, он помечен как SDA. В таблице 3,5 приведе- но подключение модуля для самых распространённых плат. Таблица 3.5 модуля RFID RC522 для самых распространённых плат MFRC522 Arduino Uno Arduino Mega Arduino N ano v3 Arduino Leonardo/ xMioro Ardni no Pro Micro RBT 9 5 DO RESET/ICSP-5 RST SDA{SS) 10 53 DIO 10 10 MOSI ll(ICSP-4) 51 Dll ICSP-4 16 MISO 12(ICSP-1) 50 DI 2 IC8P-1 14 SOK 13(ICSP-3) 52 D13 ICSP-3 15 3,3 V 3,3 V 3+3 V Стаби- лизатор 3+3 В Стабилизатор 3,3 В Стаби- лизатор 3,3 В GND GND GND GND GND GND Нины управления SS(SDA) и KST задаются е скетче, по- этому если ваша платя отличается от той, что я буду исполь-
зовать в своих примерах (UNO R3), то в начале скетча указы- вяйте пины из этой таблицы. Пример 3.57. Считать не только номер карты или бре- лока, но и все расположенные на них данные. Библиоте- ку MFRC522,h скачиваем с сайта http://iarduino.ru и раз- мещаем её в папке rfid-master, которая, в свою очередь, должна храниться в папке libraries (библиотеки) среды про- граммирования IDE, установленной на вашем компьютере. Папку, хранящую библиотеку RFID.h, предварительно пе- реименуем в rfid-masterl. Скетч примера (RC522_2.ino) приведён ниже: # include <SPI.h> ^include <MFRC522.h> #define RST.PIN 9 ^define SS.PIN 10 MFRC522 mfrc522(SS_PIN, RSI _ PIN); // активизируем- библиотеку void setup() { // инициализируем монитор последовательного порта Serial. begin(9600); while (ISerial); // ничего не делаем, пока порт не открыт SPI.beginf); // инициализируем SPI шину mfrc522.PCD_Init(); // инициализируем RFID модуль ShowReaderDetails(); // выводим данные о модуле MFRC522 Seria!.println(F( "Сканирование карты дпя определения её типа, номера и получения данных")); } void loop() { // Ищем новую карту if { ] mfrc522.PICC_isNewCardPrcsent()) < return; // Выбираем одну из карт if { ! mfrc522„PICC_ReadCardSerial(}) { retu гп;
// Выводим данные с карты mf гс522. PICC_Duin pToSeri а I (&.{ m frc 5 2 2. и i d)); } void ShowR.oaderDt!tails() { /7 Получаем номер версии модуля byte v - rnfrc522.PCD_ReadRegister(mfrc522.VfirsioriReg): Serial.print(F(wIMFRC522 Software Version: 0x;r)); Serial.print(vf HEX); if (v == 0x91) Serial.print(FC = vl.CT)); else if (v == 0x92) Serial, printf FC = v2,.0rj)); else Serial.print(FC (не знакома)')); Serial, printing "): // Когда получаем 0x00 или OxFF, передача данных нарушена if ((v == 0x00) || (v == OxFF)) { Serial.рг!п1:1п(ЕСПредупреждёниеI Ошибка связи! Проверьте правильность подключения RC522! ")); } } Считав данные с карты, получим её тип, идентификатор и данные из 16 секторов памяти (рис. 3.99). Карты стандарта MIFAKE 1К состоят из 16 секторов. Каждый сектор состоит из 4 блоков. Каждый блок содержит 16 байт данных. Пример 3.58_ Запись нового идентификатора (LIID) на кар- ту. В этом примере мы рассмотрим смену идентификатора карты. Далеко не все карты поддерживают смену идентифи- катора. Карта может быть перезаписываемой, но это означа- ет лишь перезаписываемостъ данных. К сожалению, те карты, которые имеются у меня, перезапись UID не поддерживают, но код скетча я всё-таки приведу. Скетч примера (RC522 3. ino) приведён ниже. Результат работы скетча представлен на рисунке 3.100. Записать новый I 11) на карту не удалось, поэ- тому она осталась со старым ULD.
4TtCL "i Safrwn Va Fill cel: fti W : - .J J ^EiK^ziixW up» ZJ1 :n;«Eui№Ui 1 Hi TXD-lr .-taf naj.-Mi 1. 1 ZIE-ЬЗ С1Г1 P[Pl W 4 f+ "C 'М« i.jjc HJT№ I LKf r>^:t Vteu D 1 3 4- 5 C 7 I kD IL 32 13 L4 15 Aw«uS hi pp w to я Of M 00 40 an 10 00 DO FT 05 01 flt H M -kt FT OP flfl TF 01 FT П IT Г" M 01 40 N [ [ 0 0 P 3 0 0 1 CD M 11E 00 3D DO DC OD Ed OD ID KI CO ai OD ID Г D D D ED til Cd i3E dC ID Cd 1JC OD Cl oc ID к DO S3 OD M r D D D В 59 if И :d 00 M 05 flfl Й. dfl 00 CD M M FF 01 M OP Ы D3 49 OD FF HD ¥F 00 ET to TF DI FF OD F Ю [ [ 0 D 0 3 D D JT to C*3 a: 00 CD CO EC OD D3 OD OD ffl CM DO CD ID E □ □ D 5а 4 E5 № bO M И 01 OE 00 40 00 30 PO DO W Of Ef fll Pl M Of 4» 40 FF № FE M E- o; op w ?E JT Ef [ [ P t 0 P 0 3 bi ID ci DE 00 OD IC DC OD D3 OD ID DI DO DO OD CD L D 0 t 13 ci M IE 00 OD Cd EC IC Cd CD ID frZ CO n: OD T' [ D D t за bi bi Ы CO M to ЙЕ ЙС «0 04 40 40 CO M DO ft flt Й1 M Eri Of flO «» !f M ST 00 03 (* Ft ЙР 10 [ I 0 0 0 0 0 3 ID :: M 3C 00 CD DO DC CD Ы CD 3D DI DC EI OD SD [ □ D D 19 4Й PO to pn to 01 Dl 00 4o OD CD w DO 04 M OP Of w M OP 10 Of 40 OP 0. M 00 0= pj OP w Ob « r [ 0 0 0 0 0 0 :i ET to ec >3E 00 CD CO ET 01 E3 4» FT Tr E Г rr FT L n D 3 41 to lit 00 CD Cd EC dt D3 CD 30 oc to LI [ Cr P D 4? U K> Dfl И ой OL 01 40 00 CO 3D to Cd M DC ot OD И w Mt nO 10 CD or Ol 00 co M tl 00 n CD ID [ L P D P r 0 D :d 43 DD DO IE 00 CD DC FT fll E3 4» IT I1’ FT rr rr IT [ D D 3 I? 11 » bo M 0] И 4! 40 00 40 50 PO M 00 Dfl Ot OD W to OP Ob № to ff 05 PO bfl Й1 OP 00 w u r [ 0 Й P P 0 P 4D DD 03 3-E 00 OD D< DC Ot Dl OD ID к Cd C3 CD я [ D D t i 1Я UD Dfl CD DO OD DO JT Й1 BE.' Ed ft Tt tr .p Ef L J □ 19 OP M OP w OD to ID d: OP ГЛ OD Op flD M OD M Г 0 a IT □ D И OD I11 ОС DC CD d: DD DC CD CD DD DC CD £C L □ a 36 Ob to 00 w flD Ofl 10 « OP M 00 Ob 00 00 10 to r fl fl 35 131’ w 00 DC OD DC 7T IT 3D Ed ft TT FT FT TT rr [ □ 3 I3D M OD DC OD DO OD № DC DC □ D OD CD DC CD DC L □ a Mi 0E‘ H OD DO OD Dfl 10 Pt OP DO OD Ob 00 Dfl 00 M Г 0 0 3. 13? M DO DO OD CM 3D E DD DC CD DD CD DC CD CC [ □ □ 7 ]i 00 M OD И OD DO FT OI DP Й JF 7F 77 FT FF FF г 0 a 3D OD z-i OD DC OD IC CD DC DC Cd CD OD DD DC ID to [ Й □ !9 1» M OD M 00 M 40 M Ob Dfl OD Ob Ob Dfl flfl 04 L Й Й J5 I3D M OD DC OD IC 3D d: □ E- DC CD OD OD DI CD D3 r □ □ i Я M [4 00 !>.' 00 M PF Di Ob И JF Jf ±F EJ EF П L 0 0 IC □ D CD OD DO CD DC CD DC 3D Ш OD DD DD Dl CD DC Г 0 0 15 M> bfl Of DO OD M flD Of DD C4 flb 00 OD M 00 Ot L a fl :* OP w Of И OP w Of И UP PO OP OP OP Pfl OP to r 0 0 за □ I' CJ OD И OD Crt rt СП DD LI Ft -r *f N rf 7 f L 0 a гг OP H Of » Of 00 Of 09 ap M 00 Of Df W OP И r 0 0 21 DD DO OD DO OD DC CD DC DD DC CD CD OD DC CD CC L □ □ 20 OP [4 Of PO 00 Dfl 00 01 OP M Of 0f flf DO 00 И Г 0 0 1Я □ D M op DC OD DO rc D'l DC Ed IT TF TT rr FT rr [ □ 0 LB OD M OD DO OD M flD Ot OP DO OD Ob 00 Dfl 00 (Г. r 0 fl 17 ci M OD DO OD DO 3D □I JC Id DD DD CD DO CD Cd [ □ I Lb Й0 M Of OO 00 Dfl 00 M Ob № 00 OP 00 Dfl flO M L 0 0 j ia M OD DD OD t’l FT in DD И T TT TT FT rr IT L □ 3 14 Ob to 00 DO 4D DO 30 M M M 40 Ob OD M eo to I Й fl 13 OD M OD DD OD DC 3D DI DD C*3 DD DD DD DC CD DC г 0 □ Li DD to 00 DC- 00 DO CD M Й0 Dd 00 Ob CD M flO LT L J c J ;1 ID DD flb to bfl Of 00 Г-" DO OD 00 C-3 M FT ОЙ DI IK t ЙО I'd M 00 TT Ob TF flb M rr co to Г L D Й 0 fl L 00 ЙС’ to to OP OD И D-D OP OD Dd DO 00 :d К DC OP Ob PO M OP OD OP ot op CD w DO OP :0 и CM Г t 0 a 0 1 7 OP to OD DO flD PC ‘FT PI ЙР Й? TF FT TF FT FT TF Г 0 fl 0 OD M OD DC ID IC ID n: III DC OD CD OD DO CD M [ a □ F- or N OD И 00 DO 00 M OP DO OD OP OP DO 00 01 r 0 0 C DD Dd OD d: OD IM -:d DC DD DC DD OD CD га CD DC [ □ 0 J 3 M M 00 DO OD Dfl EF 01 9 b Й FF ?F FF FT FF ET L 0 fl 2 di to OD co OD DC on DC DD DC DD OD OD DC CD Cd E □ □ 1 00 M Of DC 00 M 00 M ЙР DO OD OD 00 M 00 to L 0 Й □ EI- ГЙ 34 li_ 1 r: M DI DE M DD DD CD CP co L □ 4 Рис. 3.1Ю. Результат работы скетча в люнитире порта
#incEude <SPLh> # include <MFRC522.h> //Задаём здесь новый UID tfdefine NEWJJID {OxDE, OxAD, OxBE, OxEF} #define SS PIN 10 tfdefine RST.PIN 9 MFRC522 mfrc522(SS PIN, RST_PIN); MFRC522: :MIFARE Key key; void setupQ { Serial, begin (9600); while (^Serial); SPI.beginf); mfrc522.PCD_Init(); Serial, printing ("Осторожно 1 Этот пример перезаписывает UID вашей карты! ")}; for (byte i = 0; i < 6; ++) { key.keyByte[i] = OxFF; } } void loopf) { if ( ! mfrc522.PICC_IsNewCardPresent{) || ! mfrc522.PICC_ReadCardSerial()) { delay(50); return; } // Считываем текущий UID Serial.priпЦ.Е("Саrd UID;"}); for (byte i = 0; i < rnfrc522.uid.stze; f+ + ) { Serial.print(rnfrc522.uid.uidByte[i] < 0x10 ?" 0" : " SeriaLprint(mfrc522.uid.uidByte[l], HEX); } Serial. println(); // Записываем новый UID byte newUidf] = NEW_UID; if ( mfrc.522.MIFARE_SetUid(newUidp (byte)4pl true) ) { Serial.println{F^HoBb[n UID записан11')); }
mfrc522. PICC Ha ItAQ; // □ ста нов Смиты в ате л я iff 5 rrifnc522.PLCC_IsNewCandPresent()| t mfrc522.PICC_ReadCardSerial() ) < return; } // Считываем данные с карты Serial.рппИп(Р(чНовый UID и содержимое")); mfrc522.PICC DumpToSerial{&(mfrcS22.uid)); delay(2000); } Зтст -ткяир пгрсшьт^гсшаят 1'Д Й «ioii xtfnr' Г1Гй ПЕч AS 95 С2 ЕЕ Cirt (U4 n^t г гл -О tiz№ HA17 ;гта-.1. А ГТ упц pupr it UJfr еЫ=^4Ё-11 PW? £rrat odinB: In Camiri2-SA.tJ.i5Ti. AST L'-TflTln] Cits Ui® bdCktiDDX Ci.'. L«L. itt я ihfltfi'jC'i "LD1 CTDl AS 95 C2 EE NtG type: ЫХЕМС jj* 5KTC1 Elicit 0 12 J -c 4 7 E Za 10 | г 12 19 14 IE- AccesaEiLS 1} 4? 59 W 00 00 DO CC FT D3 55 5? TT FT TT IT FT TF [ n 0 1 ] ЙЗ 50 w 00 00 05 w CC 00 05 w и « 00 05 09 w [ 0 0 0 ] SI ОС CG M JO 00 w cc 00 D9 № 09 QC< 90 00 DD :: [ C D [ ] DO '» 00 on ПР co on nr- W 05 и ПП no 55 oe [ n 0 D ] 31 G9 00 M Oil 00 09 "2 FF 07 to b? EF FT rr FF FF [ 0 0 1 1 35 5-5 w CO 00 00 CC 00 00 50 К M к 00 no 95 к [ n 0 Г ] 57 DO c< 00 00 00 Ct CC 00 09 » 09 M 00 00 09 и [ 0 0 0 ) Зв 09 w 00 00 55 ?:- CC no DD ОС ОС X no DO DO jj [ 0 0 p ] 15 55 95 к 00 00 55 IT 07 55 £r EF = -7 Г7 FF FF FF [ 0 0 1 ] Ей Mi cc 00 00 09 и cc 00 09 OO X 00 00 00 M t 0 0 0 1 37 55 № 00 00 55 w GO no 55 ?; « X 00 50 55 77 [ 0 0 t J Б£ OD 0C 00 00 DD Gt CO 00 00 i*: 05 X 00 00 09 Ю [ 0 0 0 ] 3J 31 ?D GG 00 00 DD ~"~ IT 07 59 0? TT FT TT FF FT FF [ 0 0 1 J SO И Cfl 00 00 05 « £0 00 00 5G 05 W 00 00 00 -M [ 0 0 D ] 49 Mi cc co 09 95 'L- 00 00 00 W 00 Ti co DO DD [ c 0 Г J 40 53 1» ^0 00 55 fK co 00 55 К M Ж 00 00 05 95 Г d 0 0 ] Рис. £.100. Результат работы скетча н дюниторе порта Пример 3.59. Ещё один пример чтения UID и типа карты и вывод этой информации в монитор порта. Скетч примера (RC522_4.1no) приведён ниже. Результат работы скетча пред- ставлен на рисунке 8.101. // Подключение библиотек ^include <SPI.h> #include <MFRC522.h> // пины для сигналов SS и RST ^define RST_ PIN 9 ^define SS_ PIN 10
// Инициализация MFRC522 MFRC522 mfrc522(SS_..PlNr RST_P1N); void setupf) { // инициализация последователь него порта Serial.begin(9600); SPLbeginQ; // инициализация SPI mFrc522.PCD_Init(); // инициализация MFRC522 } void loop() { if ( ! mfrc522.PICC_,IsNewCardPrescnt()) return; if ( 1 mfrc522.PICC_ReadCardSeiial )) // чтение карты return; // показать результат чтения UID и тип метки Serial. print(F(" Card UID:"}); dump_by tc_aггау(тГгс522.uid.uidByte, mfrc522.uid.size); Serial, printing); Serial.print(F("PICC type: ")).; byte piccType = mfrc522.PICC_GetType(rnfnc522.uid.sak); Seri a I. p ri nt I n (mfrc522. PICC _GetTy peN a me( p i ccT у pc)}; delay(2000); } // Вывод результата чтения данных в НЕХ-виде void dump byte_array(byte * buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? ee 0r; : " u)*f Serial.prfnt(buff:er[i], HEX); } } j=d O3Z-: СП EA. 14 T HK Tb5*: HJ fbfct jkE Olid QlBi m Q U T PICC HT*: I!jTnrT ID ±«±d MBs rt M X BIK HJFWI J&E П ч И X PIDC ^J3 Рис. 8.101. Результат работы скетча н мониторе порта
Пример 3.60. Изменим на карте содержимое четвёртого блока первого сектора. Скетч примера (RC522 5.ino) приве- дён ниже. Результат работы скетча приведён на рисунке 3.102. В монитор порта выводятся как старые, так и новые данные. ^include <SPI.h> # include <MFRC522.h> #define RST.PIN 9 ^define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST.PIN); MFRC522: :MIFARE_Key key; void setup() { Serial.bcgm(9600); while (ISerial); SPI.begin{); ‘ mfrc522.PCD_Init(); // подготовим ключ, используя ключ FFFFFFFFFFFFh, // который является стандартом для пустых карт for (byte ; = 0; i < 6; i+ + ) { key.keyBytefi] = OxFF; } Serial, printin (FC Scan a MIFARE Classic PICC to demonstrate read and write.r/}); Serial. print(F(" Using key (for A and dump_byte_array(key .keyByte, M FRC522;: MF_KEY_SIZE); Serial. printlnQ; Serial. println(F{* BE WARE: Data will be written to the PICC, in sector #ГГ)); } void loopQ { // Ждём новую карту if { J mfrc522.PICC_IsNewCardPn*sent()) return; // Выбираем одну из карт if ( 1 mfrc522.PICC_ReadCardSerial()) return;
// Показываем подробности карты Serial, р ri nt(F(" Card UID:"}); dump. byte_array (mfrc522.uid.uidBybe, mfrc522. uid.size); Serial. println(); Serial, p ri nt(F(" PI CC type: ")); byte piccType = mfrc522.PICC_GctTypc(mfrc522.u!id.sak); Seri a I. p ri ntl n(mfrc52 2. PICC_GetTy peN □ m e( p i ccT у pe)}; // Проверяем совместимость iff piccType != MFRC522: :PICC_TYPE_MIFARE MINI && piccType != MFRC522: :PICC TYPE MIFARE.1K && piccType != MFRC522:::PICC_TYPE_MIFARE_4K) { Serial.printin'F("Thi£ sample on!y works with M1FARE Classic cards/')}; return; } // В этом примере мы используем первый сектор данных карты, блок 4 byte sector - 1; byte blockAddr = 4; byte dataBlock[] = { // новые данные, которые мы запишем на карту 0x01, 0x05, 0x09, 0x0D, // 1, 5, 9, 13, 0x02, 0x06, 0х0А, ОхОЕ, // 2, ь, 10, 14, 0x03, 0x07, 0x0В, OxOF, // 3, 7, И, 15, 0x04, 0x08, ОхОС, 0x10 // 4, 8, 12, 16 byte trailerBlock =7; byte status; byte buffer] 18]; byte size = sizeoffbuffer); // Аутентификация Seri a I. p ri ntl n(F(" Authenticating using key A...")); status - mfre522. PCD_Authenticate'(MFRC522:: PICC_CMD_MF_ AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid}); if (status != MFRC522:: STATUS. OK) { Seri a I. p ri nt( F{" PC D_Aut h entica tc(} Га i led: ")); Sori a I. p ri ntl n( mfrc522. Get Stat и sCod e Na m e( s tatus)); return; }
// Показываем текущие данный сектора Serial. println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfnc522. uid), &key, sector); Serial. println(); // Читаем данные из блока Serial. print(Ff'Reading data from block")); Serial. print(biockAddr); Serial. println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, Eksize); if (status 1 = MFRC522:::STATUS_OK) { Serial. print(FCfMIFARE_Read() failed: ")); Seri a I. p ri ntj n (mfrc522. G etStatusCo de N a me( statu s)}; } Scnal.print(r('*DatB in blockw)); Senal.print(brackAddr); Serial .printing™:")); dunnp_byte_array( buffer, 16); Seri a I. printing; Serial. println(); // Аутентификация Serial, print ln{FCJ Authenticating again using key B../')); status = mfrc522.PCD Authenticate^FRC522::P1CC_CMD_MF_ AUTH KEY B, trailerBlock, &key, &(mfrc522.uid)); if (status 1 = MFRC522:: STATU S_OK) { Serial, p ri nt(F("PCD_Authenticate() failed: ")); Serial. print!n(mfrc522.GetStatusCodeName( status)); return; } // Записываем данные e блок Serial.printtF^Writing data into btock ”')); Serial.print(blockAddr); Serial»println(FC ../)); duiTip_byte_arr ay (data Block, 16); Seriaj,println(); status = mfncS22.MIFARE_Write(blockAddr, data В lock, 16); if (status ’= MFRC522::STATUS_OK) { Serial.print(FrMIFARE_Wnto() failed: ")}; Seri a I. p ri ntl n (mf rc522. G etStatusCo do N a me( sta tu s)); } Serial.printin');
// Читаем данные снова, чтобы проверить, что запись прошла успешно Serial, р ri n^Ff" Rea ding data From block ")); Serial, p ri nt(blockAddr); Serial, printing ../)); status = rr.frc522/MIFARE_Read(blockAddrT buffer, &size); if (status 1= MFRC522: :STATUS_OK) { Serial. print(F("MIFARE_Read() failed: ")); Seri a I. p ri nt I n( mfrc522. GetStatu sCo d e Na m e (status)); } Serial, p ri nt(F(" Data in block ")); Serial. print( blockAddr); Serial. printing/)); du mp_byte_array( buffer, 16); Serial. println(); Serial. p ri ntln(F(w Checking result./')); byte count = 0; for (byte i = 0; i < 16; i++) { if (buffer[i] = - dataBlock 1]) count++; } Serial print(F("Nurnber of bytes that match = W)J; Senal.println(oount); if (count == 16) { Serial.println(F("Success } else < Serialprintln(F("Failuref no match :-O); Serial.println(F(" perhaps the write didn't work properly../)); } Serial. println(); // Выводим данные Serial.pnntln(F('<urrent data in sector:")}; m Frc522. PI CC_ D u mp M ifareClassicSectorToSe ri a I (&{ mfrc522.uid), &keyr sector); Serial. println(); mFrc522.PICC_HaltA(); mfrc522.PCD_StopCryptolO; }
void dump_byte_array(byte ^buffer, by to bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial. print(buffer[i] < 0x10 ? " СГ : " Serial, p ri nt( buffer i]f HEX); } } PlFSRr C1LH10 FIX м Оееипеттке read and nire. п?:пд rey 4 for A md Ba I FF FI FT ET TT TF ВЕНЬКЕ [ькь *111 be «Х'иьь то tht FIX. Iz weoerr #1 Cicd Ш&1 M M C2 BB P1W type; HIEbKE 1KB HuthtLilLtTlr»! u?Lftg it у %.. >. ju£±-tLl Ji’-Ji _£ RiLW! 1 Э 00 M M to M OD FF 07 flO ti E? FE Ft ET If IF [ 6 Й 1 | 4 00 00 « OS t< bl- □□ □□ dO 40 to OS t< bS OD DO [ 0 0 0 j 1 00 И » OP к op ng eg no м и- Os к op op Ct г p о ц 1 fll »L И П] M 01 0^ OS 00 M FT OB DC on OE OF | 0 0 D | EitJdl&j ditb Fira tlK\ I ... Elin in "blank 41 Di Dl OX 01 M Dt Db Lib 0B X FT БЙ I1C 0D IE [J bmheunlMiliif йэ-Нп ujXdq kej Bb.. hcltloi dira Kou black 4 ... DL ОБ OB OD fid Lb 01 OF 03 97 £B Of 04 00 X И bi4dxi4 лка txbta bl-Mk ч______ LlL« je. bxccit -I: p; os as ao :j de m oe of » or оф or st ic Checking remit... nrier nF bycej ciMG гнй1 * IS Skizcees i-i Сшин dm и mcmti 1 7 CO fl] W OS К 00 IF 0? 00 И F= FE FT FF IF rr [DOI] E 00 fl] DC itt W OD 00 00 00 M К DD И OD 00 00 [ 0 0 D ] 5 00 И M M « 0D 00 CO 00 00 M D« К 00 00 00 [ 0 fl D | 4 fll И Dl M fill oe flft OE fli >Я te OF M Ob OC 10 [ 0 fl D | Рис. ££.102. Результат ря&оты скетча и мониторе ли рта Приведём ещё некоторые источники информации по ра- боте с RFID. Домашняя страница: http://playground-arduino.ee/ Learning7MFKC522. Полезная статья: http://www.addicore.eom/v/vspfiles ; downloadables/Product% 20Downloadables/RFlD_RC522/ RF1D Qu ickSt a rtGuide, pdf.
Большое описание RFID: http://www.adafruit.com datasheets/rfid% 20guide.pdf. Программы и описание для Arduino: h t tps: / /github. com/m igue Iba Iboa / r f id # id 6. Программы для Raspberry Pi: h t tps: / / gitl nib. co in/rasplay/MFRC 5 2 2 - py t h on. 3.49. Датчики температуры и влажности DHT11 и DIIT22 Датчики DHT 11 и DHT22 не обладают высоким быстро- действием и точностью, но зато просты, недороги и отлично подходят для обучения. Они выполнены из двух частей — ём- костного датчика влажности и термистора. Чип, находящий- ся внутри, выполняет аналого-цифровое преобразование и выдаёт цифровой сигнал, который можно считать с помощью любого микроконтроллера. Для сборки проекта понадобятся следующие детали: • плата Arduino; • датчик DHT11 или DHT22; • Breadboard; • резистор на 10 кОм. Датчик DHT11 входит в состав «Набор из 37 датчиков*, который легко приобрести через Интернет. Внешний вид дат- чиков DHT 11 и В НТ 22 приведён на рисунке 3.103- Датчики DHT похожи друг на друга и имеют одинаковые выводы. Их отличия заключаются в харак- теристиках. Датчик DHT11: • определение влажности в ди- апазоне 20... 80 %; Рис. 3.103. Внешний вид датчиков DHT 11 и DHT22 * определение температуры от 0 DC до 4 50 °C; * частота опроса 1 раз в секунду.
Датчик DHT22: * определение влажности в диапазоне 0.-100 %; * определение температуры от -40 С|С до +125 DC; * частота опроса 1 раз в 2 секунды. Таким образом, характеристики датчика DHT22 лучше по сравнению с DHT11, поэтому он чуть-чуть дороже. Сни- мать показания с датчика можно нс чаще, чем раз в 2 секун- ды. Подключение датчиков DHT к Arduino Датчики DHT имеют стандартные выводы, поэтому их просто установить на breadboard. Датчики DHT имеют четыре вывода: — ♦+►— напряжение питание номиналом +5 В; — $.5» — вывод данных; — не используется; — — GND (земля). Между выводами питания и вывода данных нужно разме- стить резистор номиналом в 1LI кОм.. Датчик DHT часто продаётся в виде готового модуля. В этом случае он имеет три вывода и подключается без резисто- ра, т. к. резистор уже есть на плате. Схема подключения датчика с резистором к плате Arduino приведена на рисунке 3.104. * Рис. 3.10-4. Схема подключении датчика е резистором к плате Arduino
Для работы этих датчиков необходимо скачать библиотеку iarduinoDHT, расположенную на сайте littp://ia.rduino.ru/. Далее её необходимо поместить в папку libraries среды про- граммирования IDE, расположенной на вашем компьютере. Описание функции библиотеки Подключение библиотеки: # inclu de <iardiiin o_ DHT. li> Объявление объекта sensor и номера пина контроллера, к которому подключён датчик: iarduino_DHT sensorf М_ ВЫ ВОДА ) Функция read(}; Назначение: чтение показаний модуля. Синтаксис: readQ. Параметры: нет. Возвращаемые значения: если функция вернула значение DHT0K, то корректные значения можно прочитать из пере- менных hum и tern. Пример: if(sensor.read()= = DH7 ОК) { Se ria). pri nil n (sc n sor. hu m); Se rial. pri nil n (sc n son tom}; } Переменная hum типа float содержит полученные пока- зания влажности окружающей среды. Переменная tern типа float содержит полученные показания температуры окружа- ющей среды. Области применения датчиков — метеостанции и проек- ты климат-контроля. Пример 3.61. Определить влажность и температуру воз- духа в комнате. Будем использовать готовый модуль, содер- жащий как датчик, так и резистор номиналом 10 Ком. Этот модуль имеет три вывода, служащие для подключения напря= жения питания, земли и сигнала. Скетч примера (DHTl.mo)
приведён ниже. Скетч работает как с модулем DHT-11, так и с модулем В НТ-22: ^include <iarduino_DHT.h> // подключаем библиотеку // объявляем объект, указывая номер въевода, // к которому подключён датчик iarduino_DHT sense г(4); void setup() { //инициируем передачу данных в монитор //порта на скорости 9600 бод Se ria I. beg in(9600); // Приостанавливаем выполнение скетча на 1 секунду //для перехода датчика в активное состояние delay(lOOO); } void loop() { Serial.print ("СЕНСОР В КОМНАТЕ; "); switch (s ensor. read ()) { // Читаем показания датчика case DHT_OK: SeriaLprintln(( String) sensor.hum + "% -ff + sensor.tem + "*С'); break; case DHT_ ERROR. CHECKSUM: Serial, printin ("HE РАВЕНСТВО KCr'); break; case DHT_ERROR DATA: SeriaLprintlnCOTBET HE COOTBETCTB. СЕНСОРАМ 'DHTr"); break; case D-HT_ERROR NO_REPLY: Serial..printing НЕТ ОТВЕТА"); break; default.: SerlaLprintlnfERROR"); break; } // останавливаем выполнение скетча на 2 сек., // между выводами показаний delay(2000); }
Результат работы скетча показан на рисунке 3.105. Мы видим влажность и температуру. Изменения можно увидеть, например, выдыхая на датчик (как для затуманивания окна). Дыхание увеличивает влажность и температуру. $ C0W4 СЕЕЕС? 1 ЕЖЕН E J 75.0(4 = ai.ue*c t.Cj 3 ижгатЕ! 7S.D&t k.lct CEEGOS 3 75.DC4 - aiudo-c CEEpO? ? SEMITE; л.ос-ь iZUCCJ 3 ИИНЛ1Е; 71,0Ш - Э1.0Сг*С ceedcp 3 2Й!ЕЫЕ: 73.DCI - CEF-CCP 3 КИЕДТЕ; 75.0(4 »,oo*c CEHCG? 3 МИШЛЕ; 74.CC4 - ai.no*c CEFjCW 3 KMEMts 74, oct - ai,oo«c CEttCD? 3 BKHKUEe 7J.CC!- - CEECC? i ElKEATEi 71-DC4 - ai.oo'c CEFCPF 3 KWRMti 75.OGI - З1,ао»с CEHCfl’ 3 НИШЕ: 71.001 - СТЕК? 3 ИВОИТЕ* 75.ОС* - ai.oo’^ смсиг 3 КИНЗЛЕ! 72.CH - Рис. 3.105. Результат работы скетча н мониторе порта Пример 3.62. Определить влажность и температуру воз- духа в двух точках, используя два модуля DHT-11. Будем ис- пользовать готовые модули, содержащие как датчик, так и резистор номиналом 10 Ком. Этот модуль имеет три выво- да, служащие для подключения напряжения питания, земли и сигнала- Скетч примера (DHT2.ino) приведён ниже. Скетч работает как с модулем DHT-11, так и с модулем DHT-22. Ре- зультат работы выводится в монитор порта и показан на ри- сунке 3.106. //подключаем библиотеку для работы с датчиками # include <iarduino_DHT.h> // объявляем переменную для работы с первым датчиком // DHT и пин его подключения iardulno_DHT sensorl(4); //объявляем переменную для работы со вторым датчиком // DH Г и пин его подключения iarduino_DHT sensor2(5); void setup()
{ // последовательный порт — скорость 9600 бод Se ria I. beg in(9600); //задержка для перехода датчика в активное состояние delavflOOO); } void Joop (J { switch ( s ensorl. rea d ()) { // читаем показания датчика 1 case DHT_OK: Serial, printing String) "Датчик 1: " + sen sori .hum + "% ^ + gensori.tem + "*C"); break; case DHT_ERROR CHECKSUM: Serial, printin ("Датчик 1: HE РАВЕНСТВО КС"); break; case DHT ERROR DATA: 5йпа1.рппап("Датчик 1: ОТВЕТ HE СООТВЕТСТВ. СЕНСОРАМ DHT"); break; case DHT ERROR MO.REPLY; 5епа1.рппЬп{"Датчик 1: НЕТ ОТВЕТА"); break; default.: Sc ria I. printin ("Датч и к 1: ERROR"); break; } s w itch (s ensor2. rea d ()) { // читаем показания датчика 2 case DHT_OK: Serial, printing String) "Датчик 2: " + scnsor2Jhum + "% - " + sensorZtem + "*C"); break; case DHT_ERROR CHECKSUM: Serial.println("flaT4HK 2: HE РАВЕНСТВО КС"); brca k case DHT_ERROR DATA: 5ела1.рппап("Дагчик2: ОТВЕТ HE СООТВЕТСТВ. СЕНСОРАМ DHT"); break; case DHT_ERROR NO_REPL¥; 5епа1.ргтЬп("Датчик 2: НЕТ ОТ BE ГА"); break;
default: Serial, printing Датчик 2: ERROR/'); break; } delay(2000); } Д^Утчк 1: ДЬтчлк T: ZSTii*. IS .Г11-П.1Г J: Дьттак Is Дичин 2i 1: ДЕ.ТЧНК 2s Лртчл»: ]; JJfrTTCF 2; bl.M £5.«M H-W* «.«it 9<. on sc«h C4.WI Mj№t - 32-Ob'C - - 22.OD-C - W-Ob-C - 22b0b'C - 2i.Ob-C - ЗЪВДС - ; = .'?D"Z - iirQb'C - К.ЙЬ’С Дьгак 1! ?L.O3li - I'IlOD'C Hvfbk 2; Н.4И - П.ФЬ^ Рис. 3.11)6. Результат рибиты скетча н лшнито-ре порта Кроме библиотеки iarduino DHT имеется ещё библиотека DHT. У неё имеется своя специфика. На это следует обратить внимание при скачивании этой библиотеки. 3.50* Датчик уровня жидкости Датчик уровня жидкости (Water Sensor) широко приме- няется в системах автоматизации и при разработке е умного дома». Сп еци фи к а ция: — имя продукта: датчик уровня воды; — рабочее напряжение: 5 В; — рабочий ток: менее 20 мА; — тип датчикам аналоговый; — рабочая зона обнаружения: 40 мм х 16 мм; — вес: около 3,5 г.
Выходное напряжение (показания датчика) зависит от степени погружения датчика в жидкость и от параметров, влияющих на коэффициент передачи напряжения. Это, на- пример, проводимость жидкости. Внешний вид датчика, назначение его контактов и под- ключение к плате Arduino показаны на рисунке 3.107. Сквдэ гъодключения датчика воды к Ardninc* 3-АР -- 5V — GMIJ Рис. 3.107. Внешний вид датчика, назначение его контактов и подключений к плате Arduino При полностью сухом датчике выходное напряжение и по- казания на аналоговом входе будут равны нулю. Чем больше датчик будет погружен в воду, тем больше будут его показа- ния (от 0 до 1 023}. Пример 3.63. Подключить датчик к контроллеру и выве- сти его показания в порт монитора. Скетч примеря (voda.ino) приведён ниже, а результаты его работы — на рисунке 3.108. void setup() { pinMode(0, INPUT); Serial. begin(9600); } void loopQ { int val — analogRead(O); Serial,println (val); dclay(ZOOO); }
Ю с о Cl о 35 -31 296 565 4i5 4JE I IE 191 515 550 £41 Ъ57 Siu 553 5+4 SE-12 Ml 5ii 5+9 510 49 515 *93 4 93 491 4 HO J 91 492 Ci U 0 О Cl V| Лтпрйфула Рис. 3.108. Результат работы скетча в мониторе порта Из рисунка 3.108 видно, что при идеально сухом датчике результат равен О. При начале погружения значение скачком становится равным 305. При погружении датчика значение постепенно увеличивается до 557 т а при плавном вынимании .231
датчика из воды уменьшается до 410. Если датчик полностью вынут из еодыт то результат равен 0. Пример 3.64. Подключить датчик к контроллеру и с по- мощью светодиода контролировать уровень жидкости, Дат- чик подключить к пину АО, светодиод подключить к пину 12. Анод светодиода (длинный вывод) соединяется с пином 12, а катод через сопротивление номиналом 220 Ом соединяется с землёй. Скетч примера (vocLal.ino) приведён ниже: int х; // присваиваем имя для значений с аналогового входа АО void setup() { pinMode(12, OUTPLIl); // цифровой пин 12 для светодиода pinModefAO; INPUT); // аналоговый пин АО для датчика Serial.begin(9600); // подключаем монитор порта } void 1оор() { // х находится в интервале от 0 до 1023 х = analogRead(AO); if (х > 200} { // если х >200. то включаем светодиод digitalWritef^ HIGH); } else { // если х < 200, то выключаем светодиод digitalWritef 12, LOW); } Serial.println(x); // вывод x на монитор порта delay(lOOO); // задержка в одну секунду } Порог 200 выбран так, что датчик срабатывает, как толь- ко окажется в воде и отключается, когда вынимается из неё. 3*51. Пассивный датчик движения Пироэлектрический инфракрасный датчик движения (РШ) относится к классу пассивных датчиков. Модуль с Р1К- дат- чиком (рис. 3.109) состоит из пироэлектрического элемента
(цилиндр с прямоугольным кристаллом в центре), который уда вливает уровень инфракрасного излучения. Все предметы имеют инфракрасное излучение, и при этом чем выше тем- пература, тем интенсивнее инфракрасное излучение. Датчик накрывается сверху пластиковой линзой Френеля, которая концентрирует инфракрасное излучение и повышает чувстви- тельность датчика. Устройство линзы Френеля показано на рисунке 3.110. Рис. 3.109. Внешний вид модули с FIK-датчиком Рис. 3.110. Принцип работы линзы Френели Устройство и назначение выводов пироэлектрического датчика движения показаны на рисунке 3.111. Устройство PlK-датчиков движения практически оди- наково. Дальность обнаружения P1R-сенсоров Arduino — до б метров, угол обзора: 110* х 70D. Питание равно 5 В, а выход- ной цифровой сигнал имеет значение 0, когда движения нет, и значение 1 при наличии движения. Чувствительные элемен- ты устанавливается в герметический корпус, который защи- щает от влажности и перепадов температур. Большинство мо- дулей P1R-sensor Arduino имеют три выхода на задней части. Назначение выводов (пинов) у разных производителей может отличаться, но рядом с выходами сделаны надписи, поэто-
му перед подключением к плате Arduino внимательно изучи- те модуль. Один выход идёт к GNDT второй — к питанию о В (обозначен VCC), а третий выход (обозначен как OUT) выдаёт цифровой сигнал с пироэлектрического сенсо ра- Рис.. 3.111. Устройство и назначение выводов пироэлектрического датчика движенля: J — задержки срабатывания; 2 — настройка чувствительности; 3 — индикация питания; 4 — перегрузка датчика; о — GND; 0 - OUT; 7 — 5V Схема подключения PlR-датчика к Arduino UNO приве- дена на рисунке 3.112. Пример 3.65. Разработать систему обнаружения движе- ния и индикации его наличия. Для этого к пину 12 контрол- лера дополнительно подключим светодиод, который через ре- зистор в 220 Ом соединим с пином GN D-контроллера. Скетч примера (P1RJ Лио) приведён ниже: #dofine PIR 2 #define LED 12 void setup() { pinMode(PIR, INPUT); pinMode (LED, OUTPUT); } void loopQ { int pirVal = di:gitaiR.Qad{PIR); if (pirVal == HIGH)
{ digital Write(LED, HIGH); delay(50J; //ожидание 50 мсек } else { diaitalWritc(LED,LOW); } dclay(lO); //ожидание 2 мсек } Слепне. по-дключеиил РШ-цнтчилп к АлЬпгии Рис. 3.112. Схема подключения PlB-датчика к плате Arduino С помощью директивы ttdefine для пинов 2 и 12 мы назна- чили соответствующие имена P1R и LED. Это сделано лишь для удобства. Строка int pii’Val - digitalRead(PIR); позволяет осуще- ствить считывание информации с пина 2. В условии оператора if мы использовали двойное равен- ство: if (pirVal “-= HIGH). Двойное равенство является опера- тором сравнения. Не нужно путать данный оператор с одинар- ным равенством. Пример 3.66. Разработать систему включения освещения при обнаружении движения и выключение освещения спу- стя 1G секунд после прекращения движения. Как и в преды- дущем примере, подключим анод светодиода к пину 12 кон- троллера, а его катод — через резистор в 220 Ом соединим с
пином GM D-контроллера. Датчик подключим к пину 2. Скетч примера (PIR2.ino) приведён ниже: unsigned long counttime; // выделение памяти для счётчика tdefine LED 12 // пин для светодиода ^define PIR 2 // пин для PIR sensor void setup J { pinMode(LED, OUTPUT); pinMode(PIR, INPUT); } void loop() // если есть движение, включаем светодиод if (digitalRead(PIR) == HIGH) { digitalWrite(LED, HIGH); counttime = millisQ; } // если нет движения if (digita]Read(PIR) == LOW) { // включаем счётчик на 10 сек if (millisQ-counttime > 10000) { // если нет движения в течение 10 сек // выключаем светодиод digital Write (LED, LOW); } } } Функция millisO воя вращает количество миллисекунд, прошедших с момента старта скетча. Возвращаемое число пе~ реполнится (сбросится в 0) спустя приблизительно 50 дней. С помощью команды counttime = mill is О; начинается от- счёт времени. При этом, в отличие от функции delay, которая полностью прерывает программу, микроконтроллер может продолжать остальные вычисления в скетче.
3*52. Семисегментпый индикатор Семисегментный индикатор (СИ) с общим катодом (7-Seg- ment LED Display for Common Cathode Displays) представля- ет собой прекрасное средство для вывода и индикации цифро- вой информации. С помощью СИ можно отобразить цифры от О до 9 и точку (рис. 3.113). 10 Й 8 7 б Рис. 3.113. Семиеегментный индикатор с общим катодом Индикатор состоит из семи сегментов, комбинация кото- рых позволяет отображать цифры от 0 до 9. Кроме этого име- ется ещё сегмент точки. Комбинации сегментов хранятся в массиве. Пример 3.67. Используя Arduino, разработать цифро- вой счётчик нажатий. При нажатии кнопки нужно уве- личивать показания индикатора. В этом примере исполь- зуется статическая индикация. Нажимая на кнопку, мы тем самым увеличиваем индекс массива.. Значения той или иной цифры в двоичном коде последовательно выставляют- ся в пины с 2-го по 8-й. Схема подключения СИ к Arduino приведена на рисунке 3.111. Конденсаторы С1 и сопротивление R1 необходимы для предотвращения дребезга контактов. Дребезг контактов — это неприятное явление, когда однократное нажатие кнопки воспринимается системой как многократное. В нашем случае это привело бы к быстрому увеличению переменной counter.
Выводы 8 и 3 — это минусовые выводы индикатора, которые через сопротивление R2 подключаются к земле. В1: ЮК Cl: lOuF/lGV Рис. 3.114. Схема подключении семисе! ментнош индикатор и к плате Arduino Скетч примера (LEDl.ino) приведён ниже: /* Arduino 7-Segment LED Display for Common Cathode Displays Пины Arduino: 2Т3Т4^,6Т7,8 Пины индикатора: 7,6А2Д,9г10 Пины 3 и 8 индикатора соединены с GND Кнопка подключается к пину 9 */ //массив состояний сегментов, образующих цифры от 0 до 9 byte numbers[10] = { В11111100, В01100000, B11011010, B11110010, ВОИООПО, Bioiiono, Bioiiino, Biiiooooo, впито, впиоио }; void &atup() { forfint 1 - 2; i <= 8; i++) //раздача пинов { pinMod&O, OUTPUT); } 23H
pjnMode{9r INPUT); } int counter = 0; //счётчик нажатий кнопки bool хг = true; int star = LOW; //старое значение на кнопке void loop() { if(xr) { int nov = digitalRead(9); //новое значение на кнопке if(star == LOW && nov == HIGH) { counter = (counter + 1) % 10; //увеличиваем счётчик } star = nov; //старое — это бывшее новое } else { delay(500); counter = (counter + 1) % 10; } writeNumberfcounter); //выводим счётчик на индикатор } void writeNunnber(int number) { if(nurnber < 0 | number > 9) //на числа больше 9 не реагируем { return; } byte mask = numbersfnumber f; // выбираем код цифры из массива byte current Pin Mask = B10000000; fbrfint I = 2; i < = 8; i++) //поразрядный вывод сигналов на пины { if(mask & currentPinMask) digital Write(i, HIGH); else digitalWrite(i,LOW); //сдвиг маски вправо currentPinMask = currentPinMask >> 1; } }
Пример 3.68. Осуществить последовательный вывод на индикатор цифр от 0 до 9. Схема подключения СИ к Arduino точно такая жет что и б предыдущем примере. Скетч примера (LEDS.iiio) приведён ниже: // список пинов Arduino для подключения к разрядам а-д // семисегментного индикатора int pins[7]- {2J,4r5J6,7.13}; // массив значении сигналов на пинах для вывода цифр от 0 до 9 byte numbers[10] - { 61111X100, В01100Э00, В11011010, B11110010, B011001W, B1011011D, B10111110, 811100000, В1И11110, B11100110 }; // переменная дня хранения значения текущей цифры int numbcr=0; void setup0 { // Сконфигурировать пины как выходы fbrfint i=0;i<7;i++) pinMode(pins[i], OUTPUT); } void loop() { s h о w N u mber (n um be r); delay(lOOO); number=(number+l)%10; } // функция вывода цифры на семисегментный индикатор void showNumber(int num) { for(int i-0;i<7;i +-г) { iff bi tRcad (numbers' num]r7-i) = = HIGH) // зажечь сегмент digitalWrite(pins[i ,HIGH); else // потушить сегмент digital Writc(pins[i]rLG W); } }
3.53. Четырехразрвдиый семисегздентиый индикатор Одноразрядный семисегментный индикатор — это, конеч- но, хорошо. Но промышленность подготовила нам ещё более мощное решение. Это четырёхразрядные семисегментные ин- дикаторы (ЧСИ). Каждый из них может отражать четыре деся- тичных цифры от О до 9 и некото- рые буквы латинского и русского алфавитов. Внешний вид ЧСИ приведён на рисунке 3.115. На рисунке 3.116 приведе- на схема индикатора с общим анодом 3641BS. В маркировке присутствует буква В. Рис. 3.115. Четырёхразрядный сем мсегм е нтн ый и ндик а тор Рис. 3.116. Схема ЧСИ с общим анодим 3641BS Нумерация контактов (распиновка} стандартная: из ниж- него левого угла против часовой стрелки (рис. 3.117). 9 9 л F в 12111J LJZ.________ г____________ITTl11 DP Рис. 3.117. Нумерации контактов (пинов) ЧСИ 3641BS с общим анодом
На этом рисунке слева — 12, 9, 8 и 6 — эго пины — аноды для каждого разряда. На этом рисунке справа показаны пины сегментов — катоды светодиодов. Для отображения нужной информации необходимо по очереди подавать напряжение на аноды, а катодами формировать нужную информацию. И так для каждого разряда по очереди. Делать это нужно так бы- стро, чтобы человеческому глазу казалось, что одновременно непрерывно горят все 4 разряда. Схема подключения ЧСИ к плате Arduino приведена на рисунке 3.118. Однако нас больше будет интересовать ЧСИ типа 5611 АН с общим катодом, который имеется в моём комплекте. Его внешний вид и распиновка приведены на рисунке 3.119. На рисунке 3.120 приведена схема и распиновка ЧСИ с общим анодом &641ВН. Подключение этих ЧСИ к плате Arduino оди- наково. Есть только такое отличие: чтобы вывести какой-ли- бо символ в ЧСИ с общим анодом, необходимо подать на анод и на сегменты, которые должны светиться. Для ЧСИ с общим катодам на общий катод необходимо подать «-> и на сегменты, которые должны светиться. Ещё понадобят- ся 8 резисторов номиналом в 1 кОм, которые включаются по- следовательно в цепь каждого сегмента, в том числе и точку. Рис. 3.118. Схема подключении ЧСИ 3641BS к плате
FYQ-йвП Series FYQ-5641xi 8,54.0=12,70 c -H FYQ-oMLAx Рис. 3.119. ЧС11 типа 5641 АН с общим катодом FYQ-5S41BK Рис. 3.120. ЧСИ е ибшнлп анидим 5641ВН
Пример 3.69. Вывести на все четыре индикатора букву Скетч примеря (_4LEDl.iuo) приведён ниже: //пины для общих катодов 12, 9, 8, 6 int katodPins[] = {Al, А2, АЗ, A4}; // пины контроллера для сегментов 11, 7, 4, 2, 1, 10, 5, 3 int segmentsPins[] = {5, 6, 7, 8Г 9, 10, 11, 12}; void setopO // все пины настраиваем на вывод { for int i = 0; i < 4; I++) { pinMode(katodPins[i], OUTPU Г); } for (int i - 0; i < 8; i++) { pinMode(segmentspins i], OUTPUT); } } int seg[] = {0, 1, l.r 0r 1, 1, 1, 0}; //Буква H void loop() { // отображаем букву H во всех разрядах for ' int i = 0; i < 4; i+1) { for (int k = 0; k < 8; k++) { digitalWrite(segmentsPins[k], ((seg[k] == 1) ? HIGH : LOW)); } //подаём низкое напряжение на катод — индикатор зажигается digitalWrite(katodPjn5[j]f LOW); delay(1); // дали паузу для глаза // подаём высокое напряжение на катод — индикатор гаснет digitalWrite(katodPins[i], HIGH); } } Пример 3.70. Вывести циклически на все четыре инди- катора цифры от О до 9. Скетч примера (_4LED2.mo) приве- дён ниже:
int katadPinsf ] = {Al, A2r A3r A4}; // гйины для каждого разряда (катоды) // пины для каждого сегмента, включая точку int segmentsPinsf] = {5, 6Т 7, 8, 9, 10, 11, 12}; void setup() { // все пины программируем как OUTPU I For (int i = 0; 1 < 4; i+ + ; { pin.Mode(katodPins[1], OUTPUT); } for (int j = 0; i < S; i+ +) { pjnMode(s<.'gmentsPins| i ], OUTPUT); } } //Код (карта) для отображения цифр: //{А, В, С, D, Е, F, G,DP} — распиновка сегментов int seg[ 10]Г8] = { {1, {О, {1, <1, {о, {i, a a a a 1, 1, 1, 1, 1, 0, 0}, //Цифра 0 1, 1, 0, 0, 0, 0, 0}, //Цифра 1 1, 0, 1, 1, 1, 1, 1, 1, О, О, 1, 1, о, 1, 1, 1, 1, О, 1,1, г 1, О, о, 0. О, 1, 0}, //Цифра 2 О, 1, 0}, //Цифра 3 1, 1, 0}, //Цифра 4 1, 1, 0}, //Цифра 5 1, 1, 1, 0}, //Цифра 6 0, 0, 0, 0}, //Цифра 7 1, 1, 1, 0}., //Цифра 8 1, 1, 1, 0, 1, 1, 0}//Цифра 9 int t = 0; int digit = 0; void loopQ t += 1; if (t > 9999) t = 0; if (ft % 1000) == 0) { digit - t/ 1000; // отображаем цифры каждую секунду }
// выводим каждый разряд по очереди for (int । - 0; । < 4; i+-t) { // выводим каждый сегмент по очереди, исходя из карты цифры for (int k = 0; k < 8; k++) { digitalWrite(segmentsPins[k], ((seg [digit] [kJ == 1) ? HIGH; LOW)); } digitalWritc(katodPins;i], LOW); delay(l); d tg ita IW ri te (ka tod Pi л s[ i \ HIGH); } } Пример 3.71. Вывести циклически на ЧСИ различные числа. Скетч примера (_4LED3.ino) приведён ниже: int katodPins[] = {Alf A2f АЗ, A4}; // пины для разрядив СИ // пины дпя каждого сегментов ЧСИ int segmentsPins[] = {5, 6, lt 8r 9, 10, 11, 12}; void setup() { for (int i = 0; i <4; I++) pinMode(katodPins[i]T OU FPU Г); for (int i = 0; i < 8; i++) pinModefsegrnentsPins^],, OUTPUT); Serial.begin(9600); } //карта для выводимых цифр и символов //{А, В, С, D, Е, F, G,DP} int scgfl21[81 = { {1, 1, 1, 1, 1, 1, 0, 0}, //Цифра 0 {0, 1, 1, 0, 0, 0, 0, 0}, //Цифра 1 <1И 1, 0, 1, 1, 0, L, 0}, //Цифра 2 {1, 1, 1, 1, 0, 0, 1, 0}, //Цифра 3 {О, 1, 1, О, О, 1, 1, 0}, //Цифра 4 {1, 0, 1, 1, 0, 1, 1, 0}, //Цифра 5 {1, 0, 1, 1, 1, 1, 1, 0}, //Цифра 6 {i, 1, 1, 0, 0, 0, 0, 0}, //Цифра 7 {1, 1, 1, 1, 1, 1, 1, 0), //Цифра 8 {1, 1, 1, 1, о, 1, 1, 0}, //Цифра 9 {О, 0, 0, 0, 0, 0, 1, 0}, //Знак —
{0, О, О, О, Од О, О, 0} //Пустой разряд }; //карта для символов слова Егг int егт[4][8] = { {О, 0, О, 0, О, О, 0, 0}, //Пусто {1, О, 0. 1, 1, 1, 1. 0}, //Е {О, О, 0, 0. 1, 0, 1, 0}, //г {О, О, О, Од 1, О, 1, 0} //г }; // массив чисел, которые по очереди будут выводиться на ЧСИ. // При 10000 на дисплее будет отображена ошибка Егг float number^] = {520.45, 251, -12, 3.14159, 100000,-85.2563}; // переменная-массив дпя хранения данных, //которые не нужно пересчитывать static int агг[4][S]; int numindex = 0; float value =0.0; int counter - -1; void loop() { counter += 1; if ((counter % 200) == 0) // Пауза между сменами 200 мс { counter = 0; get Digits(numbers[n urnindex]); numindex + = 1; if (numindex >= SLzeof(numbers)/sizeof( float)) numindex = 0; } display M cssage (a rr); } void getDigits (float value) { Serial, printing»); // Выдаём ошибку на те значения, которые не можем показать if ((value >= 10000) || (value <= -1000) | (value > -0.01 && value < 0.001))
{ // Каждый разряд по очереди for (int i = 0; i < 4; i + + ) { // Каждый сегмент по очереди, исходя из заданной карты for (int k = 0; k < 8; k++) { arr[j][k] = err[i][k]; } } return; // Выход } mt digits e 4; // У нас 4 разряда if (value < 0) digits = 3; // Из-за минуса один символ убирается*/ // Делим число на 2 группы: целую часть и дробную. mt intPart = (int)abs(value); // Смотрим, сколько разрядов занимает целая часть mt intLength = ((String)intPart).length(}; // На дробную часть у нас остаётся digits-intLength разрядов // Мы можем показать максимум 3 знака после запятой - 0,000 Int fra ePart = (int)(-(abs(value) - abs(intPart)} ‘ 1000); int fracDigits = digits - intLength; fra ePart = (((Strlng)fracPart).substring(O, fra cDi gits) ),.tolnt(); // Собираем строку для отображения String output = (value < 0) ? w output += (String JiintPart; String outputFrac = ((digits - intLength <= 0) 1 (fracPart == 0)) ?tfTf : ((String)1*." + ((String) fracPart). substri ng (0, digits - IntLength)); output += (Strlng)outputF rac; //Дополняем пробелы спереди, если цифр слишком мало, // например для N-V делаем "-1" String spaces = (f digits = 4; if (output. ,ndexOf('\")) digits += 1; if (out put length () < digits) output = spaces, substring^, digits - outputlength(J) + output; // Формируем данные для показа: mt dig = -1; for (int i - 0; i < output.length/); i++)
String _char = о utput. substri ng (i, i + 1); if (_char != «.»} dig += .1; // Точка не занимает сегмент — // увеличиваем на 1 int actualdigit = 11; // По умолчанию пустой символ if ((.char = ="-")) { actualdigit = 10; У else if (_char == 61 " jl _char == Vr) { } else { actualdigit = chartoIntQ; } if (_char == Vr] { arr[dig][7] = 1; // Если нужно — ставим точку } else { for (int n = 0; n < = 7; n+-t-) arrfdig n] = seg[actualdigit]'n |; } } } } void displayMessage(intdig[4"8'|) { // Каждый разряд no очереди for (int i = 0; i < 4; i + + ) { // Каждый сегмент по очереди, исходя из заданной карты for (int k = 0; k < 8; k++) { digita IW ri te( segments Pins [k]r ((dig[i][k] == 1} ? HIGH : LOW)); } digitalWrite(katodPins[i], LOW);
delay(l); digitatWrite( katodPinsfi], HIGH); } } Если на дисплей попробовать вывести число, которое он не может отобразить (например, 10000), то отобразится сооб- щение об ошибке Егг. Пример 3.72. Подключим к нашей схеме датчик — фоторе- зистор, работа которого была рассмотрена выше. Датчик под- ключим ко входу АО платы (рис. 3.121). Будем выводить на ЧСИ значения, которые датчик будет передавать плате. Плата Arduino интерпретирует входные данные от любого датчика в диапазон значений от 0 до 1024. Скетч примера (_4LEDd«ino) приведён ниже. Функции displayMassage() и getDigits() не при- водятся, поскольку они остались без изменения. int katodPirts;'] = {Al, А2, АЗ, А4}; // пины для разрядов ЧСИ // пины для сегментов ЧСИ int segmentsPins[] = {5, 6, 7f 8Г 9, .10, 11, 12}; int pinin = АО; //пин для датчика void setup() for Int i - 0; i < 4; i++) pin Moderated Pi ns[i]f OUTPUT); for (int i = 0; i < 8; 1++) pin r4ode( segmentspins' I], OUTPUT); pinMode(pinInj INPUT); //пин настраиваем на ввод информации } //карта для цифр и символов //{А, В, С, D, Е, F, GfDP} int seg[12][8] = { <1, 1, 1, 1, 1, 1, 0r 0}, //Цифра 0 <0, 1, 1, 0, 0, 0, 0, 0), //Цифра 1 {1, 1, 0, 1, 1, 0, 1, 0}, //Цифра 2 {1, 1, 1, 1, 0, 0, 1, 0}, //Цифра 3 {0, 1, 1, 0, 0.. 1, 1, 0}, //Цифра 4 {1, 0/ 1, 1, о, 1, 1, 0}, //Цифра 5 {L 0, 1, 1, 1, 1, 1, 0), //Цифра 6 {1, 1, 1, 0, О, О, О, 0}, //Цифра 7 <1, 1, 1, 1, 1, 1, 1, 0}, //Цифра 8
<Ъ 1. 1. 1, о. 1, 1; 0}. //Цифра 9' {0, 0, О, О, О, Or 1, 0\ //Знак - {О, Ол Of О, О, О, О, 0} //Пустой разряд }; //карта для символов слова Егг int егг[4][8] - { {О, 0, 0, 0, 0, 0, 0, 0}, //Пусто {1, О, О, 1, 1, 1, 1, 0}, //Е {О, 0, 0, 0, 1, 0, 1, ОЬ //г {О, 0, 0, 0, 1, Ог 1, 0}//г }; static int агт[4]Г8]; float value =0.0; //принимаемое с датчика значение int counter = -1; void loopf) { counter += 1; if ((counter % 100) == 01 { // Пауза между сменами 100 мс counter = 0; value = analogRead(piinln); getDigitsf value); } displayMessage(arr); } void getDigits (float value} { } void displayMessagefint dig[4' [8]} { } Светодиодные сегменты индикатора требуют подключе- ния токоограничивающих резисторов. Значение резистора
обычно находится между 330 Ом и 1 кОм. Также рекоменду- ется использование транзисторов для обеспечения дополни- тельного тока, поскольку каждый вывод микроконтроллера может выдавать максимум 40 мА. Если включить все сегмен- ты разряда (цифра то потребляемый ток превысит этот предел. На рисунке 3.122 показано подключение ЧСИ с ис- пользованием транзисторов.. Рис. 3.121. Вывод на ЧСИ значении сигнала с фитирезистора Рис. 3.122. Подключен не ЧСИ с использованием транзистор ив
3.54. Инфракрасным пульт дистанционного управления В ряде наборов конструкторов на базе контроллеров Аг- duino может оказаться инфракрасный пульт дистанцион- ного управления (ИИДУ) (рис. 3.123). ИИДУ — эго один из самых простых способов вза- имодействия с электронными приборами. Так. практически в каждом доме есть несколько та- / кик устройств: телевизор, му- зыкальный центр, видеоплеер, кондиционер. Одно из перепек- Рис s 123 ик.иуль1, тиеных направлений примене- дистанционного управлении и ния ИИДУ — дистанционное ИК-датчик управление роботами. ИК-пульт ИК-пульт (рис. 3.123, слева) содержит 10 цифровых кно- пок и 11 кнопок для манипуляции с музыкой: громкость, пе- ремотка, playT stop и т. д. ИК-датчик Для приёма сигнала с пульта нам потребуется ИК-дат- чик, который воспринимает инфракрасный сигнал ня ча- стоте 38 кГц (иногда — 40кГц). Именно такое свойство по- зволяет датчику игнорировать много посторонних световых шумов от ламп освещения и солнца. Воспользуемся популяр- ным ИК-датчиком CHQ1838, который обладает следующими характеристиками: — несущая частота: 38 кГц; — напряжение питания: 2,7...5Ъ5 В; — потребляемый ток: 50 мкА. Можно использовать и другие датчики, например: VS1838B, TSOP4838t TSOP1736, SFH506.
Подключение Датчик имеет три вывода (пина). Если посмотреть на дат- чик со стороны приёмника ИК-сигнала, как показано на ри- сунке 3.124, то слева будет выход датчика* по центру — ми- нус источника питания (земля) и справа — плюс источника питания (2.7...5.3 В). Для работы с ИИДУ и ИК-датчиком воспользуемся стан- дартной библиотекой IRremote.h, которая предназначена для работы с приёмом и передачей ИК-сигналов. С помощью этой библиотеки можно принимать команды с пульта. Для нача- ла — просто выводить их коды в окно монитора последова- тельного порта. Рис. 3.124. Подключение! ИК-датчика к плате Arduino Пример 3.73. Этот программа нужна для того* чтобы по- нять, какой код формирует каждая кнопка. Скетч примера (PULTl.ino) приведён ниже. Результат работы скетча приве- дён на рисунке 3.125. Видно, что эта программа имеет недо- статок — при длительном нажатии кнопки появляется код FFFFFFFF* не имеющий никакой смысловой нагрузки. # include ^IRremote.h" IRrecv irrecv(2); // пин приёмника decode_results results; void setup ()
Serial.begin{9600); // скорость работы COM порта i rrecv. ana Ы a LRI n (); // зап ус каем п риём } void loopQ { if ( irrccv. decode ( Sires u Its )) // если данные пришли { Serial, pri ntln( results, value, HEX ); // печатаем данные frrecv.resume{); // принимаем следующую команду } | fFAiSE ГТТГПЕТ 5 FFF.-j J" Г Г Г ГТ1 FFf/JFF; , rrij?c EFk’JFF- П--- FTU1F ЕГГРЗЕТ.- macc UK-*t F“ F F' ' ’1 FFtare FFnm? fTFTTW ETC23D ГГП7ПТ Рис. 3.125. Результат работы скетча и мониторе порта Пример 3.74. Этот скетч позволяет побороться» с не- достатком предыдущего скетча. Скетч примера (PULT2.i.no) приведён ниже. Результат работы скетча приведён на рисун- ке 3.126. Недостаток практически устранён. Здесь приведены коды всех кнопок пульта (слева — направо и сверху — вниз), #include 41 IRremote.h" IRrecv irrccv(2); // пин приёмника decode_results results;
void setup() { Serial.begin(9600); // скорость СОМ-порта irrecv.enableIRIn{); // запуск приёма } void loop() { if ( irrecv.decodef &results ))// если данные пришли { // гасим коды FFFFFFFF и О if ((results.value !=OxFFFFFFFF)8i&(results.value 3=0x0)) Serial.println{ results, value, HEX ); // печатаем данные irreev.resumed; // принимаем следующую команду } } mjsr ттг.”- mz:c JR1FD TFCflP fTEDlT Fras.5' JTJCI7 I TT1Jf I IrBVU; I ГГГ7- I ГТ! T- I ГТ Air I rr:t»T JTJiT I rr?r,1F I rj-" I Hi^r- гг’.;лг Put. 3.126. Результат работы скетча н монитор* порта Пример 3.75. Этот скетч позволяет включать и выключать светодиод, подключенный к пину 3. Скетч примера (PULT3, ino) приведён ниже. Для включения светодиода использует- ся кнопка «void-*, а для выключения — кнопка 4vol-* пуль- та. Светодиод анодом подключаем к пину 3 контроллера. Ка- тод светодиода через резистор в 10 кОм соединяем с «землейф GND контроллера.
^include "IRremote.h" IRrecv irrecv{2); // пин приёмника int pinln = 3; //пин светодиода decode_results results; void setupQ { //пин светодиода настраиваем на вывод pinMode(pinIn. OUTPUT); irrecvbonableIRIn(); // запускаем приём } void loop() { if (irrecv.decode( ^results )) // если данные пришли { switch ( results.value ) { case 0xFFA857: digitalWritef 3. HIGH ); break; case OxFFEOlF: digitalWrite( 3, LOW ); break; } irrecv.resumet); If принимаем следующий код } } Пример 3.76. Этот скетч позволяет управлять серво-ма- шинкой, подключённой к пину 10 контроллера.. Датчик под- ключается к пину 11 контроллера. Для манипуляции сер- во-машинкой используются кнопки wol+i> и «vol-» пульта. Схема подключения серво-машинки и ИК-датчика к контрол- леру приведена на рисунках 3.127 и 3.128. Скетч примера (PtJLT4J.no) приведён ниже: # include "'Servo.FT tfinclude "I Rremote.tr IRrecv iirecv(ll); //датчик на 11-м пине decode_results results; Servo servoMain;
РмСх 3„127. Схема подключения серн и-ма шинки и ИК-датчика к контрила еру Рис. 3.128. Макетная плата е серво-машникои и ИК-датчнком 25Й
int servPoz - 90; //Начальное положение серво-машинка int lastPoz = 0; void setup(} { Serial. begin( 9600); i r rec v. ena b I elRI n (); servo Main .attach (10); // серво-машинка на 10-м пине servo Main. write(servPoz); } void loopf) < if (i n'ccv. decode (&тс suits)) { int res - results .value; Serial, printings, HEX); if(res- = 0xFFFFE01F) // Если нажата кнопка. "+* { lastPoz=res; servPoz+ + ; servo Mai n. w ri te(servPoz); } else if(rcs=-=0xFFFFA857) // Если нажата кнопка { servPoz--; lastPoz=res; servo Mai n. wri tefserv Poz); } else if(res==OxFFFFFFFF) // Если кнопку удерживают { if(lastPoz^=OxFFFFEOlF) servPoz++; // Удерживают я+/г ff(lastPoz»-0xFFFFA857) servPoz--; // Удерживают w’'r servo Mai n. write(survPoz); } irrecv.nesume(); delay (100); } }
3.55. Часы реального времени DS1302 Рис. 3.129. Часы реальное времени DS1302 Контроллер Arduino не имеет своих собственных ча- сов. Поэтому в случае необхо- димости его нужно дополнять специальной микросхемой DS1302. Она входит в состав модуля (рис. 3.129), который подключается к контролле- ру. В микросхему можно за- писать текущие дату и время и при необходимости считывать в любой момент времени уже реальные дату и время.. Часы реального времени (ЧРВ) весьма полезны при ре- шении задач., связанных с реальным временем: включение и выключение освещения в определённый момент времени, управление поливом растений, отопление помещений и т. д. В таблице З.б приведены выводы модуля ЧРВ. 1а0л1ща 3..6 Выводы модуля ЧРВ VCC Питание ( 1 &V) GND Земля (GNDJ CLK К цифровому пину Arduino (в примере подключен к пипу 6 Arduino) DAT К цифровому пину Arduino (в примере подключен к пипу 7 Arduino) RST К цифровому пину Arduino ( в примере подключён к пипу Й Arduino) Схема подключения к контроллеру Arduino UNO показа- на на рисунке 3.130. Для программирования ЧРВ необходи- мо скачать библиотеку iardnino_KTC.h ня сайте iarduino.ru,
Функции библиотеки позволяют записывать и считывать па- раметры реального времени. Рассмотрим: программные кон- струкции и основные функции библиотеки: — #inchide <iarduino_RTC.h> — подключение библиотеки. — iarduinoRTC ОБЪЕКТ ( НАЗВАНИЕ [т ВЫВОД_К8Т [, ВЫВОД-CLK [, ВЫВОД_ВАТ ]J]) — создание объекта. Рис. 3.130. Схема подключен ил ЧРВ к контроллеру Arduino — begin () — функция инициализации работы RTC модуля; — set time ( СЕК (, МИН [, ЧАС I, ДЕНЬ |, МЕС [, ГОД [, ДН J1JJIJ) — функция установки времени; — get time (| СТРОКА ] ) — функция чтения времени; — blinktime ( ПАРАМЕТР | ЧАСТОТА ]) — функция, за- ставляющая функцию get time <с мигать => указанным параме- тром времени; — period ( МИНУТЫ ) — функция, указывающая мини- мальный период обращения к модулю в минутах; — переменная seconds возвращает секунды от 0 до 59; — переменная minutes возвращает минуты от 0 до 59; — переменная hours возвращает часы от 1 до 12; — переменная hours возвращает часы от О до 23; — переменная midday возвращает полдень 0 или 1 (О-ат, 1pm); — переменная day возвращает день месяца от 1 до 31; — переменная weekday возвращает день недели от 0 до 6 (О-воскресенье, 6-суббота); — переменная month возвращает месяц от 1 до 12; — переменная year возвращает год от 0 до 99.
Пример 3.2 7. Этот скетч загружает текущее время в ЧРВ. Скетч примеря (CLOCKl.ino) приведён ниже: ^include <iarduino_RTC.h> iarduino_RTC time(RTC_D£1302J6,7,8); void setupQ { de!ay(300); Serial.begin(9600); time.begin(); // 0 сек, 17 мин, 11 час, 19, июля, 2017 года, суббота time.settinne(0,17,ll,19,08,17,6); } void loop() { } } Пример 3.78. Этот скетч читает и выводит в монитор пор- та текущее время из ЧРВ. Скетч примера (СЪОСКЭлпо) при- ведён ниже: #inclUdo <iarduino_ RTC.h> iarduino_R ГС time(RTC_DS1302,6,7,8); void setup() { delay(300); Serial.begin(9600); time±egin(); } void loopQ { if(millis()%1000==0) // если прошла 1 секунда { // выводим время Serial.println{time.gettimeCd-rn=Y, H:i:s, D")); // приостанавливаем на 1 мс, чтобы не выводить время // несколько раз за 1 мс delay(l); } }
Контрольные вопросы 1. Модели контроллеров Arduino: — Arduino Pro Mini — Arduino Duemilanove — Arduino Nano — Arduino LilyPad — Arduino Uno — Arduino Me gal? 560 — Arduino Leonardo — Arduino Due. 2. Платы расширения — шилды: — Sensor Shield — Motor Shield — Ethernet Shield — LCD Keypad Shield — USB HOST Shield — Nano 1 Ino Shield — 4 Relay Shiel d — Energy Shield — SD Card Shield — Wifi Shield — GPRS Shield — E-Ink Shield — Music Shield — Data Logging Shield — WI-FI модуль ESP8266 — RS485 Shield — модуль интерфейса RS-485. 3. Установка Arduino IDE в Windows. 4. Работа в среде Arduino IDE: — редактор программного кода — кнопки панели инструментов
— область сообщений — меню — монитор порта — библиотеки. 5. Цифровые пины. 6. Аналоговые пины. 7. Широтно-импульсная модуляция. 8. Функция setup(). 9. Функция loop (). 10. Управляющие операторы: — оператор if (условие) и операторы сравнения =^, !==, — оператор if...else — оператор switch...case — оператор цикла for — оператор цикла while — оператор цикла do... while — оператор break — оператор continue — оператор return. 11. Синтаксис языка С++. 12. Комментарии. 13. Ар ифмети ческ ие oneрато р ы: — оператор присваивания = — операторы сложения, вычитания, умножения, деления — оператор остаток от деления целого числа на целое чис- ло (%). 14. Операторы сравнения. 15. Логические операторы: — оператор алогическое И» (&&) — оператор алогическое ИЛИ» (|) — оператор алогическое отрицание» (!}. 16. У парные операторы: — операторы увеличения значения (++} — операторы уменьшения значения 17. Операторы с короткой записью действий (+=.,-, /—).
18. Типы данных: — boolean —char — byte — int — unsigned int — long — unsigned long — float — double — string — Массивы — void. 19. Константы: — предопределённые константы — собственные константы. 20. Переменные: —объявление переменных — границы переменных. 21. Преобразование типов данных — char() — byte() — int() — longO — floatf). 22. Функции цифрового ввода.’вывода: — pinMode() — digitatWritef) — digitalRead(), 23. Функции аналогового ввода/вывода: — analogRead() — analogReference() — analogWritef). 24. Дополнительные функции ввода/вывода: — tone() — noTone ()
— shiftOut() — pulselnQ. 25. Функции работы co временем: — millis() — micros() — delay() — delayMicrosecondsf). 26. Математические функции: — constraint) — min() — max () — abs() — map() — pow() — sq() — sqrt(). 27. Тригонометрические функции: — sin() — cos() — tan(). 28. Генераторы случайных значений: — randomSeed() — random(). 29. Функции операций с битами и байтами: — lowByteQ — highByte() — bitRead() — bitWrite() — bitSetf) — bitCLear() — bit(). 30. Функции для внешних прерываний: — attach Interrupt J — detachlnterrupt(). 31. Управление портами через регистры ATmega. 32. Функции библиотеки Serial.
— Serial.begin() — Serial.end() — Serial, available(} — Serial.readQ — Se rial, fl nah () — Serial, prin t() — Serial, prin tln() — Serial.write() — Serial, peek(). 33. Функции библиотеки SoftwareSerial: — Softwares erial() — SoftwareSerial. listenf) — SoftwareSerial.isListeningQ — Sof t wareS erial.overflow(). 34. Работа co светодиодами: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 35. Работа с кнопками: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 36. Работа с потенциометром: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 37. Управление сервоприводом: — библиотека Servo. 11 — принцип работы — схема подключения к плате Arduino — примеры скетчей. 38. Трёхцветный светодиод: — принцип работы — схема подключения к плате Arduino — примеры скетчей.
39. Работа с пьезоэлементом: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 40. Работа с фоторезистором: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 41. Работа с матричной клавиатурой: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 42. Модуль KY’002 — датчик вибрации: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 43. KY-003 — цифровой датчик Холла: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 41. KY-004 — модуль с кнопкой: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 45. KY-005 — инфракрасный светодиод: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 46. KY-006 — модуль с пассивным звуковым излучателем: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 47. KY-008 — лазерный модуль с длиной волны 650 нм: — принцип работы — схема подключения к плате Arduino — примеры скетчей.
48. KY-909 — трёхцветный rgb модуль c smd светодиодом: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 49. KY-010 — модуль с оптическим прерывателем: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 50. KY-011 —двухцветный светодиодный модуль: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 51. KY-012 — активный звуковой модуль {зуммер): — принцип работы — схема подключения к плате Arduino — примеры скетчей. 52. KY-013 — аналоговый температурный сенсор: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 53. KY-015 — модуль с датчиком температуры и влаж- ности DHT11: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 54. КY-016 — трёхцветный rgb светодиодный модулы — принцип работы — схема подключения к плате Arduino — примеры скетчей. 55. KY-017 —датчик наклона: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 56. КY -018 — светочувствительный датчик на фото резисторе: — принцип работы — схема подключения к плате Arduino — примеры скетчей.
57. KY-019 — однокянальный модуль реле: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 58. KY-U20 — датчик наклона: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 59. KY-021 — модуль с герконом: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 60. KY-022 — модуль ИК-приёмника: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 61. KY-023 — двухосевой джойстик: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 62. KY-024 — комбинированный линейный датчик Холла: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 63. KY-025 — модуль с герконом: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 64. KY-026 — датчик пламени инфракрасный: — принцип работы — схема подключения к плате Arduino — примеры скетчей* 65. KY-027 — датчик наклона со светодиодом: — принцип работы — схема подключения к плате Arduino — примеры скетчей.
66. K.Y’028 — температурный датчик с цифровым выхо- дом: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 67. КY-029 — модуль с двухцветным светодиодом: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 68. KY-031 —датчик удара: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 69. KY-032 — модуль с инфракрасным датчиком обнару- жения препятствий: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 70. KY-033 — ИК-модуль датчика, отслеживающего ли- нию: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 71. K.Y-034 — мигающий семицветный светодиодный мсь Дуль: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 72. KY-035 — аналоговый датчик холла: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 73. KY-036 — сенсорный модуль с металлическим кон- тактом: — принцип работы — схема подключения к плате Arduino — примеры скетчей.
74. KY-037 — модуль микрофона: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 75, KY-038 — звуковой сенсор с конденсаторным микро- фоном: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 76. KY-039 — датчик для измерения пульса в пальце: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 77. KY-040 — модуль с онко дером: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 78. HC-SR04 — ультразвуковой датчик расстояния: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 79. Шаговый двигатель 28BYJ-48 и драйвер ULN2003: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 80. Режимы работы ШД. 81. Драйвер (плата управления) ШД. 82. Набор функций библиотеки Stepper.11 для ШД: — Stepper () — setSpeed() — step(), 83. Набор функций библиотеки AccelStepper.h для ШД: — AccelStepper mystepper(l, pinStept pin Direction) — AccelStepper mystepper(2, pinA^ pmB) — AccelStepper mystepper(4, pinAL, pinA2, pinBl, pinB2) — AccelStepper my stepper (4, pinAlT pinA2, pmBl, pinB2)
— in ys tepp er. setMaxSpe ed( stepsPerSecond) — mystepp er. set Acc e J er a tion(s tepsP er SecondSquar ed) — mystepper. in oveTof target Position) — mystepp er. move) distance) — mystepper. rnn() — mystepp er. di st anceToGo() — mystepp er. runTo Position)); — mystepper.setSpeedfstepsPerSecond) — mystepper. rnnSpeedf). 84. Светодиодный дисплей 1588BS: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 85. Считыватель информации с пластиковых карт и бре- локов RC522: — принцип работы — схема подключения к плате Arduino — примеры скетчей — характеристики считывателя RFID RC522 — контакты и сигналы платы RFID RC522 — запись с помощью считывателя RFLD RC522 — пластиковая карта. 86. Датчики температуры и влажности DHT11 и DHT22: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 87. Библиотека iarduino_DHT: — #include <iarduino_DHT.h> — iarduiuo_DHT sensor( №ВЫВОДА ) — read(}. 88. Датчики уровня жидкости: — принцип работы — схема подключения к плате Arduino — примеры скетчей.
89. Пассивный датчик движения: — принцип работы — -схема подключения к плате Arduino — примеры скетчей. 90. Семисегментный индикатор: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 91. Четырёхразрядный семисегментный индикатор: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 92. Инфракрасный пульт дистанционного управления: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 93. Часы реального времени DS1302: — принцип работы — схема подключения к плате Arduino — примеры скетчей. 91. Библиотека iarduino_RTC.h.
Библиографический список 1. Зубарев, А. А. Ассемблер для микроконтроллеров AVR [Текст! : учебное пособие А- А. Зубарев, — Омск : Изд-во Си- 6АДИ, 2007. — 112 с. 2. Соммер, У. Программирование микроконтроллерных плат Arduino/ Free duino [Текст] / У. Соммер» — СПб. : БХБ-Петер- бург, 2012. — 256 с. 3. Ревич, Ю. В. Занимательная электроника [ Текст] / Ю. В. Ревич. — 3-е изд., перераб., и доп. — СПб. : БХВ-Петер- бург, 2015. — 576 с. 4. Петин, В. А. Проекты с использованием контроллера Arduino [ТекстJ В. А. Петин. — 2-е изд., перераб. и доп.. — СПб. : БХВ-Петербург, 2015. — 161 с. 5. Карвинен, Теро, Карвинен, Киммо, Валтокари, Вил- ле. Делаем сенсоры: проекты сенсорных устройств на базе Arduino и Raspberry Pi.; пер. с англ. — М. : ООО «&И.Д, Ви- льямс*, 2015. — 432 с. 6. Официальный сайт Arduino на русском языке: http: arduino.ru. ". Вики на сайте «зАмперки» (Материалы, статьи, руко- в одства): htt р: / / wiki. am р erka. г и/. 8. Сайт: http://cxein.net. 9. Сайт: http:/, zi-zi.ru. 10. Сайт: http://kit.ru. 11. Сайт: http://lesson .iardui no.ru. 12. Сайт: http://soltau.ru. 13. Сайт: http://arthurphdent.livejournal.com. 14. Сайт: http://kakprosto.ru. 15. Сайт: http://arduino-kit.ru. 16. Сайт: http://amperka.ru. 17. Сайт: http: / / тур га ctic. г и. 18. Сайт: http://maxpark.ru.