- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF100-101:Arduino
Материал из Linuxformat.
- Свободная электроника
Содержание |
Программировать оборудование? Легко!
Arduino |
---|
|
- Все бывалые линуксоиды умеют писать софт, но чтобы программировать «железо», нужна большая любовь к компьютеру. Мы покажем, с чего начать...
Arduino крут. Крут, поскольку это миниатюрное устройство — примерно три на два дюйма [7x5 см] — имеет порт USB и программируемый чип. Он крут, потому что его можно запрограммировать, используя очень простой язык под названием Wiring. Но главное, вся документация производителя доступна по лицензии Creative Commons, и вы можете собрать устройство сами, если захотите. Правда, для большинства людей это, вероятно, все-таки экстрим, и поэтому продаются также готовые платы Arduino — причем по очень низкой цене. IDE для программирования Arduino доступна по лицензии GPL для множества платформ, и единственное, что стоит между вами и любезным вашему сердцу «железным» проектом — это плата Arduino, клевая идея и кое-какие мелкие детали, аккуратно втыкаемые в Arduino, чтобы сделать его гораздо более интересным.
Пожалуйста, учтите, что электронные компоненты очень чувствительны: статическое электричество может быть смертельно для вашего Arduino и других крошечных компьютерных частей, так что не шаркайте ногами и носите антистатический браслет. А также помните, что электронные компоненты могут, в свою очередь, быть опасны для вас — они часто содержат свинец, поэтому тщательно мойте руки после работы с вашим прибором!
Приступим к установке
Платы Arduino доступны в нескольких вариантах, но основные три – Arduino NG (“next generation” – «новое поколение»), Arduino NG Plus и Arduino Diecimila. Это не платы-конкуренты – NG появилась первой, потом ее сменила NG Plus, а за ней вышла Diecimila. Мы пользуемся NG, потому что купили ее давно, но сейчас при попытке приобрести ее вы обнаружите только Diecimila. В принципе, различия между этими платами минимальны: на NG Plus установлен процессор Atmega168, на NG – ATmega8, а Diecimila незначительно улучшена для более простой загрузки программ. Чипы ATmega8 и ATmega168 очень похожи; основное отличие в том, что в 168 больше места для программ, но для целей нашего урока это не станет проблемой – подойдет любая из трех.
Где взять плату Arduino? Рекомендуем PCB Europe (http://pcb-europe.net) – у них есть в продаже Diecimila за 22 евро (на момент написания статьи), и они с радостью ответят на вопросы, если вы не знаете точно, что вы хотите. [А в России вы можете заказать Arduino например здесь: http://www.linuxcenter.ru/shop/embedded/arduino/]
Теперь перейдем к вопросам посложнее: что втыкать в ваш Arduino? Сама плата имеет 14 цифровых разъемов и 6 аналоговых, а также встроенный светодиод и кнопку сброса, и нужно докупить дополнительные детали, чтобы что-то создать. Если вы из США, то, возможно, недалеко от вас есть магазин Radio Shack, где имеются наготове залежи прикольных штучек – просто подойдите к одному из продавцов, объясните ему, что вы пытаетесь сделать свой первый электронный проект, и уйдете с полной корзиной товаров долларов этак на 30. Если вы из Великобритании, то лучшее место разместить заказ на нужные детали – www.maplin.co.uk; также рекомендую прихватить у них один из чудесных наборов Lucky Bags. Поразительно, сколько идей может подсказать случайная смесь деталей! Вне США и Великобритании, либо поищите хороший магазин электроники в вашей стране (говоря «электроника», мы не имеем в виду «продажа iPod»!), либо обрати- тесь в PCB Europe и купите один из комплектов деталей к Arduino.
Так или иначе, вот необходимый минимум деталей для нашего урока про Arduino:
- Макетная плата для сборки без пайки. Обычно это прямоугольник из белого пластика, со множеством отверстий, позволяющих прикрепить детали и соединить их электрически.
- Несколько проводков-перемычек. Можно накупить их разной длины, или нарезать самим – без разницы.
- USB-кабель Type A — Type B. Говоря по-человечески, это обычный соединительный кабель USB: на одном конце плоский, на другом почти квадратный.
- Несколько светодиодов. Лучше – разных цветов!
- Резисторы разных номиналов. Сопротивления более 10 кОм не понадобятся, но стоят они копейки, поэтому можете набрать всяких.
- Потенциометр.
- Фоторезистор.
Вы уложитесь при покупке вышеперечисленного в сумму менее 500 рублей, и даже еще останется, так что не бойтесь набрать лишнего – потом пригодится!
Мигалка
Первое, что делают в любом программистском проекте – аппаратном или каком еще – обычно нечто вроде “hello world”: программу заставляют выдать во внешний мир простое сообщение, чтобы убедиться в правильности конфигурации.
В Arduino встроено несколько светодиодов – есть, например, TX- и RX-светодиоды, мигающие при передаче и приеме данных. Мы воспользуемся специальными тестовыми светодиодами: они покажут, что плата нормально работает. Заставить Arduino работать под Linux придется хитростью, потому что она требует Java – причем официальной Java от Sun, клонов она не признает. Если у вас Ubuntu, подключитесь к репозиторию Multiverse, затем установите пакеты un-java5-jre, gcc-avr и avr-libc. Многие пользователи имеют проблемы из-за конфликта Arduino с поддержкой на клавиатуре системы Брайля; если она вам не нужна, сперва удалите пакет brltty – а если вы вставили плату Arduino при установленном brltty, выньте ее и воткните уже после удаления пакета. Установив программное обеспечение, запустите sudo update-alternatives --config java и выберите номер официальной Java от Sun. Этого должно быть достаточно, чтобы все заработало.
Если у вас не Ubuntu и не другая система на базе Debian, то вам опять же потребуются Java от Sun, gcc-avr и avr-libc, но зато в таких дистрибутивах, скорее всего, не придется беспокоиться об update-alternatives.
Мы включили IDE Arduino на DVD этого месяца – распакуйте ее на ваш рабочий стол и запустите команду arduino. При наличии проблем попробуйте запустить ее из терминала и посмотреть сообщения об ошибках. Запуская IDE впервые, вы должны будете ответить на вопрос о месте сохранения ваших программ – поддиректория в вашем домашнем каталоге вполне подойдет.
Итак, ПО для Arduino установлено; теперь подключим Arduino к компьютеру через USB-кабель. Если плата работает нормально, светодиод PWR (power, питание) будет гореть, а тестовый диод – мигать, показывая, что на плате все в порядке.
В редакторе Arduino зайдите в File > New для ввода нового кода. Файлы кода в Ардуинии называются “sketches” («наброски»), и с ними очень легко начать работать. Начнем мы с простого проекта: будем переключать светодиод из ВКЛ в ВЫКЛ, и я хочу показать вам код и убедиться, что он работает, а потом разобраться, как он работает.
Вот этот «набросок»:
int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(300); digitalWrite(ledPin, LOW); delay(100); }
Теперь идем в Tools > Microcontroller и выбираем либо atmega8 (если у вас ArduinoNG), либо atmega168 (если у вас Diecimila). Если вы этого толком не знаете, пропустите данный шаг – Arduino определит процессор при подключении и выдаст ошибку, если обнаружит неправильный. Получив сообщение об ошибке, просто смените опцию! Когда процессор сконфигурируется, зайдите в Tools > Serial Port; вы увидите список возможных USB-устройств. В Linux, вероятно, надо будет выбрать /dev/ttyUSB0.
ОК, настройка закончена – пора выгружать ваш «набросок» на плату! В панели меню IDE, вы можете увидеть иконку со стрелкой вправо – это кнопка Upload [Выгрузка]. Для Diecimila вам достаточно нажать на кнопку прямо сейчас, и программа будет выгружена. В противном случае сперва нужно нажать на маленькую кнопку сброса на плате Arduino, подготовив ее к принятию нового «наброска», а затем нажать кнопку выгрузки. Светодиоды TX и RX секунду поморгают, затем секунд пять ничего не будет происходить (Arduino ждет, не поступят ли дальнейшие инструкции), и наконец ваш тестовый диод должен начать мигать. Заработало!
С этим маленьким проектом вы можете шагнуть дальше. Возьмите из набора светодиод и подключите его к цифровому контакту 13. Если вы раньше со светодиодами не работали, хорошенько рассмотрите его перед установкой: у него две ножки, причем разной длины, и одна сторона цветного пластикового ободка плоская. Таким образом указывается полярность: ножка покороче и плоский обод – это «минус». Подключая ваш светодиод к плате Arduino, убедитесь, что плюсовая ножка подключена к контакту 13, а минусовая – к Gnd (ground, земля), и если все будет нормально, вы увидите, как он мигает в такт тестовому светодиоду. Ошиблись – ничего страшного, просто побыстрее выдерните светодиод!
Как работает код
Теперь, когда плата Arduino работает правильно, объясню вам, как работает код, чтобы вы сами могли его модифицировать:
- int ledPin = 13' описывает переменную ledPin типа integer (целое число – ну, то есть, не вида 3,1) и присваивает ей начальное значение 13.
- setup() – функция по умолчанию в Arduino. Она вызывается при запуске вашей программы, чтобы вы могли задать начальную конфигурацию.
- pinMode(ledPin, OUTPUT) сообщает Arduino, что вы хотите посылать данные на контакт 13, а не считывать их.
- loop() – еще одна функция по умолчанию Arduino: она вызвается всякий раз, когда процессор ищет, что бы ему еще сделать.
- digitalWrite(ledPin, HIGH) означает «послать значение HIGH на контакт 13»; HIGH – эквивалент двоичной единицы против двоичного 0, оно же – «ВКЛ», в отличие от «ВЫКЛ». Это включает светодиод.
- delay(300) заставляет процессор сделать паузу в 300 миллисекунд, т..е. примерно на треть секунды.
- digitalWrite(ledPin, LOW) выключает светодиод.
- delay(100) заставляет процессор ждать одну десятую секунды.
Вот и все! Функция loop() вызывается с частотой, равной частоте работы процессора, а вызовы delay() вставлены, чтоб разрешить процессору периодически перевести дух – иначе светодиод будет мигать так часто, что глазу не уследить, и покажется, что он всегда включен! Помните, что на большинство светодиодов насажена маленькая линза, фокусирующая их свет – ярче всего такой светодиод выглядит, если взглянуть на него сверху.
Использование макетной платы
Макетная плата имеет металлические дорожки, спрятанные под отверстиями и соединяющие ряды контактов в электрическую цепь. Колонки не соединены, поэтому горизонтальных контактов нет – есть только вертикальные. Если у вас полномерная макетная плата типа нашей, то на ней между рядов имеется просвет. Ряды по краям просвета тоже не соединены между собой. Рассмотрим на примере, как это работает: модифицируем простую светодиодную систему введением макетной платы и двух проводов. В моей плате колонки пронумерованы с 1 до 60, а ряды обозначены буквами от A до J, как показано на фото на стр. 56, и я воспользуюсь этими обозначениями для указания, куда втыкать провода. Если у вас таких обозначений нет, мои все равно вам помогут, подсказав, где ряд, а где колонка, а больше нам ничего и не надо.
Итак, для перенесения проекта «мигалки» на макетную плату, соедините проводом Gnd с J33, а другим проводом – Digital 13 c J32. Это подводит ток к контактам I33 и I32, H33 и H32, G33 и G32, F33 и F32. Моя плата имеет просвет между рядами F и E, поэтому E32 и E33 не входят в схему. Теперь вам осталось только поместить ваш светодиод на правильное место, чтобы замкнуть цепь; по-вашему, это куда?
Если вы не страдаете схемобоязнью, можете просто тыкать в контакты, пока светодиод не загорится – «методом тыка» вы много чего изучите, и это очень забавно, поверьте! В данном примере, светодиод загорится в позиции F33 (минус, короткая ножка) и F32 (плюс, длинная ножка); то же произойдет при помещении его в колонки G, H или I.
Попробуем сделать что-нибудь еще: с другой стороны платы Arduino находятся аналоговые входные контакты Analog In, а также несколько помеченных как Power. Ток в них будет побольше – заметили на одном из них отметку 5V, а на втором 9V? Это, между прочим, вольты; при таком напряжении нужна осторожность – подав на светодиод слишком много, вы его спалите. Если вы приволокли мешок светодиодов, беда невелика; но вдруг у вас их только три-четыре, и они последние! К слову, вполне безопасно подсоединить их на пару секунд, просто чтобы убедиться, что они работают. Пожалуйста, сделайте это сейчас: отключите Arduino от питания, затем соедините 5V с J33, а Gnd рядом с 5V – с J32. Потом на секунду включите плату: ваш светодиод ярко засветится (а заодно и нагреется!). Убедившись, что он работает, отключите USB-кабель, чтобы светодиод погас.
Перейдем к более сложной задаче: я хочу познакомить вас с резистором. Сия маленькая деталь задает падение напряжения, в зависимости от своего номинала сопротивления. Номинал изображен маленькими цветными полосками на корпусе резистора, но простым смертным тут ловить нечего – лучше держать под рукой шпаргалку, разъясняющую, что какие полоски означают. Теперь соедините 5V с J38 – так, чтобы светодиод не был подключен к питанию. Для замыкания цепи соедините резистором I38 и J33, и вы снова увидите свечение светодиода – но чуть тусклее. Если цветные коды резисторов для вас китайская грамота, попробуйте поочередно вставлять разные резисторы и рассортируйте их по яркости свечения светодиода!
Чтение ввода
В фирменном комплекте деталей имеется фотоэлемент – датчик, возвращающий различные значения в зависимости от падающего на него света. Потребуется чуть больше проводов, дополнительный вызов функции, а также условный оператор, но на самом деле не так все сложно – и стоит затраченных усилий: ведь вы напишете код, благодаря которому Arduino сможет ориентироваться в своей среде! Моя макетная плата снабжена двумя специальными дорожками, помещенными ради удобства подвода питания, но я ими пользоваться не буду, потому что платы поменьше не всегда обладают подобной роскошью.
Сперва поместите ваш фотоэлемент на макетную плату. Я воткнул
его в F34 и F37. Поместите мощный резистор в G34 и соедините его с I29, затем соедините проводом J29 и 5V – это подаст питание на фотоэлемент. Необходимо также соединить проводом G37 и контакт Gnd рядом с 5V, для замыкания электрической цепи. Чтобы считать данные с фотоэлемента, соедините другим проводом H34 с Analog 0, и ваша система готова для программирования!
«Набросок» для чтения данных с аналогового входа в Arduino очень прост: вам необходимо указать, с какого контакта вы будете брать данные фотоэлемента, а также сохранить эти данные. Тут пригодится функция analogRead(), возвращающая значение, которое вы можете использовать для работы. В виде «наброска» это выглядит так:
int ledPin = 13; int lgtPin = 0; int lgtVal = 0; void setup() { pinMode(ledPin, OUTPUT); } void loop() { lgtVal = analogRead(lgtPin); digitalWrite(ledPin, HIGH); delay(lgtVal); digitalWrite(ledPin, LOW); delay(lgtVal); }
Как вы думаете, что этот «набросок» должен делать? Если вы не уверены, попробуйте разобраться, загрузив его в вашу плату и прикрывая/открывая фотоэлемент!
Дерзать дальше...
Если вы раздобыли потенциометр, то заставить ваш фотоэлемент работать будет особенно легко: ваш провод от Analog 0 необходимо соединить со средней ножкой потенциометра; провод от Ground – с левой ножкой; а провод к питанию (через резистор) – с правой ножкой. Убедитесь, что потенциометр плотно вставлен в макетную плату – ножки у них обычно более толстые, так что придется на него поднажать!
Конечно, это только беглый обзор возможностей Arduino, и все потому, что настоящая магия заключается в программах, которые вы напишете. Мы показали вам, как собрать схему для чтения и записи данных, и следующий вопрос такой: что вы будете с ней делать? LXF