Оглавление
Начало работы с Ардуино
Говоря бытовым языком, Ардуино – это электронная плата, в которую можно воткнуть множество разных устройств и заставить их работать вместе с помощью программы, написанной на языке Ардуино в специальной среде программирования.
Чаще всего плата выглядит вот так:
На рисунке показана одна из плат Ардуино – Arduino Uno. Мы изучим ее подробнее на следующих уроках.
В плату можно втыкать провода и подключать множество разных элементов. Чаще всего, для соединения используется макетная плата для монтажа без пайки. Можно добавлять светодиоды, датчики, кнопки, двигатели, модули связи, реле и создавать сотни вариантов интересных проектов умных устройств. Плата Ардуино – это умная розетка, которая будет включать и выключать все присоединенное в зависимости от того, как ее запрограммировали.
Вся работа над проектом разбивается на следующие этапы:
- Придумываем идею и проектируем.
- Собираем электрическую схему. Тут нам пригодится макетная плата, упрощающая монтаж элементов. Безусловно, понадобятся навыки работы с электронными приборами и умение пользоваться мультиметром.
- Подключаем плату Arduino к компьютеру через USB.
- Пишем программу и записываем ее в плату буквально нажатием одной кнопки на экране в специальной среде программирования Arduino.
- Отсоединяем от компьютера. Теперь устройство будет работать автономно – при включении питания оно будет управляться той программой, которую мы в него записали.
Программа и среда программирования выглядят вот так:
На экране показана программа (на сленге ардуинщиков текст программы называется “скетч”), которая будет мигать лампочкой, подсоединенной к 13 входу на плате Ардуино UNO. Как видим, программа вполне проста и состоит из понятных для знающих английский язык инструкций. В языке программирования Arduino используется свой диалект языка C++, но все возможности C++ поддерживаются.
Есть и другой вариант написания кода – визуальный редактор. Тут не нужно ничего писать – можно просто перемещать блоки и складывать из них нужный алгоритм. Программа загрузится в подключенную плату одним нажатием кнопки мыши!
Визуальную среду рекомендуется использовать школьникам младших классов, более старшим инженерам лучше сразу изучать “настоящий” Ардуино – это довольно просто, к тому же знания C++ никому не повредят.
В целом все выглядит довольно понятно, не так ли? Осталось разобраться в деталях.
Testing Data Types (Addition)
Okay, let’s move on to test some more data types. If you’re following along at home, you’ll want to change your code, as seen below:
Now, load the code onto your Arduino board. Check the compile size: 2488 bytes for versus 2458 bytes for . Not a lot bigger, but it IS bigger. Again, this is because using data types which require more than 8 bits of storage (like , , or also requires the compiler to generate more actual machine code for the addition to be realized — the processor itself simply doesn’t have the capability of supporting larger data natively. Now, open the serial console and you should see something like this:
Next observation: this time the values printed correctly. That’s because the new datatype we’ve introduced, the , is correctly interpreted by the compiler as a numeric datatype, and correctly formats the output data to reflect that in the console. So, second lesson of Arduino datatype finesse: if you WANT to send the binary equivalent of a numeric datatype, say, as a means of sharing data with another computing device rather than a user looking at a console, use the function.
Next, let’s check out «Elapsed time» again. We’re up to 12 microseconds now — about 3 times as long! Still pretty short, but this is due to the previously mentioned fact that this is an 8-bit processor, so it needs to jump through some hoops to do 16-bit math, which is what’s required when adding variables together.
Onward and upward! Now let’s check out the datatype. Repeat the last code change, except this time replace the two incidents of with . Load the code and open your serial console and see what’s happened.
Before we dive into the serial capture, let’s revisit the compile size. I got 2516 bytes, this time- 28 bytes more than using and 58 more than using . Still a pretty small difference but a difference nonetheless, and a difference which could add up if you do a lot of math with instead of or .
Okay, now on to the serial results. Again, notice that the elapsed time changed. This time, however, it DECREASED from 12 microseconds to 8! How does that work? This is your third lesson in Arduino datatype finesse: what you think is happening may not be what is actually happening. I’m not sure why this occurs — it may be due to some compiler optimization, or due to some run-time optimization which saves time on small value additions which is not present in the int code. Regardless, is faster than is not necessarily a safe takeaway here, as we’ll see when we get into multiplication and division.
Okay, last stop, floating point math. Floating point math on the Arduino is tricky because the Arduino lacks a floating point unit, which is fancy-talk for a dedicated section of the processor which handles math with an arbitrary number of digits after a decimal point. Floating point math is also a sticky concept, because while humans can deal well with arbitrary numbers of zeros after the decimal point, computers can’t. This is the origin of the infamous 1 is not 1 bug that some early generation Pentium processors suffered from.
Alter the code as above again, but replace with in the two pertinent locations. Load the code and check out the compile size: 3864 bytes! What happened is that by including the floating point data type, you forced the compiler to include the floating point handling code. Clearly, that’s a pretty big chunk of code — it increased the size by a fair margin. Datatype finesse lesson four: don’t use floating point math unless you really, really have to. Most times, that’s going to be limited to giving users feedback about something which is fairly meaningless as an arbitrary integer value: the ADC will return a value like 536, which is cryptic, but converted into floating point it would be something like 2.62V, which is much more useful.
Now look at the run time on this code — back up to 12 microseconds. Also, note that the printed value now includes two zeros after the decimal place. If you want more (or fewer) digits after the decimal, you can add a number of digits into your print command:
Дистанционное управление «умным» домом
Для подключения платы к интернету, понадобится:
- Wi-Fi-адаптер, настроенный на прием и передачу сигнала через маршрутизатор;
- или подключенный через Ethernet кабель Wi-Fi роутер.
Также, есть вариант дистанционного управления по блютуз. Соответственно, к плате должен быть подключен Bluetooth модуль.
Есть несколько вариантов управления умным домом Arduino: с помощью приложения для смартфона или через веб. Рассмотрим каждое подробнее.
Приложения управления
Так как данная система-конструктор – не закрытая экосистема, то и приложений, реализованных для нее очень много. Они отличаются друг от друга не только интерфейсом, но и выполнением различных задач.
Blynk
Приложение на андроид и iOS с отличным дизайном, позволяет разрабатывать проекты, имеющие напрямую доступ к триггеру событий, на плате Ардуино. Но для работы приложения нужно интернет подключение, иначе взаимодействовать с ним не возможно.
Virtuino
Крутое бесплатное приложение на Android, позволяющее совмещать проекты в одно целое и управлять с помощью Wi-Fi или Bluetooth сразу несколькими платами.
Разрешает создавать визуальные интерфейсы для светодиодов, переключателей, счетчиков, приборов аналоговой схематехники. В нем есть учебные материалы и библиотека знаний о процессе работы с системой.
Bluino Loader – Arduino IDE
Приложение для телефона, представляет собой программную среду для кодирования Arduino. С его помощью можно быстро и легко скомпилировать код в файл, а затем отправить по OTG-переходнику на плату.
Arduino Bluetooth Control
Приложение контролирует контакты Arduino и управляет основными функциями по Блютузу. Но, программа не направлена на удаленное управление, только мониторинг.
RemoteXY: Arduino Control
С помощью приложения пользователь может создать свой собственный интерфейс управления платой. Подключение происходит с помощью Wi-Fi, Блютуз или интернет, через облачный сервер.
Bluetooth Controller 8 Lamp
Созданное с помощью Bluetooth-модулей HC-05, HC-06 и HC-07 приложение, обеспечивает восьмиканальный контроль. Таким способом достигается контроль и регулирование работы Ардуино, в соответствии с каждым из 8 светодиодов.
BT Voice Control for Arduino
Приложение специально заточено под дистанционное управление данными с ультразвукового датчика, подключенного по блютуз через Arduino. Реализуется подключения через модуль HC-05.
Подключившись, ультразвуковой датчик сможет передавать информацию о расстоянии до объекта, которая отобразится в интерфейсе приложения на телефоне.
IoT Wi-Fi контроллер
Приложение с интерфейсом, информирующем о конфигурации каждого входа/выхода в плате Arduino. В утилите можно переключать в реальном времени GPIO и показывать значение АЦП.
Веб-клиент
Управлять удаленно платой умного дома можно, разместив получение и обработку данных умного дома на веб-сервере. Естественно, сервер для умного дома Ардуино нужно создавать самостоятельно.
Для этих целей понадобится Arduino Ethernet Shield – сетевое расширение для пинов Ардуино Уно, позволяющее добавить разъем RJ-45 для подключения к сети.
При удаленном подключении, необходимо обеспечить внешнее питание платы не от USB.
Затем, подключите по USB плату к компьютеру, а по Ethernet плату к роутеру, которой раздает интернет компьютеру. При правильном установлении соединения, вы увидите зеленый свечение на порту.
После этого, нужно использовать библиотеки шилдов Ethernet и в среде разработки IDE написать код для создания сервера и отправки данных на сервер. Пример самодельного сервера неплохо описан в данной инструкции.
Уведомления по SMS
С помощью подключаемой библиотеки GSM в Arduino IDE можно:
- Работать с голосовыми вызовами.
- Получать и отправлять СМС.
- Подключаться к Интернету через GPRS.
Работает схема через специальную плату расширения GSM, содержащую специальный модем.
О создании универсальной сигнализации на Arduino, с отправкой СМС уведомления на смартфон можно узнать из соответствующей видеоинструкции.
Зачем вам Arduino?
Arduino разработана для… Всех. Так, во всяком случае, заявлено на официальном сайте компании. Список примерно такой: артисты, дизайнеры, хакеры, программисты, инженеры, для всех, кто интересуется разработкой и воплощением интерактивных проектов. Arduino может взаимодействовать с кнопками, светодиодами, двигателями, динамиками, GPS-модулями, температуру, камерами, интернетом и даже вашим смартфоном или телевизором! Подобная гибкость в сочетании с тем, что софт от Arduino — совершенно бесплатный, сами платы достаточно дешевые и легки в осваивании привела к появлению огромного сообщества поклонников данной платформы, которые выкладывают собственные куски кода, библиотеки и инструкции для огромного количества проектов с использованием Arduino.
Arduino используются в качестве «мозгов» для роботов, 3D принтеров, в системах автоматизированного полива, светодиодных кубах, грелках, в системах «умных домов» и т.д. Список постоянно растет. Все проекты и не перечислишь. Скажем так: Arduino находят применение практически в любом проекте, где необходима автоматизация.
И это только вершина айсберга. Если вам интересно взглянуть на Arduino проекты в действии, вот несколько ссылок на хорошие ресурсы (на английском языке):
- Instructables
- Bildr
- Arduino Playground
- The ITP Physical Computing Wiki
- LadyAda
- Make: Projects
Платы и модули для функционала
Существует много плат Arduino, описание которых говорит о различиях в объеме памяти, портах, питании, тактовой частоте и др. Одни предназначены для решения простых задач, другие — для решения более сложных.
К популярным платам относятся следующие виды:
- Arduino Uno. Наиболее распространенная плата. Есть большой выбор уроков. Плата допускает замену контроллера. Оснащена 14 цифровыми вводами-выводами (6 ШИМ), 6 аналоговыми входами, флеш-памятью 32 Кб (ATmega328), из которых 0,5 Кб использует загрузчик.
- Arduino Mega 2560. Создана на базе микроконтроллера ATmega2560. Флеш-память — 256 Кб, из которых 8 Кб использует загрузчик. Имеет 54 цифровых вводов-выводов (14 ШИМ), 16 аналоговых входов, 8 Кб оперативной памяти. Среди всех плат «Ардуино» у этой самый большой размер.
- Arduino Due. Оснащена 54 цифровыми вводами-выводами (12 ШИМ), 12 аналоговыми входами (2 выходами). Создана на базе микроконтроллера AT91SAM3X8E с рабочим напряжением 3,3 В и флеш-памятью 512 Кб.
- Arduino Pro Mini 3.3V. Самая миниатюрная плата в семействе Arduino. Напряжение — 3,3 В. Требует использования внешнего программатора. Память данных составляет 2 Кб. Создана на базе микроконтроллера ATmega328P. Количество цифровых выводов — 14 линий (6 из которых — ШИМ), аналоговых — 6.
- Arduino Pro Mini 5V. Аналог предыдущей модели с напряжением 5 В.
- Arduino Nano V3.0. Создана на базе ATmega328. Сдержит 32 Кб памяти, из которых 2 Кб использует загрузчик. Имеет 14 цифровых вводов-выводов (6 ШИМ), 6 аналоговых входов, встроенный порт USB. Напряжение — 5 В.
- Arduino Micro. Разновидность платы c возможностью имитировать различные USB-устройства при подключении к ПК. Оснащена 20 цифровыми вводами-выводами (7 ШИМ), 12 аналоговыми входами.
Кроме того, существуют дополнительные модули и датчики с нужными ответвлениями:
- Датчики. Системы, считывающие, отправляющие и обрабатывающие информацию. Расширяют аппаратные функции проекта.
- Модули. Дополнения, которые позволяют расширить вычислительные мощности проекта. К ним относят карты памяти, вспомогательные процессы.
Датчики можно разделить на категории:
- Устройства получения информации. Датчики и сканеры, позволяющие получить сведения об окружающей среде: давлении, температуре, влажности, расстоянии до объектов. Есть возможность вводить параметры, зависящие от этих показаний. С помощью датчика расстояния можно создавать роботы-пылесосы, которые передвигаются по комнате, избегая препятствий.
- Устройства обработки информации. Реализуются отдельно или совместно с предыдущими датчиками. Используются для совершения промежуточных операций.
- Устройства вывода информации. Это ЖК-экраны, светодиодные индикаторы, сенсорные экраны, динамики и т. д.
Среди наиболее популярных модулей «Ардуино» можно выделить:
- Ультразвуковой дальномер HC-SR04. Датчик, позволяющий с помощью ультразвука измерить расстояние от 2 см до 4 м.
- Инфракрасный дальномер Sharp. Измеряет расстояние от 20 см до 1,5 м посредством инфракрасного излучения.
- Модуль температуры и влажности DHT11. Измеряет температуру в диапазоне от 0 до +50°C и влажность от 20 до 90%. Используется для теплиц или в качестве комнатного термометра. Часто приобретается для умного дома.
- Датчик влажности почвы FC-28. Измеряет влажность почвы или другой среды. Нужен для автоматизированного полива растений.
- Bluetooth HC-06. Помогает организовать беспроводную связь с другими устройствами.
Resources and Going Further
I’m going to leave it here for now. I hope I’ve demonstrated clearly the benefits of using appropriate data types for your variables. The next tutorial will go into some of the really ugly pitfalls that are hiding in mixing data types and using INAPPROPRIATE data types — for instance, data types that are too small for the largest number that you may encounter.
All of the context for these operations comes from the compiler, and the directions for the context get to the compiler from the user. You, the programmer, tell the compiler that THIS value is an integer and THAT value is a floating point number. The compiler, then, is left trying to figure out what I mean when I say «add this integer to that floating point». Sometimes that’s easy, but sometimes it’s not. And sometimes it SEEMS like it SHOULD be easy, but it turns out to yield results you might not anticipate.
Here’s some further reading you may want to explore with your new knowledge of data types:
- Digital Logic
- How to read a schematic
- Logic Levels
- Binary
5Общение с Arduino
Как же процессор узнаёт, что именно ему следует делать? Вы должны рассказать ему это. Написание сообщений для Arduino называется программирование. Существует язык для общения с микроконтроллером, упрощённый и адаптированный специально для Arduino. Освоить этот язык совсем не сложно при желании и определённой настойчивости, даже если вы никогда раньше не программировали.
И для упрощения этого процесса разработана специальная программная среда – Arduino IDE. В её состав включены десятки примеров хороших, работающих программ. Изучив их, вы очень быстро многое узнаете о языке общения с Arduino.
Внешний вид среды разработки для программирования Ардуино – Arduino IDE
Arduino позволит вашим программам выйти из виртуального мира в мир реальный. Вы сможете увидеть, как написанные вами программы заставляют мигать светодиод или вращать вал двигателя, а затем делать и более сложные и полезные вещи. Arduino позволит вам узнать много нового и интересного и в электронике, и в программировании. В итоге это может послужить вам отличным хобби, увлекательным занятием с детьми, замечательным и полезным времяпровождением.
Ну и напоследок, посмотрите, какие разные и замечательные проекты можно воплотить с помощью Ардуино!
Тестируем разные типы данных (Сумма)
Давайте двигаться дальше и проведем тестирование других типов данных. Если вы захотите проделать подобный эксперимент с использованием своей Arduino IDE, измените скетч как это показано на рисунке ниже:
Теперь загрузите новый скетч на ваш Arduino. Проверьте размер после компиляции: 2488 байт при использовании типа данных int. Напомним, что при использовании byte у нас было 2458 байта. Не намного больше, но это всего лишь три переменные! Напомним, что тип данных int занимает 16 байт, а не 8 как, например, byte. Теперь откройте окно серийного монитора, на котором вы должны увидеть что вроде:
Следующее: в этот раз данные отобразились корректно. Это из-за того, что новый тип данных, который мы использовали, int, корректно интерпретируется компилятором как числовой тип и функция Serial.print( ) правильно отображает данные в консоли. Итак, второй урок при работе с разными типами данных Arduino: если вы хотите отправить бинарный эквивалент данных типа числового, скажем, для передачи данных на другой компьютер, а не для отображения в консоли, используйте функцию Serial.write( ).
Теперь давайте посмотрим на строку “Elapsed time”. Мы потратили 12 микросекунд — в три раза больше времени! Почему такая разница? Как мы уже упоминали выше, у нас 8-ми битный процессор, а это значит, что для математических операций с 16-ти битными числами, нам потребуются дополнительная обработка данных.
Теперь давайте займемся типом данных long. Повторите код, заменив тип данных int на long. Загрузите скетч на Arduino и откройте ваш серийный монитор:
Смотрим на размер скетча: 2516 байт, на 28 байт больше, чем при использовании int и на 58 больше, чем с использованием типа данных byte.
Смотрим дальше. Время, которое была затрачено на обработку данных уменьшилось! С 12 до 8 секунд! Почему? Это не логично! Это третий урок, который надо вынести: не всегда то, что вы предполагаете на самом деле происходит. Вероятно, подобное происходит благодаря оптимизации самого компилятора.
Итак, последнее, что мы должны рассмотреть — типы данных с плавающей запятой. Для этого замените тип данных long на float
Загрузите скетч на Arduino и обратите внимание на размер: 3864 байта! Используя тип данных с плавающей запятой вы заставили компилятор обрабатывать значения после запятой. А это дополнительный большой кусок кода
Урок четвертый — не используйте значения с плавающей запятой, если только вы на 60% не уверены, что без этого типа данных вам не обойтись. Например, если вы подключили сенсор и получаете значение с аналогового входа вроде 536, гораздо информативнее будет преобразовать это значение в вольты и отобразить пользователю что-то вроде 2.26 В.
Теперь взгляните на время обработки данной программы: опять 12 миллисекунд. Кстати, заметьте, что значения x, y, z отобразились с двумя нулями в десятичной части. Если вам надо больше (или меньше) значков после запятой, вы можете добавить их с помощью команды:
Serial.print(x, 3); // отображает x с тремя знаками в дробной части.
Синтаксис
Ниже приведены варианты объявления и присвоения строк:
1 char Str115]; // Объявление массива символов без присваивания значений 2 char Str28 = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; // Объявление массива символов и присвоение значений всем элементам, кроме последнего, компилятор Arduino автоматически добавит символ конца строки 3 char Str38 = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'}; // Явно объявлен завершающий символ 4 char Str4 = "arduino"; // Инициализирование массива строковой константой в двойных кавычках. Компилятор автоматически задаст требуемый размер на массив, равный количеству символов плюс завершающий символ 5 char Str58 = "arduino"; // Инициализирование массива с явным заданием размера и присвоением строковой константы 6 char Str615 = "arduino"; // Инициализирование массива с явным заданием дополнительного размера (с запасом), фактически превышающего размер строковой константы при начальном присвоении
Определение и назначение
Если официально, Ардуино — это платформа для создания прототипов электроники. Но что это значит? Для нас это как маленький компьютер, который можно программировать, и он взаимодействует с миром с помощью электронных датчиков, источников света, двигателей. По сути, это делает по-настоящему полезные проекты в области электроники доступными для всех. Это идеальный инструмент для мастеринга! Эта платформа стала довольно популярной среди людей, только начинающих заниматься электроникой, и на то есть веские причины:
- В отличие от большинства предыдущих программируемых плат, Ардуино не требует отдельного аппаратного обеспечения (называемого программатором) для загрузки нового кода — вы можете просто использовать USB-кабель.
- Кроме того, в среде Arduino IDE используется упрощённая версия C ++, что облегчает обучение программированию.
- Ввиду большой популярности этой платформы, в интернете полно готовых программ (скечей), что вообще освобождает от программирования новичков.
- Также в продаже имеются множество готовых датчиков, модулей, шилд расширяющих возможности платы.
Так зачем нужно Arduino и что можно сделать? Да практически всё, от простых мигалок светодиодом, роботов до системы умный дом. Подробнее с проектами можно ознакомиться здесь.
Переменные
Переменная — это способ сохранения и дальнейшего использование данных в программе. Значение переменной может быть многократно изменено, в отличии от констант.
Для создания переменной, ее нужно объявить — задать ее имя и тип данных. Также можно сразу присвоить ей некоторое значение:
Имена переменных могут состоять из латинских букв, цифр и знака подчеркивания «_», но не могу совпадать с ключевыми словами языка (false, else, long и тд). При этом заглавные и строчные буквы различаются.
Существуют соглашения по именованию переменных. Имена переменных обычно начинаются со строчной буквы. Если имя состоит из одного слова, то оно целиком пишется строчными буквами (имена полностью из заглавных букв обычно используются для констант). Если же имя переменной состоит из нескольких слов, то принято либо разделять их символом подчеркивания, либо начинать каждое новое слово, кроме первого, с заглавной буквы:
Первый вариант обычно используют при объектно-ориентированном подходе, а второй — при процедурном.
Область видимости
От того, в какой части кода объявлена переменная, будет зависть то, в какой части кода эта переменная будет доступна. переменные делят на:
- глобальные
- локальные
Глобальные переменные объявляются вне функций, обычно перед функцией setup(). Доступ к таким переменным возможен из любой функции файла.
Локальные переменные — это переменные, объявленные в функции или в теле блоков if, for, while и др. Доступ к таким переменные возможен только из тоже же функции/блока, где они объявлены.
Рекомендуется как можно реже использовать глобальные переменные, так как их использование чаще приводит к ошибкам: значение переменной может быть случайно изменено в любой функции. Также при использовании локальных переменных код становится более понятным для восприятия.
static
Ключевое слово static используется для объявление локальных переменных, значение которых будет сохраняться между вызовами функции. Этим они отличаются от обычных локальных переменных, которые создаются при каждом вызове функции и уничтожаются при ее завершении.
В этом примере переменная a будет создана только при первом запуске функции loop(). После этого при каждом вызове функции ее значением будет увеличено на единицу и мы увидим следующий вывод:
11
12
13
14
15
…
Обратите внимание, что значением 10 будет также присвоено переменной только при ее инициализации
volatile
Ключевое слово volatile используется для переменных, значение которых может быть изменено чем-то, находящимся вне секции кода. Например параллельным потоком. При использовании ключевого слова volatile компилятор будет брать значение переменной из ОЗУ, а не из регистра (временной ячейки памяти).
При программировании Arduino использовать volatile следует только в том случае, если вы используете прерывания. Причем, если переменная занимает больше 8 бит, при чтении ее значения прерывания должны быть отключены. Это связано с тем, что в arduino используется 8-ми битный микроконтроллер и он может за раз считать только 8 бит, а при чтении другая часть переменной уже может измениться.