Среда программирования и практика построения схем



 

 

– Но для путешествия в Лондон нужны деньги, – заметил Портос, – а у меня их нет.

– У меня тоже.

– И у меня.

– У меня они есть, – сказал д'Артаньян, вытаскивая из кармана свой клад и бросая его на стол.

А. Дюма. Три мушкетера

 

 

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

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

Но не следует думать, что таким способом можно овладеть всеми тонкостями ремесла. Как грамотному фотографу по‑прежнему необходимо знание многих теоретических нюансов из области теории цвета и оптики (а необходимость освоения основ химии ему теперь заменили основы компьютерных наук), так и любителю Arduino, если он не хочет ограничиваться повторением чужих схем неизвестного качества, а создавать и совершенствовать что‑то свое, придется изучать контроллеры «изнутри». Именно поэтому я подчеркивал в главе 19 , что если вы желаете овладеть микроэлектроникой по‑настоящему, то начинать следует с программирования простых конструкций на ассемблере, а не на языке С и, тем более, не в среде Arduino. Переход к языкам высокого уровня целесообразен тогда, когда вы понимаете, что именно происходит в контроллере, и в случае надобности можете управлять этим процессом.

Это мое убеждение, однако, не исключает того факта, что в качестве элементарного введения в предмет Arduino подойдет очень неплохо. О недостатках этой платформы мы еще поговорим в самом конце, а в оставшихся главах книги покажем, как с минимальной затратой сил можно с помощью Arduino делать настоящие электронные приборы, которые будут работать лучше покупных, иметь больше функций и обойдутся при этом, как минимум, не дороже тех, что имеются на прилавках. При этом ограниченный объем книги не позволяет мне остановиться на многих интересных темах: например, совсем несложно пристегнуть к Arduino модуль GPS и построить свой собственный навигатор, превратить Arduino в универсальный пульт управления бытовой техникой и даже создать на его основе автономный веб‑сервер. По необходимости мы также оставим в стороне работу в Arduino со звуком и одно из главных направлений применения этой платформы в области конструирования роботов. Хочу еще обратить ваше внимание на открытый проект Accessory Development Kit компании Google – он позволяет устройствам на Android обеспечивать двусторонний обмен данными с Arduino через USB или Bluetooth. Здесь же мы сосредоточимся на измерительной технике, вопросах взаимодействия с компьютером и выводе информации на дисплей, что даст хорошее и обстоятельное введение в платформу и позволит конструировать практически полезные вещи.

Большинство упоминаемых в этих главах комплектующих можно приобрести в интернет‑магазине «Амперка» (http://amperka.ru), сотрудники которого оказали автору неоценимую помощь в написании этого раздела книги. Администрация магазина просила сообщить, что читатели этой книги могут в «Амперке» получить скидку 5 % при использовании кодового слова ZELECTRONIKA (его надо назвать по телефону или указать в тексте письма при обращении в магазин). Советую также заглянуть в их вики‑раздел [24], где собрано большое количество сведений о применении различных компонентов Arduino.

 

 

Что такое Arduino ?

Платформа Arduino возникла в среде сотрудников Interaction Design Institute (что можно перевести, как «Институт конструирования взаимодействий»), находящегося в итальянском городке Ивреа, и получила свое почти толкиеновское название от имени реально существовавшего короля Ардуина, правившего этой местностью в начале прошлого тысячелетия. Arduino выросла из задачи научить студентов непрофильных специальностей создавать электронные устройства, причем быстро и, желательно, без опоры на углубленное изучение электроники, электротехники и программирования.

В конце концов группа, руководимая программистом Массимо Банци, создала универсальную аппаратную платформу на основе дешевых и доступных микроконтроллеров Atmel AVR , и решила ее распространять на принципах open source . Такие свободные лицензии, как знаменитая GPL, разработанная применительно к софту, для «железа» напрямую не годится, потому создатели взяли за основу пакет лицензий Creative Commons для творческих продуктов. Лицензия Arduino запрещает использование этой торговой марки для каких‑то сторонних продуктов, кроме расширений основного проекта. Это привело к тому, что от Arduino стали отпочковываться аналогичные проекты, совместимые с ним, но желающие иметь иные названия – например, такие, как Freeduino, Craftduino, Carduino и многие другие.

Сама компания, носящая название Smart Projects, основанная в 2004 году, выпускает лишь платы контроллеров Arduino. В мире насчитывается более двухсот дистрибьюторов продукции Arduino, включая довольно крупные торговые фирмы. Контроллеров Arduino создано уже около 15 версий, причем некоторые из последних – на 32‑разрядных AVR или даже на ARM‑процессорах. Плата контроллера стоит приблизительно 30 долларов, или может быть изготовлена самостоятельно – документация доступна всем желающим (см. [23]). Бесплатно распространяется и среда программирования, основанная на адаптированной под непрофессионалов версии C/C++ под названием Processing . При желании платы Arduino можно программировать и напрямую на низком уровне или из других сред программирования, т. е. так, как описано в предыдущих главах этой книги, – на каждой из плат Arduino предусмотрен для этой цели ISP‑разъем.

В основе платформы лежат несколько типовых плат‑модулей, в современной версии большей частью построенных на контроллере ATmega328. Этот контроллер имеет 32 килобайта памяти программ, чего достаточно для загрузки даже столь объемных загрузочных файлов, какие получаются при компилировании в среде Arduino IDE. Подробно описывать базовые модули Arduino здесь нет особого смысла – с ними можно познакомиться на официальном сайте [23]. Они в целом соответствуют структуре типового AVR, описанной в главе 18 , но дополнительно содержат стабилизаторы питания, несколько светодиодов и других компонентов, и, главное – встроенный загрузчик с преобразователем USB/UART, позволяющим и программировать контроллер через последовательный порт, и организовать «общение» программы с компьютером.

Для этой цели в контроллер на платах Arduino заранее записывается программа‑загрузчик. Если вы будете программировать Arduino напрямую, через обычный ISP‑программатор, то загрузчик, естественно, окажется испорченным. Однако его всегда можно восстановить с помощью среды Arduino IDE, потому любые эксперименты не приведут к фатальным последствиям. С другой стороны, на некоторых платах Arduino контроллер установлен на панельку, что позволяет применять плату совместно со средой программирования, как удобный программатор для МК AVR, которые потом можно устанавливать в другие схемы. Мы в основном воспользуемся одним из самых популярных модулей под названием Arduino Uno, а в главе 22 познакомимся с малогабаритным Arduino Mini.

Для начала работы необходимо установить и настроить среду Arduino IDE, чем мы сейчас и займемся.

 

 

Установка среды программирования Arduino

Среда программирования Arduino или Arduino IDE (Integrated Development Environment , интегрированная среда разработки) отличается от других подобных продуктов простотой и компактностью. Установки фактически не требуется – просто скачайте ZIP‑архив с официального сайта и распакуйте его на компьютере в любую папку, учитывая при этом, что размещать среду предпочтительно не в привычной Program Files (или в Program Files (x86) для 64‑разрядных Windows), а в отдельном каталоге вне системных папок – иначе придется возиться с правами доступа (см. далее).

Если качать архив не с официальной англоязычной страницы, на которую обычно ссылаются в руководствах (http://www.arduino.cc/en/Main/Software), а с русской версии сайта [23], то вы получите среду сразу на русском языке (правда, возможно, не самой последней версии). Затем для удобства можно вынести на рабочий стол ярлык файла arduino.exe, и на этом основная часть установки завершена.

Однако в Windows придется выполнить еще один шаг – установить драйвер arduino, чтобы Arduino IDE «видела» устройство. Проще всего это сделать, уже имея плату Arduino в наличии. Ранее для каждой разновидности плат имелся свой драйвер (и существующее на момент создания этой главы описание на русскоязычной странице http://arduino.ru/Guide/Windows рассчитано на такой случай), но в последних версиях он заменен на универсальный arduino.inf. Этот драйвер находится в каталоге Drivers внутри скачанной вами папки с программным обеспечением (будьте внимательны: именно в папке Drivers, а не в подпапке FTDI USB Drivers).

Для установки драйвера подсоедините любую имеющуюся плату Arduino к порту USB компьютера, для чего потребуется обычный АВ‑кабель USB (подключать плату дополнительно к источнику питания не надо). На плате должен при этом загореться зеленый светодиод ON . Если у вас Windows настроена на автоматическую установку драйверов, то сразу начнется поиск драйверов, который, естественно, закончится впустую (его можно сразу прервать, чтобы не терять времени). В Диспетчере устройств (Панель управления | Диспетчер устройств ) в разделе Порты (СОМ и LPT) появится название платы – например, Arduino UNO (COMxx:) .

Может так случиться, что этого названия не появится, а вместо него в общем списке возникнет Неизвестное устройство (Windows, особенно в последних версиях, – типичная вещь в себе, и часто ведет себя совершенно не так, как вы от нее ожидаете). В обоих случаях драйвер для этого устройства можно установить двумя путями: или прямо из Диспетчера устройств через пункт контекстного меню Обновить драйвер, или через апплет Панель управления | Устройства и принтеры , где должно возникнуть это самое Неизвестное устройство . Установка тогда делается через контекстное меню: Свойства | Оборудование | Свойства | Драйвер | Обновить . После этого выберите ручной поиск драйверов и укажите упомянутую ранее папку Drivers . В Диспетчере устройств и в окне Устройства и принтеры после этого возникнет соответствующее устройство с указанием номера привязанного к нему виртуального СОМ‑порта – например, Arduino Uno (COM3 ).

На рис. 21.1 показано окно Arduino IDE после компилирования демонстрационного примера из коллекции сайта «Амперки», представляющего собой вывод на русифицированный строчный ЖК‑дисплей традиционного «Здравствуй, мир!». Для компиляции с» целью проверки загруженного текста надо выбрать пункт меню Скетч | Проверить/Компилировать (или нажать сочетание клавиш <Ctrl>+<R>), a для его загрузки – пункт Файл | Загрузить (или нажать сочетание клавиш <Ctrl>+<U>). Перед загрузкой файл компилируется заново, потому проверенные программы можно не компилировать отдельно.

 

 

Рис. 21.1.  Главное окно Arduino IDE  

 

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

А вот скомпилированный hex‑файл, если он вдруг вам понадобится (его можно ведь загружать обычным программатором, без среды Arduino), придется поискать. Результаты деятельности Arduino IDE размещаются в недрах папки Пользователи\<имя пользователя>\АррDatа\Lосаl\Теmр (не путайте AppData с системной Application Data, куда вас, скорее всего, не пустят). Там вы найдете кучу папок с расширением tmp , название которых начинается с build (например, build290388496895462656.tmp) – внутри одной из них и находится искомый hex‑файл, имя которого должно совпадать с именем файла программы.

Скриншот окна Arduino IDE на рис. 21.1 хорошо иллюстрирует главный недостаток программирования микроконтроллеров на высокоуровневом языке, таком, как Processing, – программа, содержащая всего два десятка строк, в памяти контроллера займет почти 3 килобайта (см. сообщение внизу). И хотя к этим двум десяткам следовало бы причислить еще пару‑тройку сотен строк библиотеки LiquidCrystal (см. на скриншоте первую строку скетча[39]), все равно для такой простой программы это очень много – почти полторы тысячи команд AVR‑контроллера, которые уже не влезут в память, например, знакомого нам ATtiny2313. Аналогичная программа на «голом» AVR‑ассемблере заняла бы от силы пару сотен операторов и спокойно влезла бы в любой контроллер, имеющий достаточное количество выводов для управления строчным дисплеем. Такова цена за удобство и скорость разработки – написание и отладка подобной программы на ассемблере у опытного программиста запросто может занять целый день, а в среде Arduino даже неопытный любитель создаст ее с нуля от силы за час, который в основном потребуется для макетирования схемы с целью проверки функционирования.

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

Среда Arduino сама не найдет устройство. Даже если оно подключено, но по каким‑то причинам связь с компьютером нарушена, то при попытке загрузки программы возникнет сообщение об ошибке (красная надпись внизу):

avrdude: stk500_getsync(): not in sync: resp=0x00

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

Чтобы этого красного сообщения не возникало, следует после установки драйвера и первого запуска arduino.exe сразу установить нужный СОМ‑порт через меню Сервис | Последовательный порт . Тогда в нижнем левом углу окна программы появится надпись, соответствующая типу платы и подключенному порту. Если подключенная плата не определяется автоматически или определяется неверно (это может быть, например, при подключении через отдельный адаптер таких плат, как Arduino Mini, не имеющих встроенного USB‑порта), то тип платы придется выбрать отдельно через меню Сервис | Плата .

В процессе отладки коммуникационных функций по последовательному порту вам понадобится отключать и включать устройство Arduino. Если вы используете стороннюю коммуникационную программу (как чаще всего и бывает, см. далее), и забудете ее закрыть перед программированием, то порт может оказаться недоступным для Arduino IDE. Прежде всего закройте коммуникационную программу и попробуйте загрузить программу в плату заново – скорее всего, дело только в этом. Но при многих включениях и отключениях платы Arduino драйвер может окончательно запутаться, в результате чего последовательный порт окажется недоступен и в среде Arduino, и в сторонних коммуникационных утилитах. Чтобы восстановить работоспособность порта, необязательно перезагружать компьютер. Найдите устройство Arduino в Диспетчере устройств и в контекстном меню разыщите пункт Отключить . Отключите устройство, и сразу же включите опять (в Windows 7 и 8 пункт меню будет называться Задействовать ). После этого порт должен заработать, как надо.

 

 

Настройки Arduino IDE

После загрузки драйвера первым делом проверьте пункт Файл | Настройки (File | Preferences для англоязычной версии). Там вы можете поменять язык самой программы (и, кстати, также и язык сообщений об ошибках), отказаться от проверки наличия обновлений (иначе при каждом запуске будете получать назойливые предложения сменить русскую версию на последнюю английскую), и, главное, поменять размещение текстов ваших программ (скетчей), заданное по умолчанию.

Во всех последних версиях Windows подобные среды программирования предлагают разместить папку с проектами где‑нибудь в недрах папки Users (Пользователи). Способ неудобный (проще хранить среду и привязанные к ней документы в одном каталоге) и опасный (потому что потерять пользовательские папки при переустановке системы – как два байта переслать), но вынужденный – по умолчанию писать в системный каталог Program Files пользовательским программам во всех версиях Windows после ХР запрещено. Поэтому я и рекомендовал не распаковывать среду в системный каталог – если вы захотите создать в нем пользовательскую папку с проектами, то для нее придется долго и мучительно возиться с правами доступа. А если он размещен отдельно, то просто создайте внутри папки, содержащей arduino.exe , каталог, с названием, например, Projects, и укажите его в самом первом пункте настроек через кнопку Выбрать .

Много разнообразных настроек доступны через файл preferences.txt (его размещение указано внизу окна настроек). Так, обладателям большого монитора размер окна Arduino IDE по умолчанию покажется мелковатым, а запоминать размер среда почему‑то не умеет (ах, если бы это было самым крупным ее недостатком!). Для изменения этого параметра следует отредактировать в файле preferences.txt строки editor.window.height.default И editor.window.width.default (установив, например, 1000 и 800, соответственно). Только не забудьте, что перед внесением изменений в preferences.txt следует создать его резервную копию.

 

 

Программы для Arduino

Программы для Arduino (скетчи) пишутся на варианте языка Processing/Wiring, специально разработанном для этой среды. Как и многие другие языки, он основан на языке C/C++, потому в случае затруднений в правилах синтаксиса можете смело обращаться к любому сетевому справочнику по функциям этих популярных языков. В среде Arduino работает большинство стандартных функций языка С, так что проблема будет не в том, чтобы найти способ осуществления какого‑либо действия (такого, как извлечение корня или преобразование числа в строку и наоборот), а в том, чтобы выбрать подходящий способ из всего многообразия, которым почему‑то так гордятся приверженцы этого языка.

Справку по большинству функций языка С можно найти в соответствующем разделе классического учебника Герберта Шилдта [25]. Основные приемы выполнения арифметических и логических операций на языке С неплохо изложены в книге [26]. Что же касается функций, специфических для Arduino, то они изложены в разделе Программирование официального сайта Arduino, в том числе на русском языке [23].

Если вы с языком С до сих пор не знакомы, то учтите, что логики и стройности в нем немного, зато очень много лишнего и непонятного. Не унывайте – чтобы овладеть Arduino, изучать язык досконально не требуется, Processing и был придуман для тех, кто не хочет углубляться в программирование. Нам сейчас будет достаточно следующих элементарных сведений.

Любая программа в среде Arduino состоит из трех основных блоков: блока определений, функции установок и бесконечного цикла, который и составляет собственно программу. Эти блоки полностью аналогичны структуре нашей ассемблерной программы (см. главу 19 , где с блока определений начиналась программа, функция установок у нас следовала за меткой Reset , а бесконечный цикл заключал текст, который выполняется вне прерываний (у нас – то, что между меткой Cykle : и оператором rjmp Cykle ). Явное использование прерываний в программах Arduino – скорее исключение, что относится к числу недостатков этой платформы (и мы еще будем об этом говорить).

* * *

 

Подробности

Но было бы ошибкой считать, что прерывания в Arduino не используются вовсе. Например, в Arduino отсчет времени реализован совершенно так же, как мы делали в главе 19 , только не с помощью Time1, как у нас, а через восьмиразрядный Timer0. Здесь тоже устанавливается прерывание таймера по переполнению и тоже с коэффициентом предделителя 64. При обычной тактовой частоте Arduino, равной 16 МГц, прерывания переполнения восьмиразрядного таймера происходят каждые (64/16)·256 = 1024 микросекунды, что позволяет реализовать такие функции, как millis () или delay () . Самый частый отсчет возможен при таком коэффициенте каждые 4 микросекунды, что обуславливает приведенное в справочнике по функциям Arduino максимальное разрешение функции отсчета микросекунд micros () . Любопытно, что задержка в микросекундах (т. е. функция delayMicroseconds () ) при этом реализована в виде простой программной задержки, как мы делали в первом примере главы 19 . Функции коммуникационного порта, кстати, также основаны на прерываниях (см. далее).

 

* * *

Блок определений содержит обычные для почти любого языка программирования ссылки на включаемые библиотеки и определения переменных, например:

 

#include <LiquidCrystal.h> //подключаем библиотеку для работы со строчным ЖК‑индикатором

int i; //переменная i – 16‑разрядный счетчик

byte temp = 0; //рабочая переменная типа byte

float temperature; //переменная – действительное число для значения температуры

 

Определение наименований выводов, как констант:

 

#define dataPin 16 //dataPin – цифровой вывод 16[40] (т. е. вывод А2 платы, см. далее)

 

Выводы можно определять и как переменные целого типа:

 

int ledPin =3; // цифровой выход управления светодиодом

 

Строчные и заглавные буквы здесь различаются, например, string () и String () – это разные функции (см. справочник по языку на сайте [23]). В языке С любые определения можно делать в любом месте программы, выносить их в начало необязательно. Только стоит учесть, что, например, вызов переменной, определенной внутри некоей функции (локальная переменная), в другой функции вызовет сообщение об ошибке. Для того чтобы переменная действовала для всей программы, она должна быть определена именно в начале, до всех функций (глобальная переменная). Нюанс заключается в том, что глобальная переменная займет ресурсы контроллера на все время работы программы, тогда как локальная освободит их по окончании действия функции. В условиях ограниченных ресурсов МК это может оказаться существенным фактором, влияющим на скорость выполнения программы.

Наша процедура Reset (блок установок) здесь выглядит, как функция setup :

 

void setup()

{

< операторы >

}

 

Следует заметить, что в языке С служебное слово void («пустота») обозначает, что за ним последует то, что в человеческом языке носит название «процедура» – т. е. функция, не возвращающая никакого значения. Между фигурными скобками здесь размещаются те операторы, которые должны выполняться при запуске программы один раз. После setup обычно идет функция (на самом деле тоже процедура) бесконечного цикла, которая обозначается словом loop («петля»):

 

void loop()

{

< операторы >

}

 

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

В заключение нашего суперкраткого обзора программирования для Arduino стоит напомнить про некоторые особенности логических операций в языке С, которые почти не играют роли в обычном программировании, но в приложении к микроконтроллерам имеют важное значение. Это касается выполнения базовых логических функций «И», «ИЛИ» и «НЕ» о которых мы упоминали в главе 14 (см. также [25]).

В языке С имеются две разновидности логических операций: обычные («логическое И» &&, «логическое ИЛИ» ||, «логическое НЕ»!) и поразрядные битовые («поразрядное И» &, «поразрядное ИЛИ» |, «поразрядное НЕ» ~). Теперь вы можете с полным пониманием отнестись к этому разделению: обычные логические операции относятся к булевым переменным (т. е. таким, которые принимают только два значения: «ноль»/«не ноль», «ложь»/«правда»), а поразрядные – к числовым переменным, т. е. попросту к нашим родным регистрам контроллера.

В условных операторах (if ) должна присутствовать чисто логическая операция с бинарным исходом («правда» – «ложь»), потому там надо ставить символы логических операций, а вот в операциях с числами и регистрами – поразрядных. Например, значок неравенства в языке С запишется, как «!=» (буквально и значит «не равно»), а запись «~=» будет бессмысленной. Но одинарные символы (& вместо положенного && или | вместо положенного ||) все равно часто ставят в условном операторе if , потому что там обычно фигурируют бинарные операции, вроде операций сравнения («больше», «меньше», «равно», «не равно» и т. п.), которые сами по себе в результате дают логическое значение. То есть они фактически состоят из одного двоичного разряда, и применение к ним побитовой операции даст ровно тот же результат, что и обычной логической.

 

 

Термостат на Arduino

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

Мы уже упоминали (см. главу 18 ), что в состав AVR‑контроллеров входит 10‑разрядный многоканальный АЦП. На платах Arduino его выводы специально помечены, как аналоговые входы (буквой А с цифрами от нуля до пяти). Заметьте, что они могут быть задействованы и как обычные цифровые с номерами от 14 до 18, и мы в таком качестве ими еще воспользуемся. Один из этих входов мы как раз и применим для измерения температуры, а управлять подключением нагрузки будем с одного из цифровых выходов.

Итого нам понадобятся:

□ плата Arduino Uno (годится и любая другая);

Я термистор в качестве датчика температуры. Подойдет, например, имеющийся

□ «Амперке» В57164‑К 103‑J с номинальным сопротивлением 10 кОм при 25 °C – именно его характеристики приведены в главе 13 в качестве иллюстрации к свойствам термисторов;

□ переменный резистор 10 кОм, постоянный резистор 620 Ом;

□ исполнительное реле – электромагнитное (обязательно с усилительным транзисторным ключом, см. далее) или твердотельное.

В продаже имеются модули на основе 5‑вольтовых электромагнитных реле, специально подогнанных под управление от выходов Arduino. Электромагнитные реле сами по себе требуют довольно большого тока управления (и он тем больше, чем мощнее реле, – непосредственно от логики могут работать только самые маломощные герконовые реле), потому во всех подобных релейных модулях обязательно имеется транзисторный усилительный ключ[41]. Например, в «Амперке» продается такой модуль на основе реле HLS8L‑DC5V‑S‑C. Если вас электромагнитное реле не устраивает, и вы стремитесь к предельной простоте схемы, то можно поискать твердотельные реле – подойдут, например, CX240D5R фирмы Crydom или аналогичные с напряжением срабатывания 3‑15 В. У них ток управления составляет около 15 мА при 5 вольтах на входе, что допустимо для AVR, потому их управляющий вход можно подключать к цифровому выводу Arduino напрямую. Правда, при напряжении 220 вольт коммутировать нагрузку мощностью больше киловатта CX240D5R не может, но нам в данной задаче больше и не требуется.

Схема термостата на Arduino Uno показана на рис. 21.2.

 

 

Рис. 21.2. Схема термостата на Arduino Uno  

 

На схеме обмотка реле К1 (с нормально разомкнутыми контактами) условно присоединяется прямо к цифровому выходу Arduino – подразумевается, что либо это упомянутое ранее твердотельное реле с нужными характеристиками, либо просто управляющий вход готовой платы релейного модуля. Для контроля состояния схемы одновременно с нагревателем срабатывает светодиод. Программа термостата в соответствии с подобной схемой крайне проста:

 

 

Величины резисторов подогнаны под указанный термистор В57164‑К с номинальным сопротивлением 10 кОм при 25 °C (103‑J). В соответствии с программой срабатывание реле будет происходить вблизи значения на выходе АЦП, равного 500. Это составляет примерно середину 10‑разрядного диапазона (вся шкала – 1024 градации), т. е. такое значение установится при приблизительном равенстве верхнего и нижнего сопротивлений относительно входа АО (напряжение на этом входе тогда составит примерно 2,5 вольта).

Обратите внимание, что обе функции if не заканчиваются привычным else . Для предотвращения дребезга в программу введен гистерезис: реле включается при превышении значения кода 510, а выключается при снижении до значения 490. В промежутке оно будет сохранять предыдущее состояние. Двадцать единиц кода (то, что в главе 12 мы называли зоной нечувствительности ) соответствуют примерно 10 милливольтам, т. е. гистерезис при температуре в пределах 30–40 градусов составит чуть меньше одной десятой градуса (проверьте сами с помощью табл. 13.1 из главы 13 ).

Установка температуры срабатывания с помощью резистора R2 при таких параметрах возможна в пределах примерно от 22 до 96 °C. Разумеется, на практике такой широкий диапазон регулировки не требуется, потому целесообразно номинал R2 уменьшить. Величина R1 подбирается так, чтобы R1 и номинальное значение R2 в сумме составляли сопротивление термистора при нижнем значении желаемого диапазона температур (в соответствии с табл. 13.1). Для более точной подгонки можно провести калибровку и изменить пороговые значения в программе, измеряя установившуюся температуру обычным термометром.

Если вы примените в этой схеме другие датчики, то не забудьте про знак температурного коэффициента. Обычный диод или транзистор в диодном включении (как в схемах из главы 13 ) также имеют отрицательный наклон характеристики, потому для них в программе придется поменять только числовые значения порога срабатывания. А вот полупроводниковые датчики типа ТМР35 (см. главу 13 ) или просто металлические термометры сопротивления (как в конструкции из главы 17 ) имеют положительный температурный коэффициент, поэтому условия срабатывания придется изменить на обратные. Причем не просто поменять «больше» на «меньше» и наоборот, а изменить и соотношение порогов для гистерезиса – в новой ситуации нагреватель должен будет включаться, если значение меньше меньшего порога, а выключаться – если больше большего.

Как видите, обращаться с Arduino не просто, а очень просто. Работа с АЦП относится к базовым функциям платформы и не требует даже подключения отдельных библиотек. Оцените, насколько облегчили создатели платформы жизнь разработчику: вызову функции anaiogRead () соответствуют операции установки режима АЦП, тактовой частоты его работы, выбора канала и пр.

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

 

 


Дата добавления: 2019-02-12; просмотров: 226; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!