Какие мк являются основами arduino
Перейти к содержимому

Какие мк являются основами arduino

  • автор:

Знакомство с Arduino

Торжественно открываю новый блог на Хабре, посвящённый Arduino! Блог об универсальном opensource-микроконтроллере Arduino, который будет интересен всем любителям микроэлектроники, самодельных гаджетов и всем, кто не боится взять в руки паяльник.

Внешний вид платы Arduino Diecimila

Arduino представляет собой линейку электронных блоков-плат, которые можно подключать к компьютеру по USB, а в качестве периферии — любые устройства от светодиодов до механизмов радиуоправляемых моделей и роботов. Программы для него пишутся на простом и интуитивно понятном си-подобном языке Wiring (c возможностью подключения сторонних библиотек на C/C++, например, для управления LCD-дисплеями или двигателями), компилируются и загружаются в устройство одной кнопкой, после чего вы тут же получаете работающий автономный гаджет. Никакого ассемблера, никаких лишних проводов и дорогущих деталей и программаторов — чистое творчество, включай и работай!

Применение

После короткого рассказа друзьям и знакомым про Arduino («это типа электронного конструктора, микро-ЭВМ, в который можно загрузить любую программу и получить любое другое устройство») самый часто задаваемый вопрос «А зачем это всё?» или «Какая мне от этого выгода?» Скучные люди, не правда ли? Неужели среди ваших знакомых нет ни одного радиолюбителя, а может вы и сами радиолюбитель?
Применение Arduino очень простое — не забавы ради, а развития мозга для. Интересно же линуксоидам ковыряться в коде ядра? Какая от этого польза? Почему бы вам не заняться «железным» (в противовес «софтовому») творчеством? Вот прямо сейчас рядом со мной сидит коллега-дизайнер и разбирается… с нейронными сетями. В общем что говорить, забыт дух технического творчества, забыты радиокружки и авиамодельные клубы. Все только сидят у своих компьютеров и сделать ничего путного в железе, кроме как воткнуть вилку в розетку, не могут 🙂 Соберите свой веб-сервер, цветомузыкальную установку или прикольного робота!
Сообщество любителей Arduino уже знает об успешных примерах: GPS-трекер с записью на SD-карту, простой аудиоплеер, Twitter-дисплей, электронные игры с дисплеем и тачскрином… Попробуйте купить радиодеталей и сделать что-то своё! Есть даже готовый набор для создания четырёхъядерного Arduino-кластера.

Технические характеристики

Arduino Diecimila представляет собой небольшую электронную плату (далее просто плата) ядром которой является микроконтроллер ATmega168. На плате есть: 14 цифровых входов/выходов, 6 из которых могут работать в режиме ШИМ (PWM) (а следовательно управлять аналоговыми устройствами вроде двигателей и передавать двоичные данные), 6 аналоговых входов (исходной информацией служат не логические 0/1, а значение напряжения), тактовый генератор на 16 МГц, разъёмы питания и USB, ICSP-порт (что-то вроде последовательного интерфейса для цифровых устройств), несколько контрольных светодиодов и кнопка сброса.
Этого вполне достаточно, чтобы подключить плату к USB-порту компьютера, установить нужный софт и начать программировать.

  • Микроконтроллер: ATmega168
  • Рабочее напряжение: 5 В
  • Входное напряжение (рекомендуемое): 7-12 В
  • Входное напряжение (пределы): 6-20 В
  • Цифровые порты ввода/вывода: 14 портов (из них 6 с ШИМ-сигналом)
  • Аналоговые порты ввода: 6 портов
  • Ток для портов: 40 мА
  • Ток для 3.3В источника: 50 мА
  • ППЗУ (Flash Memory): 16 KB (из них 2 Кб используются загрузчиком)
  • ОЗУ (SRAM): 1 Кб
  • ПЗУ (EEPROM): 512 байт
  • Тактовая частота: 16 МГц

Питание
Питание платы осуществляется двумя способами: по кабелю USB (при этом никаких других ухищрений делать не нужно, используется в процессе отладки), либо по специальному разъёму вроде того, что у ноутбуков. В радиомагазине можно купить такой разъём и присоединить к нему аккумулятор или 9-тивольтовую батарейку типа «Крона». Источники питания можно менять перемычкой на плате.

Преимущества и недостатки

  • Цена. В Москве Arduino Diecimila можно купить меньше чем за 1000 руб. При этом вы покупаете законченное (ну почти) устройство, не требующее дополнительного оборудования, такого, как дорогостоящие программаторы и отладочные стенды, и не требует платного софта.
  • Кроссплатформенность. Программное обеспечение Arduino работает на Windows, Macintosh OS X, Linux и других операционных системах, поскольку является открытым и работает на Java. Большинство микроконтроллерных систем ограничиваются Windows.
  • Простая среда программирования. Программная оболочка является простой в использовании для новичков, но достаточно гибкой для продвинутых пользователей, чтобы быстро достичь нужного результата. Особенно это удобно в образовательной среде, где студенты могут с лёгкостью разобраться с платформой, а преподаватели — разработать учебный курс и задания.
  • Открытый исходный код. Язык может быть расширен с помощью C++ библиотек, более продвинутые специалисты могут создать свой собственный инструментарий для Arduino на основе компилятора AVR C.
  • Открытые спецификации и схемы оборудования. Arduino основан на микроконтроллерах Atmel ATMEGA8 и ATMEGA168. Схемы модулей опубликованы под лицензией Creative Commons, поэтому опытные схемотехники могут создать свою собственную версию модуля для своих нужд. Даже сравнительно неопытные пользователи могут сделать макетную версию модуля, чтобы понять, каким образом он работает и сэкономить деньги.

Ссылки:

  1. Официальная поддержка Arduino
  2. Википедия
  3. Проекты на платформе Arduino
  4. Интернет-магазин наборов для сборки на платформе Arduino
  5. Купить контроллер Arduino в Москве

Постскриптум

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

  • arduino
  • микроконтроллеры
  • радиотехника
  • электроника

Введение. Что такое ARDUINO

arduino NANO купить дешево arduino UNO купить дешево arduino UNO R3 ORIG купить дешево

Arduino — это платформа для разработки простых электронных систем на базе микроконтроллеров фирмы AVR . AVR относится к семейству восьмибитных микроконтроллеров фирмы Atmel, использующих RISC-ядро, не суть важно. Короче говоря, Arduino существенно упрощает работу с микроконтроллерами AVR, особенно в домашних условиях, где нет особо времени заниматься травлением печатных плат. К тому же стоимость китайских плат Arduino не существенно отличается от стоимости самого микроконтроллера AVR (может раза в 2). Кроме того, платформа Arduino имеет свой собственный объектно-ориентированный язык Processing/Wiring , который на самом деле является надстройкой над C++. Писать программы на нем проще, чем на чистом C или C++.

Arduino хорошо подходят для создания электронной начинки для дистанционно управляемых или автономных роботов

Arduino

Основные виды плат Arduino

Arduino UNO : МК AVR ATmega328, Flash 32 KB, ОЗУ 2 Кб. Цена от $3 .

Arduino Nano : тоже, что и в UNO, но более компактная. Стоит порядка $2.

Arduino Leonardo : МК AVR ATmega32u4, Flash 32 KB, ОЗУ 2 Кб. Стоит порядка $7-8.

Arduino Mega 2560 : МК AVR Atmega2560, Flash 256 KB, ОЗУ 8 kb. Стоит порядка $7-8.

Arduino Due : микроконтроллер Coxter AT91SAM3X8E, Flash 512 KB, ОЗУ 96 Кб. Стоит около $15.

Более подробнее описание наиболее популярных плат Arduino читать здесь:

Платы ARDUINO по низкой цене

Нажми на изображение, чтобы заказать в интернет-магазине:

arduino NANO купить дешево arduino UNO купить дешево arduino UNO R3 ORIG купить дешево arduino MEGA купить дешево arduino DUE купить дешево

Now 30.10.23 3:19:35, Your IP: 178.132.111.91; arduino.zl3p.com/basic/11_intro
ePN

Arduino: с чего начать изучение

Arduino – инструмент, с которым может рано или поздно столкнуться программист. Изначально так называлась компания, производящая различные IT-механизмы и платы. На данный момент Ардуино – это специальный конструктор. Он является программируемым микроконтроллером для разнообразного оборудования.

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

Что это такое

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

Первая отвечает за среду разработки (программу для написания и отладки прошивок, IDE), готовые библиотеки и упрощенный язык программирования C++. Аппаратная часть – большая линейка микроконтроллеров и готовых модулей. С их помощью можно работать с Ардуино с нуля и очень быстро.

Платы Ардуино используются для погружения в азы:

  • программирования;
  • механики;
  • электротехники.

На его основе можно сконструировать различные полезные устройства – от мигалок и метеостанций до систем «умный дом» и средств автоматизации.

Как собрать устройство

Работа с Arduino строится на основе нескольких важных процессов – сборка микроконтроллеров в единое устройство, а также программирование.

Чтобы собрать устройство своими руками, потребуется:

  1. Сделать печатную плату и обеспечить тактирование микроконтроллеров. Для этого подключается тактовый генератор.
  2. Добавить обвязку – фильтры питания, кнопки для перезагрузки, резисторы и так далее.
  3. Обеспечить оборудованию остальные компоненты. Их требуется разложить на плате или воспользоваться штекерами.
  4. Обеспечить системе стабильное питание.
  5. Запрограммировать устройство. Иногда для этого используется специальное устройство – программатор.
  6. Загрузить прошивку на оборудование через программатор.

Это инструкция может показаться сложной, но на самом деле она простая. Ардуино – это просто. Он предоставляет настроенный микроконтроллер и все, что необходимо для его работы. Сюда же входит стабилизатор напряжения и программатор. Настоящий подарок для чайников в электронике и технике!

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

Обучение Arduino немыслимо без освоения определенного языка разработки. Начало погружения в рассматриваемый МК сложно представить без C++. Ардуино использует его упрощенную версию для полноценной работы.

При попытках программировать с Arduino IDE необходимо запомнить несколько базовых правил для чайников. Они точно такие же, как и при разработке на «обычном компьютере» на языках СИ-семейства:

  • после каждой инструкции или функции ставится точка с запятой;
  • тип данных нужно обязательно указывать перед объявлением функции;
  • если функция ничего не возвращает, она должна быть определена как void;
  • перед объявлением переменных тоже указывается тип используемых данных;
  • комментарии в исходном коде допускаются – они начинаются с «//» или «/*»/.

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

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

Функция setup

Уроки и документацию на русском языке по Ардуино, которые позволят начать обучение работы с микроконтроллерами с нуля, можно отыскать в Google и других поисковиках. Но сначала рекомендуется просто рассмотреть несколько ключевых функций. Они дадут возможность работать с Ардуино на первых порах.

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

Если для имеющейся прошивки (как у чайников) ничего из перечисленного не требуется, функция setup все равно объявляется. Ниже – стандартный ее пример:

Написание этого фрагмента отвечает за открытие последовательного порта связи с компьютером. Пины 9 и 13 назначаются как вход и выход.

Функция loop

Loop() – функция, которую программа реализовывает после setup. Если запрограммировать Arduino, то loop будет отвечать за зацикливание. Она выполняется снова и снова.

Пример – ATmega328. Он установлен на большинстве плат Arduino. Выполняет loop около 10 000 раз в секунду. За счет этого программистам предоставляются широкие возможности для создания софта.

Как запрограммировать микроконтроллер

Руководство пользователя по разработке и программированию МК указывает на то, что после сборки аппаратной части остается запрограммировать поведение оборудования. Краткая инструкция Ардуино для начинающих будет выглядеть в этом случае так:

  1. Написать прошивку. Делается это при помощи любого текстового редактора.
  2. Скомпилировать прошивку. Для AVR – через бесплатный консольный компилятор. Он называется avr-gcc.
  3. Загрузить прошивку в микроконтроллер. Для AVR используется консольная утилита avrdude.

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

Первый проект

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

Это первое устройство на базе Arduino. Тактовая кнопка и светодиод подключаются к микроконтроллеру:

Чтобы схема работала, необходимо написать скетч на компьютере в текстовом редакторе или в специализированной ID. Вот его пример. Здесь при нажатии на кнопку светодиод загорается, а при повторной операции – гаснет. Код соответствующего скетча:

Здесь добавлена дополнительная команда. Она называется debounse. Отвечает за подавление дребезга контактов.

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

Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus !

ГЛАВА 21 Основы Arduino

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

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

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

Возникновение платформы 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 возникла в среде сотрудников 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 после компилирования демонстрационного примера из коллекции сайта «Амперки», представляющего собой вывод на русифицированный строчный ЖК-дисплей традиционного «Здравствуй, мир!». Для компиляции с» целью проверки загруженного текста надо выбрать пункт меню Скетч | Проверить/Компилировать (или нажать сочетание клавиш +), a для его загрузки — пункт Файл | Загрузить (или нажать сочетание клавиш +). Перед загрузкой файл компилируется заново, потому проверенные программы можно не компилировать отдельно.

Рис. 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 пункт меню будет называться Задействовать). После этого порт должен заработать, как надо.

После загрузки драйвера первым делом проверьте пункт Файл | Настройки (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 (скетчи) пишутся на варианте языка 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 //подключаем библиотеку для работы со строчным ЖК-индикатором

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 обычно идет функция (на самом деле тоже процедура) бесконечного цикла, которая обозначается словом 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 () соответствуют операции установки режима АЦП, тактовой частоты его работы, выбора канала и пр.

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

Обмен через последовательный порт

Для лучшего понимания, что именно мы будем делать дальше, кратко рассмотрим устройство последовательного порта. Сначала разберемся в терминах, которые имеют отношение к предмету разговора. В компьютерах ранее всегда присутствовал СОМ-порт, часто кратко называемый портом RS-232. Правильнее сказать так: СОМ-порт передает данные, основываясь на стандарте последовательного интерфейса RS-232. UART (Universal Asynchronous Receiver-Transmitter, универсальный асинхронный приемопередатчик) есть основная часть любого устройства, поддерживающего RS-232. Соответственно, UART как составная часть входит практически во все универсальные микроконтроллеры, в том числе и в ATmega328, лежащий в основе Arduino. В контроллере ATmega2560 (Arduino Mega) таких портов даже целых три.

Кроме UART в порт RS-232 (в том числе в СОМ-порт ПК) входит схема преобразования логических уровней в уровни RS-232, где биты передаются разнополярными уровнями напряжения, притом инвертированными относительно UART. В UART действует положительная логика с обычными логическими уровнями, где логическая единица есть высокий уровень (+3 или +5 В), а логический ноль — низкий уровень (0 В). У RS-232 логическая единица передается отрицательным уровнем от -3 до -12 В, а логический ноль — положительным уровнем от +3 до +12 В. Преобразователь уровня в МК, естественно, не входит, так что для стыковки с компьютером придется его изобретать.

Идея передачи по интерфейсу RS-232 заключается в передачи целого байта по одному проводу в виде последовательных импульсов, каждый из которых может быть 0 или 1. Если в определенные моменты времени считывать состояние линии, то можно восстановить то, что было послано. При этом для приемника и передатчика, связанных между собой тремя проводами («земля» и два сигнальных провода «туда» и «обратно»), приходится задавать скорость передачи и приема, которая должна быть одинакова для устройств на обоих концах линии. Эти скорости стандартизированы и выбираются из ряда: 1200, 2400, 4800, 9600, 14 400, 19 200, 28 800, 38 400, 56 000, 57 600, 115 200 (более медленные скорости я опустил)[42]. Число это обозначает количество передаваемых/принимаемых битов в секунду.

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

Рис. 21.3. Диаграмма передачи данных по последовательному интерфейсу RS232 в формате 8п2

В современных компьютерах СОМ-порт, как правило, отсутствует. Конечно, его можно обеспечить с помощью дополнительных плат или (в ноутбуках) PCMCIA-карт, но, в общем случае, это неудобно. Куда проще воспользоваться универсальным последовательным портом USB, имеющемся практически на каждом компьютерном устройстве. Микросхемы-переходники, обеспечивающие преобразование USB/RS-232, носят по наименованию выпускающей их фирмы название FTDI и являются составной частью любого устройства, обеспечивающего эмуляцию протокола RS-232 через USB. Устройство при этом имеет лишь простой UART, а преобразование обеспечивается микросхемой, которая в случае Arduino встроена в плату.

При соединении такого устройства с компьютером через USB-кабель драйвер распознает его, как виртуальный СОМ-порт (см. раздел об установке Arduino в этой главе). Кстати, подобную связь с компьютером имеют многие дешевые мобильники — в них со стороны телефона имеется лишь UART, в точности так же, как в МК AVR, а для связи нужен специальный и иногда довольно дорогой кабель-адаптер с установленной внутри микросхемой FTDI или аналогичной.

Как и взаимодействие с АЦП, работа через последовательный порт в Arduino относится к базовым функциям и не требует подключения внешних библиотек. Далее мы увидим, что физически передача через последовательный порт может быть реализована далеко не только с помощью USB, — чуть позже мы рассмотрим модуль, который «прозрачно» для программиста обеспечивает передачу по радиоканалу с помощью тех же самых функций.

Сам по себе обмен через последовательный порт в Arduino немногим сложнее чтения значения аналоговой величины в только что рассмотренном примере термостата и обеспечивается набором функций Serial (см. их описание в разделе Программирование [23]). Для успешной работы спроектированного устройства совместно с Windows, если Arduino IDE в ней не устанавливалась, необходимо установить драйвер ArduinoUSBSerial.inf, входящий в комплект Arduino IDE (находится в основном каталоге размещения среды Arduino). Для обмена данными библиотека Serial использует цифровые порты платы Arduino 0 (RX) и 1 (ТХ). Разумеется, если вы используете функции Serial, то нельзя одновременно с этим использовать порты 0 и 1 для других целей, — обратите внимание, что во всех наших проектах они остаются свободными.

Простейшая пробная программа для работы с функциями serial выглядит так:

Функция Serial.write() отличается от Serial.print() тем, что первая посылает данные, как числа, а вторая позволяет организовать вывод в различных строковых форматах (см. описание функции в [23]). Мы здесь употребляем вариант второй функции под названием serial.println, который дополнительно присоединяет к выводу символы перевода строки. Многочисленные примеры употребления этих операторов в разных вариантах вы встретите далее.

Подробности

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

Для лучшего понимания, как это делается, стоит учесть, что с последовательным портом в Arduino связан буфер размером 64 байта (не путать с аппаратным буфером самого UART). Чтобы действительно ничего не упустить, следует вызывать функцию Serial.available о с задержкой — тогда, когда в этом буфере уже что-то имеется, иначе считается только первый пришедший байт, а остальные могут пропасть. Потому мы без зазрения совести ставим в программе временные задержки (функция delay ()) при приеме нескольких байтов из компьютера или другого устройства — операция, которая в случае отсутствия такого буфера, наоборот, только привела бы к гарантированной потере данных. При формировании задержек следует ориентироваться на то, что передача одного байта на скорости 9600 занимает примерно 1 миллисекунду. Так что при приеме в пределах десятка байтов будут разумными величины задержек порядка 10 миллисекунд или несколько более на весь цикл приема. Именно такой прием мы применим при установке часов из компьютера в главе 22, где и познакомимся с приемом последовательности нескольких байтов.

Да, а как принять посланные байты в компьютере? Для этого годится абсолютно любая программа-монитор, позволяющая устанавливать номер порта и скорость приема. В том числе такая программа входит и в Arduino IDE (Сервис | Монитор порта). Она заслуженно вызывает многочисленные нарекания своей примитивностью, но для каких-нибудь простых тестовых целей вполне годится — главное, что в ней не надо ничего устанавливать, связь с устройством доступна немедленно после загрузки программы. Для более «продвинутых» читателей я рекомендую свою программу-монитор под названием Соm2000 (ее можно скачать с сайта автора по адресу http://revich.lib.ru/comcom.zip) — она отличается тем, что позволяет организовать обмен в любом удобном формате (численном в десятичной или шестнадцатеричной форме, а также в текстовом). Входит подобная программа, как составная часть, и в утилиту X–CTU для настройки радиомодулей по протоколу ХЬее, которыми мы будем заниматься в следующей главе.

Столь простое обращение с последовательным портом позволяет дополнить программы Arduino простейшим средством отладки. Такие средства напрочь отсутствуют в среде Arduino, а без них очень трудно отлаживать более-менее сложные программы, — ту же настройку часов из компьютера (глава 22) без контроля за тем, что принимается в программе и в каком виде, создать было бы просто нереально. Для этого в нужных местах программы вы расставляете операторы Serial.print() или Seriai.write(), посылающие в компьютер переменные, значения которых необходимо контролировать, и отслеживаете их состояние через монитор порта.

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

Работа с текстом на графическом дисплее MT-12864J

Дисплеи для вывода цифр, текста и графики, как мы уже знаем из главы 7, встречаются нескольких разновидностей. Здесь мы остановимся на небольших матричных дисплеях, в которых изображение составляется из точек, что позволяет формировать произвольные символы и элементарные изображения. Матричные дисплеи бывают графические и строчные, отличающиеся способом управления: у них разные контроллеры, ориентированные в одном случае на адресацию каждой точки в отдельности, во втором — на вывод символов по их коду, подобно тому, как это делается в программах для компьютеров. Разумеется, эта преимущественная ориентация не исключает вывод текста на графические дисплеи или вывод примитивных изображений на строчные. Именно задачей вывода текста на графический дисплей мы сейчас и займемся, а в следующей главе познакомимся со строчными разновидностями.

Для каждого из этих типов дисплеев имеется стандартный контроллер, по образцу которого строится управление любой аналогичной матрицей. Для символьных строчных экранов стандартный контроллер называется HD44780, а для графических ту же роль играет ks0108 — с ним совместимы все графические экраны небольшого размера. Мы воспользуемся популярным отечественным графическим ЖК-модулем MT-12864J фирмы МЭЛТ. На сайте «Амперки» в разделе Вики легко разыскать статью «Работа с ЖК-матрицей 128×64», рассказывающую о подключении этого модуля в стандартном графическом режиме с помощью библиотеки GLCD.

Здесь мы подробнее остановимся на некоторых нюансах практического применения ЖК-матриц на основе контроллера ks0108, а также рассмотрим вывод текста с помощью готовых шрифтов из библиотеки GLCD и вопросы их модернизации для вывода кириллических символов.

Подключение MT-12864J

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

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

Модернизированная с учетом этого обстоятельства схема подключения MT-12864J к Arduino Uno приведена на рис. 21.4.

Рис. 21.4. Схема подключения MT-12864J к Arduino Uno

Как видите, у нас оставлены, свободными контакты D1 и D2 (RX и ТХ последовательного порта) и контакты А4-А5, которые, как мы еще узнаем, участвуют в обмене через порт 12С. Одновременная работа со стандартным подключением SD-карты, требующим выводов интерфейса SPI (11, 12, 13 и, с некоторыми оговорками, 10) здесь уже оказывается невозможной. Этот дефицит выводов станет одной из причин, по которым в проекте метеостанции, рассматриваемом в следующей главе, мы выберем другой тип дисплея. Но и ЖК-дисплей может оказаться полезным во многих случаях, особенно при проектировании малопотребляющих приборов, работающих на батарейках.

Обратим также внимание на резисторы R1 и R2, о которых почему-то авторы статей о графических матрицах часто забывают упомянуть. Переменный или подстроечный резистор R1 служит для регулировки контрастности индикатора. На схеме он подключен так, как рекомендуется в документации фирмы МЭЛТ, однако может подключаться и по схеме потенциометра: одним концом к «земле», другим к питанию 5 В, а средним выводом к контакту Vo индикатора. Номинал его выбирается в пределах 10–20 кОм, и в конечном продукте R1 можно заменить на постоянный резистор подобранного номинала.

Резистор R2 — токоограничивающий для LED-подсветки. Его можно не устанавливать вовсе (и в документации он не упоминается), поэтому на схеме он обозначен пунктиром. Согласно документации МЭЛТ, ток подсветки тогда составит около 64 мА. Установить токоограничивающий резистор R2 следует в двух случаях: если вы хотите уменьшить ток (и, соответственно, пожертвовать яркостью подсветки), или если подсветка питается от отдельного источника с повышенным напряжением. Последний вариант обычно реализуется при смешанном питании, когда подсветка подключается к нестабилизированному напряжению на выходе сетевого адаптера, а при переключении на батарейку отключается вовсе. Потребление контроллера модуля при выключенной подсветке тогда составит всего 4 мА (на подробностях реализации этого способа мы здесь останавливаться не будем). При обычном напряжении на выходе адаптера (7–9 В) резистор R2 должен погасить лишние 2–4 В, соответственно, его номинал должен составлять от 39 до 62 Ом.

Отметим, что на свету дисплей MT-12864J при отсутствии подсветки выглядит даже лучше — больше контраст и углы обзора, а сама подсветка настолько тусклая, что при посторонней засветке экрана только снижает контраст, ухудшая различимость символов. То есть фактически она требуется только при эксплуатации экрана в темноте. Зато, вопреки ожиданиям, качество дисплея в отсутствии подсветки оказалось вполне на высоте.

Скачать библиотеку GLCD можно с официального ресурса по ссылке, приведенной в сноске 5. На момент подготовки этой книги последняя версия библиотеки носит номер 3. Распакуйте ее, как обычно, в папку libraries каталога Arduino. Так как мы меняли контакты, то для начала файл библиотеки, где обозначены выводы, придется «причесать» в соответствии с нашими потребностями. Для этого разыщите в папке librariesglcdconfig файл ks0108_Arduino.h. Согласно схеме (см. рис. 21.4), установите следующие выводы (в листинге приводятся только строки файла, которые подлежат правке, а старые номера выводов закомментированы):

#define glcdData0Pin 2 //8 — так было в оригинале

#define glcdData1Pin 3 //9

#define glcdData2Pin 4 //10

#define glcdData3Pin 5 //11

#define glcdData4Pin 6 //4

#define glcdData5Pin 7 //5

#define glcdData6Pin 8 //6

#define glcdData7Pin 9 //1

#define glcdCSEL1 10 //14

#define glcdCSEL2 11 //15

#define glcdRW 12 //16

#define glcdDI 11 //15

#define glcdEN 14 //18

Русификация модуля MT-12864J

Никакого специального текстового режима в модулях MT-12864J не существует. Текст в них выводится просто как картинка, для чего имеются таблицы шрифтов в виде специальной функции, вызываемой через оператор SeiectFont. Чтобы русифицировать этот индикатор, для него придется создать шрифт с русскими символами. Причем создать «руками» — рекомендуемый в описании библиотеки конвертер шрифтов Windows, к сожалению, не понимает никаких символов, кроме служебных и английских. Это объясняется тем, что в UTF-8, принятой в качестве кодировки для файлов Arduino IDE, только эти символы из стандартной таблицы ASCII однозначно переводятся в однобайтовую кодировку. Нет никаких сомнений, что авторы конвертера могли бы с этой проблемой справиться, — но только представьте, какой объем работы им пришлось бы провернуть, чтобы охватить всего десяток-другой самых популярных языков? Так что простим их и вспомним, что благодаря открытому коду все в наших руках.

Для этого мы модернизируем имеющийся в комплекте библиотеки GLCD английский шрифт 5×7 точек, размещающийся в файле SystemFont5x7.h (папка fonts). Никакие особые инструменты для этого не нужны — немного поразмыслив над приведенными там кодами (для наглядности каждый байт следует разложить в двоичное представление и записать все пять штук один над другим), вы легко разберетесь в принципе устройства таблицы и сможете ее менять и дополнять без какого-либо визуального редактора. Вот как, например, кодируется заглавная буква «Р» в этой системе (последовательность 0x7F, 0x09, 0x09, 0x09, 0х06):

Если вы еще не догадались, то мысленно поверните байтовый массив на 90 градусов влево, и вы увидите букву «Р», образованную единицами. Хитрость дополнения имеющейся таблицы состоит только в том, чтобы русские буквы соответствовали их кодам, получающимся при компиляции текстового файла с программой, — вводить текст в программе через номера кодов не слишком удобно, приятнее писать его прямо по-русски.

Правила Arduino IDE для кодирования символов второй половины байтовой таблицы символов (т. е. с номерами более 127) соответствуют младшему байту кодировки UTF-8 (именно в ней сохраняется текстовый файл программы. ino). В русскоязычной части таблицы UTF-8 младшие байты кодов с 80h no 8Fh занимают строчные буквы от «р» до «я», далее идут подряд 32 заглавные от «А» до «Я» (исключая букву «Ё»), а в кодах от B0h до BFh размещены оставшиеся строчные от «а» до «п». Таким образом у нас еще остается в конце байтовой таблицы незадействованная часть размером в целых 64 символа (с кодами от C0h до FFh), куда можно при надобности поместить различные служебные символы, отсутствующие в оригинале (вроде степеней или индексов). При самостоятельном дополнении таблицы не забывайте, что номера символов должны идти подряд, начиная с указанного в заголовке функции System5x7 кода 0x20 (что соответствует пробелу во всех разновидностях кодировок, основанных на ASCII). А общее количество символов следует указать в последнем параметре функции — в оригинале там стоит 0x60 (десятичное 96), у нас это число возрастает до 0хА0 (160).

Один из таких отсутствующих символов нам понадобится уже в следующей главе — ни в системном английском шрифте, ни в доработанных разными умельцами вариантах не содержится значка градуса. Чтобы больше ничего не менять в заголовке файла, мы не будем дополнять таблицу, а подставим этот- значок вместо одного из редко используемых символов. Закодированный в этой системе символ градуса будет выглядеть так: 0х00, 0х00, 0x0f, 0x09, 0x0f. Для замены я выбрал знак «» («обратный слэш»), номер которого в таблице равен 0х5С. Вместо значка градуса в операторе вывода тогда придется указывать либо его код (в среде Arduino IDE это удобнее делать в восьмеричном виде так: «134»), либо просто двойной «обратный слэш» в соответствии с правилами синтаксиса языка С.

Кроме указанных изменений, в этом шрифте я исправил цифру 0 — вместо перечеркнутого «0» скопировал для символа 0x30 строку для буквы «О» (символ номер 0x4F). Перечеркнутый ноль давно удален из всех шрифтов в пользовательских устройствах, что иногда даже бывает неудобно, — например, когда требуется воспроизвести пароль с цифрами и буквами вперемешку. И только в таблицах шрифтов для подобных индикаторов он по инерции задержался с доисторических времен господства АЦПУ и алфавитно-цифровых терминалов, но в современном антураже выглядит довольно дико. Обидно, что для строчных дисплеев со встроенными шрифтами, подобных тем, что вы также увидите в следующей главе, этот символ так просто исправить не удастся.

Архив с файлом русифицированного шрифта под именем SystemFont5x7R.h вы можете скачать с сайта автора (http://revich.lib.ru/AVR/Rus_Lcd.zip). При его создании использованы наработки пользователя SkyFort с сайта Robocraft.ru, который и проделал основную работу по прорисовке русских символов и переводу их в hex-коды, применяя какой-то хитрый софт. Файлы шрифта можно размещать прямо в папке с библиотекой GLCD (там же, где размещается файл библиотеки glcd.h) или в ее подпапке fonts. В последнем случае в директиве #include к имени файла придется добавлять название каталога (ПО образцу: #include «fonts/SystemFont5x7.h»). В том же архиве имеется файл тестовой программы-примера ProbaJ_CD.ino, который выводит подряд символы русского алфавита и цифр, значок градуса и в нижней строке — наименование дисплея «MT-12864J»:

#include //подключим библиотеку

#include «SystemFont5x7R.h» //файл шрифта

void setup ()

GLCD.Init(); //инициализация

GLCD. ClearScreen ();

void loop ()

GLCD.SelectFont(System5x7); //выбираем шрифт

GLCD.CursorToXY(0,0); //установим курсор в начальную позицию

GLCD. println («АБВГДЕЖЗИЙКЛМНОП»);

GLCD.println(«PCTyOXU41imbbIb3roH»);

GLCD.println («абвгдежзийклмноп»);

GLCD.println(«рстуфхцчшщъыьэюя»);

GLCD.println(«1234567890»);

GLCD.CursorToXY(19*6,4*8); //установим курсор в предпоследнюю позицию 5-й строки

GLCD.print(С); //градус С

GLCD.CursorToXY(4*6,7*8); //установим курсор в позицию 4 строки 8

GLCD.print(«MT-12864J»);

Из приведенного примера понятно, как обращаться с текстом при выводе. Текстовая зона с данным шрифтом содержит 8 строк по 21-му символу в каждой. При выводе строки длиннее 21 символа, ее конец автоматически перейдет на другую строку. Для принудительного перевода строки используйте функцию GLCD.println ().

Чтобы правильно позиционировать вывод текста, следует иметь в виду, что библиотечная функция cursorToXY() рассчитана на графический экран 128×64 точки. По этой причине при выводе текста указывать положение курсора удобно так, как показано в примере, с учетом того, что символ занимает 6 точек по ширине, а строка — 8 точек по высоте. Поскольку позиции в строке и сами строки нумеруются с нуля, то вывод символа в предпоследнюю (20-ю, т. е. номер 19) позицию пятой (т. е. номер 4) строки предваряем оператором cursorToXY (19*6,4*8).

Обратите внимание, что вывод на такой дисплей всегда должен начинаться с функции установки курсора на определенную позицию — чтобы выводимые символы заменяли старые на том же месте. Иначе в следующем цикле функции loop () строки быстро поползут вверх, не давая разглядеть результата. Результат выполнения тестовой программы приведен на рис. 21.5. Фото сделано при выключенной подсветке — на снимке она была бы практически не видна.

Рис. 21.5. Результат выполнения тестовой программы для дисплея MT-12864J

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *