Показаны сообщения с ярлыком Начинающим. Показать все сообщения
Показаны сообщения с ярлыком Начинающим. Показать все сообщения

09.05.2014

Книжная полка

Недавно издательство БХВ порадовало нас книгой Виктора Петина "Проекты с использованием контроллера Arduino"



К сожалению, полноценной рецензии выдать не могу, доступно только оглавление:
  • краткий обзор плат Arduino;
  • описание всех операторов языка Wiring;
  • описание встроенной библиотеки Serial;
  • описание встроенной библиотеки LiquidCrystal и даже пара слов про LiquidCrystalRus;
  • описание встроенных библиотек EEPROM, Ethernet, OneWire, SD, Stepper;
  • разбор подключения мыши и клавиатуры PS/2 - библиотека ps2dev;
  • работа с датчиками iButton, DS18B20, DHT11 и DHT12;
  • подключение к светодиодным матрицам;
  • примеры стыковки с RFID-приемниками, купюроприемниками, датчиками расстояния HC-SR04;
  • освещается вопрос обмена данными с помощью ИК, в том числе различные типы кодирования;
  • работа с ходовой частью робота через микросхему L293D;
  • использование приемопередатчика Bluetooth HC-05, а также NRF24L01 с помощью библиотеки Mirf;
  • вывод на экран телевизора с помощью библиотеки TVOut, с примерами игровых программ;
  • работа с USB через USB Host Shield;
  • немного про ROS (распределенная операционная система для роботов) и X10 (умный дом).
Приятно, что книги про Arduino на русском все-таки выходят - даже оглавление само по себе указывает путь к практическим решениям. Я специально сопроводил его ссылками на соответствующие статьи (в первую очередь на русском языке).

Будет ли достаточно этой книги именно для вашего проекта? Лично я ожидал хоть что-то про использование Arduino Due и Leonardo (они упоминаются в обзоре), изменение прошивок ATmega16u2 (на последних Uno и Mega), про использование программатора - в реальности рано или поздно этот вопрос возникает (хотя на тему программирования ATMEL недостатка в литературе нет, например книга Ревича). Стоило бы посвятить больше места шилд-платам.... Хотя, стоп! Надо сказать автору "большое спасибо" уже за это издание (лучшее "спасибо" - это легально купленный экземпляр книги, особенно если хотите продолжения ;).

Если кто-то прочел и хочет оставить отзыв - милости прошу в комменты, расскажите ;) Еще лучше, если будет сравнение с предыдущей книгой Соммера.

А примеры из книги можно скачать здесь.

25.12.2012

IR-приемник на Arduino

Когда ваше устройство на основе Arduino переходит из фазы прототипизации в реальную жизнь, часто возникают вопросы типа "надо делать корпус" - и все из-за того, что отлично работающие под уютной настольной лампой, от лабораторного источника питания устройства могут не пережить и одной попытки использования в руках ребенка или "отчаянной" домохозяйки. Да я уж и не говорю о рассеянных авторах! ;)

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


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


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




Стоит запомнить, пожалуй, единственный принципиальный момент - от того, насколько соответствуют частоты пульта и приемника, зависит дальность приема. Иными словами, если излучение модулировано частотой 38 кГц, а фотоприемник по спецификации рассчитан на 36 кГц - все равно будет работать, только придется ближе подходить ;) Выглядят подобные устройства, например, так:



Подключить фотоприемник к Arduino можно с минимальным комплектом деталей:



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

В качестве библиотеки можно взять вариант от Ken Shirriff,  который не только поддерживает форматы NEC, SIRC, RC5, RC6, но и может принимать вообще "сырые" посылки, ни к одному известному коду не относящиеся (и умеет еще много другого, конечно же ;)

Первым делом надо загрузить в Arduino тестовый скетч IRecvDemo и решительно испытать на нем все необходимые кнопки вашего ИК-пульта, просматривая результат в окне Serial Monitor-а:

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}


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

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

Не забудьте также посмотреть самое лучшее в инете описание IR-кодов на страницах SB Projects.

17.05.2012

Вторая книга по Arduino на русском



Скоро нас ожидает выход Getting Started with Arduino на русском языке - самой первой книги про Arduino, автором которой является сам Massimo, в переводе Михаила Райтмана (судя по отзывам, его переводы выполнены довольно качественно).

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

В русском переводе книга приобрела название "Arduino для начинающих  волшебников". Есть пара смутивших меня моментов - изменена оригинальная обложка и убрана ссылка на издательство O'Relly (интересно, Тим в курсе?) - и это при полном (!) дублировании оглавления (интересно, Массимо в курсе? ;) 

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

25.11.2011

Книга про Arduino на русском

Спешу поделиться хорошей новостью: издательства наконец-то заинтересовались темой Arduino и выпустили перевод Соммерса (отличилось питерское издательство BHV):



Книгу в руках пока не держал, но доступен небольшой фрагмент в виде PDF (только оглавление и введение). Его хватает, чтобы оценить объем рассмотренных вопросов, но, к сожалению, недостаточно для понимания качества и полноты изложения. Тем не менее, уже сейчас Программирование микроконтроллерных Плат Arduino/Freeduino можно купить:
Если кто-то уже может поделиться впечатлениями - милости прошу в комменты.

05.06.2011

ElectroDroid

Уважаемый Vergellan поделился со мной ссылкой на программу для Android - ElectroDroid.
Твердые пять звезд, что неудивительно, потому что эта программа-справочник умеет довольно много:

  • Цветовая кодировка резисторов (3-6 полос);
  • Цветовая кодировка дросселей;
  • Закон Ома;
  • Расчёт реактивного сопротивления;
  • Делитель напряжения;
  • Сопротивление резисторов в последовательном и параллельном включении;
  • Расчёт заряда конденсатора;
  • Операционный усилитель;
  • Ограничительный резистор для светодиода;
  • Расчёт LM317;
  • Тепловой режим;
  • Расчёт времени работы батареи;
  • Расчёт катушки индуктивности (только в платной версии);
  • Расчёт падения напряжения;
  • Расчёт ширины дорожек печатной платы;
  • Расчёт простых фильтров;
  • Расчёт таймера NE555;
  • Цоколёвка разъёмов (USB, serial, parallel, ethernet, SCART, DVI, HDMI, S-Video, VGA, FireWire, Jack, XLR, RCA, DMX, ATX, Molex, EIDE, SATA);
  • Справочники (Таблица сопротивлений; Таблица стандартных резисторов и конденсаторов; Маркировка конденсаторов; AWG, SWG размеры проводов; Таблица ампеража; Символы и сокращения; Условные графические обозначения; Приставки системы СИ; Информация о батарейках; Теоремы двоичной логики и алгебры; Информация о микросхемах 7400 серии; Кодировка ASCII);
  • Полная поддержка EIA рядов резисторов во всех расчётах;
  • ...и многое другое!


10.01.2011

Как заЛУТить из Eagle?

Публикуемые мной под лицензией CC-SA схемы и рисунки печатных плат обязательно содержит внутри файлы с расширениями .sch и .brd - результат работы CAD-системы Eagle. Пользующаяся большой популярностью за рубежом, эта система почти не прижилась в России - у нас предпочитают KiCAD, Sprint Layout или P-CAD. Не вдаваясь в религиозные споры о преимуществах того или иного пакета, хочу дать внятное практическое руководство, как использовать Eagle для ЛУТ.

Итак, есть готовый .brd-файл с разводкой под одностороннюю печатную плату для выводных элементов, требуется перевести его в бумажный вид  - распечатать на бумаге для ЛУТ.

Получение и установка Eagle

Не надо искать никаких краков и серийников - есть совершенно бесплатная версия Eagle, имеющая небольшие ограничения. Весь фокус в том, что для наших целей они  несущественны, но, на всякий случай: размер платы, которую можно редактировать бесплатной версией не должен превышать 100 х 80 мм, иметь более двух слоев и более одного листа со схемой. При этом открывать и просматривать можно хоть шестислойные платы со схемами на десятке листов. Поддерживаются Windows, Linuх и Mac OS.

Установка довольно примитивна, если не собираетесь рисовать схемы и разводить платы - вдаваться в нее на данном этапе нет смысла.

Выбор слоев

Откройте .brd-файл командой File | Open | Board из основного окна:



Обычно, схема и разводка должны быть синхронизированы, поэтому может открыться и окно со схемой (если вы позаботились положить в тот же каталог файл .sch). Нас изначально будет волновать лишь окно с разводкой - то, у которого заголовок начинается с Board. Распахните окно пошире, чтобы внимательно изучить то, что нам досталось от заботливого разработчика Open Hardware. 



Разводка платы состоит из набора слоев. Стандартных слоев довольно много, вдобавок можно создавать свои собственные. Отображать их на экране одновременно не всегда удобно, но для первого знакомства с чужой разработкой следует сначала увидеть всю картину целиком. Включите все слои: File | View | Display/hide layers (в окне кнопка All или Ctrl-A).

Чего только не рисуют на этих слоях! Тут тебе и документация, и копирайты авторов, и диаметры отверстий... Важно отсечь ненужное (с) Микеланджело. 

А что, собственно, нужно? Для ЛУТ нам потребуются следующие слои:
  • Bottom (16) - именно на нем (по умолчанию синим цветом) рисуют дорожки для односторонних плат;
  • Pads (17) - посадочные площадки для выводных элементов;
  • Vias (18) - переходные отверстия между слоями (для однослойных плат - место пайки перемычек);
  • Dimension (20) - контур платы.
(все слои пронумерованы - для стандартных  можно смело пользоваться вместо названий номерами)

В большинстве случаев, этого набора достаточно. 

Перед отключением лишнего, советую присмотреться повнимательней - возможно, на плату нанесен какой-нибудь дополнительный текст, который должен быть вытравлен на медном слое. Это может быть дополнительный пользовательский слой, с номером от 100 и выше. Например, на плате Arduino Severino заботливый Эдилсон Акаши нанес номера пинов Arduino и поместил их в слой "CopperText". Если сомневаетесь, попробуйте включать и выключать разные слои и посмотреть на результат. Имейте ввиду, что рисунки слоев не должны пересекаться, иначе получите вместо правильного рисунка печатных проводников один сплошной брак. Поэтому, в случае любых сомнений - вращайте колесико мыши для увеличения масштаба или нажимайте F3/F4 (через меню - View | Zoom in и View | Zoom Out).

Замечание по поводу визуализации: когда вы рассматриваете плату в окне Board Editor, вы смотрите на нее так, как смотрели бы на настоящую плату, если бы текстолит был прозрачный. Поэтому, слой Top вы видите в точности так же, как и в реальной жизни, а вот Bottom - в зеркальном отображении. 

CAM-процессор 

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

Выполните команду File | CAM Processor, появится его окно:


Сперва надо выбрать целевой формат. Я предпочитаю eps (enhanced post script) - векторный формат, известный практически всем графическим редакторам. К тому же, в нем содержится информация о размере изображения, что крайне важно: если в итоге масштаб отпечатка не будет 1:1, это тоже будет практически верный брак. 

Обязательно выберите имя файла, в поле Scale должна быть единица.

Отключите все слои, затем включите Bottom, Pads, Vias, Dimension и дополнительные (если вы их все-таки обнаружили на предыдущем шаге). 

В группе Style проверьте, что:
  • очищен флажок Mirror
  • очищен флажок Fill pads
Теперь отважно жмите кнопку "Process Job". Eagle может выругаться и на то, что некоторых слоев "не положено, а они положены" (с) анек; что он, бедный, потратит много времени на такую-то фигуру, и т.п. Игнорируйте это нытье - нам же ЛУТить надо, а он про это даже не догадывается.

Отпечаток

Для подготовки отпечатка потребуется любой графический редактор - одинаково хорошо подойдут и PhotoShop, и GIMP. Откройте полученный на предыдущих шагах файл, предварительно пояснив редактору, что:

  • требуется черно-белая палитра цветов;
  • разрешение - 600 dpi
Этим вы сэкономите энное количество памяти своего компьютера и драматически ускорите обработку. Хотя, если ваш принтер способен на большее, чем 600 dpi - можете установить и больше, но смысл это делать имеет только при наличии SSOP и TQFP корпусов в схеме - т.е. таких, где ножки тоненькие и расстояние между ними - крошечное. Для старого доброго PDIP это будет излишеством.

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

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

Кстати, проверить, что все получилось в нужном масштабе - несложно. Для этого надо вернуться в Eagle и сделать следующее:
  1. Переключиться с вражеских дюймов и милов в нашенские сантиметры и миллиметры. В командной строке наберите: "GRID mm 0.01";
  2. Для простоты, отключить все слои, кроме Dimension;
  3. Перейти в режим получения информации (Show object properties);
  4. Открывать свойства интересующих линий границы и сравнивать с тем, что говорит линейка, приложенная к отпечатку. 

Все хорошо? Тогда заряжайте глянцевую плотную фотобумагу и печатайте - только не забудьте установить тип бумаги "Card Stock" или что-то в этом духе, ибо бумага будет - толстая. 

Маркировка

Хорошо, если плата небольшая или вы уже выстрадали каждый миллиметр при разводке. Но в суровой реальности подсказки в виде маркировки противоположной стороны помогут избежать глупых ошибок при установке элементов. К сожалению, редко кто применяет самодельную маску - поэтому поясняющие надписи наносят только на противоположный (неомедненный) слой при помощи того же ЛУТ - только не травят ;)

Для создания "лицевой" стороны односторонней печатной платы, надо выполнить предыдущие шаги, но с другим набором слоев. Нам потребуются:

  • Dimension - чтобы не промахнуться, орудуя ножницами;
  • Holes - монтажные отверстия (не путать с отверстиями для выводов элементов);
  • tPlace - контурный слой элементов с лицевой (Top) стороны;
  • tNames - слой названий элементов (типа R1, C10 и т.п.);
  • tValues - слой со значениями номиналов (10К, 100 нФ и т.п.);
  • tDocu - слой документирования (функциональный смысл джамперов, названия сигналов - обычно на плате не печатается, но может пригодиться); 
  • Top - верхний слой, для односторонней платы полезен, если есть перемычки.
Быть может, какие-то из надписей вас вообще не устроят - тогда не обойтись без редактирования. Например, сначала можно включить слой tPlace и отделить Name и Value от элемента командой Smash (нажимайте на крестики-центры элементов, в замен образуются еще два - для имени и номинала). Далее, ненужное можно убрать командой Delete или передвинуть командой Move. Добавляют текст командой Text, после чего при помощи Properties надо заменить шрифт на "Vector" нужного размера (Size) и толщины (Ratio).

Наконец, дело сделано - сохраняйте файлы (обязательное условие запуска CAM-процессора), можно под другим именем, чтобы не "портить" оригинал. В окне CAM-процессора включите только те слои, которые будете печатать (см. выше), а в Style - обязательно нужен Mirroring. Перед распечатыванием не забудьте снова убедиться, что надписи зеркальные!

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

Сверловка

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

В состав Eagle входит много замечательных скриптов (ULP - User Language Programs), которые могут помочь в разнообразных вопросах. Среди них - скрипт drill-aid.ulp. Для его активизации перейдите в главное окно программы, раскройте пункт "User Language Programs", найдите его и по правой кнопке запустите на плате - "Run in Board" (не забудьте сохранить CAD-файлы под другим именем перед этой операцией, если хотите иметь возможность возврата к предыдущему состоянию).


Все кружочки заданного вами диаметра будут нарисованы на слое 116 - лишние можно удалить.



Также рекомендую посмотреть на скрипты drill-legend.ulp и drillegend.ulp - они создают специальный слой, отмечающий диаметры отверстий, включая легенду. Так, по крайней мере, сразу можно понять сколько и каких сверл потребуется ;)

В целом же, Eagle - далеко не самая худшая система, позволяющая рисовать электрическую схему и производить ручную / автоматическую разводку платы с последующим экспортом в Gerber274x, так что с ее помощью плату можно подготовить и для реального производства.

Кстати, меня поразило руководство пользователя - как человек, близкий к программным разработкам, я с завистью читал этот мануал и поражался - как же им удалось написать такую великолепную документацию, отвечающую не на банальные вопросы "для чего нужен пункт File|Open", а предоставляющее поэтапно усложненное описание процесса решения задач. Поэтому, если соберетесь изучить Eagle - читайте именно его, не пожалеете ;) 

19.08.2010

Уроки Wiring (6)

Урок 6. Что за ШИМ?

(продолжение, начало см. Урок 5. Нажми на кнопку!)

Пожалуй, самая загадочная для новичка надпись на плате Arduino - PWM. На самом деле, это сокращение от Pulse Width Modulation, по-русски "Широтно Импульсная Модуляция" или ШИМ.

Что такое PWM?

На секунду вернемся к картинке из предыдущего урока:



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

Собственно, именно эту ширину и предполагается модулировать - то есть изменять определенным образом. Зачем все это может понадобиться? Да вот - хотя бы для изменения яркости свечения светодиодов.

Так выглядит график зависимости свечения от тока для самого ординарного светодиода:


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

Возьмем для примера  светодиод L, присутствующий на всех современных Arduino-совместимых платах:


Светодиод загорится только в том случае, когда к его выводам будет приложена достаточная разность потенциалов. В данном случае одна ножка подключена к земле, а к другой - через токоограничительный резистор 1 кОм - вывод digital13. Следовательно, светодиод будет загораться по команде digitalWrite(13, HIGH).

Резистор включен последовательно со светодиодом с единственной целью - ограничить ток, протекающий в цепи. Обычно его значение прикидывают следующим образом: берут напряжение во всей цепи (для Arduino это 5 Вольт) и вычитают из него рабочее падение напряжения на светодиоде (указано в технических характеристиках светодиода, в простейшем случае зависит от цвета - для красного около 2 Вольт), получая падение напряжение на резисторе (в данном случае 5-2=3В). И далее, по закону Ома: R = U/I, где вместо I подставляется ток в цепи - который мы и хотим ограничить, скажем 3 мА. Получаем R = 3В/0.003А = 1000 Ом. При таком раскладе светодиод будет светиться, хоть и немного тускло, но вполне приемлемо. Чтобы добиться максимума яркости, можно увеличить ток до 30 мА - изменив номинал резистора R2 на 100 Ом.

Что же получается? Если мы хотим изменить яркость свечения светодиода, надо менять значение токоограничительного резистора. В принципе, нет ничего невозможного - существуют специальные резисторы с цифровым управлением, которые управляются через шину SPI или I2C, получают от микроконтроллера значение и меняют свое сопротивление в соответствии с ним. Но едва ли это оправдано с точки зрения стоимости и удобства (пойди еще найди и купи такой компонент, не пользующийся широким спросом). Другой вариант - это простейший ЦАП на основе R-2R цепочки, но он требует использования дополнительных выходов Arduino и тоже выглядит чересчур внушительным решением для такой простой задачи. Вот тут-то, как вы уже догадались, и приходит на помощь ШИМ.

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


Вот так выглядит скетч, который плавно гасит и зажигает светодиод L:

void setup() {
  pinMode(13, OUTPUT);
}

word cycle = 300;
byte stepdelay = 20;
byte zazor = 5;

void loop() {
  for (word intensity=zazor;intensity<(cycle-zazor);intensity++) {
    for (byte k=0;k<stepdelay;k++) {
      digitalWrite(13,HIGH);
      delayMicroseconds(intensity);
      digitalWrite(13,LOW);
      delayMicroseconds(cycle-intensity);
    }
  }
  for (word intensity=(cycle-zazor);intensity>zazor;intensity--) {
    for (word k=0;k<stepdelay;k++) {
      digitalWrite(13,HIGH);
      delayMicroseconds(intensity);
      digitalWrite(13,LOW);
      delayMicroseconds(cycle-intensity);
    }
  }
}

В этом скетче длительность импульса - чуть более 300 микросекунд. При этом в цикле мы постепенно уменьшаем и увеличиваем относительную ширину импульса, добиваясь эффекта циклического плавного изменения яркости. При этом надо избегать "крайних" значений ширины импульса около 0 и 300, иначе никакого эффекта плавного мерцания не будет (этим управляет константа "zazor").

Ура, мы изобрели диммер! (именно этот скетч я заливаю готовые платы перед отправкой, в качестве одного из элементов ОТК ;)

Торжество разума омрачает только одно - наш Ардуино оказался загруженным исключительно одной задачей. А если надо заставить скетч выполнять и другие операции? Как сделать генерацию PWM-сигнала фоновой и незаметной задачей?

Вот именно в этом случае нужно воспользоваться функцией аппаратного ШИМ в Arduino. Правда, работает она лишь на избранных пинах (они помечены звездочкой или надписью pwm), зато можно один раз выполнить analogWrite(pin, value), и спокойно заниматься другими делами. Вот так можно переписать скетч с использованием новой функции:

/*
 Fading
 
 This example shows how to fade an LED using the analogWrite() function.
 
 The circuit:
 * LED attached from digital pin 9 to ground.
 
 Created 1 Nov 2008
 By David A. Mellis
 Modified 17 June 2009
 By Tom Igoe
 
 http://arduino.cc/en/Tutorial/Fading
 
 */


int ledPin = 9;    // LED connected to digital pin 9

void setup()  { 
  // nothing happens in setup void loop()  { 
  // fade in from min to max in increments of 5 points:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 
}

(на самом деле это скетч из примеров к ArduinoIDE - Analog|Fading).

Полюбоваться на его работу можно, если воткнуть светодиод длинной плюсовой ножкой в digital9, а короткой минусовой - в GND. Для счастливых владельцев Arduino Mega можно просто исправить значение константы ledPin в самом начале скетча с 9 на 13, поскольку в отличие от Duemilanova, Mega поддерживает аппаратный ШИМ на digital13.

Как видите - проще некуда. В данном случае используется аппаратная возможность atmega, связанная с работой таймеров. Но производится она внутри ядра, поэтому снаружи все выглядит так просто. И это хорошо, особенно для начинающих ;)

06.08.2010

Металлоискатели


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

Вот что пишет автор этой книги, Андрей Щедрин, в неопубликованном фрагменте предисловия к 3-му изданию:

Эпоха, в которую мы живем - это эпоха сплошных суррогатов. Наука подменяется ремеслом, творчество – плагиатом, товары - китайским ширпотребом, культура – телевидением (перечислять можно долго). Человек эпохи суррогатов, не прилагающий никаких усилий, обречен на деградацию. Добродушный Иванушка-дурачок из старых сказок давно превратился в слабоумного Лёню Голубкова. А лень, наряду с дорогами и дураками – одна из бед нашей страны. Ведь “троечник”, списывающий у соседа контрольную и даже не пытающийся потрудиться над собой, превратится, в лучшем случае, в бездарного инженера, бездарного журналиста, бездарного политика… Тридцать лет назад в книжке “Занимательная математика” Перельман рассказывал школьникам о финансовых “пирамидах”. Но видимо, и творцы ГКО, и жертвы “МММ” - не читали в детстве книжек!..

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

03.08.2010

Набор USBasp

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


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

23.07.2010

Уроки Wiring (5)

Урок 5. Нажми на кнопку!

(продолжение, начало см. Урок 4, Немного о синтаксисе Wiring)

... получишь результат!" - пела когда-то группа "Технология". На Ардуино, к сожалению, всего одна кнопка: бесспорно важная, но малоинтересная.  Нажимая на нее, мы просто перезапускаем скетч с самого начала.

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

17.07.2010

Уроки Wiring (4)

Урок 4. Немного о синтаксисе Wiring

(продолжение, начало см. Урок 3. Из чего состоит скетч?)

Чтобы освоить следующие уроки, придется позанудствовать  уделить немного внимания самому языку программирования Arduino - Wiring. На самом деле, он является надмножеством C++ для микроконтроллеров AVR: это такой "хитрый" язык, когда объекты использовать еще можно, а вот распределять динамическую память при помощи оператора new - уже нельзя. Мы рассмотрим объекты позже, когда будем учиться работать с библиотеками. Если вы уже знакомы с синтаксисом С/C++, можете смело забить пропустить этот урок и переходить к следующему.

Всем остальным хочу порекомендовать учебники по языкам: для C рекомендую Кернигана и Ритчи, а по C++ - Страуструпа или Шилдта. Сам по ним учился и гарантирую, что после прочтения этих книг вы как минимум получите грамотное и развернутое представление о языке. Я же, на свой страх и риск, попробую изложить необходимый на мой взгляд минимум.

25.01.2010

Уроки Wiring (3)

Урок 3. Из чего сделан скетч?

(продолжение, начало см. Урок 2. ArduinoIDE)

В предыдущем уроке мы даже толком не разобрали текст нашего скетча "Blink". Присмотримся к нему повнимательнее:

/*
  Blink
 
 Turns on an LED on for one second, then off for one second, repeatedly.
 
 The circuit:
 * LED connected from digital pin 13 to ground.
 
 * Note: On most Arduino boards, there is already an LED on the board
 connected to pin 13, so you don't need any extra components for this example.
 
 
 Created 1 June 2005
 By David Cuartielles
 
 http://arduino.cc/en/Tutorial/Blink
 
 based on an orginal by H. Barragan for the Wiring i/o board
 
 */

int ledPin =  13;    // LED connected to digital pin 13

// The setup() method runs once, when the sketch starts

void setup()   {                
  // initialize the digital pin as an output:
  pinMode(ledPin, OUTPUT);     
}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop()                     
{
  digitalWrite(ledPin, HIGH);   // set the LED on
  delay(1000);                  // wait for a second
  digitalWrite(ledPin, LOW);    // set the LED off
  delay(1000);                  // wait for a second
}

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

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

Пока что запомните: если в строке встретилось два слеша //, то они, вместе со всеми символы правее, до конца этой строки компилятору глубоко безразличны. Если в комментарий надо превратить сразу несколько строк, то его начинают с  /* и заканчивают */.   Таким образом, вышеприведенный код для компилятора будет значительно проще и короче:

int ledPin =  13;

void setup()   {                
  pinMode(ledPin, OUTPUT);     
}

void loop()                     
{
  digitalWrite(ledPin, HIGH);   
  delay(1000);                  
  digitalWrite(ledPin, LOW);   
  delay(1000);                  
}


Кстати, комментирование применяют и для отладки, чтобы временно "выключить" фрагмент скетча. В ArduinoIDE для этого есть горячая клавиша Ctrl+/, которая позволяет быстро закомментировать или раскомментировать выделенный фрагмент текста.

Итак, первая строка скетча:

int ledPin =  13;

Это объявление переменной с именем ledPin. Компилятор забронирует в памяти микроконтроллера пару байт для хранения целого числа, позволяя вам начиная с этого места обращаться к нему по имени 'ledPin'. Заодно он присвоит ему начальное значение 13.

Следующая конструкция обязательно должна присутствовать в любом сектче:

void setup() {
}

Забегая вперед - это определение функции. Однако, функция setup особенная: она исполняется один раз после старта скетча (по включению питания Arduino или после сброса). Туда можно смело вынести все действия, которые должны выполниться один раз, например - настройка скорости последовательного порта или выбор режима работы универсальных пинов (на ввод или на вывод). Все эти действия должны быть вписаны между открывающей и закрывающей фигурными скобками { }.

И, кстати, сейчас там только одна строчка:

pinMode(ledPin, OUTPUT);

Оператор языка Wiring 'pinMode' устанавливает для одного из указанных пинов режим ввода или вывода. В данном случае номер пина берется из переменной ledPin (напоминаю, что там было число 13, а следовательно - речь про digital13, к которому подключен тестовый светодиод L), режим задается константой OUTPUT, что логически подготавливает нас к тому, что через этот пин будет что-то выводиться.

Если понадобится сделать из тринадцатого пина вход, используйте константу INPUT. Но по умолчанию все цифровые пины после старта скетча и так уже находятся в режиме ввода. И еще одно важное замечание: режим вход/выход можно переключать в процессе работы скетча, сколько угодно раз! Главное, чтобы схема была для этого предназначена.

void loop() {
}

Функция loop также должна быть в любом скетче - она вызывается сразу после завершения setup, а потом снова и снова... до бесконечности. Может быть, это покажется вам немного странным, но в применении к микроконтроллерам вообще и к Ардуино в частности, встречается довольно часто: надо постоянно опрашивать кнопки и датчики, давать команды на моторы или реле, выводить данные на дисплей. Собственно, именно поэтому однократно исполняемые действия и вынесены в setup - если что-то надо сделать один раз, сделайте именно в ней.

Разберем, из чего состоит тело loop:

digitalWrite(ledPin, HIGH);

Это еще один оператор языка Wiring, который переключает состояние пина в одно из двух возможных. HIGH соответствует логической единице (она же - напряжение питания микроконтроллера, для Duemilanova это +5 Вольт), LOW - логическому нулю, это меньше +0,5 В.

Светодиод L подключен в Arduino следующим образом:



Анатомию этой схемы мы разберем позже, пока стоит запомнить, что если на пине Ардуино установить напряжение , светодиод начнет светиться - как говорят, он "откроется" и через него потечет ток. Если же на этом входе будет меньше 1,5В, то этого напряжения не хватит для его открывания, и он обидится светиться не будет.

Итак, оператор digitalWrite(ledPin, HIGH) формирует +5В на выходе 13 и зажигает таким образом светодиод L.

delay(1000);

Эта команда delay заставляет микроконтроллер остановиться и ничего не делать целую 1000 миллисекунд - безумно много! Кстати, 1000 мс = 1 с ;)

digitalWrite(ledPin, LOW);

Этой командой светодиод отключается (см. выше).
Дальше снова происходит задержка в одну секунду.
А потом... тело loop заканчивается, но поскольку он вызывается беспрерывно, то управление снова переходит на начало - исполняется digitalWrite(ledPin, HIGH), и так далее.

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



Если бы у нас под руками был специальный прибор осциллограф, то подключив его к digital13 мы увидели бы примерно такую картину:



Говоря строгим языком, мы добились на этом выходе колебаний с частотой 0,5 Гц ( 1 Гц  соответствует одному полному колебанию в секунду). Меняя две величины задержки в delay, можно добиваться другой частоты мигания, а если они начать менять их отношение, то изменится скважность сигнала (сейчас мы получили то, что обычно называют меандр).

Но чтобы пользоваться Arduino все это знать необязательно. Все мигает, как и задумано, не так ли? ;)

В качестве домашнего задания: попробуйте поправить скетч таким образом, чтобы светодиод мигал не равномерно, как сейчас, а периодически подмигивал 3-х кратными вспышками. Какая задержка должна быть между вспышками, чтобы глаз их все еще различал?

В следующем уроке мы подробнее разберем основные конструкции языка Wiring.

20.01.2010

Уроки Wiring (2)

Урок 2. ArduinoIDE

(продолжение, начало см. Урок 1. Что внутри Arduino?)

Чтобы программировать, нам потребуется ArduinoIDE. Хорошая новость состоит в том, что она абсолютно бесплатная, с открытым исходным кодом. Отправляемся на страницу http://arduino.cc/en/Main/Software и выбираем самую-самую последнюю версию под нужную операционную систему. На момент написания статьи это была сборка 0017, официально поддерживались Windows, MacOS и Linux, энтузиасты сделали пакеты для OpenSolaris.

Для Windows архив занимает чуть больше 80 Мбайт, зато там есть всё необходиме, в том числе драйвера.

Итак, что делает программист, получая в распоряжение свежехакнутуюустановленную IDE? Первым делом - пишет программу HelloWorld, которая только и делает, что выдает на экран "Hello, world!". Зато, после этого можно расслабиться: две трети дела сделано - осталось всего лишь написать программный продукт, который потрясет мир.

Итак, распаковываем arduino-0017.zip в какую-либо папку (в этом поможет свободный PeaZip). Инсталляция не требуется, поэтому просто запускаем из этой папки arduino.exe (можете набраться храбрости и сделать ярлык на рабочем столе ;).

После запуска мы увидим что-то наподобие этого:



Вверху привычно маячит строка меню, ниже - спартанский тулбар для вызова наиболее частых операций; белое поле - собственно область редактора, где надо писать программу (в терминах Ардуино - "набросок" или sketch). Черное поле - информационный экран для выдачи ругани диагностических сообщений ArduinoIDE.

Пусть в качестве "Hello World" наша Duemilanova помигает своим тестовым светодиодом L. Создатели дистрибутива заботливо разместили необходимый нам скетч в секции примеров, остается только загрузить:



Самое время подключить Arduino к нашему компьютеру с помощью кабеля USB A-B. Если все верно, загорится светодиод PWR, а остальные слегка мигнут. Дотошные могут понажимать на кнопку сброса и посмотреть, как светодиод L вспыхивает при каждом нажатии. Если он будет вспыхивать и без нажатия - не пугайтесь, именно так и происходит, когда в Arduino еще не загружено ни одной рабочей программы.

Единственный момент - надо утрясти вопрос с драйверами. Обычно, после подключения последовательно обнаруживаются два устройства: FT232R USB UART и USB Serial Port:





Устанавливать надо, естественно, оба устройства. В ответ на удивленные возгласы Windows надо послать ее за драйверами в каталог:

arduino-0017\drivers\FTDI USB Drivers

В итоге вы должны добраться до такой страницы:



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

Панель управления -> Система -> Оборудование -> Диспетчер устройств

...и поискать USB Serial Port (не отключайте Arduino!). При желании его можно здесь же изменить (Свойства | Port Settings | Advanced Settings):





ОК, номер порта выяснили, теперь возвращаемся обратно в ArduinoIDE и сообщаем ей об этом  через меню Tools | Serial Port:



Затем, чтобы компилятор правильно оттранслировал скетч в исполняемый код, надо установить тип платы и микроконтроллера. Внимательно прочитайте название микроконтроллера на своей плате Ардуино, затем выберите свой вариант в меню Tools | Board:



Если вы на этом шаге перепутаете тип микроконтроллера, то скетч просто не загрузится в Arduino после компиляции. А вот если вы спутаете тип платы, возможен легкий курьез - скетч будет работать либо в два раза быстрее, либо в два раза медленнее, чем задумано ;) Для простоты, будем предполагать, что у нас Duemilanova с ATmega328, так как именно этот вариант наиболее распространен. Если у вас на чипе написано ATmega168-20PU или ATmega8-16PU, можете купить ATmega328P на замену (никаких переделок в схеме - вынули старый, поставили новый). Таким образом, памяти под скетч станет гораздо больше.

Все готово, теперь выбираем меню Upload to I/O Board или нажимаем кнопку Ctrl+U:





Ждем. Произойдет следующее:
  • скетч будет скомпилирован (сначала преобразован из Wiring в язык C, потом в объектный код и наконец в загрузочный файл);
  • ArduinoIDE сбросит плату, что приведет к остановке работающего в настоящий момент скетча и старту специальной микропрограммы-bootloader-а;
  • Загрузочный файл будет передан в Arduino (мигают светодиоды L, Rx - чуть ярче, Tx - чуть слабее);
  • Память Arduino будет прочитана и произойдет сравнение с исходным файлом - верификация (мигают светодиоды L, Rx - чуть слабее, Tx - чуть ярче);
  • Bootloader нехотя передаст управление скетчу.
Итак, если все верно, светодиод L начнет мигать, приветствуя мир и сообщая о том, что наш первый скетч заработал:




Что дальше? В следующем уроке мы разберем скетч "Blink" более подробно.

22.12.2009

Уроки Wiring (1)

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

Урок 1. Из чего состоит Arduino?

Итак, вы собрались поразить мир невероятным электронным устройством и выбрали в качестве платформы Arduino. Но вот вопрос - а что у него, собственно, внутри?

Наверное, вы уже поняли, что на панельке возвышается "сердце" системы - микроконтроллер фирмы ATMEL ATmega328P-PU (иногда это может быть и ATmega168-20PU, и даже - ATmega8-16PU, пока для простоты считайте, что они отличаются лишь максимально возможным размером программы). Если ваши задумки не помещаются в ATmega328P, не паникуйте! Для этого придумали Arduino Mega.

Вернемся к тому, что расположено на плате:



  1. Разъем USB (квадратный, или B-типа) - основной канал общения Arduino с компьютером. Почти всю работу выполняет припаянный справа многоногий чип FT232RL, представляясь компьютеру в виде виртуального COM-порта. Во время обмена моргают светодиоды Rx и Tx. Кроме того, с этого же разъема Arduino будет получать стабилизированное питание +5В - именно от него питается микроконтроллер ATmega.
  2. Разъем питания 2.1/5.5 - альтернативный способ подать питание на Arduino, если под рукой нет компьютера с разъемом USB (c такой ситуацией приходится сталкиваться чаще, чем можно подумать). Когда будете подбирать подходящий блок питания, обращайте внимание на то, что плюс должен быть в центре, а напряжение - в пределах 7..20 Вольт. Идеально было бы питать его от 9 Вольт, иначе стабилизатор начинает ощутимо нагреваться. Часто переносные проекты питают от компактного и относительно недорогого элемента "крона" (6F22).
  3. Кнопка сброса. Работает в точности, как в "большом брате" - нажимаете ее, и все начинается с самого начала!
  4. Колодки цифровых пинов. Цифровые (digital) пины Arduino нумеруются от 0 до 13 и могут превращаться во входы или выходы - причем их роль можно менять прямо по ходу пъесы выполнения программы. Кое-где на них написано PWM, что означает возможность аппаратного ШИМ (широтно-импульсная модуляция, которую мы рассмотрим позже). AREF - это вход опорного напряжения внутреннего АЦП, может пригодиться при работе с аналоговыми значениями. GND - это "земля" или "минус" вашего источника питания. 
  5. Колодки аналоговых и прочих пинов. Справа расположены аналоговые пины - 0..5, их можно использовать для считывания аналоговых сигналов. В отличие от цифровых входов, которые при чтении могут давать только единицу или ноль, аналоговые выдадут вам число от 0 до 1023, в зависимости от текущего приложенного к ним напряжения. Если не хватает цифровых пинов, можно превратить эти выводы в цифровые - и тогда они получат номера 14-19. Левая часть колодки имеет специальное значение, разберем чуть подробнее:





    • RESET - дополнительный вход сброса. Зачем, если и так уже есть кнопка? Очень просто - на пины может надеваться так называемая Shield-плата со схемой, которой управляет Arduino, и до кнопки уже будет не добраться. Поэтому часто на Shield-плате делают еще одну - дублирующую и соединяют с этим входом. Сброс - это святое! ;)
    • 3V3 - питание +3,3 Вольта. Оно получается как бы "побочным" способом от USB-чипа FT323RL. Не исключено, что оно может пригодиться, но увы - допустимый ток всего 50мА! Для сравнения - порт USB может отдавать в 10 раз больше - 500мА.
    • 5V - питание +5 Вольт. Это линия питания микроконтроллера и всей схемы. При питании от внешнего источника, может отдавать до 1,5 А, так что смело используйте, но учтите - помехи на этой шине могут серьезно осложнить жизнь микроконтроллеру! 
    • GND - земля, причем сразу два контакта подряд. Так сделано для удобства.
    • VIN - напряжение, которое поступает прямо с разъема питания [2]. Те самые 7..20 Вольт о которых мы уже упоминали.



  6. Светодиод L. Это специальный тестовый светодиод, подключенный к цифровому входу номер 13. У Arduino нет встроенного дисплея или динамика и иногда единственный способ сообщить миру о том, что в вашей микропрограмме все плохо в порядке - помигать именно этим светодиодом.
У пытливых, наверное, уже созрел вопрос - а что будет, если подключить питание и к USB, и к разъему питания? Облако едкого дыма Да ничего страшного не произойдет - специальная схема на плате Duemilanova выберет, откуда брать питание. В других платах - например, в Diecimila, надо было механически переставлять джампер. Так что эта автоматика - приятное (в основном ;) усовершенствование.

Подводя промежуточный итог: по большому счету, Arduino состоит из микроконтроллера, моста USB-COM и светодиода "L". Микроконтроллер сам по себе содержит в себе много интересного, по умолчанию доступно:

  • универсальные цифровые пины ввода/вывода - 14 штук ( 0 - 13 )
  • аналоговые пины для чтения через АЦП - 6 штук ( 0 - 5 )
  • два пина, которые могут быть источником прерываний ( 2 и 3 )
  • таймер, который отсчитывает число миллисекунд, прошедших с момента старта.
Если подключить некоторое количество библиотек, можно также получить доступ к таким ресурсам:
  • энергонезависимая память (EEPROM) и память программ (FLASH);
  • таймеры;
  • последовательный порт (UART);
  • двупроводная шина, совместимая с I2C.
Что дальше? Конечно же, программировать!

(продолжение следует: Урок 2. Запуск ArduinoIDE)