25/05/2011 23:19:59
В статье "Универсальное Ethernet-устройство для управления домом" я сделал небольшой обзор относительно недорого решения, позволяющего опрашивать различные датчики и кнопки, а также управлять различными нагрузками (лампы, электроприборы, нагреватели). В этом материале я хотел бы продолжить разговор об использовании сети Ethernet в Умном Доме.
Всевозможные готовые IP-менеджеры типа IP Power или NetPing при всех преимуществах имеют и свои недостатки. Во-первых, это, конечно же, цена. Во-вторых, отсутствие по понятным причинам исходных кодов прошивки и невозможность в полной мере изменять логику работы устройства. Если с ценой все более-менее понятно, (хочется сделать устройство своими руками как минимум в 5-7 раз дешевле), то насчет логики следует пояснить.
Итак, я хотел сделать устройство, которое бы имело умело:
Очевидно, что описанный выше базовый функционал не существует в доступных на рынке готовых продуктах.
ПРИМЕЧАНИЕ (от 17.04.2012): Сообществом ab-log.ru было разработан готовый модуль домашней автоматизации MegaD-328, построенный на идеях, описанных в данной статье.
Для создания такого устройства я применил микроконтроллер Atmega168 (а позже Atmega328) от компании Atmel, который имеет на борту 16Кб Flash для программного кода и микросхему ENC28J60 от Microchip, которая занимается поддержкой сети Ethernet и соединена с МК посредством интерфейса SPI.

Схема устройства от Guido Socher (tuxgraphics)
Почему были выбраны эти микросхемы. Во-первых, достаточно простая принципиальная схема устройства. Во-вторых, низкая стоимость компонентов. В-третьих, Atmega168 и ENC28J60 доступны в DIP-корпусах и имеют по 28 ног. Это означает, что собрать такое устройство можно самостоятельно дома без специальных навыков и оборудования. Чтобы еще упростить схему устройства, применяется RJ-45 разъем MAG-Jack со встроенным трансформатором. Фактически все, что нужно для сборки устройства - это МК, интерфейсный чип, разъем, кварцевый генератор и пара резисторов.
В результате получилось вот такое миниатюрное устройство c размерами 75х40 мм. Но фактически это Web-сервер с мощными функциональными возможностями.

Что бы вы думали это такое? Это Web-сервер.
Для программирования устройства можно использовать простейший программатор типа USBasp.

Слева программатор (нужен только для загрузки микропрограммы, справа - модуль
Собрав девайс мы можем залить в него оригинальную прошивку от автора схемы с поддержкой протокола TCP/IP для AVR, чтобы получить в результате устройство, работающее как Web-сервер! Теперь можно с любого компьютера управлять заранее запрограммированным входом.

Тестовая прошивка. Управление выходом через Web
Но авторская прошивка с одной стороны не решает поставленные выше задачи, а с другой стороны делает такое устройство привязанным к разработчику, требующим программатор и знаний основ программирования для МК в тех случаях, когда нам нужно всего-лишь поменять IP-адрес или набор выходов. Поэтому я решил написать для данного устройства свою прошивку, которая делает устройство полностью универсальным, выполняет все задуманные функции и по сути является трансформером, подстраивающимся под любые требования проектировщика Умного Дома.
Главная идея заключается в том, чтобы иметь возможность каждый порт микроконтроллера настраивать индивидуально, используя Web-интерфейс. Таким образом, любой порт из доступных можно настроить как вход (кнопки, датчики), как выход (лампы, приборы) или как АЦП (всевозможные сенсоры, в случае, если порт МК имеет встроенный АЦП). Тем самым я как бы разделяю готовый прибор на две части - ядро и модуль расширения с клеммами, к которому подключаются конечные устройства и датчики. Например, до сегодняшнего дня мне нужно было 10 входов для кнопок и 3 выхода для управления лампами. Но появилась новая задача и теперь нужно 9 входов и 4 выхода. Все, что необходимо, это изменить подключение к модулю расширения и выполнить перенастройку девайса с помощью любого браузера, но никаких изменений в программном коде ядра, перепрошивки, программатора это не потребует. С другой стороны в доме может функционировать несколько устройств, имеющих разную конфигурацию входов и выходов, но совершенно одинаковую прошивку. В этом смысле индивидуально настраиваемая по Etnernet в визуальном режиме функция каждого порта по сути заменяет традиционное программирование и прошивание, которые требуют дополнительных знаний, оборудования и главное - времени.
В описываемом мною устройстве доступно 13 свободных портов. В данный момент все порты имеют названия, ассоциированные с портами МК (D0, D1 и т.д.), это было удобно для разработки, но в дальнейшем можно отказаться от такой нумерации в пользу какой-нибудь более традиционной.

Перечень доступных для управления и настройки портов контроллера
Кликнув на название порта мы попадаем в режим настройки. Как я уже говорил, каждый порт можно сконфигурировать как IN (вход), OUT (выход) и ADC (АЦП).
Замечу, что все настройки сохраняются в EEPROM (энергонезависимую память), то есть после выключения устройства сохраняются.

Если мы сконфигурируем порт как OUT (выход), то в Web-интерфейсе появится возможность увидеть текущее состояние выхода State, которое может принимать значение OFF (выключено) или ON (включено), а также возможность здесь же включить или выключить подключенную нагрузку.

В случае, если мы настроем порт как ADC (АЦП), мы можем увидеть значение от 0 до 255, которое характеризует состояние датчика.

Однако самые интересные настройки у порта в режиме IN (вход).

Значение State очевидно - текущее положение входа. Остальное требует отдельного пояснения.
Основная проблема многих устройство Умного Дома заключается в том, что они не могут сами сообщать мастеру/серверу/контроллеру о срабатывании какого-либо входа. Обычно мастер, в роли которого в моем случае выступает сервер (ПК), сам с некоторой периодичностью опрашивает устройства. Во многих случаях частота опроса не имеет решающей роли, но только не в случае с выключателями света. Представьте себе ситуацию, когда после нажатия на выключатель, свет включается с задержкой (при использовании механизмов, подобных latch в 1-wire) или вовсе не включается (мы попали в момент между опросами). Таким образом, чтобы полноценно работать с выключателями света, необходимо в цикле несколько раз в секунду опрашивать каждый выключатель. Это создаст приличный трафик в любого рода сети.
В этом смысле логичным видится другой подход. Устройство само определяет факт нажатия кнопки, сообщает об этом серверу и спрашивает его что ему делать. Именно такая логика и заложена в прошивку нашего Ethernet-устройства.
Но, прежде чем показать, как это работает, хочу обратить внимание на ссылку Conf, присутствующую на первом скриншоте. По ссылке находится сетевые настройки устройства, а именно IP-адрес и адрес сервера. Именно на этот сервер будет отправляться информация об изменении состоянии входов. Естественно и в данном случае настройки хранятся в EEPROM.

Итак, кнопка, сработала, МК зафиксировал нажатие (кстати, в прошивке реализован эффективный программный алгоритм защиты от дребезга контактов - Debouncing) и по протоколу HTTP связывается с сервером, сообщая ему нужную информацию. Протокол HTTP выбран не случайно. С одной стороны это в некоторой степени гарантирует доставку пакета, ведь HTTP работает поверх TCP, с другой стороны, что более важно, значительно облегчает, как мне кажется, программирование на стороне сервера. Ведь у нас уже работает домашний Web-сервер, работающий на Apache!

Лог Apache. Устройство сообщает серверу об изменении состояния входа 0 (D0)
Нам необходимо только написать простейший PHP-скрипт, отвечающий на запрос устройства.
<? if ( $_GET['pt'] == "0" ) echo "6:2"; ?>
Если сработал вход "0", сообщить устройству в ответ "6:2". Но что это означает эта команда?
Команда устройству состоит из двух полей, разделенных двоеточием.
Первое поле (6) - номер порта от 0 до 12 (у нас 13 входов/выходов)
Второе поле (2) - действие. Возможные варианты (0 - выключить, 1 - включить, 2 - переключить с вкл на выкл или наоборот)
Важно заметить, что сервер может послать устройству сразу несколько команд.
Например, "6:2;5:1", разделенных точкой с запятой, что будет означать "Выход 6 переключить, выход 5 включить". В одном ответе сервера может содержаться до 13 подобных команд. Просто, не правда ли?
Но что если в нашей домашней вообще сети вовсе нет сервера или же он по каким-то причинам недоступен или неисправен? Не проблема! Вернемся к настройке входа.

Здесь в поле Cmd в том же самом формате, например "6:2" прописывается команда, которую выполнит устройство если:
1) Сервер не прописан в конфигурации устройства
2) Сервер прописан, но не отвечает в течение 3 секунд
Таким образом, если говорить, к примеру, об управлении светом, мы можем использовать это устройство как само по себе, без всяких серверов, так и в паре с сервером, где команды, описанные в Cmd выступают в роли сценария по умолчанию. Мы в любом случае не останемся без света. То же самое можно сказать и относительно более критичных вариантов применения, связанных с безопасностью и системами защиты. Есть сервер - спрашиваем, нет сервера - решает вопрос самостоятельно.
Но что делать, если у нас в сети два таких устройства, а по сценарию при срабатывании входа на первом устройстве, должен переключится выход на другом? Например, датчик протечки в одном месте, а кран с приводом в другом? Для этого существует последнее поле Eth:
Здесь мы можем прописать IP-адрес устройства с командой для выполнения (параметр cmd). Таким образом, устройства могут управлять друг другом, но только в том случае, если неисправен или не указан основной сервер. Поле Eth можно использовать не только для передачи команд другим устройствам, но и для передачи какой-либо информации на резервный сервер, записав в это поле нужный URL.
Управлять устройством можно не только через Web-браузер или посредством скриптов, но и через любые программы типа wget, curl, ведь для передачи информации используется URL строка и GET-запросы типа
192.168.0.14/sec/pt=5&cmd=6:2
что мне кажется очень удобным, так как позволяет использовать огромное количество всевозможных инструментов, утилит и облегчает интеграцию Ethernet-устройства в систему Умного Дома, на чем бы она ни строилась.
Нисколько не сложнее получить текущее состояние порта.
192.168.0.14/sec/pt=7&cmd=get
По данному запросу Ethernet-устройство выдаст только состояние (ON, OFF или значение АЦП) без какой-либо лишней информации. Команду "get" удобно использовать в программах на сервере. Так, например, чтобы считать состояние АЦП устройства, достаточно всего одной строчки на PHP!
<?
$adc = file_get_contents('http://192.168.0.14/sec/?pt=7&cmd=get');
?>
Для компиляции и заливки прошивки в Linux требуется всего три пакета: собственно сам компилятор gcc-avr, библиотеки для работы с AVR и программа, работающая с программатором, широко известная "дудка" avrdude
apt-get install gcc-avr avr-libс avrdude
Чтобы скомпилировать прошивку, нужно распаковать архив (внизу статьи) и выполнить команду make.
Прошивка программатором USBasp осуществляется с помощью команды
avrdude -c usbasp -p m168 -e -U flash:w:eth_rem_dev_tcp.hex
На текущий момент все, о чем написано в статье, занимает в памяти микроконтроллера всего 15252 байт.
AVR Memory Usage ---------------- Device: atmega168 Program: 15252 bytes (93.1% Full) (.text + .data + .bootloader) Data: 862 bytes (84.2% Full) (.data + .bss + .noinit) EEPROM: 489 bytes (95.5% Full) (.eeprom)
Еще одно фото устройства в момент разработки. Стенд для отладки и экспериментов.

Отладочный стенд. Ethernet-устройство, программатор
Кнопки, переменный резистор для отладки АЦП
Диоды и симисторы (кстати, от ключа 1-wire) для тестирования выходов
Хочу заметить, что это мое первое знакомство с языком C и первая программа для МК. Поэтому приветствуются любые комментарии, указания на ошибки.
Тема в форуме, где идет обсуждение данного решения и подхода.
В данный момент устройство находится в стадии "боевого" тестирования, работая на реальной задаче.
Прошивка для Atmega168
ip_manager.zip (Исходники тестовой прошивки, о которой рассказывается в статье)
ip_manager.hex (Бинарный скомпилированный файл прошивки)
Последнее изменение исходных кодов: 22.07.2011
Прошивка для Atmega328
Версия 3.02 (2012-05-06)
- Исправлена несовместимость с Web-серверами, использующими "Chunked transfer encoding" (спасибо andvas)
Версия 3.01 (2012-05-03)
- Исправлена ошибка в работе HTTP-протокола (спасибо andvas)
Версия 3.00 (2012-04-20)
- Релиз, связанный с выпуском готового модуля MegaD-328
- Улучшена работа устройства в сети
- Небольшие изменения в Web-интерфейсе
- Светодиод, который теперь на порте PB0, отображает сетевую активность
- Наименование портов с P0 по P13. Соответствие (последовательность) реальным портам Atmega задается в исходнике в массиве "aio"
Версия 2.02.1 (2012-01-26)
- Исправлена ошибка в выводе состояния выходов (убран лишний <br>)
Версия 2.02 (2012-01-23)
- Исправлена ошибка в обработке состояния выходов по умолчанию (спасибо Leon7)
- Исправлена ошибка в переключении порта D3 из режима PWM в режим SWITCH
Версия 2.01 (2012-01-04)
- Добавлена возможность смены пароля
- Расширено до 35 байт поле для сетевых сценариев
- Исправлено множество ошибок и недоделок
Версия 2.00 (2012-01-03)
- Добавлена возможность использования аппаратного ШИМ на портах PD3, PD5, PD6
- Добавлена возможность изменения имени скрипта, на который отправляются данные
- Исправлена ошибка в обработке ответа сервера
- Небольшие изменения в оформлении HTML-страниц
Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.
2012-04-20 19:04:30 | Макар
Ребята.в архиве несколько файлов, и мне не совсем понятно.в какой последовательности их компеллировать.или их не все компилировать.это первый мой проект,обьясните самыми простыми словами
2012-04-20 18:47:50 | edka
Макар, в Avr studio жмете build. Файлы компилируются в папку debug вашего проекта.
2012-04-20 16:50:29 | Макар
Andrey_B,а как проделать это в AVR Studio
2012-04-20 16:21:14 | Andrey_B
Макар, для этого нужен компилятор.
В Linux использую avr-gcc, в Windows используют, например, AVR Studio
2012-04-20 13:48:41 | Макар
Andrey_B,скажите,как вы исходники компилировали в файл прошивки и получили файл с расширением .hex
2012-04-18 17:55:48 | Andrey_B
Макар, IP-адрес по умолчанию задается в исходника прошивки в файле main.c
Скачайте архив с прошивкой и скомпилируйте ее с нужным вам адресом.
2012-04-18 09:00:53 | макар
Как вы писали программу для контроллера?мне не совсем понятно как в программном коде прописать IP адрес. я навичек в этом деле,зарание спасибо за помощь
2012-04-10 12:54:52 | Andrey_B
Денис, конкретно в данном устройстве такой возможности конечно нет. Чисто теоретически, оцифровывать сигнал с камеры с помощью atmega можно, но, боюсь встроенных ресурсов МК (скорость, память) может не хватить, чтобы давать качественную картинку с полным разрешением. Да и не специфичная для МК задача. Намного дешевле и проще применять дешевые китайские IP-камеры. Со всеми их недостатками качество изображения будет выше, а возможностей больше.
2012-04-10 12:47:31 | Andrey_B
Макар, разъемы в данном устройстве можно применять разные. Я лично использовал MagJack и PulseJack. Последний использую в последних версиях устройства. Его можно заказать у меня на сайте. Его обозначение J00-0063NL
Но это далеко не единственный вариант. На нашем форуме в соответствующей ветке писали и о других вариантов разъемов. Однако стоит учесть, что не все они абсолютно совместимы по выводам (особенно это касается размеров).
2012-04-10 12:19:45 | Денис
А не подскажете можно ли видео с веб камеры например передавать через устройство...ил же скажем подключить к АЦП аналоговую камеру?
2012-04-10 09:52:27 | Макар
Андрей не могли бы вы полностью указать маркировку разъема rj45
2012-04-02 15:36:54 | Виталий Б
Я новичек в этом деле. Андрей не могли бы вы опубликовать печатную плату.буду очень признателен
2012-03-01 20:53:39 | Andrey_B
Кое-что есть на нашем форуме, где есть по этому поводу очень большая и содержательная ветка.
2012-03-01 00:02:46 | Юра
Очень понравилось, а где взять фото печатной платы, если можно выложите или подскажите.
2012-02-12 11:51:24 | Andrey_B
Задайте ваш вопрос на нашем форуме. Там есть люди, которые могут дать более квалифицированную консультацию.
2012-02-11 21:23:19 | Андрей
Всем привет! Интересная штука получилась - спаял схему, прошил мегу (удачно - проверено), при включении питания и подключении сетевого кабеля зеленый светодиод горел, но не пинговался. Проверял схему много раз, а потом СЛУЧАЙНО отпаял от разьема RJ-45 вывод номер 1 (который идет на катушку ... ) и схема сразу заработала!!! Пингуется, заходит через браузер, можно поменять что-то на выводах. Не могу понять что произошло??!! Может катушка индуктивности (10 мкГн как-то влияет??) Спасибо!
2012-02-02 22:36:30 | Andrey_B
Ваш вопрос я не понял. Сформулируйте ваш вопрос более развернуто. Желательно это сделать на форуме, где об Ethernet-устройстве существует отдельная ветка.
2012-02-02 20:48:26 | Миша
Привет!
я делаю девайс с эзернетом, который будет работать как www-клиент (отправлять GET запрос).
Вопрос: зачем устройству знать IP сайта и IP роутера, когда известен веб-адрес?
Спасибо!
2012-01-22 23:22:27 | Andrey_B
Сергей, диоды на разъеме RJ45 должны гореть даже с отсутствующим МК. Где-то ошибка в плате. Опишите свою проблему на нашем форуме - там есть люди, которые должны помочь. К тому же аналогичная проблема там обсуждалась.
2012-01-22 18:04:33 | Серега
Андрей, подскажите пожалуйста! Схему спаял. Прошивку зашил через avrdude (под виндой). НО когда подключаю к компу через ethernet кабель, то диоды на разъеме RJ-45 не горят, комп устройство не видит.
Схему перепроверял несколько раз, вроде все ок. Подскажите в чем может быть проблема? Есть подозрение на нерабочий разїем или микросхему ENC. Как можно диагностировать устройство еще?
2012-01-03 21:33:57 | Andrey_B
T1, опция -p m168
Все поддерживаемые микроконтроллеры прописываются в конфигурационном файле avrdude.conf
В моем есть и 168 и 328
2012-01-03 17:59:07 | Т1
Андрей, спасибо, но все равно немного не понятно. в списке контроллеров в дудке я не нашел 168 меги, какой ставили вы?
2012-01-03 13:59:23 | Andrey_B
T1, фьюзы:
для Atmega168: L:0x60, H:0xDF
для Atmega328: L:0x60, H:0xD9
Для программирования МК использую avrdude
2012-01-03 12:40:51 | T1
Андрей, а напишите пожалуйста, как вы выставляли FUSE байты и в какой совтине шили мк.
2011-12-21 10:55:14 | Andrey_B
DMG, просто блокнот
2011-12-21 01:46:56 | DMG
Andrey_B, какую IDE используете для разработки прошивки? Или просто Блокнот?
2011-12-19 11:20:37 | Andrey_B
Rolf, TP1 не используется (см. Datasheet на ENC28J60)
TP2 можно использовать как полноценный IO. В будущих версиях прошивки будет задействован и он.
2011-12-19 11:15:29 | Andrey_B
Андрей, 10 мкГн
2011-12-19 06:45:41 | Rolff
Андрей, а подскажите плиз, куда должны идти две точки TP1 и TP2 соответственно
2011-12-18 17:49:46 | Николай
Виталий Sprint Layout 5.0 , версия 4.ХХ не всегда корректно открывает многие печатки.
2011-12-18 13:18:09 | Андрей
Андрей, подскажите пожалуйста, какой номинал индуктивности L1 на схеме? Спасибо.
2011-12-14 12:12:30 | Andrey_B
Виталий, например, Sprint Layout
2011-12-14 09:30:34 | Виталий
Добрый день, Andrey_B
какой программой нужно открывать avr-eth.lay,какие нашел (SL4RUS,rulay) перепробовал не идет.
2011-11-29 18:11:44 | Andrey_B
Юрий, согласен. Не лучший вариант.
Давайте перенесем обсуждение на форум. Там есть ветка по поводу этого устройства.
Я сейчас планирую переходить на atmega328. Можно запланировать эту фичу в новой версии прошивки для 328.
2011-11-29 09:19:11 | Юрий
Честно говоря я не понимаю в чем выгода от применения третьего способа. Если рашьше "исполнитель" ждал три секунды что скажет "сервер" то сколько он будет ждать сейчас и как это отразится на работе системы? Не получится ли что после самостоятельного исполнения заложенного действия придет запоздавший ответ от сервера, в котором будет (например) прописано какое-либо другое действие?
2011-11-28 16:31:03 | Andrey_B
Юрий, я ждал, когда кто-нибудь задаст этот вопрос.
В текущей версии прошивки такая схема работы не заложена.
Эту задачу можно решить разными способами.
Способ №1. Мы в конфигурации устройства указываем, что сервер используется только для отчета. Команды, идущие от него игнорируются.
Способ №2. Эту опцию переносим в настройки конкретного входа. Это даст возможность с разными выходами работать по-разному.
Способ №3. Мне он кажется пока наиболее логичным. Отправляем сообщение серверу, а если сервер ничего не ответил, тогда выполняем сценарий по умолчанию.
Как вы считаете?
2011-11-28 15:22:53 | Юрий
Андрей, скажите, если я хочу настроить устройство так чтобы оно при прописанном сервере не ждало три секунды, а сразу реагировало и только отправляло отчет о своем состоянии на сервер, как это сделать?
2011-10-22 21:57:11 | Andrey_B
Eugene, ну есть люди, которые своей головой думать не умеют. Что уж тут поделать. Я отношусь к таким деятелям с искренним сочувствием. ;)
2011-10-22 13:25:17 | Eugene
Плагиат? Ссылка скрыта.
2011-10-12 23:13:25 | Александр
Очень понравился ваш сайт и статьи. Грамотно, и вместе с тем, "для людей". Меня на ваш сайт привела такая специфическая задача - хочу (формат "для себя", поэтому ни одно из готовых решений не подходит из-за дороговизны) сделать устройство, которое может коммутировать SATA интерфейс. Т.е. соединять один физический порт контроллера (на материнской плате, например) с любым из X портов, подключенных к данному устройству. Т.е. чтобы можно было включить любой из винчестеров. С коммутированием питания еще как-то можно повоевать, но вот с коммутацией SATA я ничего не нашел даже и близко.
Может ваш взгляд со стороны поможет? Спасибо!
2011-10-09 10:58:15 | Andrey_B
Вот здесь я выкладывал фото обратной стороны и комментарий к фото.
2011-10-08 17:19:31 | Иван
Андрей, а вы можете еще выложить фото обратной стороны платы в статью?
2011-10-07 12:39:50 | Andrey_B
Иван, у описываемого в статье устройства есть набор входов и выходов. Непосредственно к логическому выходу нагрузку подключить нельзя. Предполагается некая плата расширения, на которой могут быть установлены реле, симисторы или другие коммутирующие нагрузку компоненты. Максимальная мощность нагрузки в этом случае зависит от конкретной реализации этой платы. Например, на фото в статье я подключил двухканальный симисторный блок от модуля 1-wire. Его номинальная мощность около 300Вт на канал. Но ничто не мешает использовать другие решения, реле, мощные симисторы с радиаторами, которые могут коммутировать несколько киловатт.
2011-10-07 00:17:16 | Иван
А сколько ватт можно подключать в качестве нагрузки?
2011-09-02 13:08:46 | Andrey_B
DMG, с текущей версией модуля использовать технологию PoE нельзя. Теоретически можно доработать модуль, но проблема в другом. PoE предполагает использование инжекторов, коммутаторов с поддержкой PoE. Это оборудование значительно дороже. Учитывая, что планируемое место для размещения таких модулей - серверные, распределительные шкафы, где всегда можно обеспечить питание устройства, использование PoE пока всерьез не рассматривалось.
2011-09-02 12:16:11 | DMG
Интересно, а можно применить к этим компонентам технологию PoE?
2011-05-31 10:28:26 | Andrey_B
arsic, вы говорите об аппаратной части?
Фактически Arduino + Ethernet Shield - это тоже самое, что описывается в статье, но... Во-первых, готовый набор Arduino будет стоить около 2000 руб, тогда как это решение можно собрать рублей за 300-500. Во-вторых, я хотел всячески минимизировать зависимость от производителей и платформ. В моем случае зависимость только от Atmel и Microchip. В случае с Arduino - еще и от платформы, языка программирования, среды разработки. А по большому счету разницы никакой нет.
2011-05-30 23:37:03 | arsic
Андрей, поясните, почему не взяли за основу что-нибудь готовое из arduino?
П.С. Спасибо за статьи! Всегда с удовольствием захожу на ваш сайт.