29.07.2009

Хронология

После комментариев уважаемого FireFly всерьез задумался о хронологии.
Теперь в статьях под тегом ArduinoCompatible по возможности буду добавлять дату, когда оно было впервые упомянуто. Надеюсь на помощь читателей - в случае чего, вы меня поправите ;)

28.07.2009

Анонс

Приношу извинения своим постоянным читателям за вынужденную паузу в подготовке материалов. А всё из-за нового устройства:



Девайс подключается к шине USB 1.1 и способен не только читать и писать образ картриджа СМП Электроника МК-90, но еще и показывать напряжение на внутренней батарейке модуля. Почти готово, в настоящий момент дорабатываю вопрос о том, сколько и какого цвета будет светодиодов и как они должны мигать ;)

Само собой, схема, sources и firmware будут опубликованы под cc-sa, в скором времени ;)

25.07.2009

MRC28

Название: Универсальный робоконтроллер MRC28 v1.4.1
Процессор: ATmega8-16PU
Тактовая частота: 16МГц
Совместимость с Shield-платами: нет
Совместимость с Arduino IDE: есть
Страница проекта: http://robozone.su/2008/02/29/universalnyjj-robo-kontroller-mrc28.html
Дата первого упоминания: 29.02.2008



Авторство MRC28 принадлежит FireFly (Vitaliy Shulyakov ;). Как гласит история, встала необходимость разработки макетной платы для экспериментов с контроллером ATmega8-16PU, о конструкции которой шли споры "до хрипоты", пока авторы не увидели Arduino и не поняли, что "двигаются в правильном направлении".

Если считать датой появления MRC28 29.02.2008, когда были опубликована статья на robozone.su, то получается, что это - первая в своем роде модификация Arduino на чипе MAX232, а также одна из первых плат, ориентированных на DIY - выполненная в одностороннем формате.
Узел конвертера COM-TTL похож на Freeduino MaxSerial:



Схема питания также стандартная:



Колодки с выводами пронумерованы дважды, согласно нумерации ATmega и Arduino:



В основной схеме также нет особых новшеств:



Как я уже упоминал, неоспоримый плюс печатной платы - в ее одностороннем исполнении, так сказать ready for ЛУТ. Собственно, такая же идея лежит в основе Arduino Severino, окончательную версию которой опубликовал месяцем раньше Эдилсон Акаши.

К сожалению, MRC28 получился по размерам несколько больше Severino (т.е. больше 61 х 90 мм), содержит 6 перемычек вместо 3-х. При этом:
  • совместимость с Shield-платами Arduino не обеспечивается;
  • нет автосброса (часть MAX232 просто не использована);
  • нет светодиодов Rx и Tx.
По заявлению авторов, достижение совместимости не преследовалось, отсюда, кстати, и наличие 10-контактного разъема ICSP: я долго ломал голову, зачем может потребоваться оживлять МК при неправильном программировании fuse-битов. Ведь если использовать ArduinoIDE, то постоянная перепрошивка вроде как и не требуется: скетч загружается через bootloader и фьюзы никто не трогает. Также, мое удивление вызвали резисторы, включенныепоследовательно к выводам порта B.

К контроллеру было разработано минимум две Shield-платы:
Авторы выложили в открытый доступ схему (sPlan 6.0) и печатную плату (Sprint-Layout 4.0). Файлы будут доступны только после регистрации и авторизации на сайте. На схеме можно разглядеть копирайт, но права, на которых можно воспроизводить и модифицировать эту разработку, увы, остаются неясными.

Мое резюме: если вы больше тяготеете к Arduino, то существуют и более совершенные конструкции - более компактное и удобное решение с MAX232 - Freeduino MaxSerial by Spiff, а также - Roboduino. Не смог также найти ссылки на покупку MRC28 - в сборе, в виде KIT-а или только PCB, так что засучите рукава - предстоит травля в хлорном железе. Кстати, именно так и стоит сделать, если нет возможности заказать Roboduino - именно к ней наиболее близка комбинация MRC28+универсальный модуль.

Вместе с тем - это первый и единственный (надеюсь, пока единственный) оригинальный проект Arduino-совместимой платы в Рунете. Пожелаем ему всяческих успехов!

15.07.2009

Аналоговые датчики температуры и Arduino

В предыдущей статье я уже упоминал о том, как устроена аналоговая микросхема-датчик температуры, а сейчас предлагаю перейти к практике.

Обычно, мы получаем сенсор в корпусе TO-92 (не перепутайте с транзистором):



На фото - популярный датчик TMP36 от Analog Devices. Как видите, выводов три, и если смотреть в положении "надписью к нам, ножками вниз", то получается (слева направо): питание (Vs), выход (Vout), земля (GND). Главная особенность таких датчиков - значение напряжения на выходе однозначно определяет температуру, независимо от напряжения питания (!). Последнее может варьироваться от 2,7 до 5,5 Вольт.

Это очень удобно, и позволяет нам выполнить проверку датчика вне схемы, если под рукой есть элемент питания 3В, хотя бы даже и батарейка CR2032. В активном состоянии датчик потребляет не более 50 мкА, для проверки в течение двух-трех минут вполне хватает. Собираем схему:



Теперь, подключая мультиметр к выходу датчика (разумеется, в режиме измерения напряжения), мы будем наблюдать напряжение около 0,78 В, что соответствует 28 °С.



Чтобы убедиться в работоспособности датчика, его надо слегка нагреть, отлично подойдут:
  • пальцы рук (температура вашего тела - 36,6 °С)
  • дующий горячим возухом фен (можно довести и до 50 °C)
  • кошка (температура 38-39 °C)

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



Теперь подключим датчик к Arduino. Пусть выход будет подключаться к analog0, а питание - к стабилизированному питанию +5В Arduinio:



Для чтения придется использовать АЦП, а ему, как известно, требуется опорное напряжение, надо выбрать один из трех вариантов: питание, внешнее на AREF или внутреннее.

Напряжение на выходе датчика TMP36 меняется от 100 мВ до 2В, так что использовать внутренний источник опорного напряжения 1,1В не получится. Хотя, такое значение у источника МК ATmega168/328, а вот в ATmega8 это будет уже 2,56 В. Гораздо проще ориентироваться на стабилизированные +5 В, которые поступают от USB.

Чтобы правильно перевести показания датчика в температуру, надо сначала понять, какое напряжение мы прочитали. АЦП возвращает число от 0 до 1023, при этом 0 = 0В, 1023 = 5В для нашего случая. Поэтому:

voltage = 5 В / 1024 * sensor

Заглянем в документацию на датчик: там оговаривается, что изменение на один градус цельсия соответствует изменению на 10 мВ, при этом 500 мВ будет соответствовать температуре 0°C. Получаем формулу:

tempC = (voltage - 0.5) * 100


 
void setup() {
Serial.begin(38400);
}

void loop() {
float voltage = 5.0 / 1024.0 * analogRead(0);
Serial.print(voltage);
Serial.println(" B");
float tempC = ( voltage - 0.5 ) * 100;
Serial.print(tempC);
Serial.println(" C");
delay(1000);
}


Одно маленькое замечание к тексту скетча: значение опорного напряжения надо писать именно "5.0", чтобы компилятор случаем не решил разделить 5 на 1024 целочисленным делением и не получил пожизненный ноль в итоге.



Вернемся к вопросу о точности. Наш АЦП имеет шаг измерения 4,9 мВ, в то время как сам датчик имеет погрешность ±1°C, или ±10 мВ. Таким образом, даже если мы понизим опорное напряжение, например, до 3,3 В и получив таким образом шаг преобразования 3,3 / 1024 = 3,2 мВ, это повышение точности не спасет нас от ошибки самого сенсора. С другой стороны, напряжение питания +5 В тоже может запросто "гулять" ±5%, но в итоге это порождает ту же самую ошибку ±10 мВ. Таким образом, как ни крути, для данной схемы погрешность измерения будет не менее ±2°C. Из этого следует, кстати, забавный метрологический вывод: дробную часть можно отбрасывать ;)

(в статье использованы материалы из статьи про измерение температуры by ladyada)

12.07.2009

Ethernet Shield по UDP (2)

В продолжение темы с UDP в Arduino - примеры и новая версия библиотеки.

В новой версии два изменения:

1. Если вы уже успели начать использовать предыдущую версию, то поменяйте обработку значения, возвращаемого ClientUDP::open(). Раньше успехом была единица, в случае неудачи - ноль. Теперь все наоборот ;) Если все успешно - будет ноль, в противном случае - это код ошибки.

Причина такого изменения тривиальна - в оригинальном Client.cpp довольно много мест, где стоит проверка и немедленный "молчаливый" возврат нуля: поди-ка разберись, почему open() "накрылся" - то ли сокетов свободных нет, то ли порт занят. Константы ошибок описаны в ClientUDP.h, быстродействие и размер кода не изменились.

2. Появилась публичная переменная uint16_t _sent, в которой сохраняется число переданных байт.

А вот это из-за специфики класса Print, от которого порожден оригинальный класс Client и мой "плагиатный" ClientUDP. Прототип write возвращает void, и чтобы иметь хоть какой-то шанс понять, отправилась дейтаграмма или нет, можно прочитать после ее вызова значение _sent. Расплата за это - два байта SRAM.

Скачать новую версию с примером (про который далее): ClientUDP_1.1.zip

Итак, для эксперимента надо взять пару Arduino:



...( это оригинальная Diecimila и Freeduino MaxSerial )...

Также понадобится две штуки Ethernet Shield:



...( это оригинальная Ethernet Shield и вариант от NKC Electronics )...

Следующий естественный ;) шаг - соединение их попарно:



...а также - в комплексе:



Платы работают в режиме разделения функций: к первой подключены три кнопки, она является передатчиком. Ко второй подключены светодиоды, и она - соответствено - является приемником. По нажатию или отпусканию кнопки формируется двухбайтовый UDP-пакет (номер кнопки + состояние), который отсылается приемнику. Приемник "декодирует" пакет, зажигая или гася соответствующий светодиод:



В качестве портов, к которым подключены и кнопки, и светодиоды, выбраны digital 7,6,5. Значение порта, ip-адресов и mac-адресов выбрано весьма произвольно, не ищите там скрытого смысла ;)

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

08.07.2009

Arduino minimum

Случайно наткнулся на одном из иностранных сайтов на "минимальный набор для повторения логической части Arduino". Схемы к нему не прилагалось, состав был следующий:
  • микроконтроллер ATmega168-20PU - 1 шт.
  • конденсатор 100 нФ - 2 шт.
  • резистор 1 кОм - 4 шт.
  • резистор 10 кОм - 1 шт.
  • кварц 16 МГц - 1 шт.
  • конденсатор 22 пФ - 2 шт.
  • электролит 470 мкФ х 16 В - 1шт.
  • светодиоды 3 мм - 3 шт.
  • стабилитрон 5,1В - 1 шт.
  • тактовая кнопка - 1 шт.
Легко угадывается схема сброса - кнопка, R = 10К. Схема тактирования - 2 х 22 пФ + кварц 16 МГц. Один конденсатор 100 нФ надо повесить рядом с ножками ATmega. Также, можно предположить, что три из четырех R = 1 К предназначаются в качестве токоограничительных к светодиодам.

Дальше начинаются разнообразные варианты. Светодиодов - три, но как их распределить? Вакантных места - целых четыре. Традиционный светодиод L на digital 13, питание, RX и TX - выбираем три из четырех.

Второй конденсатор 100 нФ можно использовать как второй фильтр по питанию, или подключить к AREF, как это рекомендуется в datasheet к Atmega.

Остаются резистор 1К, электролит и стабилитрон. В принципе, напрашивается классическая (варварская) схема параметрического стабилизатора питания.

Вот что у меня получилось из этого комплекта:


Естественно, чтобы стабилитрон начал работать, Vcc должно быть > 5,1В. Сверху Vcc ограничено в первую очередь сопротивлением R2 = 1К, который имеет мощность 0,25 Вт; простой расчет показывает, что напряжение более 15 Вольт ему противопоказано. Следовательно, не более 20 В ( 15 падает на резисторе, 5 - поддерживает стабилитрон).

03.07.2009

Измерение температуры

По причине неожиданной популярности, решил продолжить "температурную" тему.

Итак, что может предложить нам современная техника для измерения температуры?

1. Термопара

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

Термопары бывают разных типов (обычно обозначаются буквами – R, K, S и т.д.), в зависимости от пары металлов. Основной плюс – это широкий температурный диапазон: можно подобрать термопару для измерений как для сверхнизких - 200 °C, так и для довольно высоких 2000 °C значений температуры. Кроме того, их можно использовать в агрессивных средах, если это позволяют входящие в состав металлы.

Однако, для радиолюбительской практики они малоприменимы: существует масса погрешностей, с которыми надо бороться. Присутствует нелинейность. Наконец, точность будет хуже ±1 °C.

2. Термостат

Полное название звучит как "термометр сопротивления". Принцип действия основан на способности материалов изменять свою проводимость в зависимости от температуры. Чаще всего изготавливаются из металлической проволоки или пленки, и чем больше у нее температурный коэффициент сопротивления (ТКС), тем точнее получается результат. В обычных условиях точность лучше ±1 °C, в идеале возможно 0,001 °C.

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

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

Иногда можно встретить упоминания о биметаллических термостатах серии KSD301 – к сожалению, они не имеют ничего общего с термометрами сопротивления. Их действие основано на свойствах биметаллической проволоки – способностью растягиваться при нагревании и сжиматься при охлаждении.



Элемент KSD301 – это исполнительное, а не измерительное устройство - термоконтакт, срабатывающий при достижении какой-либо температуры, а по остыванию возвращающийся в исходное положение.

3. Термистор

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

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



Вот только одна беда с ними: в отличие от термостатов, зависимость имеет нелинейный характер, поэтому измерять с их помощью температуры в широком диапазоне может оказаться проблематично :( Общий диапазон температур у этого класса устройств также ниже, чем у термостатов и термопар: от -50 °C до 300 °C.

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

Как правило, их используют в аналоговых схемах, выполняя предварительную калибровку. Например, для схемы регулятора оборотов вентилятора на ОУ, готовую схему соединяют с термистором, заранее нагретым до известной температуры, после чего производят подбор или регулировку "обычных" элементов (как правило, резисторов). На схеме термисторы обозначены таким символом:



Типичные примеры термисторов – ММТ-1, КМТ-4. Стоят недорого; в зависимости от типа, имеют погрешность от 10..20 %.

4. Аналоговый термодатчик

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

Принцип действия ИДТ основан на том факте, что падение напряжение на p-n переходе транзистора линейно зависит от температуры.

Влияние температуры на транзистор – довольно неприятная проблема, частично ушедшая в прошлое c появлением микросхем. Размещая транзисторы на одном кристалле, производители микросхем автоматически добиваются одинаковых температурных условий для всех полупроводников, в то время как в прошлом конструкторам приходилось вводить специальные "общие" радиаторы для транзисторов или вообще искать другие решения. В данном случае, для получения линейной зависимости требуется компенсировать эффекты, связанные с током насыщения и разбросом начального падениея напряжения на p-n переходе. Для этого либо эмиттерные переходы делают разной площади, либо, напротив, соединяют одинаковые транзисторы в ячейку Борка.

Для нас это не особенно важно, главное – мы имеем в итоге прецизионный датчик, который остается подключить к аналого-цифровому преобразователю (а как мы знаем, Arduino от ATMEGA достался 1024-ступенчатый 6-канальный АЦП ), что дает возможность весьма точно измерять температуру, особенно если подвергнуть схему несложной калибровке.

Типичные примеры аналоговых датчиков в корпусе TO-92 – LM335 от National Semiconductor, TMP36 от Analog Devices:



Из минусов – надо учитывать падение напряжения на идущих к датчику проводах; требуется отдельный провод питания. Зато получается относительно дешево, можно объединять между собой параллельно (измерение минимальной температуры) или последовательно (измерение средней температуры).

Занятно, что существуют микросхемы АЦП со встроенным драйвером семисегментного дисплея – и тогда для реализации цифрового термометра МК вообще не нужен ;)

5. Цифровой термодатчик

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

Типичный пример – DS18B20 производства MAXIM/DALLAS. Так сказать, мечта программиста – не требуется никакой калибровки, минимальная схема обвязки, возможность "паразитного питания", много датчиков может располагаться на одной шине (у каждого есть свой собственный уникальный код, программируемый при производстве).



За это придется расплатиться реализацией шины OneWire, не факт, что она поддерживается МК на аппаратном уровне (в ATmega ее точно не ищите; и не путайте с TwoWire – это разные вещи). Но ведь программистам только это и надо ;)

Цена у DS18B20, конечно же, выше LMZх39 или TMP3х, зато переводит часть проблем в сугубо программную область, предоставляя более широкие способы применения.

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

Ссылки по теме:
  • Сайт, полностью посвященный измерениям температуры - temperatures.ru
(в статье использованы материалы из Википедии - свободной энциклопедии)

02.07.2009

Лицензия на материалы в этом блоге

Creative Commons License

Вот, наконец, добрались руки и до лицензирования содержимого этого блога. Спешу донести до читателей и авторов, что я выбрал для всех статей Creative Commons Shared-Alike 3.0 по умолчанию (если другого не оговорено в тексте статьи). По этому же поводу я добавил текст в "подвал" шаблона сайта.

В двух словах: эта лицензия позволяет другим перерабатывать, исправлять и развивать произведение даже в коммерческих целях при условии указания авторства и лицензирования производных работ на аналогичных условиях (т.н. "копилефт‐лицензия"). Все новые произведения основанные на лицензированном под нею будут иметь аналогичную лицензию, поэтому все производные будет разрешено изменять и использовать в коммерческих целях. Более подробно см. статью про CC в Википедии, которую я усиленно штудировал перед написанием этого поста ;)

По большому счету, при использовании работы требуется разместить текст с указанием URL данного сайта и именем автора (в конце каждого поста это указано явно, например - id или Ilya Danilov).

Если для какой-то работы или статьи автор указывает другую лицензию - он вставит в конце поста изображение соответствующего значка CC и ссылку на текст лицензии.

Разобраться с лицензией меня побудили две вещи: во-первых, я сам использую работы под этой лицензией, а она прямо обязывает сохранять лицензию на производные работы (в этом и состоит сущность Shared Alike). А во-вторых, появились сайты, полностью скопировавшие к себе статьи из этого блога: с одной стороны - я полностью поддерживаю, с другой - надеюсь на понимание с их стороны смысла cc-sa.