Пользователь
0,0
рейтинг
22 ноября 2012 в 12:50

Собираем wi-fi устройство управления электроприборами с веб-сервером и JS-фронтэндом

Добрый день, уважаемые хабровчане. В этой статье я несколько отойду от своего традиционного подхода к DIY – нашей основной целью станет быстрое и эффективное получение результата, а не изобретение велосипедов с целью самообучения, поэтому даже люди, впервые держащие паяльник, смогут все это повторить и получить готовое устройство за ~1000 рублей и один день.

Введение


Говорят, лень – двигатель прогресса. Это, в принципе, верное высказывание – лично меня всегда напрягала необходимость вставать и идти гасить свет, когда уже почти заснул. Поэтому еще на втором курсе университета я собрал простое устройство на AVRке, позволяющее включать и выключать люстру с помощью любого пульта дистанционного управления. Оно до сих пор висит в одной комнате и работает в режиме 24/5 уже 5 лет.
После была попытка избавиться от пульта – система распознавания голосовых команд, на такой же AVRке, которую я заодно сдал как курсовую в универе – она даже заработала, но не настолько удовлетворительно, как хотелось бы, поэтому менять шило на мыло я не стал.
Через некоторое время сформировалось понимание, что в подавляющем большинстве случаев, когда мне требуется включить или выключить свет, у меня в пределах досягаемости и непосредственной близости имеются либо ПК, либо планшет, либо коммуникатор – следовательно, наиболее удобным способом будет управление через них.
Я набросал вариант реализации на специальных радиомодулях, NRF24L01P – действительно потрясающих, так, например, размер SMD-варианта этого модуля составляет всего 10х15 мм! При этом ими удобно управлять, у них есть собственный протокол, который хендлит адресацию, мультиприем, авто-подтверждение приема и т.п.
Соответственно, по моим прикидкам, должен был быть какой-то USB-донгл с этим модулем, в перспективе – подключенный к компьютеру с веб-сервером, чтобы дать возможность управлять с мобильных устройств, и исполнительные девайсы с ответными трансиверами.
Очень долго у меня не доходили руки до всех этих систем – уже год у меня из стены торчали провода, которые я каждый раз замыкал руками, включая люстру, и говоря себе «ну вот разгребу дела на работе, и сяду разведу платы».
К счастью, последние проекты на работе были связаны с мобильными устройствами, которые должны были уметь несколько больше, чем может дать STM32 и любой другой Cortex M3, и я достаточно много времени провел работая с OpenWRT и устройствами типа всеми любимого TL-MR3020 и TL-WR703, о настройке которых я недавно написал статью. Вместе с этим опытом пришло осознание того, что подобные задачи решаются невероятно быстро и очень эффективно при помощи устройств с linux и wi-fi на борту. Хотя бы потому, что Wi-Fi дает куда более удобные (а в случае с необходимостью передачи видео/аудио – практически единственные доступные) средства беспроводной связи, поддерживаемые всеми современными устройствами.
Конечно, если объектов управления десятки, имеет смысл сделать более тупые исполнительные устройства на кастомных модулях, и оставить серверам с линуксом роль узлов. Но в случае, когда мы делаем продукт для реального использования у себя дома, а не в расчете на гипотетические объекты, такой подход приведет только к жуткой потере времени и денег.
Итак, давайте соберем за день устройство, которое позволит включать-выключать бытовой прибор (до 1.6КВт потреблением) по Wi-Fi, с красивым фронтэндом и без долгой возни с платами, прошивками и драйверами.

Программная часть


Начнем, вопреки традиции, не с железа, а с программной части, ибо она достаточно простая и проверить ее вы сможете сразу же после покупки роутера, даже без его разборки.
Надеюсь, к этому моменту вы уже успели купить TL-MR3020 и, может быть, даже прочитали мою статью по пересборке ядра. На самом деле, можно обойтись даже без пересборки, просто перешейте его прошивкой с официальной вики проекта OpenWRT – если потом возникнет желание, вы легко сможете сделать свою прошивку, встроив в нее необходимые скрипты.
Итак, как будет устроен наш прибор?

  1. Так как нам важно сохранить минимальное количество деталей, мы не будем использовать никаких внешних флешек и хабов, поэтому размер доступной нам памяти ограничен 4 МБ, из которых свободно, обычно, около 1-1.5 МБ.
  2. Учитывая пункт 1 выберем самый легковесный веб-сервер, поддерживающий CGI – идеальным вариантом стал 20-килобайтный mini-httpd безо всяких надстроек.
  3. В качестве cgi-скрипта воспользуемся обычными башевскими скриптами. В принципе, место позволяет поставить минимальную сборку питона. Правда, боюсь, без пересборки ядра вы это не осуществите – т.к. все, что вы ставите после прошивки устанавливается в JFFS, то и занимает оно намного больше, чем если бы было вбилдено изначально в SquashFS. В порядке эксперимента, я вбилдил и python-mini и mini-httpd прямо в образ, выкинув оттуда все лишнее – при билде JFFS образа система кинула эрроры о превышении размера, оставив на память недособранные куски, но SquashFS-образ собрался нормально, оставив мне еще ~250 КБ свободного места – для наших нужд вполне хватит. Еще одно замечание – старт питона с внутренней флешки выполняется намного медленнее, чем старт башевского интерпретатора (и явно медленнее, чем с внешней USB-флешки, сказывается SPI-интерфейс), поэтому при использовании питоновских скриптов для CGI отклик будет составлять около 1 секунды – не очень критично, но слегка раздражает. Впрочем, если бы я писал что-то более сложное, чем дрыганье одним GPIO, меня бы куда больше раздражал огромный и мерзкий баш-скрипт, и я бы предпочел смириться с секундным стартом интерпретатора питона
  4. Баш-скрипт будет дергать один из доступных нам GPIO, на котором висит светодиод. Светодиод мы с вами потом отпаяем и привесим на него твердотельное реле, управляющая цепь которого является по сути таким же светодиодом.
  5. Index.html будет содержать в себе небольшой js-код для отображения красивой картинки с лампочкой, которая будет зажигаться/гаснуть при нажатии, выполняя асинхронный запрос к CGI-скрипту, а также будет дергать его каждые N секунд, на случай если кто уже зажег лампочку с другого компьютера – чтобы обновить картинку в соответствии со статусом.
  6. Запитаем мы это все от идущего в комплекте блока питания, предварительно его разобрав, вынув из корпуса сам модуль, чтобы уменьшить размеры итогового девайса. Этот шаг опционален, если хотите – можете питать как вам удобнее.


Давайте начнем. На данный момент вы должны уже перешить роутер на OpenWRT и подключиться к нему по Ethernet-кабелю.
Заходим по SSH/WinSCP на роутер и идем в /etc

Настраиваем wi-fi

для этого идем в /etc/config/network и пишем там

config interface 'wlan'
option proto 'dhcp'

Это обеспечит получение wi-fi контроллером роутера IP от DHCP нашего домашнего раздатчика вай-фай в лице другого роутера.
В /etc/config/wireless заботливые first-start скрипты уже сгенерили настройки радио, осталось закомментить строку #option disabled 1 включая модуль wi-fi и в секции ниже, описателе интерфейса, написать что-то типа

config wifi-iface
	option device   radio0
	option network  wlan
	option mode     sta
	option ssid     тут-имя-вашей-точки
	option encryption psk2 
	option key тут-ваш-пароль

Данные настройки приведены для WPA2-PSK. Для WPA-PSK encryption будет psk, для открытой точки none, для вепа, соответственно, wep – более подробно лучше прочитать на официальной вики тут и тут.
Проверяем что все хорошо при помощи

wifi down
wifi
iwconfig wlan0

Если все ОК, iwconfig сообщит вам что вы присоединены к вашей точке доступа, после чего от эзернета его следует отрубить и продолжить настройку по wi-fi.

Настраиваем GPIO

Теперь нам надо дать доступ к GPIO пинам из юзер-спейса. Ядро это умеет само по себе, ничего делать для этого не нужно, но GPIO уже захвачены драйвером мигания светодиодами. При желании можно не трогать светодиоды и их драйвер, так как, согласно вики, есть несколько незадействованных GPIO, подтянутых к земле, подтяжку которых можно отпаять, после чего использовать их в собственных целях. В этом случае выгружать драйвер не нужно, достаточно только экспортировать GPIO (показано ниже). Но мы воспользуемся пинами со светодиодами, чтобы сразу увидеть результат трудов:
Пишем в /etc/rc.local

rmmod leds_gpio
echo 0 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio0/direction
echo 0 > /sys/class/gpio/gpio0/value

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

echo 1 > /sys/class/gpio/gpio0/value

А погасить – вот этой:

echo 0 > /sys/class/gpio/gpio0/value

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

Настраиваем mini-httpd

Если вы пересобрали ядро и встроили в него mini-httpd, то переходите сразу к настройке, если нет — ставим его из репозитория

opkg update
opkg install mini-httpd

Теперь внесем небольшие правки в /etc/mini-httpd.conf, так чтобы его первая строка выглядела как

cgipat=cgi-bin/**.sh

Теперь сервер будет пинать все что лежит в /www/cgi-bin/ и чье имя оканчивается на .sh как команду, транслируя ее ответ браузеру.

Настраиваем аппаратную кнопку

На случай если нам не захочется тянуться к wi-fi, повесим дублирующее действие на единственную кнопку: в /etc/hotplug2.rules убираем галочку перед словом buttons, чтобы нажатие на кнопки вызывало скрипты-обработчкики из соответствующей папки, строка теперь должна выглядеть так:

SUBSYSTEM ~~ (^net$|^input$|button$|^usb$|^ieee1394$|^block$|^atm$|^zaptel$|^tty$) {

После этого идем в /etc/hotplug.d/, создаем там папку button, а в ней – скрипт buttons (не забывая выставить ему права на выполнение командой chmod +x buttons!) со следующим содержимым:

#!/bin/sh
	if [ "$BUTTON" = "wps" ]; then
	if [ "$ACTION" = "released" ]; then
		state=`cat /sys/class/gpio/gpio0/value`
		if [ "$state" = "0" ]; then
			echo 1 > /sys/class/gpio/gpio0/value
		else
			echo 0 > /sys/class/gpio/gpio0/value
		fi
	fi
fi

Теперь нажатие на кнопку будет переключать состояние светодиода. При желании можно сделать чтобы светодиод под этой кнопкой светился в противофазе с управляющим, то есть чтобы при погашенной люстре кнопка аппаратного включения была подсвечена для упрощения ее поиска в потемках – для этого просто экспортируйте пин 26 в rc.local также, как экспортировали пин 0, и добавьте аналогичные строки вывода 1/0 в его value рядом с выводом в value нулевого пина.

Это можно проверить прямо сразу – если вы все сделали правильно, то нажатие на кнопку вызовет изменение состояния светодиода.

Пишем CGI-скрипт

Теперь покидаем /etc и идем в /www, где создаем директорию cgi-bin, а в ней – скрипт light-control.sh, которому делаем chmod +x, со следующим содержимым:

#!/bin/sh
	echo "content-type: text/html"
	echo ""
	input=$(echo $QUERY_STRING | tr "&" "\n") 
	for param in $input
	do		
		name=`echo $param | cut -f 1 -d "="`
		value=`echo $param | cut -f 2 -d "="`
		if [ "$name" = "action" ]; then
			if [ "$value" = "on" ]; then
				echo 1 > /sys/class/gpio/gpio0/value
			elif [ "$value" = "off" ]; then
				echo 0 > /sys/class/gpio/gpio0/value
			fi
		fi
	done
	cat /sys/class/gpio/gpio0/value

Первые две строки после #!/bin/sh обязательны для CGI-скрипта – говорим браузеру что все ок и мы сейчас выдадим хтмл, после чего шлем два \r\n в соответствии с требованиями стандарта.
Потом берем из переменной $QUERRY_STRING параметры, куда их поместил заботливый mini-httpd, и разбираем каждый на name и value. Вообще, тут будет использоваться только один параметр, но пусть код будет в более общем виде, на случай если решим расширить.
Дальше проверяем – если нам передали action=on, то зажигаем диод, если action=off – гасим.
А после всегда возвращаем то, что прочитали из value – 1 если диод горит, 0 – если нет. Таким образом, если мы дернем наш скрипт извне с каким-либо параметром кроме action=on/off или вообще без параметра, мы получим от него текущий статус светодиода.

Пишем фронтэнд

Кидаем в директорию /www скаченный с офф. сайта jquery — с ним действительно удобно делать аяксовые запросы – я видел все эти java-script’ы впервые в жизни (т.к. это самая дальняя от моих занятий и интересов область), но за 5 минут при помощи гугла осилил нужные мне действия. Сохраняем jquery под именем jquery.js
Туда же сохраняем представленные ниже картинки под именами lamp_on.jpg и lamp_off.jpg, символизирующие нашу люстру – их сделал из стащенной с гугла картинки путем разрезания ее на две части и легкой подгонки по размеру друг к другу. При желании можно использовать любые картинки.





Там же создаем index.html, в который пишем

<html>
	<head>
		<script type="text/javascript" src="jquery.js"></script>
		<script type="text/javascript">

			function LampImgOn()
			{
				$('#lamp_off').hide();
				$('#lamp_on').show();
			}

			function LampImgOff()
			{
				$('#lamp_on').hide();
				$('#lamp_off').show();
			}

			function ProcessResult(data)
			{
				if(data=="1\n")
					LampImgOn();
				else
					LampImgOff();				
			}
			
			$(document).ready(function()
			{
					$.ajaxSetup({
  					  cache: false
					});
				$('#lamp_on').hide();
				jQuery.get('/cgi-bin/light-control.sh', {'action': 'none'}, ProcessResult); 

				$('#lamp_on').click(function()
					{
						jQuery.get('/cgi-bin/light-control.sh', {'action': 'off'}); 
						LampImgOff();
					})
				
				$('#lamp_off').click(function()
					{
						jQuery.get('/cgi-bin/light-control.sh', {'action': 'on'}); 
						LampImgOn();
					})
				window.setInterval("jQuery.get('/cgi-bin/light-control.sh', {'action': 'none'}, ProcessResult)",2000);
			});
		</script>
	</head>

	<body bgcolor="#000000">
	<img id = 'lamp_off' src = 'lamp_off.jpg' height = '40%' style='display:none'>
	<img id = 'lamp_on' src = 'lamp_on.jpg' height = '40%' style='display:none'>
	</body>	
</html>


Тут мы на размещаем на страничке две изначально невидимые картинки с зажженной и погашенной лампой, а ява-скрипт после старта запрашивает аяксом от CGI (при помощи параметра action=none) текущий статус, а результат передаем на ProcessResult, который активирует ту или иную картинку. Эта же функция зовется после асинхронных запросов на переключение статуса (которые выполняются в обработчиках события клика на картинки), а также заводится таймер, которые каждые 2000 мс дергает скрипт на предмет статуса, чтобы отображать актуальные данные в случае, когда кто-то изменил их с другой страницы или аппаратной кнопкой.

Вот, собственно, и все – теперь можно зайти браузером на IP нашего роутера и насладиться красивой страничкой, управляющей светодиодом. Если вы нажмете на кнопку роутера при открытой страничке и подождете 2 секунды, картинка изменится сама за счет запроса, выполненного таймером.
На этом программная часть закончена, переходим к железке.

Железо


Что касается аппаратной части, то тут ситуация двоякая. Собственно схема у нас простейшая – управляющая цепь твердотельного реле по сути – тот же светодиод, и все что нужно – обеспечить протекание через него достаточного для включения тока. У S202S02 это не меньше 8 мА.
К сожалению, напрямую завести его от GPIO не получится – напряжение на GPIO 2.6В, после чего стоит резистор в очень маленьком корпусе номиналом 260 Ом и светодиод с падением напряжения около 1.5В. Таким образом, через него течет около 4-5 мА. Падение на S202S02 от 1.2 до 1.4В, так что то там будет примерно такой же. Можно, конечно, поискать резистор в таком же корпусе, но меньшего номинала, перепаять его, и нагрузить несчастный GPIO на 10 мА, но лучше пойти более простым путем – роль светодиода у нас исполнит переход база-эммитер NPN-транзистора, через который при падении в 0.75В потечет ток в 0.7 мА а в коллектор мы ему включим управляющую цепь реле.
Проблемы же состоят в другом. Их, собственно, две:

  1. Нужно отпаять светодиод (у нас это светодиод LED4) и припаять вместо него наш транзистор
  2. Нужно как-то упихать в корпус реле (ну это нетрудно, оно мелкое) и внутренности блока питания.

Что касается пункта 1. Текстолит, на котором выполнена схема, попросту говоря дерьмовый.
Дорожки и контактные площадки срывает моментально, припой – подстать текстолиту – начинает плавиться когда этот самый текстолит уже начинает гореть.
Что касается пункта 2. Будь корпус на 5 мм выше – проблем бы не было. Но увы, конденсаторы блока питания и импульсный трансформатор слишком высоки, чтоб корпус закрылся.
К сожалению я не нашел какого-то идеального волшебного решения, позволяющего красиво и быстро запихать в корпус невпихуемое. Костыльных вариантов много – начиная от покупки пластикового корпуса, в который это все влезет (нормальный, в общем-то, вариант), и заканчивая синей изолентой и резиночками для удержания в целости исходного корпуса.
Я выбрал нечто среднее – т.к. у меня оставался полиморф-пластик, я проложил узкую его полоску по периметру исходного корпуса и вдавил в нее крышку.
Так что в этом вопросе я рекомендую каждому найти устраивающее его решение самостоятельно. Разумеется, если вы будете использовать большой корпус, либо приделаете БП вне этого мелкого, вам совсем не обязательно отпаивать от платы разъемы, я просто расскажу что сделал я.
Чтобы плата могла влезть в корпус вместе с блоком питания, я отпаял от нее все разъемы (Ethernet, USB-Host, micro-USB-Power), а также развязку от эзернета. Плата резко стала плоской. Если будете это делать – будьте очень, очень внимательны. Я поплатился за свою невнимательность, установив слишком сильный поток из фена, в результате чего отпаялся критичный конвертер U5, дающий 3.3 В системе. Более того, его сдуло на пол и пришлось его долго искать – но, к счастью, удалось припаять его обратно.



Обращаем внимание на перемычку R113 (обведена красным) – по умолчанию она разомкнута. Замкнув ее мы сможем подавать питание на роутер через разъем USB-Host – а туда подпаяться на порядок удобнее и надежнее, т.к. он не SMD. Поэтому замыкаем R113 и спокойно паяем два провода для питания в отверстия из-под разъема.
Заметили, как тяжело паять провод в «земляное» отверстие? Оно соединено с полигонами земли на всех слоях, где они есть – теплоотвод бешеный, мой паяльник еле справился.
А вот так выглядят внутренности блока питания (рядом с платой роутера для масштаба)



Отпаиваем два хилых провода, которые раньше шли к вилке, и припаиваем туда что-то более надежное, что потом соединим с сетью 220В. Заодно отпаиваем его USB-разъем, так как соединим его напрямую с нашими проводами питания роутера.
Готовим реле, паяя так, чтобы потом силовые провода ничего не коснулись. Я подпаял вот так:



После пайки запихиваем в термоусадку, либо заматываем изолентой, либо покрываем сверху каким-нибудь герметиком или чем-то аналогичным (кстати, на фото блока питания видно этот самый герметик — он был изначально, китайцы тоже заботятся о ТБ).
Далее паяем транзистор – Я взял первый попавшийся под руку 2N6517 и подпаял его базой к той площадке, где у LED4 было написано +, эммитером – ко второй.



Так вот. Так делать не надо. Потому что достаточно одного неверного движения и вы сорвете обе площадки, придется потом паяться к резистору. Лучше подпаяйте тоненькие проводки к обеим площадкам, закрепите их на плате и выведите в безопасное место. И – да – если вы будете паять неаккуратно, то рискуете, как я, коснуться паяльником выводов микросхемы памяти и закоротить их. После чего будете проклинать свои кривые руки и час пытаться очистить их оловоотсосами, оплетками для выпайки, иголками – проверено на себе. К счастью, очистить таки удалось, но напряжно было неимоверно.
Осталось совсем немного – теперь у нас есть выход типа «открытый коллектор» (оставшийся вывод транзистора), к которому паяем резистор из расчета падения 1.3 вольта на оптопаре – то есть, при питании от 3.3В (их проще всего взять, на нераспаяном разъеме P1 справа на рисунке выше это четвертый пин), мы должны обеспечить ток где-то в 10 мА, что означает ровно 200 Ом.
Теперь аккуратно кладем блок питания кондерами вниз на плату роутера, не забыв проложить бумажкой – металлический верх кондера не должен быть под напряжением, но перемкнуть что-нибудь может, так что пусть будет бумажка. Провода питания роутера запаиваем в отверстия от разъема USB на блоке, плюсовой пин реле припаиваем к 3.3В (отверстие 4 на P1), минусовой – через 200 Ом резистор к коллектору транзистора.
Спиливаем одну из бобышек крышки, чтобы она не упиралась в блок питания, выступ, предназначенный для нажатия на кнопку наращиваем при помощи обрезка стержня от ручки или того же полиморфа.
Ну и прижимаем это все крышкой, закрепляя ее как вам больше нравится – полиморфом, изолентой, резиночками – на что хватит фантазии и материалов.
Осталось подвести 220В к проводам питания роутера, а коммутируемые провода реле включить вместо выключателя люстры или любого другого бытового электроприбора.

Получилось? Поздравляю, теперь в вашей люстре есть веб-сервер с CGI под управлением Linux, отдающий пользователям веб-фронтэнд на JavaScript, и все это – примерно за 1000 рублей и один день возни.
@Ariman
карма
352,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (37)

  • +1
    Поставил плюс за подход ;)
  • +1
    Даже дешевле чем на всяких «новомодных» ZigBee, при условии, что с питанием проблем нет.
    • +1
      А с питанием и нет — припаиваете его же БП и все работает — почти безотходное производство)
      Проблема только с упихиванием этого в исходный корпус, но этим можно не страдать, а взять имеющийся под рукой корпус побольше, и все.
      У вайфая есть ряд преимуществ перед кастомными радиомодулями, включая и зигби — как минимум вам не нужно будет устройство-мост, которое свяжет эту самую зигби сеть с вашей домашней.
      А еще можно навесить камеру и стримить видео — это займет не намного больше времени чем конфигурирование CGI. А вот если вы захотите стримить видео по кастомному радиомодулю, то, боюсь, результаты будут далеко не скоро и далеко не такие как хотелось бы…
      • 0
        А сколько вообще свободных GPIO у этого девайса? одна релюшка — это конечно, лучше чем ничего, но все-таки ради одной покупать целый рутер сомнительная идея :)
        Кстати, я таки пожалел денег на эксперименты и купил TL-WR703N — китайский брат этого рутера. OpenWRT прошил, после плясок с бубнами (сначала сдуру поставил DDWRT, с него фиг прошьешь так просто OpenWRT).
        Но подружить его с 3G модемом не удалось, сделать из него мост -Ethernet — WiFi тоже не удалось (WiFi приставка для Raspberry например). К сети коннектится, адреса раздает, а вот бриджить что-то не хочет.
        • 0
          4 GPIO на светодиоды, два неиспользуемые и подтянуты к земле, один — на кнопке, два — на трехпозиционном переключателе.
          А в чем проблема имея USB и UART сделать себе столько GPIO, сколько нужно?) Ну а если уж совсем не хочется ничего делать — двух гпио достаточно для подключения сдвигового регистра, и, опять таки, получения нужного количество выходов.
          • 0
            проблема с USB наверное в том, что я понятия не имею что с ним делать :)
            А UART использовать для подключения МК разве что :)
            • +1
              Ну как минимум вы можете в USB воткнуть микросхему от FTDI, которая преобразует USB в ногодрыгание своими GPIO)
              Причем, драйвер для этой штуки, насколько я помню, в ядре присутствует. Так часто поступают, когда не хотят разрабатывать свои USB-девайсы. В итоге у вас, по сути, будет набор весьма быстрых, управляемых из любого удобного языка программирования, GPIO. Работа с котороми будет сводится к посылке буферов данных и их приема от микросхемы.
              С уартом при желании можно проделать то же самое, реализовав нечто похожее на любом контроллере.
              • 0
                Я почти так и сделал: у меня был другой роутер, тоже китайский… вот что из него вышло.
                Сейчас, кстати, наконец пригодился — стоит на работе как таймер и управляет подсветкой растений.
              • 0
                Ну, наверное, можно, но мне как-то bitbang всегда казался извратом как и использование недокументированных хаков в винде — закроют их в следующей версии все. а тут как-то никогда не знаешь, будет оно работать или огребешь проблем. Мне вариант с AVR по I2C видится более правиьным. Надо только добраться до I2C на Raspberry
                • +1
                  А AVR чем занимается, не бит-бангом? Все цифровые микросхемы им и занимаются.
                  Странные у вас предрассудки, I2C тоже битбанг — деграете пинами в соответствии со стандартом.
                  Как можно не знать «будет оно работать или нет», если FTDI для этого проектировалась? Хотите — делайте на ней I2C, хотите — SPI, хотите — интерфейс для дисплея реализуйте.

                  • 0
                    В принципе, да, только «легально» :) Удобство в том, что тайминги на AVR соблюдать проще, реализуя любой интерфейс, а то и вообще не надо возиться — поддержка есть аппаратная. Вручную из под линукс у меня точно не хватит знаний реализовать эти шины. Или у вас есть готовый код?
                    В теории оно все красиво, а на практике замучаешься сделать что-то сложнее елочной гирлянды из 3х светодиодов :)
                    • 0
                      Нет, вы не так поняли) на ГПИО самого линухового чипа в самом деле могут возникнуть проблемы при реализации быстрых шин, так как линукс не ОСРВ. Правда если вам нужно реле переключать через сдвиговый регистр, проблем не будет.

                      А чип фтди работает по другому принципу — у него собственный тактовый генератор, вы кидаете ему буфер данных, он выдвигает их на свои ГПИО, поэтому не будет проблем с таймингами.
                      Кода у меня нет, найти, думаю, не проблема — а на крайний случай — написать. На том же питоне.
                      • 0
                        Да все я правильно понял, просто выдавать тому же FTDI команды и данные нужно с правильными интервалами, если шину реализуем относительно быструю. В общем, я в свое время наигрался с реализацией шин. Бывает просто, бывает не очень.
                        А питон — в лес :) не люблю интерпретируемые языки как класс, а уж в связке с железом реального мира — тем более. Все там через одно место. Для обучения детей годится, написать моргалку светодиодом годится. Но это неинтересно, а как чуть сложнее — логику на нем писать уже муторно.
                        • +1
                          Вы не правы.
                          Питон тут объективно правильнее использовать, чем тот же C, как бы я его не не любил. Он уровнем выше чем С, скорость разработки выше на порядки, база кода огромна, переносимость великолепна.
                          На С пишут самые низкоуровневые блоки, как раз таки только самое нижнее общение с железом, всю логику выносят на него. Вы будете месяцами писать на С то, что на питоне реализуется и деплоится за неделю на железке.

                          Это реалии современного мира — я тоже не любил подобные языки, но приходится принимать современные подходы, чтобы не стать неэффективным.
                          • –1
                            Не знаю, может оно и так, но написать что-то целиком на питоне на мой взгляд сложнее, чем целиком на С/С++. А зачем использовать два языка и еще мучаться с их стыковкой если можно один? Я, к счастью, не должен быть эффективным — мне достаточно чтобы это было просто и удобно для меня. А изучать десяток новых языков мне неудобно, потому что время затраченное на изучение питона я могу потратить на написание программы на С.
                            Я бы вообще предпочел DOS или Windows на Raspberry :) потому что тогда я мог бы писать там на том, что я знаю еще гораздо лучше — Pascal или вообще Delphi. Каждый новый язык — это в первый раз в первый класс — а как тут делается эта привычная вещь? а потом ловля детских ошибок. Если конечно вы не пишете код из 100-200 строк всего.
                            А что-то интересное имеет свойство разрастаться. Поморгать лампочками и правда можно на питоне. А обрабатывать данные с сенсоров: акселерометры, гиро, магнетометр, GPS. А при этом параллельно работать с сетью? Желательно не превращать при этом Raspberry в однозаданый контроллер, нагрузив его интерпретацией так, что он захлебнется. Работать с сетью, файлами? Я еще не подступался к этому на С под Linux, но точно знаю что кода море и я быстро разберусь, как только руки дойдут. А на питоне это удобно?
                            А OpenCV я смогу из него подцепить, когда дело до него дойдет? На С++ под Windows простое приложение с OpenCV заработало за 1 вечер, даже меньше.
                            • +1
                              Два языка используют, чтобы максимально удобно и эффективно решить поставленную задачу. «Со стыковкой» никто не мучается. Вы затратите на порядок больше времени, пытаясь реализовать то же самое на каком-то одном языке, при этом выходной код получится куда менее поддерживаемым и куда более подверженным ошибкам.

                              >А обрабатывать данные с сенсоров: акселерометры, гиро, магнетометр, GPS. А при этом параллельно работать с сетью?
                              Я, к сожалению, связан NDA и не могу раскрывать подробности проектов с работы, но именно это мы и делали.
                              Вы на С, прошу прощения, затрахаетесь с этой параллельностью как раз. И быстро сделать не получится. На питоне это удобнее на порядки. У нас там крутилось здоровенное мультитред приложение, которое и информацию с датчиков собирало, и в бд параллельно писало, и с сетью работало. И это все на хилом 400 МГц процессоре.

                              И OpenCV и OpenCL — без проблем подключаются, можете нагуглить примеры.
                              Причем, мы писали код, параллельно деплоя его на ноутбуке (х86) и на аналогичной роутеру платформе (mips). Не меняя ни символа. Ну вот так задача стояла, получить результат и на ноуте и на эмбеддед платформе.
                              На С++ прикладной софт писать вообще не стоит уже, если уж встает вопрос о написании прикладного софта на PC, лучше обратиться к яве или шарпу, потому что на них, опять таки, выше скорость разработки, выше читабельность и поддерживаемость кода.

                              «Мне не надо быть эффективным» — это плохая отговорка, с ней вы так и будете на уровне «поморгать лампочкой», охотиться при помощи дубины, когда все вокруг уже перейдут на ружья. К тому же странно слышать какие-то выводы, если вы «не подступали» ни к С на Linux ни к питону.
                              • 0
                                Под Linux невелик опыт это факт. На С под Linux немного писал. Но совсем немного. Даже книги приличной не нашел, которая бы разложила по полочкам все быстро и дальше можно было с пониманием что к чему программить в этой ОС. В основном, все сосредточены на работе с GUI, а меня она под Linux не интересует вообще.
                                К сожалению, разработка для меня лишь хобби, ни копейки я этим уже давно не зарабатываю. Поэтому я стараюсь как можно меньше распыляться между различными платформами и языками. По опыту — чем лучше я знаю какой-то инструмент, тем быстрее и эффективнее я что-то могу им сделать, а для того, чтобы эффективно изучить несколько, нужно иметь много времени. У меня не одно хобби и выделить годы на изучение прежде чем приступить к реализации идеи, у меня нет возможности. Но и ограничивать свои возможности используя только Питон (для некоторых вещей все равно придется использовать С, а значит его тоже надо знать хорошо) не хочется. Это примерно как Arduino — Wiring простая надстройка над С++, но ужасно неэффективная и никогда не понимаешь что и как там работает, а когда хочешь использовать все возможности МК, выясняется, что там многие вещи конфликтуют друг с другом, и приходится переписывать все равно все самому.
                                А когда взял и немного разобрался с С для AVR, то стало куда проще дергать нужные библиотеки в качестве примеров кода, чуть-чуть адаптируя под себя. Работает быстрее, компактно и не приходится бороться с кучей глюков того монстра, который создали разработчки пытаясь уберечь чайников от изучения внутренностей МК.
                                • 0
                                  Вы хотите досконально изучить молоток, игнорируя пилу и топор.
                                  Рано или поздно влетите в ситуацию, когда бить молотком бревно, в надежде что оно расколется, станет куда дольше, чем взять и попробовать топор.

                                  Я понимаю, что есть разница между профессиональным подходом и хобби — но в то же время — хобби это же то, что вам интересно. Разве вам не интересно расширить свои горизонты?
                                  Вы вот добавили в свой арсенал новый инструмент после AVR — системы совсем другого класса, достаточно мощные эмбеддед платформы с полноценной ОС. К ним в комплекте идут новые подходы и новые средства, пытаясь работать с новой платформой старыми методами и отбрасывая сразу новые вы очень сильно теряете и скорость разработки и качество итогового продукта.

                                  Вы представляете, сколько времени у вас займет реализация стриминга видео и веб-сервера на каком-нибудь небольшом DSP? Даже при условии, что он его потянет?
                                  Пока вы месяцами будете писать драйверы для камеры и кодек, студент первокурсник запустит стриминг на какой-нибудь похожей плате с линуксом за день.
                                  Да, сама платформа будет несколько дороже — но это полностью компенсируется ценой разработки. Так и с языками программирования, нужно оценивать возможности, а не упираться в один.
                                  Кстати, насчет платформы — сейчас это все так дешевеет, что не факт, что и дороже — та же карамбола стоит 22 евро, сравнимо со всякими отладочными для жопастых контроллеров. А MiniX стоит $70, при этом там гигагерцовый процессор и гигабайт памяти, при размерах 60х60 мм и потреблении в 1-2 ватта — что означает, что вы можете на порядок эффективнее разрабатвать свои продукты используя более удобные инструменты…
                                  • 0
                                    Расширить горизонты в плане новых языков — нет, неинтересно. Полиглотом я был в свое время, понял, что это неэффективно. Да, увлекательно изучать новое. но мне гораздо больше нравится работать собственно над интересной частью, а не над изучением платформы. Восторг от новых железок прошел несколько лет назад, теперь мне интересно делать те штуки, которые я придумал, а не реализовывать очередной велосипед. Учиться ездить на велосипеде марки питон довольно скучно, благо под Linux мне пока все равно что изучать, лишь бы эффективнее было, попробую, может и пойдет.
                                    стриминг видео на Raspberry у меня занял 3 часа вечером вчера — пока нашел способ поставить ffserver и он компилировался 2.5 часа. А с утра за полчаса mjpeg-streamer заработал так как надо.
                                    Но это тупая железка никакой логики она не реализует. Если разберусь с OpenCV может удастся что-то поинтереснее сделать. Но там уже стриминг не нужен, достаточно обрабатывать видео локально.
                                    DSP изучать не вижу надобности, для моих задач оно не нужно вообще. низкоуровненые кодеки я точно разрабатывать не буду.
                                    • 0
                                      Вы себе противоречите, чтобы «не реализовывать очередной велосипед», как раз и требуется владение инструментами, позволяющими использовать уже реализованное.

                                      Причем тут изучение DSP и то, за сколько вы там стриминг подняли? Речь не об этом, это пример того, как нежелание отойти от одних инструментов и изучить другие приводит к жуткой потере времени — в данном случае, для примера, я сказал про реализацию стриминга на голом DSP и ту же реализацию на платформе с Linux.
                                      • 0
                                        Вот для этого я и купил Raspberry — Linux по идее должен позволить использовать готовые наработки.
                                        Пару книжек ко Python я скачал, посмотрим, что он даст. Но в целом меня раздражают решения, которые впустую тратят и так не слишком большие мощности девайса.
                                        Да и лишние прослойки, ничего полезного не делающие, тоже не люблю. К сожалению, без некоторых не обойтись. Но хорошие библиотеки полезны.
            • 0
              Не заморачиваясь с USB (и не разбирая роутер) можно так: habrahabr.ru/post/151982/. Но всего три выхода.
              • +1
                Есть еще ft245bm. С точки зрения USB-хоста(роутера) — FTDI USB-UART, а физически USB->8 TTL пинов.
                • 0
                  Вот спасибо, мил человек! Там даже не выходы, а GIO. Не знаю, как случилось, что я до сегодняшнего дня не подумал о таком простом решении. Вот, и Ariman выше о том же пишет.
      • 0
        В вашем случае, конечно, нет. Я про другие применения, в которых это может быть важно.
        • 0
          Вы о потреблении?
          Потребляет, в основном, передатчик — так что в случае с зигби потребление тоже не очень будет радовать.
          Хотя конечно, связка кортекс-зигби, да еще и регулярно уводимая в сон, будет потреблять меньше.

          Роутер без дополнительной периферии, со включенным wi-fi модулем потребляет, по моим замерам, 100 мА х 5В, что тоже, согласитесь, не так много.
          • 0
            Согласен
          • 0
            Зигби, кстати, бывают весьма бюджетные. С потреблением там все может оказаться гораздо лучше, т.к. оконечный зигби модуль почти все время дрыхнет, постоянно работает только концентратор.
  • 0
    Читаю такие посты и в голове начинает теплится надежда: через пару лет, когда будет своя квартира/дом, можно будет уже смело собирать сервер для автоматизации всего дома… начиная от примитива в виде автоматики освещения и заканчивая умным холодильником, отправляющим на телефон СМС со списком необходимых покупок.
  • 0
    А можно поинтересоваться, откуда узнали про свойства перемычки R113? А то хочется тоже сделать несколько проектов на WR703N, но не могу найти достаточно информации именно о таких вот моментах — перемычках, точках, куда подпаяться для получения плюшек… =)
    • 0
      Вот здесь энтузиасты отреверсили схему WR703N.
      Она во многом совпадает со схемой mr3020.
  • 0
    Автор, а как вы подали питание на шайтан-машинку? Во всей этой схеме смущает, в общем-то, только этот момент — ведь на выключателе, обычно, питания как такового нет.
    • 0
      Ага, этот момент я как раз на втором курсе вуза и прояснил, когда сделал первый подобный девайс. И тогда мне пришлось тянуть отдельно провод из розетки. С тех пор у меня было пять лет, чтобы этот вопрос как-то решить)
      Когда менял люстру, увидел больше проводов чем надо — они были на случай, если там будет висеть пятирожковая люстра с индивидуальным выключателем на группу рожков — так как у меня их всего три и выключаются они одним выключателем, лишний провод я использовал для того, чтобы вывести себе питание (второй-то его конец был выведен там, где находится выключатель). А земля была, понятное дело — выключатель же вставлялся в разрез между лампой и землей.
      • 0
        В таком случае получается, что вам просто повезло (я бы предпочёл шайтан-машинку разместить на месте выключателя, но не суть). В общем же случае или придётся тащить розетку или давать собственное питание, или прокидывать дополнительный провод…
        PS на лампу земля обычно не подается, только фаза и ноль. По правилам выключатель должен размыкать фазу.
        • 0
          Она и есть на месте выключателя, туда выходит провод. Да, вы правы, конечно же фазу размыкает, просто не стал акцентировать на этом внимание.

          Собственное питание проводится без особых проблем во время ремонта — как раз когда меняют выключателем и прочие, собственно, во время ремонта я и подключил тот дополнительный провод.
          • 0
            Не при всяком ремонте это возможно (В панельных домах бывают залиты каналы бетоном, в кирпичных домах чаще всего надо штукартурку штробить для прокладки новых кабелей). Да и ремонт не всегда возможен (обычно только в своём жилье).
            Эхх… Кокгда уже можно будет получать питание по одному проводу или по радио без диких потерь и вреда для окружающих :(
  • +1
    Хорошая, статья, браво!
    Вот, кстати, на просторах TP-LINK нашел еще один интересный роутер, WR-720N
    На форуме openwrt утверждается, что он на том же железе, а благодаря встроенному блоку питания подобное устройство потребует гораздо меньшего количества проводов.

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