Умный Дом по Ethernet

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Умный Дом по Ethernet

Сообщение THK » 30 мар 2011, 10:21

Я, так сказать, начинающий в AVR.
Я тоже, до этого общался только с 8051.
Буду рад, если дадите еще какие-нибудь рекомендации именно в плане защиты устройства.
Будут идеи, напишу обязательно.
Где-то достаточно 8-битной конвертации, а где-то желательно использовать 10-битную (предполагаю с высокоточными датчиками вполне может пригодится). Выносить это в настройки? Не перебор ли? Хотя с другой стороны иметь прошивку с возможностью настройки большого числа параметров работы чипа вместо традиционного программирования может быть удобно.
Если есть желание и возможность, то почему нет? Для души, так сказать.
Я себе в таких удовольствиях стараюсь не отказывать.
Что касается практической стороны. Какая максимальная частота оцифровки может быть нужна? В даташите написано: "13 µs - 260 µs Conversion Time" ,т.е. около 76,9-3,8 кГц. На мой взгляд, 10 бит, 5-10 Гц вполне достаточно для любых применений...

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 31 мар 2011, 01:25

Хочу поделиться информацией о ходе работ. ;)
Теперь устройство отправляет по нажатию кнопки информацию серверу по протоколу HTTP, получает в ответ инструкции и выполняет их. Время реакции, даже при условии, что устройство обращается к монстроидальному Apache, который запускает PHP-процесс, который лезет в MySQL, порадовало... Я думал, что придется делать что-то вроде облегченного Web-сервера под эти задачи, но даже на моем очень загруженном сервере все работает весьма быстро. Глаз почти не замечает задержки. Хотя порт, по которому устройство долбится на сервер имеет смысл сделать настраиваемым.
Но в процессе реализации столкнулся с проблемой, которая известна как AVR Debouncing. То есть нельзя просто так опрашивать кнопку... Цифровой вход настолько чувствительный, а кнопка настолько "ненадежна" с точки зрения МК, что это проявляется конкретными глюками. Мгновенное включение/выключение нагрузки, нагрузка "как бы" не включается, "как бы" не выключается. В общем неадекватная реакция нагрузки на нажатие кнопки, когда нажатие на кнопку легкое или быстрое или не акцентированное.
Для решения проблемы применил немного видоизмененный алгоритм немецкого программиста, известный как Danni Debounce, который для решения этой проблемы использует прерывания и таймер. Алгоритм хорош тем, что не блокирует работу МК и работает одновременно со всеми входами.
И тут возникает вопрос. Значит и ЭТО тоже нужно выносить в конфигурацию? Или по крайней мере главную настройку таймера МК - время, в течение которого вход должен сохранять свой логический уровень чтобы прошивка детектировала факт изменения состояния. Так, для кнопки оптимальное время 5-10 мс, но ведь не кнопками едиными... Значит надо иметь настройку Debouncing: Off, 5, 10, 15 ms
Не влезет все в 16Кб ;)

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Умный Дом по Ethernet

Сообщение THK » 31 мар 2011, 09:43

Если мне не изменяет склероз, разговор шел об устройстве, как о ядре , к которому подключается внешние входа/выхода. Программная защита от дребезга контактов - хорошо, но давайте немного порассуждаем.

1. Я не стал-бы тянуть провода со всего дома непосредственно к пинам контроллера. Маленькие токи, большое входное сопротивление входов, длинные линии и уровень лог.1 меньше 2 вольт сделают своё дело - дом будет мигать как новогодняя елка!

2. На входы/выходы надо делать опторазвязку и входную часть запитывать напряжением 12-24 вольта.

3. То, к чему я веду. Если на входе будет стоять оптрон + пара резисторов, то добавить еще один конденсатор - не проблема. Зачем тогда программная защита от дребезга контактов? Мне кажется это лишнее.

У меня вопрос по схеме. Часть пинов контроллера не используется (PB0,PB1,PB7) Вы задействуете их в своей прошивке?

PS Вот алгоритм русского програмиста Васи Пупкина :D
Начну издалека.
Задача, которая выполняется в функции Main - циклическая, попросту говоря бесконечный цикл.
В памяти организуется массив с числом элементов, равным числу входов со зночением 0xFF во всех ячейках.
Во время каждого прохода цикла опрашиваем входные пины.
Если на входе "0" - вычитаем 1 из соответствующей ячейки, если "1" - прибавляем 1 (с защитой от переполнения). Как только значение в ячейке = 0, значит кнопка нажата.
Алгоритм "самонастраивающийся" и в каких либо параметрах не нуждается, максимум - галочка "включить защиту от дребезга".

Добавлю еще одну "фенечку" - девушек это не касается. :lol:
Часто необходимо чтобы при постоянном (статичном) состоянии входа задача выполнялась один раз - при изменении состояния (так называемый детектор фронтов импульса).
Запоминаем состояние входа.
В следующем проходе сравниваем текущее и запомненное состояние.
Если они разные - произошло событие (фронт или спад), сохраняем текущее состояние и обрабатываем событие.
Иначе проходим мимо.

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 31 мар 2011, 11:16

THK писал(а):Я не стал-бы тянуть провода со всего дома непосредственно к пинам контроллера.
Совершенно согласен. Описанные вами меры имеет смысл применить.
THK писал(а):У меня вопрос по схеме. Часть пинов контроллера не используется (PB0,PB1,PB7) Вы задействуете их в своей прошивке?
По поводу PB1. Не хотелось бы отказываться от светодиода. С точки зрения каких-то сервисных, тестовых задач, он может пригодится.
А насчет PB0 и PB7 нужно посмотреть.
THK писал(а): В памяти организуется массив с числом элементов, равным числу входов со зночением 0xFF во всех ячейках.
Во время каждого прохода цикла опрашиваем входные пины.
Если на входе "0" - вычитаем 1 из соответствующей ячейки, если "1" - прибавляем 1 (с защитой от переполнения). Как только значение в ячейке = 0, значит кнопка нажата.
Я не совсем понял идею алгоритма. Если как простая защита от дребезга, то я это пробовал. Абсолютно не работает и ничем не отличается от механизма без какой-либо защиты вообще. Если почитать форумы на тему debouncing, то это первое, с чего начинают программисты, а затем прибегают к альтернативным методам и приходят в итоге к схеме с прерыванием и таймером. Считается, что это наиболее правильный для AVR метод. Или здесь что-то другое имеется ввиду?

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Умный Дом по Ethernet

Сообщение THK » 31 мар 2011, 14:32

По поводу PB1. Не хотелось бы отказываться от светодиода.
Для тестов согласен, а на отлаженном алгоритме он зачем может пригодится?
Я не совсем понял идею алгоритма.
Идея - организовать "прозрачную" (не зацикливающую процессор) задержку, длительностью = (длительность_выполнения_Main) * 255
Это эквивалентно тому, что прочитать состояние входа, подождать сколько-то времени, снова прочитать вход и если сост.1 = сост.2 сделать вывод, что кнопка нажата.
Возможно Вы не заметили разницу из-за малого времени выполнения Main...

В свое время я долго не мог сделать корректный опрос клавиатуры из-за того, что программа реагировала (условие срабатывало) не на изменение уровня на входе, а на сам уровень (если вход =1 выполняем ..... и так в цикле, пока нажата кнопка :) ). Ну это, так, лирическое отступление. Хотя, судя по описанию, симптомы совпадают.

У Вас как описано условие, что кнопку нажали и надо произвести какие-то действия?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 31 мар 2011, 15:12

THK писал(а):
По поводу PB1. Не хотелось бы отказываться от светодиода.
Для тестов согласен, а на отлаженном алгоритме он зачем может пригодится?
Ну, для эстетики. Это же в конце концов красиво, когда лампочки моргают. :D
Любое осмысленное действие: отправка TCP/IP пакетов, фиксация нажатия кнопки и пр. сопровождается морганием светодиода. Так можно, например, определить, что устройство не зависло и еще функционирует. Хотя, конечно, может оно и лишнее.
Идея - организовать "прозрачную" (не зацикливающую процессор) задержку, длительностью = (длительность_выполнения_Main) * 255
Это эквивалентно тому, что прочитать состояние входа, подождать сколько-то времени, снова прочитать вход и если сост.1 = сост.2 сделать вывод, что кнопка нажата.
Возможно Вы не заметили разницу из-за малого времени выполнения Main...
Еще в самом первом сообщении, в котором я упомянул эту проблему, я написал, что "Алгоритм хорош тем, что не блокирует работу МК и работает одновременно со всеми входами." Это относилось к алгоритму Danni Debounce. Для данного устройства, где может сработать одновременно несколько кнопок, это очень важно. А вот предложенный вами механизм не работает. И не только у меня. Точнее он работает, но плохо. Причем дело не в количестве пропущенных циклов main(). Кстати, 255 - это почти ничего. На эту тему я вчера нашел массу статей и обсуждений. Примерно с 2005 года самым лучшим, быстрым и экономичным программным алгоритмом для debouncing'а считается тот, что использует встроенный в МК timer interrupt. Есть только несколько разновидностей реализации (для C++, для Ассемблера). Теперь реакция кнопок ну просто лучше не придумаешь.
Но вы правы, для кнопок требуется аппаратная реализация защиты от дребезга. Однако, если хватит на все памяти, в чем есть сейчас большие сомнения, то настройку для входа (хотя бы чекбокс) нужно будет заложить.
В свое время я долго не мог сделать корректный опрос клавиатуры из-за того, что программа реагировала (условие срабатывало) не на изменение уровня на входе, а на сам уровень (если вход =1 выполняем ..... и так в цикле, пока нажата кнопка :) ). Ну это, так, лирическое отступление. Хотя, судя по описанию, симптомы совпадают.
Нет-нет. Дело не в этом. Эта проблема решается легко. Дело в другом. По нажатию кнопки у нас включается свет. Эмулируем реальную работу. Если у нас хорошая кнопка, то при нормальном нажатии у нас в 95% случаев свет включится. Нажали повторно - 95%, что выключится. Однако в 5% случаев нажатие кнопки сопровождается быстрым включением-выключением (дребезг/bounce). Иногда оно настолько быстрое, что визуально кажется, что свет не включился или не выключился. 5% - это много. И 1% много. А если мы используем кнопку похуже (у меня на макетке две - одна хорошая, другая уже с износом), то процент смещается в худшую сторону. А если мы начнем быстро-быстро кнопку нажимать, то получается полная ерунда. А вот с программным алгоритмом, который я описал, все прекрасно. Можно азбуку морзе набивать. Эти 5%, если не делать обработку программную или аппаратную, будут сильно нервировать пользователей, а какой же это Умный Дом, если он будет нервировать? ;)

Насчет условий и прочего... Все мне стало в принципе ясно. Осталось только собрать все в кучку. Как соберу, выложу исходник. И буду просить критиковать, так как я чайник не только в AVR, но и в C++ ;)

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Умный Дом по Ethernet

Сообщение THK » 31 мар 2011, 18:47

Ну вот, теперь даже я понял в чем проблема! :D
Как соберу, выложу исходник. И буду просить критиковать, так как я чайник не только в AVR, но и в C++ ;)
Atmega168 и ENC28J60 заказаны в радуге, приедут через 4 недели... :(
А на счет чайника Вы погорячились! Самовар! Не меньше. :D А чайник - я...

Sonny80
Сообщения: 2
Зарегистрирован: 25 мар 2011, 23:02

Re: Умный Дом по Ethernet

Сообщение Sonny80 » 04 апр 2011, 09:59

Господа,
Надо делать сжатие/разжатие html шаблонов, хранимых во Flash Atmega - я уже проходил через эти грабли... Без этого веб сервер будет совсем никакой :(

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Умный Дом по Ethernet

Сообщение THK » 04 апр 2011, 19:27

Вот здесь http://ab-log.ru/forum/viewtopic.php?f=1&t=6#p48 Андрей все расписал.
Все страницы должны помещаться в один TCP пакет. Размер HTML-страницы не должен превышать 550 байт.
Вопрос не в хранении страниц, а в ее передаче.

PS Если я что-то неправильно понял, поясните пожалуйста.

Sonny80
Сообщения: 2
Зарегистрирован: 25 мар 2011, 23:02

Re: Умный Дом по Ethernet

Сообщение Sonny80 » 04 апр 2011, 22:29

THK писал(а):Вот здесь http://ab-log.ru/forum/viewtopic.php?f=1&t=6#p48 Андрей все расписал.
Все страницы должны помещаться в один TCP пакет. Размер HTML-страницы не должен превышать 550 байт.
Вопрос не в хранении страниц, а в ее передаче.

PS Если я что-то неправильно понял, поясните пожалуйста.
1) 550 байт - это ограничение из-за отсутсвия "склеивания" пакетов в демонстрационном примере tuxgraphics. Для передаче в одном сегменте локалки пойдет... Но если вопрос встанет о передаче на удаленные расстояния, например, через GPRS или при наличии ряда маршрутизаторов, которые, допустим, ваш пакет разобьют на пару мелких по 256, то могут возникнуть проблемы.
2) я вообще то говорил о хранении html страниц в памяти atmega... Ведь вы делаете web сервер... И нужны будут страницы для конфигурирования направления передачи портов, IP адресов, Mac адреса. В сумме со стандартными тегами html наберется приличный размер для 16 килобайт флеши... А если допустим захочется сделать java скрипт проверки введенных данных?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 04 апр 2011, 23:21

Sonny80, вы правы. Уже сейчас мне становится понятным. Даже в урезанном минималистском виде все страницы не поместятся во Flash-памяти микроконтроллера. Сейчас думаю, как урезать еще сильнее, чтобы сделать какой-то законченный работающий вариант. А уже потом, возможно, применить вашу идею относительно компрессии данных.
Да вот только возникла какая-то проблема с USBasp программатором. Разбираемся.
Пока суть да дело решил наконец-то привезти в порядок кабельное хозяйство. Заказал двухметровую 19" стойку, а точнее коммуникационный шкаф (пока только на 2-й этаж), где будет смонтировано все: Ethernet, 1-wire (с помощью патч панели), ТВ, охранно-пожарная сигнализация, силовые цепи. Телефонию сразу буду делать IP. Буду ставить Asterisk. Еще раз убеждаюсь. В современном доме без сервера/высокопроизводительного контроллера обойтись ну очень сложно. Думаю, хватило бы 24 портов в новом коммутаторе только на один этаж... ;)

stpavel
Сообщения: 75
Зарегистрирован: 08 апр 2011, 18:43

Re: Умный Дом по Ethernet

Сообщение stpavel » 08 апр 2011, 19:11

Здравствуйте. Для облегчения задачи, почему бы не воспользоваться Arduino ? Огромное количество библиотек, документации и примеров, язык очень прост в освоении, контроллер плюс ethernet shield с ebay обходится порядка 1500 рублей. Понимаю что с "нуля" дешевле и может быть интереснее, но по моему выгода от дешевизны , если учесть затраты времени ( если это конечно не серийное производство ), сомнительна.
Последний раз редактировалось stpavel 08 апр 2011, 20:07, всего редактировалось 1 раз.

stpavel
Сообщения: 75
Зарегистрирован: 08 апр 2011, 18:43

Re: Умный Дом по Ethernet

Сообщение stpavel » 08 апр 2011, 19:36

Andrey_B писал(а):Телефонию сразу буду делать IP. Буду ставить Asterisk.

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

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 08 апр 2011, 22:45

stpavel, это несколько не та область, где всерьез имеет смысл обсуждать облегчение задачи. ;)
А по существу принципиально не вижу существенной разницы между Arduino и применяемым мной схемотехническим решением.
Некоторые тезисы в пользу моего подхода (хотя и не очень убедительные):
1. Меньшая зависимость от производителя. Готовые платы Arduino и Ethernet Shield в значительной степени менее распространены и доступны, тогда как Atmega8 и ENC28J60 можно купить в любом магазине радиодеталей. Сколько будет жить и развиваться платформа Arduino неизвестно, тогда как C, avr-gcc и avr-libc будут всегда, пока Atmel что-то выпускает в этом роде.
2. Для avr-gcc не меньше, а значительно больше готовых библиотек и решений. В частности готовых стэков TCP/IP несколько. Найти в Интернете информацию и решения для C проще чем для программной платформы Arduino (на мой взгляд).
3. Собрать своими руками модуль на Atmega+ENC28J60 технически значительно проще чем один только Ethernet Shield.
4. Программирование на С для Atmega дает массу новых знаний в плане программирования МК, принципов его работы (не только МК, а вообще компьютерных систем). Да немного разобраться с C было бы для меня очень полезным опытом, так как подавляющее большинство Open Source для Linux написаны на нем.

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

Sonny80 и все, кто разбирается в программировании МК. Есть вопрос.
Иногда в процессе манипуляции с указателями возникают ошибки логического характера. Так вот в результате этих ошибок, по всей видимости, происходит некорректная работа с памятью. С точки зрения компилятора синтаксических ошибок нет. Но при работе такой прошивки, когда в исходном коде идет некорректная работа с какой-нибудь переменной, иногда каким-то образом затрагиваются регистры МК (тогда как переменная никаким образом с этими регистрами не связана). Иногда это порты. Хуже всего, когда сбой приходится на регистры, отвечающие за тактирование МК. Так как в схеме от tuxgraphics применяется тактирование от ENC28J60, некорректные параметры работы prescaler'а полностью нарушают работу МК. В результате программатор USBasp его по понятным причинам не видит. Приходится перепрошивать его другим более "нормальным" программатором.
Вопрос вот в чем. Что происходит? Как можно избежать таких программных ошибок?

stpavel, за краткий обзор возможностей Asterisk спасибо. Буду внедрять ;) И звонок на воротах к нему же подключу ;)

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Умный Дом по Ethernet

Сообщение THK » 09 апр 2011, 10:29

Andrey_B, не хочу отговаривать Вас от проекта Atmega+ENC28J60, тем более Вы привели весомые доводы за него. Меня заинтересовало вот это:
The latest revision of the Ethernet Shield includes a micro-SD card slot.
Т.е. возможность разместить WEB-странички на карте, освободив тем самым Flash контроллера для основного кода.
Возможность вести логи.
И, как мне показалось, реализация TCP от Arduino позволяет не ограничиваться соотношением 1 страничка - 550 байт.

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 09 апр 2011, 11:11

THK, а я видел. Но это совсем новая разработка. Я пока не встречал готовых любительских устройств. Впрочем, это вопрос времени.
Понимаете, любая реализация TCP/IP требует памяти. Полноценная реализация требует много памяти. Здесь вопрос не в том, Arduino это или нет.
Берем Atmega328 или Atmega644 вместо Atmega88/168 и ставим в нее uIP, у которого нет таких ограничений, как в TCP/IP от tuxgraphics.
Берем Arduino на Atmega168 и обнаруживаем что для "пользовательского" кода нет места. Это ведь одно и то же! ;)

Но и то и другое либо будет развиваться, либо умрет.

Это работа не на результат. Какая по сути разница Arduino или нет. В этом проекте я вижу основную для себя тенденцию в развитии Умного Дома.
1. Расширение использования стандарта Ethernet в системах домашней автоматизации
2. Сеть узлов разной производительности и функционального назначения или микромодулей, работающие по стандартным протоколам HTTP-TCP/IP
3. Тесная интеграция всех систем Умного Дома с Интернетом. Полная их совместимость со всеми бытовыми средствами телекоммуникации.

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

А что до аппаратного решения. Завтра будем использовать технологии ARM: Cortex, FreeScale, Atmel... А послезавтра любой микромодуль будет иметь 8 ядер, десятка два интерфейсов и сотню входов/выходов. Условно, конечно. Но, как мне кажется, движение идет в этом направлении.

maxxir
Сообщения: 32
Зарегистрирован: 15 апр 2011, 12:42
Откуда: Тольятти

Re: Умный Дом по Ethernet

Сообщение maxxir » 15 апр 2011, 14:29

Andrey_B писал(а): Sonny80 и все, кто разбирается в программировании МК. Есть вопрос.
Иногда в процессе манипуляции с указателями возникают ошибки логического характера. Так вот в результате этих ошибок, по всей видимости, происходит некорректная работа с памятью. С точки зрения компилятора синтаксических ошибок нет. Но при работе такой прошивки, когда в исходном коде идет некорректная работа с какой-нибудь переменной, иногда каким-то образом затрагиваются регистры МК (тогда как переменная никаким образом с этими регистрами не связана). Иногда это порты. Хуже всего, когда сбой приходится на регистры, отвечающие за тактирование МК. Так как в схеме от tuxgraphics применяется тактирование от ENC28J60, некорректные параметры работы prescaler'а полностью нарушают работу МК. В результате программатор USBasp его по понятным причинам не видит. Приходится перепрошивать его другим более "нормальным" программатором.
Вопрос вот в чем. Что происходит? Как можно избежать таких программных ошибок?
В этом и есть особенность С - язык очень мощный и довольно простой, но работа с указателями требует
большой осторожности. Тут в основном только длительный опыт программирования на С поможет. Читайте классику жанра: "Керниган, Ричи. Язык C". Если есть возможность старайтесь избегать неоправданного использования указателей путем явного определения переменных, структур етс.. В сомнительных местах вставляйте -debug проверки (например посредством printf через UART порт, либо мигание светодиодом например).
Ну и вообще в программировании микроконтроллеров на С есть масса своих нюансов. Незабывайте внимательно читать даташиты на контроллер и не ленитесь заглядывать в errata.
Кстати синтаксис С очень схож с Verilog (привет FPGA и CPLD). Чрезвычайно полезно программировать на С - очень хороший багаж знаний получается. :roll:

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 15 апр 2011, 22:48

Тактирование МК производится от ENC28J60. Этот чип работает на частоте 25Мгц. При инициализации МК дается команда перевести CLKOUT сетевого чипа на частоту 12,5Мгц. Если в результате неправильной работы с памятью сбивается настройка CLKOUT сетевого интерфейса, например, МК начинает тактироваться от 25Мгц, модуль перестает работать и не программируется через USBasp.
Для решения этой проблемы пришлось подключить внешний кварц на 16Мгц. Ну и стараюсь избегать ошибок при работе с указателями.
Работа над прошивкой продолжается. Не так быстро, как хотелось бы, но рано или поздно я ее сделаю. По ходу родились некоторые интересные мысли. Сообщу чуть позже, если все же хватит памяти... ;)

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 18 апр 2011, 00:11

Я все-таки сделал это!
Мое устройство работает! Прошивка, конечно, не идеальна с точки зрения программирования на языке C. Есть большое поле для оптимизации работы с памятью и внедрения дополнительных функций, но основная идея реализована.
Итак, вводные данные.
МК Atmega168.
28 ног, 16Кб Flash-памяти, 1Кб SRAM, 512 байт EEPROM

Адрес по умолчанию 192.168.0.14, пароль "sec", запускаем браузер
ablog_eth_beta1.jpg
ablog_eth_beta1.jpg (19.14 КБ) 41499 просмотров
Здесь мы видим доступные нам 13 портов. В данный момент названия портов соответствуют названиям регистров МК, но в дальнейшем я откажусь от этого и будет просто 0 1 2 3 4 и т.д.
Верхняя ссылка, страница конфигурации
ablog_eth_beta2.jpg
ablog_eth_beta2.jpg (17.61 КБ) 41499 просмотров
Входим в настройки порта. NC - не сконфигурирован, In - порт является входом, Out - выходом.
Настраиваем порт на выход
ablog_eth_beta3.jpg
ablog_eth_beta3.jpg (17.65 КБ) 41499 просмотров
State - текущее состояние порта (включен/выключен)
ON OFF - можно прямо тут включить или выключить подключенную к порту нагрузку

Далее настраиваем вход
ablog_eth_beta4.jpg
ablog_eth_beta4.jpg (18.62 КБ) 41499 просмотров
Здесь все аналогично, за исключением двух полей: Cmd и Eth - расскажу дальше.

Прежде чем использовать устройство, зададим ему в конфигурации адрес сервера:
ablog_eth_beta6.jpg
ablog_eth_beta6.jpg (18.45 КБ) 41499 просмотров
Собственно, здесь кроме адреса сервера можно задать и IP адрес устройства.
Да, все настройки (в том числе портов) хранятся в энергонезависимой EEPROM и после включения-выключения устройства естественно сохраняются.
Я задал адрес сервера 192.168.0.250

Теперь нажимаем кнопку, которая подключена к порту, сконфигурированному как In.
В логах access.log сервера Apache можно увидеть следующее:
ablog_eth_beta7.jpg
ablog_eth_beta7.jpg (12.38 КБ) 41499 просмотров
Модуль по протоколу HTTP обратился на сервере к скрипту test-http.php и передал номер сработавшего входа pt=0

Теперь пишем простейший скрипт на PHP

Код: Выделить всё

<?
if ( $_GET['pt'] == "0" )
{
	echo "6:2";
}
?>
Если параметр pt равен 0 (сработал вход с номером 0), то ответить простой строкой "6:2"
А что такое 6:2?
Первая цифра [6] - номер порта
Вторая цифра [2] - действие. 1 - включить, 0 - выключить, 2 - изменить состояние (с вкл на выкл или с выкл на вкл)
Устройство получить эту команду от сервера, разберет ее и выполнит, произведя нужные операции с портами.
Важно отметить, что можно задать операции с несколькими портами, например так
6:1;5:0
Это будет означать: порт 6 включить, порт 5 выключить.
В одном ответе сервера может содержаться 13 таких команд.

Идем дальше.
ablog_eth_beta5.jpg
ablog_eth_beta5.jpg (21.82 КБ) 41499 просмотров
Поле Cmd у входа. Здесь можно задать команды, которые связаны с этим входом. Формат команд точно такой же как описано выше. И управлять можно любыми выходами сразу. Да, если порт настроен как вход, а мы попытаемся его включить, прошивка не даст это сделать.
Логика такая:
1. Если в конфигурации не прописан сервер, устройство работает само по себе. То есть в данном примере, если сработает вход 0, устройство переключит выходы 5 и 6.
2. Если в конфигурации прописан сервер, устройство пошлет запрос на сервер, но если статус ответа сервера не 200 (а, например, 301, 404 и т.д.), то модуль сам решит что делать, а именно переключит 5 и 6. Если сервер не ответил (он в дауне), то устройство будет в течение 3 секунд ждать ответа (для этого используется встроенный таймер в МК ISR(TIMER1_COMPA_vect), то есть модуль не блокируется, продолжает работать как обычно), то модуль и в этом случае выполнит эту команду.

Поле Eth. Это URL дополнительного сервера/устройства. В этом заложен глубокий смысл. ;)
Для каждого порта можно задать свой URL, причем IP-адреса могут быть разными.
Зачем это надо? Во-первых, это может быть резервный сервер или что-нибудь в этом духе. А во-вторых, это может быть точно такое же устройство!
Например, здесь можно указать:
192.168.0.15/s/?cmd=6:1
Таким образом если в нашей сети несколько таких устройств, то при срабатывании какого-то конкретного входа на одном модуле можно отправить команду по сети Ethernet на включение выхода на другом модуле без участия сервера!
То есть устройства могут общаться между собой. С их помощью можно строить сложные распределенные схемы. Как я говорил ранее, если произошла протечка на 2-м этаже, то можно отправить команду на закрытие крана на подаче воды даже если центральный сервер лежит.
Эту же команду можно выполнить и из любого браузера, с помощью wget, curl и т.д. для управления любым из существующих в сети модулей.

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

И все это 14 700 байт.
К сожалению длины всех команд и URL пришлось ограничить. Ведь у нас в наличии только 512 байт EEPROM.

Что нужно добавить в ближайшее время:
- Новый тип порта: АЦП. Код готов
- Настройка битности АЦП
- Возможно, PWM
- Настройка в каких случаях отправлять информацию на доп. адрес (всегда или только когда основной сервер недоступен), сейчас всегда.
- Настройка MAC
- Сильно оптимизировать работу с EEPROM. Вероятно придется парсить URL-доп. сервера, чтобы хранить IP-адрес в 4-х байтах вместо 15. и т.д. В данный момент EEPROM занят на 96%.

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Умный Дом по Ethernet

Сообщение THK » 18 апр 2011, 19:19

Классно :!: :!: :!:
Честно скажу - такого функционала не ожидал!

Есть пара вопросов.
Порт PB0 останется свободным? Может стоит его задействовать?
Если сервер не ответил (он в дауне), то устройство будет в течение 3 секунд ждать ответа
3 секунды довольно долго... Возможно предусмотреть настройку этого параметра? Тогда задача
Настройка в каких случаях отправлять информацию на доп. адрес (всегда или только когда основной сервер недоступен), сейчас всегда.
отпадает сама собой.
Если время = 0 отправить сразу, иначе подождать...
Вероятно придется парсить URL-доп. сервера, чтобы хранить IP-адрес в 4-х байтах вместо 15. и т.д.
Все устройства находятся в одной подсети с маской 255.255.255.0, можно отдельно хранить адрес сети (3 байта), а на хранение адреса устройства выделить 1 байт... ;)
Настройка битности АЦП
А зачем? Пусть работает в максимальном разрешении. Скорости преобразования хватит под любые задачи (ИМХО).

PS И еще раз, чтобы сбить у себя шквал восторга. А-а-а-а-громный респектище и уважуха!

Ответить