Все права на текст принадлежат автору: Монк С .
Это короткий фрагмент для ознакомления с книгой.
Программируем ArduinoМонк С

 


С. Монк

Программируем Arduino. Профессиональная работа со скетчами

2017

Переводчик А. Макарова

Технический редактор Н. Суслова

Литературный редактор Н. Рощина

Художники Л. Егорова, С. Маликова

Корректоры С. Беляева, Н. Витько

Верстка Л. Егорова

С. Монк

Программируем Arduino. Профессиональная работа со скетчами . — СПб.: Питер, 2017.

ISBN 978-5-496-02385-6

© ООО Издательство "Питер", 2017

Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.

Об авторе

Доктор Саймон Монк (Dr. Simon Monk; Престон, Соединенное Королевство) имеет степень бакалавра в области кибернетики и информатики, а также доктора наук в области программной инженерии. Доктор Монк несколько лет занимался академической наукой, прежде чем уйти в промышленность. Является одним из основателей компании Momote Ltd, специализирующейся на разработке программного обеспечения для мобильных устройств. Со школьных лет активно увлекается электроникой и много пишет для радиолюбительских журналов об электронике и открытом аппаратном обеспечении. Автор многочисленных книг по электронике, посвященных в основном открытым аппаратным платформам, особенно Arduino и Raspberry Pi. В соавторстве с Полом Шерцем написал третье издание книги «Practical Electronics for Inventors».

Вы можете последовать за Саймоном в Twitter, где он зарегистрирован как @simonmonk2.

Благодарности

Хочу выразить большую признательность издательству McGraw-Hill Education, сотрудники которого приложили массу усилий, чтобы выпустить эту книгу. Отдельное спасибо моему редактору Роджеру Стюарту (Roger Stewart), а также Ваставикте Шарма (Vastavikta Sharma), Джоди Маккензи (Jody McKenzie), Ли-Энн Пикрелл (LeeAnn Pickrell) и Клер Сплан (Claire Splan).

Хочу также поблагодарить компании Adafruit, SparkFun и CPC за предоставленные модули и компоненты, использовавшиеся при подготовке этой книги.

И напоследок, но не в последнюю очередь, спасибо Линде за ее терпение и великодушие, благодаря которым я смог написать эту книгу.

Введение

Arduino — стандартный микроконтроллер, получивший широкое признание у инженеров, мастеров и преподавателей благодаря своей простоте, невысокой стоимости и большому разнообразию плат расширения. Платы расширения, подключаемые к основной плате Arduino, позволяют выходить в Интернет, управлять роботами и домашней автоматикой.

Простые проекты на основе Arduino не вызывают сложностей в реализации. Но, вступив на территорию, не охваченную вводными руководствами, и увеличивая сложность проектов, вы быстро столкнетесь с проблемой нехватки знаний — врагом всех программистов.

Эта книга задумана как продолжение бестселлера «Programming Arduino: Getting Started with Sketches»1. Несмотря на то что эта книга включает краткое повторение основ из книги «Programming Arduino», она познакомит читателя с более продвинутыми аспектами программирования плат Arduino. В частности, эта книга расскажет, как:

• обеспечить эффективную работу при минимальном объеме доступной памяти;

• решать сразу несколько задач без помощи механизмов многопоточного выполнения;

• упаковывать код в библиотеки, чтобы им могли пользоваться другие;

• использовать аппаратные прерывания и прерывания от таймера;

• добиться максимальной производительности;

• уменьшить потребление электроэнергии;

• взаимодействовать с последовательными шинами разных типов (I2C, 1-Wire, SPI и последовательный порт);

• взаимодействовать с портом USB;

• взаимодействовать с сетью;

• выполнять цифровую обработку сигналов (Digital Signal Processing, DSP).


Загружаемые примеры

Книга включает 75 примеров скетчей, которые распространяются в открытом виде и доступны на веб-сайте автора www.simonmonk.org. Перейдя по ссылке на страницу этой книги, вы сможете загрузить исходный код примеров, а также самый актуальный список ошибок и опечаток, найденных в книге.


Что необходимо для чтения книги

Данная книга в первую очередь посвящена вопросам программирования. Поэтому для опробования большинства примеров будет достаточно платы Arduino, светодиода и мультиметра. Если у вас имеются дополнительные платы расширения Arduino, они тоже пригодятся. Для рассмотрения примеров из главы 12 вам понадобится плата Ethernet или Wi-Fi. На протяжении всей книги мы будем использовать разные модули для демонстрации разных интерфейсов.

В центре внимания находится Arduino Uno — наиболее широко используемая плата Arduino, но в главах, посвященных программированию порта USB и цифровой обработке сигналов, рассматриваются некоторые особенности других плат Arduino, таких как Leonardo и Arduino Due.

В приложении в конце книги вы найдете список поставщиков, у которых сможете приобрести все эти компоненты.


Как работать с этой книгой

Каждая глава посвящена отдельной теме, связанной с программированием Arduino. Главы книги, кроме главы 1, где приводится краткий обзор основ Arduino, можно читать в любом порядке. Если вы опытный разработчик, начните с главы 14, чтобы вникнуть в некоторые особенности программирования Arduino.

Далее следует краткое описание глав.

Глава 1 «Программирование Arduino». Эта глава содержит сводную информацию о программировании Arduino. Это учебник для тех, кому требуется быстро ознакомиться с основами Arduino.

Глава 2 «Под капотом». В этой главе мы заглянем под капот и посмотрим, как работают программы для Arduino и откуда они берутся.

Глава 3 «Прерывания и таймеры». Новички обычно стараются не использовать прерывания, и совершенно напрасно, так как часто они оказываются удобным инструментом и их программирование не представляет никаких сложностей. Однако прерывания имеют свои ловушки, и эта глава расскажет вам все, что вы должны знать, чтобы не попасть в них.

Глава 4 «Ускорение Arduino». Платы Arduino оснащены маломощными процессорами с невысоким быстродействием, поэтому иногда требуется выжать из них все, что только можно. Например, встроенная функция digitalWrite надежна и проста в использовании, но неэффективна, что особенно заметно, когда требуется одновременно включить несколько выходов. В этой главе вы узнаете, как увеличить ее производительность, а также познакомитесь с другими приемами создания быстродействующих скетчей.

Глава 5 «Снижение потребления электроэнергии». Когда для питания платы Arduino используются аккумуляторы или солнечные батареи, желательно уменьшить потребление электроэнергии. Этого можно добиться не только оптимизацией конструкции устройства, но и применением особых приемов программирования.

Глава 6 «Память». В этой главе мы посмотрим, как уменьшить потребление памяти, а также познакомимся с достоинствами и недостатками, связанными с динамическим распределением памяти в скетчах.

Глава 7 «Интерфейс I2C». Интерфейс I2C на плате Arduino может существенно упростить взаимодействие с модулями и компонентами и позволит обойтись меньшим числом контактов на плате. Эта глава описывает, как действует интерфейс I2C и как им пользоваться.

Глава 8 «Взаимодействие с устройствами 1-Wire». В этой главе рассказывается о шине 1-Wire для связи с устройствами, такими как датчики температуры компании Dallas Semiconductor, которые часто применяются с платами Arduino. Здесь вы узнаете, как действует эта шина и как ею пользоваться.

Глава 9 «Взаимодействие с устройствами SPI». SPI — еще один стандартный интерфейс, поддерживаемый платами Arduino. В этой главе описывается, как он действует и как им пользоваться.

Глава 10 «Программирование последовательного интерфейса». Поддержка передачи данных через последовательный порт, порт USB или контакты Rx и Tx на плате Arduino — отличный способ организовать обмен данными с периферийными устройствами и другими платами Arduino. В этой главе вы узнаете, как пользоваться последовательным портом.

Глава 11 «Программирование интерфейса USB». В этой главе рассматриваются разные аспекты использования порта USB на плате Arduino. Вы познакомитесь с возможностью эмуляции клавиатуры и мыши, поддерживаемой платой Arduino Leonardo, а также узнаете, как подключить клавиатуру или мышь к соответственно оборудованной плате Arduino.

Глава 12 «Программирование сетевых взаимодействий». Плата Arduino давно стала обычным компонентом «Интернета вещей». В этой главе вы узнаете, как программировать Arduino для работы в Интернете. В число обсуждаемых здесь тем входит описание плат расширения Wi-Fi и Ethernet, использования веб-служб и применения Arduino в качестве маленького веб-сервера.

Глава 13 «Цифровая обработка сигналов». Плата Arduino способна выполнять простую обработку сигналов. В этой главе обсуждаются разные способы такой обработки, от фильтрации сигнала, поступающего на аналоговый вход, с применением программного обеспечения вместо внешних электронных устройств до вычисления относительной величины различных частотных сигналов с применением быстрого преобразования Фурье.

Глава 14 «Многозадачность с единственным процессом». Программисты, пришедшие в мир Arduino из мира больших систем, часто отмечают отсутствие поддержки многозадачности в Arduino как существенное упущение. В этой главе я попробую исправить его и покажу, как преодолеть ограничения однопоточной модели встроенных систем.

Глава 15 «Создание библиотек». Рано или поздно вы создадите нечто замечательное, что, по вашему мнению, могли бы использовать другие. Это будет самый подходящий момент оформить свой код в виде библиотеки и выпустить ее в свет. Эта глава покажет вам, как это сделать.


Ресурсы

В поддержку этой книги на веб-сайте автора (www.simonmonk.org) создана страница. Перейдя по ссылке на страницу этой книги, вы найдете исходный код примеров, а также другие ресурсы.


От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter.com (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.


1 Монк С. Программируем Arduino. Основы работы со скетчами. — СПб.: Питер, 2015. — Примеч. пер.

1. Программирование Arduino

Эта глава содержит сводную информацию о плате Arduino. Если вы ничего не знаете об Arduino, возможно, вам стоит также прочитать книгу «Programming Arduino: Getting Started with Sketches» (McGraw-Hill Professional, 2012)2.


Что такое Arduino?

Термин «Arduino» используется для обозначения физических плат Arduino, наибольшей популярностью из которых пользуется модель Arduino Uno, и системы Arduino в целом. Система включает также программное обеспечение для компьютера (применяется для программирования платы) и периферийные платы, которые можно подключать к основной плате Arduino.

Для работы с платой Arduino вам понадобится подходящий компьютер. Это может быть персональный компьютер с операционной системой Mac, Windows, Linux или нечто более скромное, такое как Raspberry Pi. Компьютер нужен в основном для того, чтобы выгружать программы в плату Arduino. После установки на Arduino эти программы действуют совершенно автономно. На рис. 1.1 показано, как выглядит плата Arduino Uno.

Рис. 1.1. Плата Arduino Uno

Плата Arduino может подключаться к порту USB компьютера. Когда она подключена, вы можете посылать сообщения в обоих направлениях. На рис. 1.2 показано, как соединяются плата Arduino и компьютер.

Рис. 1.2. Плата Arduino и компьютер

В отличие от компьютера, Arduino почти не имеет памяти, а также не имеет операционной системы, клавиатуры с мышью и экрана. Главная ее задача — чтение данных с датчиков и управление исполнительными устройствами. То есть можно, к примеру, подключить к плате датчик измерения температуры и управлять мощностью обогревателя.

На рис. 1.3 перечислены некоторые устройства, которые можно подсоединять к плате Arduino. Это далеко не все виды устройств, которые можно подключить к Arduino.

Рис. 1.3. Устройства, подключаемые к Arduino

Далее перечислены некоторые очень интересные проекты, реализованные на основе Arduino:

• Bubblino — подключенная к Arduino машина для мыльных пузырей, которая выпускает пузыри, когда вы посылаете ей сообщение в Twitter;

• светодиодные кубы;

• счетчики Гейгера;

• музыкальные инструменты;

• дистанционные датчики;

• роботы.


Установка и среда разработки

Для программирования Arduino используется интегрированная среда разработки Arduino (Arduino Integrated Development Environment, IDE). Если вы программист и имеете опыт работы со сложными средами разработки, такими как Eclipse или Visual Studio, то Arduino IDE покажется вам очень простой и, возможно, вы отметите отсутствие интеграции с репозиториями, функции автодополнения команд и прочих удобств. Если вы новичок в программировании, то вам понравятся простота и легкость использования Arduino.


Установка среды разработки

Прежде всего загрузите программное обеспечение для своей операционной системы с официального веб-сайта Arduino: http://arduino.cc/en/Main/Software.

После загрузки вы сможете найти подробные инструкции по установке для каждой платформы по адресу http://arduino.cc/en/Guide/HomePage3.

Самое замечательное в Arduino то, что для работы с этой платой вам понадобятся лишь сама плата Arduino, компьютер и кабель USB для их соединения между собой. Плата Arduino может даже питаться от порта USB компьютера.


Blink

Чтобы убедиться в работоспособности платы, запишем в нее программу, которая будет включать и выключать светодиод, отмеченный на плате Arduino меткой L, из-за чего его часто называют светодиодом L.

Запустите Arduino IDE на своем компьютере. Затем в меню File (Файл) (рис. 1.4) выберите пункт Examples—>01 Basics—>Blink (Примеры—>01 Basics—>Blink).

Рис. 1.4. Загрузка скетча Blink в Arduino IDE

Чтобы не отпугивать непрограммистов, программы в мире Arduino называют скетчами. Прежде чем выгрузить скетч Blink в свою плату Arduino, вам нужно настроить в Arduino IDE тип платы. Набольшее распространение получила плата Arduino Uno, и в этой главе я буду полагать, что вы используете именно ее. Поэтому в меню Tools—>Board (Инструменты—>Плата) выберите пункт Arduino Uno4 (рис. 1.5).

Рис. 1.5. Выбор типа платы

После настройки типа платы выберите порт, к которому она подключена. Сделать такой выбор в Windows очень просто, поскольку в списке, скорее всего, будет единственный порт COM4 (рис. 1.6). Однако в Mac или Linux список обычно содержит большее количество последовательных устройств. Среда разработки Arduino IDE помещает последние подключенные устройства в начало списка, поэтому плата Arduino должна находиться вверху.

Рис. 1.6. Выбор последовательного порта

Чтобы выгрузить скетч в плату Arduino, щелкните на кнопке Upload (Загрузка) на панели инструментов — второй слева, которая подсвечена на рис. 1.7.

Рис. 1.7. Выгрузка скетча Blink

После щелчка на кнопке Upload (Загрузка) справа внизу в окне Arduino IDE появится индикатор выполнения, отражающий ход компиляции скетча (то есть его преобразования в формат, подходящий для выгрузки). Затем какое-то время должны мигать светодиоды с метками Rx и Tx на плате Arduino. И наконец, должен начать мигать светодиод с меткой L. В нижней части окна Arduino IDE должно также появиться сообщение «Binary sketch size: 1,084 bytes (of a 32,256 byte maximum)» («Скетч использует 1084 байт (3%) памяти устройства. Всего доступно 32 256 байт»)5. Оно означает, что скетч занимает около 1 Кбайт флеш-памяти из 32 Кбайт, доступных в Arduino для программ.

Прежде чем приступить к программированию, давайте познакомимся с аппаратным окружением, в котором вашим программам, или скетчам, предстоит работать и которое они смогут использовать.


Обзор платы Arduino

На рис. 1.8 показано устройство платы Arduino. В левом верхнем углу рядом с разъемом USB находится кнопка сброса. Нажатие на нее посылает логический импульс на вывод Reset микроконтроллера, который в ответ

Рис. 1.8. Устройство платы Arduino

очищает свою память и запускает программу с самого начала. Обратите внимание на то, что программа, хранящаяся в устройстве, сохраняется, потому что находится в энергонезависимой флеш-памяти, то есть в памяти, не утрачивающей свое содержимое даже при выключении электропитания.


Электропитание

Электропитание платы Arduino возможно через разъем USB или через разъем внешнего блока питания, находящийся ниже. На этот разъем допускается подавать постоянное напряжение от 7,5 до 12 В. Сама плата Arduino потребляет около 50 мА. Поэтому небольшой 9-вольтовой батареи типа «Крона» (200 мА·ч) достаточно, чтобы питать плату в течение примерно четырех часов.

При подаче питания на плату загорается индикатор питания (справа на плате Uno, слева на плате Leonardo).


Контакты электропитания

Рассмотрим теперь контакты в нижнем ряду на рис. 1.8. Все контакты, кроме первого, подписаны.

Первый контакт, без метки, зарезервирован для использования в будущем. Следующий контакт, IOREF, служит для определения опорного напряжения, на котором работает плата. Обе модификации, Uno и Leonardo, используют напряжение 5 В, поэтому на данном контакте всегда будет присутствовать напряжение 5 В, но в этой книге он не будет использоваться. Его назначение — позволить платам расширения, подключаемым к 3-вольтовым модификациям Arduino, таким как Arduino Due, определять напряжение, на котором работает плата, и адаптироваться к нему.

Следующий контакт — Reset. Он служит той же цели, что и кнопка сброса. По аналогии с перезагрузкой компьютера контакт Reset позволяет сбросить микроконтроллер в исходное состояние и заставить его выполнять программу с самого начала. Чтобы сбросить микроконтроллер с помощью этого контакта, необходимо кратковременно подать на него низкое напряжение (замкнуть на «землю»). Маловероятно, что вам когда-нибудь потребуется этот контакт, но знать о его существовании полезно.

Остальные контакты в этой группе служат для вывода электропитания с разными уровнями напряжения (3.3V, 5V, GND и 9V) в соответствии с обозначениями. GND, или ground («земля»), означает 0 В. Контакты GND служат опорными точками, относительно которых измеряется напряжение во всех других точках на плате.

Два контакта GND совершенно идентичны, наличие двух контактов GND иногда оказывается полезно. В действительности в верхнем ряду на плате есть еще один контакт GND.


Аналоговые входы

Контакты в следующей группе подписаны Analog In (аналоговые входы) с номерами от 0 до 5. Эти шесть контактов можно использовать для измерения напряжения и его анализа в скетче. Несмотря на то что они обозначены как аналоговые входы, их можно использовать и как цифровые входы или выходы. Но по умолчанию они действуют как аналоговые входы.


Цифровые входы

Теперь перейдем к верхнему ряду контактов (см. рис. 1.8) и начнем движение справа налево. Здесь находятся контакты, обозначенные Digital 0...13. Их можно использовать как цифровые входы или выходы. Если включить такой контакт из скетча, на нем появится напряжение 5 В, а если выключить — напряжение упадет до 0 В. Подобно контактам электропитания, их следует использовать осторожно, чтобы не превысить максимально допустимый ток.

Цифровые выходы могут отдавать ток до 40 мА с напряжением 5 В — этого более чем достаточно для питания светодиода, но недостаточно для непосредственного управления электромотором.


Платы Arduino

Модель Arduino Uno (см. рис. 1.1) является последней версией оригинальной платы Arduino. Это самая распространенная модель Arduino, и обычно, когда кто-то говорит, что использует Arduino, подразумевается именно эта модель.

Все остальные модели плат Arduino сконструированы для удовлетворения особых потребностей, таких как большая величина тока на входных и выходных контактах, более высокая производительность, меньший размер, возможность вшивания в элементы одежды и подключения телефонов на Android, простота подключения к беспроводным сетям и т.д.

Независимо от конструктивных особенностей, все платы программируются из Arduino IDE, немного различаясь лишь некоторыми особенностями программного обеспечения, которое они могут использовать. Поэтому, узнав, как использовать одну плату Arduino, вы сможете применять полученные знания для работы с другими моделями.

Давайте рассмотрим спектр официальных версий платы Arduino. Существуют разные модели Arduino, отличные от обсуждаемых в этой книге, но они не так популярны. Полный их перечень можно найти на официальном веб-сайте Arduino (www.arduino.cc).


Uno и похожие модели

Модель Uno R3 является последней в серии стандартных плат, включающей также модели Uno, Duemilanove, Diecimila и NG. Все эти платы построены на основе микропроцессоров ATmega168 и ATmega328, которые различаются только объемом памяти.

Другой современной моделью Arduino того же размера и с тем же набором контактов, что и Uno R3, является Arduino Leonardo (рис. 1.9). Как видите, эта плата содержит меньше электронных компонентов, чем Uno. Это объясняется использованием другого процессора. Плата Leonardo сконструирована на основе процессора ATmega32u4, схожего с ATmega328, но имеющего встроенный интерфейс USB, благодаря чему отпала необходимость в дополнительных компонентах, которые можно увидеть на плате Uno. Кроме того, модель Leonardo имеет немного больше памяти, больше аналоговых входов и обладает некоторыми другими преимуществами. Она также немного дешевле Uno. Во многих отношениях она имеет также более удачную конструкцию, чем Uno.

Рис. 1.9. Arduino Leonardo

Но если все перечисленное верно, возникает резонный вопрос: почему Leonardo не пользуется большей популярностью, чем Uno? Причина в том, что усовершенствования, внесенные в плату Leonardo, ухудшили обратную совместимость с Uno и другими предшествующими моделями. Некоторые платы расширения, особенно старой конструкции, не будут работать с Leonardo. Со временем эти отличия станут доставлять все меньше хлопот, и будет интересно посмотреть, смогут ли модель Leonardo и ее последующие версии завоевать наибольшую популярность.

Относительно недавно в арсенале Arduino появилась плата Arduino Ethernet. Она объединяет основные характеристики Uno с интерфейсом Ethernet, позволяющим подключаться к сети без использования дополнительной платы расширения Ethernet.


Большие платы Arduino

Иногда количества контактов ввода/вывода на платах Uno и Leonardo оказывается недостаточно для решения поставленных задач. В таких ситуациях вы оказываетесь перед выбором между приобретением дополнительных плат расширения для Uno или переходом на использование плат большего размера.


СОВЕТ

Если вы только начинаете знакомиться с Arduino, воздержитесь от покупки большой платы. Они выглядят привлекательно, обладая большим числом контактов и большим быстродействием, но имеют проблемы совместимости с платами расширения. Пока вам лучше остановить свой выбор на стандартной модели Uno.

Модели Arduino большего размера имеют тот же набор контактов, что и Uno, а также двойной ряд дополнительных контактов ввода/вывода с торцевой стороны и более длинные ряды контактов по боковым сторонам (рис. 1.10).

Рис. 1.10. Arduino Due

Традиционно самой большой считается Arduino Mega 2560. Эти платы, подобно всем другим большим платам Arduino, имеют больше памяти каждого вида. Платы Mega 2560 и Mega ADK комплектуются процессорами с производительностью, схожей с производительностью процессора в модели Arduino Uno. Но в целом Arduino Due — более «мощная машина». Эта плата комплектуется процессором с тактовой частотой 84 МГц (сравните с 16 МГц модели Uno), но имеет проблемы совместимости с другими моделями. Самая большая из них состоит в том, что для электропитания Due должно использоваться напряжение 3,3 В вместо 5 В, как для большинства предыдущих моделей Arduino. Неудивительно, что многие платы расширения несовместимы с ней.

Однако эта плата имеет множество преимуществ, значимых для большинства проектов с высокими требованиями:

• большой объем памяти для программ и данных;

• аппаратная поддержка вывода звуков (аппаратные цифроаналоговые преобразователи);

• четыре последовательных порта;

• два порта USB;

• интерфейсы USB-хоста и USB OTG;

• имитация USB-клавиатуры и USB-мыши.


Маленькие платы Arduino

Для одних проектов модель Uno может оказаться слишком маленькой, но для других — слишком большой. Несмотря на невысокую стоимость плат Arduino, они становятся слишком дорогим удовольствием, если включать их в каждый проект. Существует целый спектр маленьких и специализированных плат Arduino, которые имеют меньший размер, чем обычная модель Uno, или более низкую цену за счет отсутствия каких-то особенностей, не требующихся в большинстве проектов.

На рис. 1.11 изображена плата Arduino Mini. Эта модель не имеет интерфейса USB, а ее программирование осуществляется с применением отдельного модуля расширения. Помимо Mini существуют также модели Nano и Micro. Обе они имеют встроенный интерфейс USB, но и стоят дороже.

Рис. 1.11. Arduino Mini и Arduino Programmer


Платы LilyPad и LilyPad USB

Плата LilyPad и более новая ее версия LilyPad USB — одни из самых интересных моделей Arduino (рис. 1.12). Эти платы можно вшивать в элементы одежды и соединять их токопроводящими нитями со светодиодами, выключателями, акселерометрами и другими устройствами. Для программирования более старых плат LilyPad требуется использовать отдельный интерфейс USB, как в случае с Arduino Mini. Однако эти платы постепенно вытесняются более новой модификацией Arduino LilyPad USB, имеющей встроенный разъем USB.

Рис. 1.12. Arduino LilyPad


Неофициальные платы Arduino

Благодаря статусу открытого аппаратного обеспечения помимо «официальных» плат, описанных ранее, появилось множество неофициальных копий и модификаций Arduino. Прямые клоны Arduino, которые без труда можно найти на eBay и других недорогих торговых площадках, являются простыми копиями плат Arduino. Единственное их преимущество — невысокая цена. Но существует также ряд интересных Arduino-совместимых разработок, предлагающих дополнительные возможности.

В числе примеров такого рода плат, которым стоит уделить внимание, можно назвать:

• EtherTen — аналог платы Arduino Ethernet (www.freetronics.com/products/etherten);

• Leostick A — малогабаритный аналог платы Leonardo со встроенным разъемом USB (www.freetronics.com/collections/arduino/products/leostick).

Теперь, после знакомства с аппаратной стороной Arduino, можно перейти к знакомству с возможностями их программирования.


Язык программирования

Многие ошибочно полагают, что платы Arduino имеют собственный язык программирования. В действительности программы для них пишутся на языке с простым названием C. Этот язык существует с самых первых дней развития вычислительной техники. А вот что действительно привносит Arduino — это набор простых в использовании команд, написанных на C, которые вы можете использовать в своих программах.

Пуристы могут заметить, что в Arduino используется C++, объектно-ориентированное расширение языка C. Строго говоря, они правы, однако наличие всего 1–2 Кбайт памяти обычно означает, что использование объектно-ориентированных приемов при программировании для Arduino не самая лучшая идея, за исключением особых ситуаций, и фактически программы пишутся на C.

Начнем с изменения скетча Blink.


Изменение скетча Blink

Может так случиться, что при первом включении ваша плата Arduino уже мигает светодиодом. Это объясняется тем, что платы Arduino часто поставляются с установленным скетчем Blink.

Если у вас именно такая плата, вам может понравиться предложение изменить частоту мигания, чтобы убедиться, что вы можете сделать что-то своими руками. Давайте рассмотрим скетч Blink, чтобы понять, какие изменения следует внести, чтобы заставить светодиод мигать чаще.

Первая часть скетча — это комментарий, описывающий назначение скетча. Комментарий не является программным кодом. В процессе подготовки кода к выгрузке все такие комментарии удаляются. Все, что находится между парами символов /* и */, игнорируется компьютером и адресовано людям.

/*

  Blink

  Включает светодиод на одну секунду, затем выключает на одну секунду, и так много раз.

  Этот пример кода находится в свободном доступе.

*/

Далее идут два однострочных комментария. Они похожи на блочные комментарии, но в отличие от них начинаются с пары символов //. Эти комментарии описывают происходящее. В данном случае комментарий сообщает вам, что контакт с номером 13 — это тот самый контакт, которым мы собираемся управлять. Мы выбрали этот контакт, потому что на плате Arduino Uno он подключен к светодиоду L.

// На большинстве плат Arduino к контакту 13 подключен светодиод.

// Дадим ему имя:

int led = 13;

Следующая часть скетча — функция setup. Эта функция должна присутствовать в каждом скетче, и она выполняется всякий раз, когда происходит сброс платы Arduino, либо в результате (как сообщает комментарий) нажатия на кнопку сброса Reset, либо после подачи электропитания на плату.

// процедура setup выполняется один раз после нажатия на кнопку сброса

void setup(){

  // инициализировать контакт как цифровой выход

  pinMode(led, OUTPUT);

}

Структура этого текста может показаться немного странной тем, кто только начинает изучать программирование. Функция — это фрагмент программного кода, имеющий собственное имя (в данном случае setup). Пока просто используйте предыдущий текст как шаблон и помните, что скетч должен начинаться строкой void setup() {, за которой следуют необходимые команды, каждая в отдельной строке, завершающиеся точкой с запятой (;). Конец функции отмечается символом }.

В данном случае Arduino выполнит единственную команду pinMode(led, OUTPUT), которая настраивает контакт на работу в режиме выхода.

Далее следует основная часть скетча, функция loop.

По аналогии с функцией setup каждый скетч должен иметь функцию loop. Но в отличие от функции setup, которая выполняется только один раз после сброса, loop выполняется снова и снова. То есть как только будут выполнены все ее инструкции, она тут же запускается снова.

Функция loop включает светодиод, выполняя инструкцию digitalWrite(led, HIGH). Затем выполняется команда delay(1000), приостанавливающая скетч на 1 с. Значение 1000 здесь обозначает 1000 мс, или 1 с. После этого светодиод выключается, скетч приостанавливается еще на 1 с, и процесс повторяется.

// Процедура loop выполняется снова и снова, до бесконечности

void loop() {

  digitalWrite(led, HIGH);  // включить светодиод (HIGH — уровень напряжения)

  delay(1000);              // ждать 1 с

  digitalWrite(led, LOW);   // выключить светодиод, установив уровень напряжения LOW

  delay(1000);              // ждать 1 с

}

Чтобы увеличить частоту мигания светодиода, заменим оба числа 1000 числом 200. Обе замены должны быть произведены в функции loop, поэтому теперь она должна выглядеть так:

void loop() {

  digitalWrite(led, HIGH);  // включить светодиод (HIGH — уровень напряжения)

  delay(200);               // ждать 1 с

  digitalWrite(led, LOW);   // выключить светодиод, установив уровень напряжения LOW

  delay(200);               // ждать 1 с

}

Если попытаться сохранить скетч перед выгрузкой, Arduino IDE напомнит, что этот скетч является примером и доступен только для чтения, но предложит сохранить копию, которую вы затем сможете изменять по своему усмотрению.

Однако сейчас этого делать не нужно — просто выгрузите скетч в плату, не сохраняя его. Если сохранить этот или другой скетч, вы увидите, что он появится в меню File—>Sketchbook (Файл—>Папка со скетчами) Arduino IDE.

Итак, щелкните на кнопке Upload (Загрузка) еще раз, и, когда выгрузка завершится, плата Arduino сама сбросится и светодиод должен начать мигать чаще.


Переменные

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

При объявлении переменной в языке C необходимо указать ее тип. Например, если нужна переменная, хранящая целое число, ее следует объявить с типом int (сокращенно от integer — целое со знаком). Чтобы определить переменную с именем delayPeriod и значением 200, нужно записать такое объявление:

int delayPeriod = 200;

Так как delayPeriod — это имя, в нем не может быть пробелов. По общепринятым соглашениям имена переменных должны начинаться с буквы в нижнем регистре, а каждое новое слово в имени — с буквы в верхнем регистре. Такую «горбатую» форму записи имен программисты часто называют верблюжьей нотацией (camel case).

Давайте добавим эту переменную в скетч Blink, чтобы вместо жестко зашитого значения 200, определяющего продолжительность паузы, можно было использовать имя переменной:

int led = 13;

int delayPeriod = 200;

void setup() {

  pinMode(led, OUTPUT);

}

void loop() {

  digitalWrite(led, HIGH);

  delay(delayPeriod);

  digitalWrite(led, LOW);

  delay(delayPeriod);

}

Везде в скетче, где прежде использовалось число 200, сейчас стоит ссылка на переменную delayPeriod.

Если теперь вы пожелаете заставить светодиод мигать еще чаще, достаточно будет изменить значение delayPeriod в одном месте.


If

Обычно строки программы выполняются по порядку, одна за другой, без исключений. Но как быть, если потребуется изменить порядок выполнения? Что если какая-то часть скетча должна выполняться только при определенном условии?

Хорошим примером может служить выполнение фрагмента, только когда нажата кнопка, подключенная к плате Arduino. Такой код мог бы выглядеть примерно так:

void setup()

{

  pinMode(5, INPUT_PULLUP);

  pinMode(9, OUTPUT);

}

void loop()

{

  if (digitalRead(5) == LOW)

  {

    digitalWrite(9, HIGH);

  }

}

В этом случае условие (после оператора if) выполняется, если с контакта 5 прочитано значение LOW. Два знака «равно» == обозначают операцию определения равенства двух значений. Ее легко спутать с единственным знаком «равно», обозначающим операцию присваивания значения переменной. Оператор if говорит: если условие истинно (то есть выполняется), то должны быть выполнены команды в фигурных скобках. В данном случае команда, устанавливающая уровень напряжения HIGH на цифровом выходе 9.

Если условие ложно (не выполняется), то Arduino просто перешагнет через фигурные скобки и продолжит выполнение программы. В данном случае будет достигнут конец функции loop, и она запустится снова.


Циклы ...




Все права на текст принадлежат автору: Монк С .
Это короткий фрагмент для ознакомления с книгой.
Программируем ArduinoМонк С