Эксперимент 32. Объединение аппаратных средств и программного обеспечения
Я полагаю, что многие читатели этой книги — а возможно, большинство — уже слышали о среде Arduino. Проделав три последующих эксперимента, вы узнаете, как настроить среду Arduino, а затем самостоятельно создавать для нее программы, вместо того чтобы скачивать приложения, найденные в онлайн-источниках.
Что вам понадобится
• Плата Arduino Uno или совместимый аналог (1 шт.)
• USB-кабель с разъемами типа А и В на противоположных концах (1 шт.)
• ПК или ноутбук со свободным USB-портом (1 шт.)
• Стандартный светодиод (1 шт.)
Определения
Микроконтроллер — это микросхема, которая работает как маленький компьютер. Вы пишете программу, содержащую инструкции, которые понимает микроконтроллер, а затем копируете их в определенную область памяти микросхемы. Эта память энергонезависимая — ее содержимое сохраняется даже при отключении питания.
Если вы уже сталкивались с микроконтроллерами, то я предложил бы сразу приступить к написанию программы, однако для первоначального изучения микроконтроллера понадобится больше времени и сил, чем требовалось для тех компонентов, с которыми мы имели дело ранее. Сначала нужно понять принцип работы микроконтроллера и выяснить некоторые важные подробности. Следовательно, я должен начать с объяснений и примеров. Затем мы проведем первый эксперимент для знакомства с процессом настройки среды Arduino и выполнения самого простого теста. Эксперименты 33 и 34 вовлекут вас в программирование микроконтроллера Arduino с использованием других компонентов в сочетании с ним.
Процедура настройки программной среды и проверки аппаратных средств займет пару часов. Вам понадобится найти время, когда вы сможете выполнить описанные инструкции не отвлекаясь. Как только вы завершите начальную подготовку, дальнейшая работа станет гораздо проще.
Применения микроконтроллеров
Типичный алгоритм работы микроконтроллера:
• Получить входной сигнал от поворотного энкодера, который регулирует громкость звучания автомобильной аудиосистемы.
• Выяснить, в какую сторону поворачивается преобразователь.
• Подсчитать число импульсов от преобразователя.
• Выдать команду программируемому резистору с указанием, на сколько равных шагов он должен изменить свой номинал, чтобы увеличить или уменьшить громкость стереосистемы.
• Ждать прихода следующих входных сигналов.
Микроконтроллер смог бы также справиться и с гораздо более сложной задачей, например, с обработкой всех входных сигналов, выработкой выходных сигналов, а также с принятием решений, связанных с системой охранной сигнализации в эксперименте 15. Он мог бы сканировать датчики, включать сигнализацию через реле после периода задержки, принимать и проверять последовательность нажатия клавиш, когда вы захотите отключить сигнализацию — и многое другое.
Микроконтроллеры есть во всех современных автомобилях, там они выполняют как сложные задачи, например обеспечивают синхронизацию зажигания в двигателе, так и совсем простые — выдают звуковое оповещение, если вы не пристегнули ремень безопасности.
Микроконтроллер может выполнять небольшие, но важные задачи, о которых я рассказывал в предыдущих экспериментах, например, устранять дребезг контактов кнопки или генерировать сигнал звуковой частоты.
Если принять во внимание то, что одна маленькая микросхема может выполнять так много различных задач, то почему мы не используем ее для всего?
Микроконтроллер: да или нет?
Микроконтроллер универсален и многофункционален, однако в одних ситуациях он подходит лучше, чем в других. Он идеален для выполнения логических операций типа «если происходит это, то делаем то-то, а если то, то делаем что-то другое», но он увеличивает сложность и стоимость устройства, и конечно же, подразумевает основательный процесс обучения: чтобы программировать микроконтроллер, вы должны освоить компьютерный язык.
Если вы не хотите тратить время на изучение этого языка, то можете скачивать и использовать программы, которые написаны другими. Многие предпочитают этот вариант, потому что он дает быстрые результаты. В онлайн- библиотеках можно найти тысячи бесплатных программ для микроконтроллера Arduino.
Но программа может функционировать не совсем так, как нужно вам. Вам придется ее модифицировать — и вы вернетесь назад к ситуации, когда вам необходимо понимать язык, чтобы по максимуму задействовать микросхему.
Написать программу для среды Arduino в принципе несложно, здесь многое зависит от конкретной задачи. Тем не менее, это не одношаговая операция. Программный код необходимо проверить, а процесс отыскания и устранения ошибок может занять много времени. Одна маленькая ошибка будет приводить к непредсказуемым результатам или вообще блокировать работу всей системы. Вам понадобится заново вычитать код, исправить ошибки и попробовать еще раз.
Лишь проделав всю эту трудоемкую работу, можно добиться желаемого результата. По этой причине лично я считаю, что применять микроконтроллер целесообразно, если только ваши ожидания реалистичны.
В любом случае, чтобы выяснить, хотите ли вы заниматься микроконтроллерами, нужно поэкспериментировать с ними самостоятельно.
Одна плата и несколько микросхем
Я начну с основного вопроса. Что такое Arduino? Если вы считаете, что это микросхема, то вы не вполне правы. Каждый продукт с брендом Arduino состоит из небольшой печатной платы, спроектированной компанией Arduino, и содержит микроконтроллер, произведенный абсолютно другой фирмой. На плате Arduino Uno (рис. 5.79) установлен микроконтроллер Atmel ATmega328P-PU. Плата содержит также стабилизатор напряжения, несколько гнезд, которые позволяют вам подключить провода или светодиоды, кварцевый генератор, разъем для подключения питания и USB-адаптер, который реализует обмен информацией между платой и компьютером.
Если вы покупаете микроконтроллер ATmega 328P-PU отдельно у поставщика компонентов, он обойдется вам менее чем в 1/6 от розничной стоимости платы Arduino с той же микросхемой. Почему вы должны столько переплачивать, чтобы получить эту маленькую печатную плату? Ответ заключается в том, что проектирование платы и разработка программного обеспечения для нее не такая уж простая задача.
Рис. 5.79. Плата Arduino Uno, оснащенная микроконтроллером ATmega 328P-PU компании Atmel
Это программное обеспечение обозначают буквами IDE (от англ, integrated development environment — интегрированная среда разработки). После того как вы установите ее на свой компьютер, удобная пользовательская среда позволит вам написать программу и скомпилировать ее: это означает, что среда преобразует инструкции на языке С (который понятен людям) в машинный код (который понятен микросхеме Atmel). Затем вы запишете код в микросхему ATmega.
Если для вас это пока не слишком понятно, подытожу сказанное:
• Arduino — это печатная плата, в которую встроен микроконтроллер Atmel.
• Программное обеспечение IDE компании Arduino позволяет вам написать программу на вашем компьютере.
• После того как вы напишете программу, среда IDE скомпилирует ее, чтобы создать код, который может понять микросхема.
• Среда IDE отправляет этот код микросхеме Atmel, которая хранит его.
Как только ваш код окажется в микросхеме, плата Arduino становится ей больше не нужна. Теоретически вы можете вынуть микроконтроллер ATmega328 и использовать его где-либо — на макетной плате или в другой схеме, где предусмотрен микроконтроллер. Микросхема будет по-прежнему выполнять запрограммированную работу, потому что код хранится в ней.
В реальности же этому препятствует ряд мелочей, о них вы можете узнать, прочитав очень хорошую книгу под названием Make: AVR Programming («Программирование микроконтроллеров серии AVR») Эллиота Уильямса (Elliot Williams). Она расскажет вам, как на самом деле осуществить «пересадку» микросхемы ATmega.
Если вы научитесь это делать, то последствия будут значительными. Вам понадобится лишь одна плата Arduino, и вы сможете очень дешево покупать микросхемы Atmel. Установите микроконтроллер в панельку на плате, запрограммируйте его, выньте и используйте в другом устройстве. Вставьте в плату другой микроконтроллер, передайте в него другую программу и задействуйте в другом проекте.
Все достаточно просто, если у вас версия Arduino Uno, где микроконтроллер — это микросхема, предназначенная для установки в монтажные отверстия. Вы можете вынуть ее из панельки миниатюрной отверткой и заменить на другую микросхему, вставив ее двумя пальцами. Существует версия Arduino Uno с впаянным микроконтроллером, установленным методом поверхностного монтажа. В этом случае поменять микросхему нельзя.
Нужно ли остерегаться подделок?
Теперь, когда я объяснил основы, расскажу о том, как все настроить.
Хотя существует множество моделей Arduino, здесь я отдал предпочтение плате Arduino Uno, и мои инструкции применимы к версии R3 и более поздним.
Вы можете приобрести плату Arduino у многих поставщиков, поскольку она была спроектирована и продается как продукт «с открытым исходным кодом», позволяя каждому желающему изготовить ее копию, подобно тому как любой производитель может выпустить таймер 555 (хотя доводы здесь немного другие).
Компании Mouser, Digikey, Maker Shed, Sparkfun и Adafruit — все они продают оригинальные продукты Arduino. В интернет-магазине eBay, тем не менее, вы можете встретить нелицензированные копии плат Arduino за треть их цены. Идентифицировать такой продукт можно по отсутствующему логотипу Arduino. Чтобы отличить оригинальную плату от имитации, посмотрите на логотип, изображенный на рис. 5.80.
Нелицензированные платы полностью законны. Это не покупка пиратского программного обеспечения или музыки. Единственная отличительная черта, контролируемая компанией Arduino, — это ее торговая марка, которую не могут использовать другие производители. (Хотя на деле некоторые мошенники присваивают этот логотип незаконно, но вы поймете, что такие платы не являются оригинальными, потому что они очень дешевые.)
Рис. 5.80. Только платы, произведенные или лицензированные компанией Arduino, могут иметь такой логотип
Замечание
Из-за спора между компанией Arduino и ее бывшим производителем подлинные платы Arduino за пределами США продаются под названием Genuino.
Будет ли плата-имитация работать надежно? Я стал бы доверять платам, которые выпущены компаниями Adafruit, Sparkfun, Solarbotics, Evil Mad Scientist и некоторыми другими. Я не могу купить и перепроверить их все, поэтому вам придется составить собственное мнение об этом, основываясь на отзывах других покупателей и вашем общем впечатлении о поставщике. Но помните о том, что вам будет достаточно одной платы для программирования множества микросхем Atmel. Поэтому, возможно, доплата за приобретение подлинного продукта Arduino не станет такой уж разорительной. Приобретая фирменное изделие, вы помогаете компании продолжать разработку новых продуктов.
Лично я купил оригинальную плату Arduino.
Настройка среды Arduino
Будем считать, что к настоящему моменту вы уже купили плату Arduino Uno или ее копию, которую вы считаете надежной. Вам понадобится также стандартный USB-кабель с разъемами типа А на одном конце и типа В на другом, как показано на рис. 5.81. Обычно он не идет в комплекте с платой. Если у вас нет запасного кабеля, то можете взять его от другого устройства, пока выполняете настройку и начальную проверку. Дешевые кабели можно найти в онлайн- магазинах, таких как eBay.
Рис. 5.81. Кабель для подключения платы Arduino к USB- порту компьютера
У вас уже есть плата и кабель, теперь нам понадобится программное обеспечение IDE. Зайдите на сайт Arduino (http://www.arduino.cc) и выберите вкладку Download («Загрузка»). Затем выберите версию среды IDE, которая соответствует вашему компьютеру. В настоящее время доступны версии для OS X, Linux и Windows. Я буду использовать версию 1.6.8, но мои инструкции должны быть применимы и к более поздним версиям. Скачать программное обеспечение можно бесплатно.
Обратите внимание на то, что вам нужен компьютер с операционной системой Windows ХР или более поздней, Mac OS X 10.7 и выше или Linux в 32- или 64-разрядной версии. (Эти требования актуальны на момент написания книги. В будущем компания Arduino может изменить их.)
Описанная далее процедура установки для трех разных операционных систем основана, главным образом, на инструкциях из хорошего руководства для начинающих Getting Started with Arduino («Приступая к работе с Arduino») Массимо Банзи (Massimo Banzi) и Майкла Шилоу (Michael Shiloh). Можно также найти инструкции по установке на таких сайтах, как SparkFun (http://www.sparkfun.com) и Adafruit (). И наконец, на самом сайте компании Arduino (http://www.arduino.cc) также есть необходимые инструкции.
К сожалению, все описания немного отличаются. Например, сайт Arduino рекомендует подключить плату до запуска установщика, а М. Банзи и М. Шилоу в своей книге пишут, что вначале следует запустить установщик, а потом подключить плату. Это осложняет мою задачу, поскольку и те и другие инструкции были написаны в сотрудничестве с разработчиками Arduino.
Далее я поделюсь своими представлениями о том, как установщик будет работать в каждой системе.
Установка Arduino в ОС Linux
Похоже, это самое сложное, поскольку существует множество версий данной операционной системы. Вынужден направить вас к руководству по установке на сайте Arduino (http://play- ground.arduino.cc/learning/linux). Сожалею, что не могу вам лично помочь с системой Linux.
Установка Arduino в ОС Windows
Я опишу процедуру, которую рекомендует сайт, поддерживаемый компанией Sparkfun.
Не подключайте пока плату. Сначала найдите скачанную программу установки среды IDE. Имя файла может выглядеть как arduino-1.6.8-windows.exe, хотя, когда вы это читаете, номер версии уже почти наверняка изменился. Расширение ехе в конце имени файла может не отображаться, в зависимости от настроек вашего компьютера.
Замечание
Некоторые руководства упоминают о скачивании файла с архивом, который следует разархивировать. Насколько мне удалось выяснить, компания Arduino перестала запаковывать файл в архив. Вы можете запустить его сразу.
Дважды щелкните мышью по значку файла, и вы должны увидеть последовательность шагов, которая знакома вам по установке программного обеспечения других производителей.
Сначала необходимо принять условия лицензионного соглашения (если вы не согласитесь, то не сможете запустить программное обеспечение). Затем вас спросят, хотите ли вы поместить ярлык на Рабочий стол и в меню Пуск. Разрешите поместить ярлык на Рабочем столе. Меню Пуск — на ваше усмотрение. После этого вас попросят указать папку, в которую будет установлено программное обеспечение IDE. Следует принять предлагаемые настройки по умолчанию.
Если вы такой же «динозавр», как и я, предпочитающий версию ХР (а в действительности нас таких миллионы), то вы можете увидеть предупреждение, показанное на рис. 5.82. Точный вид зависит от вашей версии Windows. Проигнорируйте это предупреждение, нажав кнопку Все равно продолжить (Continue anyway). Если у вас спросят разрешения установить драйверы устройства, нажмите кнопку Да (Yes).
Рис. 5.82. Пользователи старой операционной системы WinXP могут проигнорировать это предупреждение
Замечание
В операционной системе Windows 8 служба безопасности не позволит вам установить неподписанные драйверы устройств. Такой проблемы нет у современных версий установщика Arduino IDE, но если у вас каким-либо образом оказалась старая версия, вы можете поискать решение в сервисе Google по запросу sparkfun disable driver signing, который должен привести вас в раздел сайта Sparkfun, где содержатся полезные сведения по этой теме.
После установки программного обеспечения подключите плату Arduino к компьютеру с помощью USB-кабеля.
Круглый разъем питания на плате Arduino оставьте неподключенным, поскольку плата соединена с компьютером через USB-порт и получает питание по USB-кабелю. Примите во внимание то, что более короткий и толстый кабель уменьшает падение напряжения. Если вы пользуетесь ноутбуком, в особенности старой модели, он может ограничивать питание через USB- порт до 250 мА. Даже на настольном компьютере, который рассчитан на выдачу тока 500 мА по USB-кабелю, этот ток может быть разделен между тремя или четырьмя USB-портами. Такие устройства, как внешний жесткий диск, могут потреблять значительное количество энергии.
Подождите, пока компьютер идентифицирует плату. После этого вы должны увидеть, что зеленый светодиод горит постоянно, а желтый мигает. Еще одна расположенная рядом пара светодиодов (они обозначены как ТХ и RX) должна быстро мигать при передаче данных.
Найдите ярлык среды IDE. Он называется Arduino, и установщик поместил его на Рабочий стол. Если вы не хотите, чтобы он был на Рабочем столе, перетащите его в другое место. Дважды щелкните мышью по ярлыку, чтобы запустить среду Arduino IDE.
В открывшемся окне раскройте меню Инструменты (Tools), перейдите к пункту Порт (Ports) (в версии для Mac этот пункт теперь называется Serial Ports («Последовательные порты»)), и вы увидите список последовательных портов вашего компьютера. Они называются СОМ1, COM2 и т. д.
Что такое последовательный порт? У персональных компьютеров первых выпусков не было USB-разъемов. Они использовали «протокол последовательной передачи данных» и D-образные разъемы, а компьютер отслеживал активный разъем, присваивая ему «номер порта». Эта система до сих пор встроена в ОС Windows, хотя прошли уже десятилетия с момента ее появления, а сам протокол редко встречается в домашних приложениях.
Вам нужно узнать лишь следующее: удалось ли среде Arduino IDE и ОС Windows согласовать номер порта, который был назначен плате Arduino Uno. В идеале, если выбрать пункт меню Инструменты | Порт (Tools | Ports) в среде IDE, то вы увидите плату Uno в списке, она будет отмечена «галочкой», и все окажется в порядке. Если это так, то пропустите следующий раздел и перейдите далее к разделу «Программа Blink».
Поиск и устранение неисправностей (Windows)
Существуют два неблагоприятных момента, которые могут повлиять на назначение портов.
• В подменю Порт (Ports) среды Arduino IDE вы можете увидеть, что плата Arduino Uno есть в списке, но она не отмечена флажком. Вместо этого может быть отмечен другой порт. Попробуйте указать правильный порт. Вы можете увидеть предупреждение, если среда IDE не одобряет используемую плату Uno. Проигнорируйте это предупреждение, установите флажок Не показывать это снова (Don’t show me this again) и переходите к разделу «Программа Blink» этой главы.
• Порт, обозначенный как Arduino Uno, может отсутствовать в списке. В таком случае запишите названия перечисленных СОМ- портов. Закройте меню среды IDE. Отключите плату Arduino Uno. Подождите пять секунд. Снова откройте подменю Порт (Ports) и посмотрите, какой COM-порт пропал. Закройте подменю. Подключите плату Arduino снова. Откройте заново подменю. Щелкните мышью по названию порта, который появился, чтобы установить на нем флажок. Переходите к разделу «Программа Blink».
Система Windows позволяет проверить настройки порта. В меню Пуск выберите пункт Справка и поддержка. В открывшемся окне введите в строке поиска «Диспетчер устройств». Он должен оказаться первым в результатах поиска. Запустите Диспетчер устройств. Если у вас установлена система Windows ХР, будет выведен список портов. В более поздних версиях Windows, чтобы открыть список портов в Диспетчере устройств, необходимо выбрать пункт меню Вид | Показать скрытые устройства.
Вы должны увидеть в этом списке Arduino Uno. Если рядом с названием стоит желтый кружок или восклицательный знак, щелкните по нему правой кнопкой мыши, чтобы узнать, в чем проблема.
Если система Windows не может найти драйвер устройства для вашей платы, поищите его в папке Arduino, которая содержит все извлеченные установщиком файлы.
Еще одна известная проблема с платой Arduino Uno и портами Windows заключается в том, что среда IDE может не работать, если у вас уже назначено более девяти портов. Такое бывает редко, но если вы столкнетесь с этой проблемой, попробуйте отменить назначение некоторых портов или вручную прописать свободный порт, который имеет известный номер.
Если вы по-прежнему испытываете трудности, перейдите к разделу «Если проблемы остаются» данный главы.
Установка на компьютере Mac
После загрузки установщика IDE найдите созданный компьютером ярлык, дважды щелкните по нему, и вы увидите образ диска, который содержит программное обеспечение Arduino IDE. Вы можете перетащить его в папку Приложения (Applications).
Теперь подключите Arduino к компьютеру с помощью USB-кабеля.
Замечание
Плата получает питание через USB-кабель, поэтому подключать внешний источник к круглому разъему питания на плате Arduino не нужно.
Подождите, пока компьютер идентифицирует плату. Вы должны увидеть, что зеленый светодиод горит постоянно, а желтый мигает. Еще одна расположенная рядом пара светодиодов (они обозначены как ТХ и RX) должна мигать быстро. Они свидетельствуют о том, что данные передаются и поступают.
Если откроется окно с сообщением о том, что обнаружен «новый сетевой интерфейс», нажмите кнопку Настройки сети (Network Preferences), а затем кнопку Применить (Apply). Если плата Arduino Uno обозначена как не настроена (not configured), не обращайте внимания. Закройте это окно.
Дважды щелкните мышью по ярлыку среды Arduino IDE, который вы перетащили в папку Приложения (Applications). Для соединения с платой Arduino Uno вам необходимо выбрать правильный порт. В меню Инструменты (Tools) среды IDE выберите пункт Последовательный порт (Serial Port) и укажите в раскрывающемся списке вариант /dev/cu.usbmodemfal41 (ИЛИ порт с подобным названием).
Если все получилось так, как описано здесь, можете перейти к разделу «Программа Blink».
Если проблемы остаются
Эта книга может переиздаваться без изменений в течение некоторого времени. По крайней мере, я на это надеюсь. А вот программное обеспечение меняется очень часто. Возможно, мои инструкции по установке уже устареют, когда вы будете читать эти строки.
Для каждого нового издания и каждой новой электронной версии этой книги я постараюсь проверить инструкции, чтобы они по возможности были максимально точными. Но вполне возможно, что вы читаете старое издание или старую версию электронной книги.
Что делать? Лучший вариант — зайти на сайт компании Arduino или компании Sparkfun и выполнить процедуру установки, приведенную там. Сайт гораздо проще и быстрее обновить, чем книгу.
Программа Blink
Полагаю, вы уже запустили среду IDE. Ее главное окно должно выглядеть так, как показано на рис. 5.83, хотя в других версиях среды могут быть некоторые отличия.
Рис. 5.83. Окно, которое по умолчанию открывается при запуске среды Arduino Uno
Перед началом работы вы должны проверить, правильно ли среда IDE определила версию платы, которая подключена к компьютеру.
В основном окне среды IDE зайдите в меню Инструменты (Tools), откройте подменю Плата (Board) и убедитесь, что плата Arduino Uno отмечена точкой, как показано на рис. 5.84. Если это не так, щелкните по ней мышью, чтобы выбрать ее.
Теперь вы готовы подавать команды плате Arduino. В верхней части рабочего пространства основного окна среды IDE вы увидите слово sketch («эскиз»), за которым следует текущая дата и буква «а». Что это за «эскиз»? Рисунок, который вы собираетесь нарисовать?
Рис. 5.84. Когда вы используете плату Arduino Uno, она должна быть отмечена точкой в подменю Плата
Нет, в мире Arduino «эскиз» означает то же, что и «программа». Возможно, это вызвано тем, что разработчики не хотели, чтобы людей пугала мысль о необходимости программировать компьютер. Вероятно, подобным же образом и Стив Джобс, когда он был еще жив, ощутил, что пользователи портативных устройств чувствуют себя более комфортно, когда он называет программы приложениями. Возможно, Джобс был прав, но я не думаю, что умельцев так легко напугать. На самом деле, я думаю, что они желают программировать компьютеры. А иначе зачем тогда читать эти строки?
«Эскиз» для среды Arduino означает «программу», однако я буду употреблять слово «программа», потому что именно этим она и является на самом деле, и я испытываю неловкость, называя ее «эскизом». Когда вы читаете информацию в онлайн-источниках, пользователи одинаково часто используют слова «программа» и «эскиз».
Теперь мне необходимо напомнить вам последовательность действий, которой мы будем придерживаться. Вначале вы напишете программу в окне среды IDE. Затем вы скомпилируете ее, выбрав соответствующий пункт меню, чтобы преобразовать текст в инструкции, понятные для микроконтроллера. Затем вы загрузите код программы в плату Arduino, а после этого плата автоматически запустит программу.
Окно среды IDE на моем компьютере по умолчанию содержит некоторый текст, показанный на рис. 5.83. В последующих версиях среды все может быть организовано немного иначе, но принцип останется прежним. Вы увидите какие-либо строки, в начале которых стоят два слеша:
// put your setup code here, to run once.
Это строка комментариев. Она предназначена для людей — объяснить, что происходит в том или ином фрагменте программы.
Замечание
Когда написанная вами программа компилируется для микроконтроллера, компилятор будет игнорировать все строки, начинающиеся символами //.
Следующая строка гласит:
void setup () {
Это строка программного кода, понятная компилятору и микроконтроллеру. Но вам нужно знать, что она означает, потому что в начале каждой программы Arduino должна быть процедура настройки, а я надеюсь, что в будущем вы начнете писать программы самостоятельно.
Слово void говорит компилятору, что эта процедура не будет генерировать какой-либо числовой результат или выдавать значение на выходе.
Конструкция setup() указывает, что следующая процедура должна выполняться только один раз, в самом начале.
Обратите внимание на фигурную скобку { после команды setup().
Внимание!
Каждая законченная последовательность операторов на языке С должна быть заключена между символами { и }.
Поскольку символ { должен всегда сопровождаться символом }, то в открытом окне программы где-то должен быть знак }. Да, он действительно есть, двумя строками ниже. Между этими символами нет ничего, и значит, в этой процедуре нет инструкций. Вы должны будете их написать.
Замечание
Не имеет значения, находятся ли символы { и } на одной или на разных строках. Компилятор Arduino игнорирует разрывы строк и последовательности из двух и более пробелов.
Теперь пришло время написать что-нибудь в пустой строке под сообщением put your setup code here. Попробуйте следующее:
pinMode(13, OUTPUT);
Вы должны ввести команду в точности так. Компилятор не обнаружит опечатки. Кроме того, поскольку язык С чувствителен к регистру, вы должны различать прописные и строчные буквы. Команда pinMode должна быть написана как pinMode, а не как pinmode ИЛИ Pinmode. слово OUTPUT должно быть написано как OUTPUT, а не как output или Output.
pinMode — это команда плате Arduino Uno, сообщающая о том, как использовать один из ее выводов. Этот вывод может либо получать данные как вход, либо отправлять данные как выход. Число 13 — это номер контакта, и если вы осмотрите свою плату, то обнаружите, что один из маленьких разъемов идентифицирован номером 13, рядом с желтым светодиодом. Я выбрал 13-й контакт произвольно.
Точка с запятой указывает на конец инструкции.
Внимание!
В конце каждой команды должна быть точка с запятой. Всегда. Не забывайте об этом!
Теперь перейдем к пустой строке под сообщением, которое гласит:
// put your main code here, to run repeatedly
По наличию двух слешей вы можете догадаться, что это очередной комментарий. Компилятор проигнорирует его. В строках под комментарием наберите такие инструкции:
void loop() {
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(100);
}
Если вы ранее уже имели дело с платой Arduino, то тяжко вздохнете, подумав: «Опять эта проверка мигания светодиодов!» Да, это так, и именно поэтому я назвал данный раздел «Программа Blink». Это программа, которую почти все используют для предварительной проверки (хотя я изменил время задержки по причинам, которые станут ясными далее). Порадуйте меня, набрав эту программу в окне IDE. Очень скоро мы перейдем к более сложным проектам.
Возможно также, вы смутно догадываетесь, что означают некоторые команды.
Команда void означает то же, что и раньше.
Команда loop() — это инструкция, приказывающая плате Arduino повторять какое-либо действие снова и снова. Какое действие? Процедуру, указанную между фигурными скобками.
Команда digitalWrite служит для отправки чего-либо с какого-то контакта. Какого? Я указал 13, потому что его режим был определен ранее.
Замечание
Вы не сможете использовать цифровой вывод, пока заранее не укажете, в каком режиме он должен функционировать.
Что должен сделать этот вывод? Перейти в высокое состояние (HIGH).
В конце инструкции не забудьте точку с запятой.
Команда delay заставляет плату Arduino немного подождать. Сколько? Число 100 означает 100 миллисекунд. В одной секунде 1000 миллисекунд, и поэтому плата Arduino подождет одну десятую секунды. В этот период времени вывод 13 будет оставаться в высоком состоянии.
Думаю, вы сможете догадаться, что означают следующие две строки.
Совсем скоро вы сможете запустить эту программу. Но сначала вернитесь к плате и вставьте выводы светодиода между разъемом 13 и разъемом, обозначенным GND, рядом с ним.
Замечание
Убедитесь в том, что короткий вывод светодиода находится в гнезде GND. Светодиоду не нужен токоограничительный резистор, поскольку тот встроен в разъем 13.
Маленький желтый светодиод на моей плате уже мигал по умолчанию, как только я подключил плату. Светодиод, который я вставил только что, также начинает мигать, поскольку желтый светодиод, который установлен на плате с помощью поверхностного монтажа, тоже подключен к выводу 13.
В первых версиях Arduino Uno встроенный светодиод не начинал мигать при подключении платы. В будущих версиях разработчики Arduino могут отключить это «мигание по умолчанию». В любом случае, это неважно, потому что ваша программа изменит частоту мигания.
Проверка и компилирование
Далее вы должны проверить, не допустили ли вы какую-либо опечатку. В меню Скетч (Sketch) выберите команду Проверить/Компилировать (Verify/Compile), как показано на рис. 5.85. Среда IDE проверит ваш код и выдаст сообщение, если обнаружит какую-то проблему.
Можно проверить, как компилятор реагирует на ошибки. В листинге программы измените pinMode на piMode, а затем выполните команду Проверить/Компилировать (Verify/Compile), чтобы увидеть, что произойдет.
Рис. 5.85. Прежде чем отправлять свою программу на плату Arduino, выполните команду Проверить/Компилировать
В нижней части окна IDE, в черной области, появится сообщение об ошибке. Вы можете растянуть эту область, перетаскивая мышью верхнюю границу так, чтобы можно было без прокрутки увидеть больше двух строк. Сообщение об ошибке, которое получил я, гласит «piMode was not declared in this scope» («переменная piMode не была описана в этой области действия»).
Видите ли, в языке С есть зарезервированные слова и определенные функции, которые имеют особое значение. Пару из них — digitaiWrite и delay — вы уже использовали.
Но переменная piMode не существует ни как зарезервированное слово, ни как определенная функция, и поэтому компилятор сообщает, что вы ее не объявили, чтобы указать, что она собой представляет.
Исправляйте текст вашей программы до тех пор, пока команда Проверить/Компилировать (Verify/Compile) не перестанет находить ошибки.
Загрузка и запуск
Теперь в меню Скетч (Scetch) выберите команду Загрузка (Upload). Лично я всегда представляю, что я переписываю программу с моего большого компьютера на маленький компьютер Arduino, но все называют этот процесс загрузкой, и поэтому будем считать, что так оно и есть.
Если загрузка прошла успешно, то чуть выше черной области сообщений об ошибках вы увидите сообщение Загрузка завершена (Done Uploading).
Если же процесс загрузки слишком долго не завершается — это плохо. Это означает, что по- прежнему есть какие-то проблемы со связью, возможно, потому что конфигурация СОМ-порта настроена неверно. Вернитесь к приведенному ранее разделу поиска и устранения неисправностей для вашего компьютера. Но вначале сохраните программу. В меню Файл (File) выберите команду Сохранить (Save) и введите имя для своей программы. После того как вы исправите проблемы с COM-портом, вы сможете заново загрузить программу, если необходимо, и попробовать снова.
Если все работает как предполагалось, то теперь встроенный светодиод и ваш светодиод быстро мигают — включаются на одну десятую секунды и выключаются на десятую секунды, в соответствии с инструкциями в вашей программе.
Вам может показаться, что после стольких усилий полученное достижение невелико, но мы ведь должны были с чего-то начать, а программирование микроконтроллера обычно начинается с мигания светодиода. В следующем эксперименте вы создадите новую программу, которая делает нечто более полезное.
Кратко подведем итог тому, что вы уже узнали и что необходимо делать для программирования платы Arduino.
• Создайте новую программу (или «эскиз», как его предпочитает называть среда Arduino).
• Выберите в меню Файл (File) пункт Новый (New), если это необходимо.
• Каждая программа должна начинаться с функции задания конфигурации setup о, которая выполняется один раз.
• Прежде чем что-либо делать с каким-либо контактом платы, вы должны объявить его номер и режим работы, используя команду pinMode.
• Для контакта может быть указан режим INPUT (Вход) или OUTPUT (Выход).
• Некоторые номера контактов недопустимы. Посмотрите на вашу плату, чтобы увидеть используемую систему нумерации.
• Каждую функцию или блок программы следует заключать в фигурные скобки. Скобки могут быть расположены на разных строках.
• Компилятор игнорирует разрывы строк и дополнительные пробелы.
• Каждая команда функции или блока должна завершаться точкой с запятой.
• Каждая программа Arduino должна содержать функцию loop (после функции setup), которая будет выполняться неоднократно.
• Команда digitalWrite переводит контакт, который настроен на работу в качестве выхода, в состояние HIGH («высокий» уровень) или LOW («низкий» уровень).
• Команда delay говорит плате Arduino ничего не делать в течение указанного интервала времени в миллисекундах (тысячных долях секунды).
Числа в круглых скобках после команды — это параметры, которые говорят о том, как применять данную команду.
Проверьте программу с помощью команды Проверить/Компилировать (Verify/Compile) в меню Скетч (Sketch), прежде чем загрузить ее в плату Arduino.
Вы должны исправить все ошибки, обнаруженные при проверке/компилировании.
Зарезервированные слова — это набор команд, которые понимает плата Arduino. Вы должны вводить их без ошибок. Заглавные и строчные буквы считаются различными.
После того как вы загрузили программу, она начнет работать автоматически, пока вы не отключите питание платы или не загрузите новую программу.
На плате Arduino Uno рядом с USB-разъемом находится кнопка сброса (тактильный переключатель). Когда вы нажимаете ее, плата Arduino сбрасывает все параметры и перезапускает программу.
Не забывайте сохранять программный код
Когда вы изменяете вашу программу и загружаете ее в микроконтроллер, новая версия будет записана поверх старой. Другими словами, предыдущая программа будет стерта. Если вы не сохранили ее под другим именем на компьютере, она будет утрачена навсегда. Будьте внимательны, когда загружаете модифицированные программы. Сохраняйте каждую версию на компьютере, присвоив ей новое имя, — это разумная мера предосторожности.
После того как инструкции программы будут загружены в микроконтроллер, извлечь их обратно невозможно.
Программирование требует внимания к мелочам
Не знаю, заметили ли вы, что краткая памятка для этого эксперимента оказалась длиннее, чем для всех других экспериментов, где мы работали с отдельными компонентами. При написании программы следует учитывать множество деталей, и вам необходимо все делать предельно аккуратно. Лично мне это нравится, ведь если что-либо сделано безошибочно, то оно будет правильным всегда, и всегда будет работать таким образом. Программы никогда не «изнашиваются». Если вы сохранили их на подходящем носителе, они могут прослужить бесконечно долго. Программы, которые я написал в 80-х годах, теперь спустя 30 лет, будут также работать в окне DOS на моем ПК.
Некоторым людям не по душе скрупулезная работа, они склонны делать опечатки или им не нравятся жесткие требования, которые предъявляет язык программирования (он, например, всегда настаивает, чтобы вы начинали программу с функции setup, даже если у вас нет настройки). Разные люди предпочитают различные аспекты электроники, так и должно быть. Если бы всем хотелось писать программы и никому не нравилось заниматься «железом», то у нас не было бы никаких компьютеров. Какое занятие избрать — решать вам.
Я же продолжу и далее опишу другой эксперимент, в котором плата Arduino функционирует более интересно. Хочу показать вам, как в некоторых случаях микроконтроллер может выполнять задачу проще, чем отдельные компоненты.
Но прежде чем я завершу этот эксперимент, возможно, вам будет интересно узнать, что произойдет, если вы отключите плату Arduino от компьютера.
Вот несколько правил:
• Для работы программы плате Arduino необходимо питание.
• Плате не требуется питание, чтобы хранить программу. Она автоматически сохраняется в микроконтроллере, подобно данным на флэш-носителе.
• Если вы хотите запустить программу, когда плата не соединена с компьютером, то должны подключить источник питания через круглый черный разъем рядом с USB- разъемом на плате.
• Напряжение источника питания может составлять от 7 до 12 В. Его не нужно стабилизировать, потому что плата Arduino снабжена собственным стабилизатором, который превращает входное напряжение в постоянное напряжение 5 В. (Некоторые платы Arduino работают от источника 3,3 В, но не плата Uno.)
• Диаметр разъема источника питания равен 2,1 мм, его центральный вывод положительный. Вы можете купить сетевой адаптер на 9 В с таким разъемом.
• Если вы подадите внешнее питание, когда плата Arduino подключена с помощью USB- кабеля, то она будет автоматически использовать внешний источник питания.
• Вы можете отключить плату Arduino от USB-кабеля в любой момент, не беспокоясь о функции «Безопасного удаления оборудования» , которая присутствует в некоторых версиях ОС Windows.
Разновидности микроконтроллеров
На заводах и в лабораториях многие процессы повторяются. Датчики температуры могут управлять нагревательным прибором. Датчик оборотов может регулировать скорость вращения электродвигателя. Микроконтроллеры идеальны для таких однообразных задач.
Компания General Instrument представила один из первых микроконтроллеров в 1976 году и назвала его PIC — Programmable Intelligent Computer (Программируемый интеллектуальный компьютер) или Programmable Interface Controller (Программируемый контроллер интерфейса), в зависимости от того, какому историческому источнику вы доверяете больше. В дальнейшем General Instrument продала бренд PIC другой компании, Microchip Technology, которая владеет им по сей день.
Плата Arduino основана на микроконтроллерах Atmel, но PIC-контроллеры по-прежнему являются альтернативным вариантом. Существует упрощенная учебная версия таких контроллеров, лицензированная компанией Revolution Education Ltd. Они назвали свой модельный ряд микросхем PICAXE без каких-либо видимых рациональных причин, наверное, решив, что такое название красиво звучит.
Микроконтроллеры PICAXE поставляются с собственной средой IDE, в которой принят другой язык программирования — BASIC. В некоторых случаях он проще, чем С. Другая серия микроконтроллеров, BASIC Stamp, также использует язык BASIC с дополнительными, более функциональными командами.
Если вы поищете микроконтроллеры PICAXE на сайте Wikipedia, то найдете очень подробную информацию обо всех их возможностях.
Я полагаю, что это более понятное описание, чем на официальном сайте компании.
В отличие от платы Arduino вам не придется покупать специальную плату для программирования микросхем PICAXE. Все, что вам нужно — это специальный USB-кабель, помимо соответствующего программного обеспечения, которое вы можете скачать бесплатно.
Первое издание моей книги содержит некоторую вводную информацию о продукции PICAXE. Если вам интересно, то вы можете обратиться к этой книге.
Микроконтроллеры: «за» и «против»
Теперь, когда вы изучили некоторые основы, мне необходимо привести аргументы, которые могут повлиять на ваше решение о том, использовать ли микроконтроллер в каком-либо проекте или нет.
Долговечность
Для флэш-памяти, которая хранит программу в микроконтроллере ATmega328, производитель гарантирует 10 000 операций чтения-записи с автоматической блокировкой испорченных ячеек памяти. Это число кажется довольно большим, и мы можем надеяться, что микроконтроллер прослужит нам очень долго. Тем не менее, мы пока достоверно не знаем, такой же ли у них срок службы, как у старых логических микросхем, которые продолжают работать спустя 40 лет после их производства. Имеет ли это значение? Решать вам.
Моральный износ
Микроконтроллеры, как и технологии программирования, развиваются очень быстро. Когда я готовил первое издание этой книги, плата Arduino была сравнительно новой, а ее будущее — неопределенным. Теперь она доминирует в области любительской электроники, но как изменится ситуация через пять лет? Никто не знает. Например, продукт Raspberry Pi представляет собой целый компьютер в одной микросхеме. Никто не может предсказать, придет ли он или что-то еще на смену плате Arduino.
Даже если плата Arduino останется самым распространенным вариантом, уже появляются новые версии оборудования и обновления среды IDE, которые следует учитывать при программировании микросхемы. Так или иначе, вы должны быть в курсе разработок в этой области и можете даже отказаться от одного бренда микроконтроллеров и переключиться на другой.
Для сравнения: в большинстве случаев дискретные компоненты, предназначенные для установки в монтажные отверстия, уже достигли пределов своего развития. Некоторые новые элементы, например поворотные энкодеры или миниатюрные матричные жидкокристаллические и светодиодные дисплеи, появились сравнительно недавно. Тем не менее, большинство из новых продуктов создано для совместной работы с микроконтроллерами. В старом добром мире транзисторов, диодов, конденсаторов, логических микросхем и микросхем-усилителей, знания, которые вы приобрели сейчас, будут актуальны еще с десяток лет.
Микроконтроллеру необходимы внешние компоненты
Последний и возможно самый важный аргумент: микроконтроллеры не работают сами по себе. В схеме всегда есть какие-либо другие компоненты, даже если это просто переключатель, резистор или светодиод, причем они должны быть совместимы со входами и с выходами микроконтроллера.
По этой причине, чтобы на практике применить микроконтроллер, вы по-прежнему должны знать основы электроники. Вы должны усвоить такие базовые понятия, как напряжение, сила тока, сопротивление, емкость и индуктивность. Возможно, вам следует узнать о транзисторах, диодах, алфавитно-цифровых дисплеях, булевой логике и других компонентах, о которых я рассказывал в этой книге. И если вы намерены создавать прототипы и завершенные устройства, то вам по-прежнему необходимо знать, как пользоваться макетной платой и паяльником.
С учетом всего этого, резюмируем плюсы и минусы.
Преимущества дискретных компонентов
• Простота.
• Немедленные результаты.
• Нет необходимости в языках программирования.
• Низкая стоимость для несложных устройств.
• Устоявшиеся технологии применения.
• Лучше подходят для аналогового применения, например, для аудио.
• По-прежнему необходимы в схемах с микроконтроллерами.
Недостатки дискретных компонентов
• Способность выполнять только одну функцию.
• Трудности при разработке устройств, выполняющих сложные логические функции.
• Сложности при масштабировании. Большие схемы трудно собрать.
• Изменения в схеме могут оказаться сложными или даже невозможными.
• С ростом числа компонентов в схеме увеличивается энергопотребление.
Преимущества микроконтроллеров
• Исключительно универсальны, способны выполнять множество функций.
• Легкость при расширении или при изменении схемы (просто перепишите программный код).
• Обширные бесплатные интернет-библиотеки приложений.
• Идеальны для приложений, включающих сложную логику.
Недостатки микроконтроллеров
• Довольно дороги для применения в небольших схемах.
• Требуют основательных навыков программирования.
• Процесс разработки занимает много времени: создание кода, его проверка и исправление ошибок, переустановка — все это помимо выявления и устранения неисправностей компонентов схемы.
• Стремительно развивающиеся технологии требуют непрерывного обучения.
• Каждый микроконтроллер имеет индивидуальные нюансы и особенности, которые необходимо изучить и помнить.
• Большая сложность означает более высокую вероятность появления неисправностей.
• Необходим стационарный компьютер или ноутбук, а также хранилище данных для программ. Информация может быть случайно утрачена.
• Необходим стабилизированный источник питания (обычно 5 или 3,3 В постоянного тока), как для логических микросхем. Величина выходного сигнала ограничена — 40 мА или меньше. Невозможность приводить в действие реле или динамик подобно таймеру 555. Если вам требуется большая мощность, следует предусмотреть дополнительную управляющую микросхему.
Подведение итогов
Теперь я готов ответить на вопрос: «Что следует предпочесть — микроконтроллеры или традиционные дискретные компоненты?»
Мой ответ таков: вам понадобится и то, и другое. Именно поэтому я включил микроконтроллеры в книгу, которая в основном рассказывает о дискретных электронных компонентах.
В следующем эксперименте я покажу, как датчик и микроконтроллер могут работать совместно.