Управляем чайником из браузера или как я интернет-розетку делал


В этой статье я хочу рассказать о моем опыте создании управляемой розетки. Не GSM(это всем надоело, да и слишком просто — читай sms да дергай пинами), а управляемой через браузер, с помощью кнопочек на HTML-страничке.

Итак, какой же путь должен проделать сигнал, чтоб включить чайник?
Нажатие кнопки на странице -> переход по ссылке и отработка web-сервера -> выполнение CGI скрипта -> передача команды по UART контроллеру -> появление напряжение на пине -> срабатывание реле, которое включает чайник.

Рассмотрим все по порядку.

Хотя нет, начнем с обратного конца — контроллера.

Физический уровень — дергаем пины.


Под эту роль удачно подвернулась техасовская плата с MSP430.
Под нее была написана прошивка в их среде Energia, которая является переработанным под другой контроллер редактором скетчей Arduino. Да, радуйтесь — код совместим с ардуйней, и будет работать точно так же. Выглядит вот так:



Весь код можно посмотреть вот тут. Осторожно, там немного быдлокода.

А про кусочек я сейчас расскажу:

byte inByte = 0;  //Байт для данных из UART
int status[12]; // Для статуса пинов
 
void setup() {
Serial.begin(9600);// Конфигурируем UART
pinMode(RED_LED, OUTPUT);// Конфигурируем пины на выход
pinMode(6, OUTPUT);} 

if (Serial.available() > 0) { //Как только на входе появится байт и пока они не закончатся,
inByte = Serial.read(); // запихиваем их в эту переменную, 
    switch (inByte){  // и делаем что нибудь, в зависимости от них:
      case 's':  // если пришел "s", то
          Serial.print("RED_LED:");  // показываем статистику,
          Serial.println(status[10]); // какой из портов включен, а какой выключен
      break;
     case 'r':  //а если название порта, 
        if (status[10] == 0)        { // то проверяем статус, и в зависимости от него,
          digitalWrite(RED_LED, HIGH); // либо зажигаем
          status[10] = 1;        }  // (не забыв поменять статус)
        else        { 
        digitalWrite(RED_LED, LOW); // либо гасим
        status[10] = 0;        } // (тоже не забыл поменять статус)
        break; 
}              
}
}  


Сообственно, он весь состоит из этого (честно говоря, я в первый раз вижу код для arduino и сам редактор кода тоже), и мне лень было разбираться с чем-то сложнее case.
Управляется он 14 байтами, выраженными для удобства в символах: 123456789nfrgs
132456789 — включают, а при повторной посылке выключают пин.
n — включает все пины (от ON)
f — выключает все пины (от OFF)
s — показывает, что включено, а что нет (от STAT)
g — включает или выключает зеленый светодиод (GREEN)
r — красный светодиод… Ну вы поняли.
В одной посылке можно комбинировать несколько символов, скажем rgs1 — включит оба светодиода, покажет информацию, а потом подаст напряжение на первый пин.

Красноглазим


В загашниках нашел шнурок от чего-то, с контроллером CP2101, который был незамедлительно подключен к плате. Легким движением в гугле был найден драйвер...
Нет, я вру. Придется рассказать про компьютер.
У меня есть несколько вот таких одноплатных компьютеров, с ARM-процессором A10, и Android на борту.



Можно было запустить и Linux, но я не стал этого делать — я на нем еще фильмы смотрю, а в Androide это делать удобнее. Пришлось битые 4 часа ковыряться то в выдаче гугла, то в потрохах системы, пробуя собрать хоть какой-нибудь модуль для USB-UART конвертера. Когда я уже почти сдался, наткнулся на блог моего спасителя, в котором он выложил два модуля для Android на A10 (он смог собрать, в отличии от меня), кои были немедленно загружены(insmod cp210x.ko). После чего я перевернул вверх дном все мои коробки с барахлом, но нашел шнурок именно с конвертером CP2101.

Втыкаем его в USB, с замиранием сердца делаем ls /dev, и вожделенный /dev/ttyUSB0 появляется в системе!
Далее последовал секс интересный час, который я провел, выясняя как правильно инициализировать устройство, чтоб на него слать байты. Не буду мучать читателей, и расскажу сразу:
stty -F /dev/ttyUSB0 9600 — инициализируеут порт. лучше выполнять при каждом обрацении, мало ли. вдруг между посылками вы шнурок вытащите.
/system/bin/echo «r» >/dev/ttyUSB0 — отправляет байт в порт.
А контроллер его принимает, и включает порт, на котором висит красный светодиод.

Веб и CGI


Добрые люди подсказали мне, как с уровня консоли перенестись на уровень браузера. Делюсь этим сакральным знанием и с вами:
1) Нужен Busybox и SSH сервер. Впрочем, если вы хотите набирать скрипты на самом устройстве, можно оботись и эмулятором терминала.
2) Создаем каталог, в который складываем файлы:
http.cfg — конфигурация веб-сервера, которая, состоит из одной строчки: *.html:/system/bin/sh, которая означает, что все html-файлы надо выполнять интерпритатором sh, а не просто отдавать пользователю.
Скрипт, назвовем его, например starthttpd, в котором тоже будет немного строк:
insmod /sdcard/www/cp210x.ko >/dev/null 2>&1 — строчка, которая загружает в ядро драйвер конвертера(чтоб не делать это каждый раз вручную), и не ругается, если он там есть.
httpd -p12 -h /sdcard/www -c /sdcard/www/http.cfg — запускает сервер на порту 12(кто то занял 80), с корневой папкой /sdcard/www, и конфигом, который мы сделали ранее.
и, наконец, сердце — index.html:

#!/bin/sh
stty -F /dev/ttyUSB0 9600 #конфигурируем порт
/system/bin/echo $QUERY_STRING >/dev/ttyUSB0 #плюемся в порт  символами, которые нам передали GET-ом.
echo "Content-type: text/html"
echo ""
echo "<html><header></header><body>"
echo "<input type=\"button\" value=\"RED_LED\" onclick=\"location.href='?r'\" />" #делаем кнопки, которые передают тот самый параметр(href='?r')
echo "<input type=\"button\" value=\"GREEN_LED\" onclick=\"location.href='?g'\" /><p>"
echo "<input type=\"button\" value=\"PIN_1.4\" onclick=\"location.href='?1'\" />"
echo "<input type=\"button\" value=\"PIN_1.5\" onclick=\"location.href='?2'\" /><p>"
echo "<input type=\"button\" value=\"PIN_1.7\" onclick=\"location.href='?9'\" />"
echo "<input type=\"button\" value=\"PIN_2.0\" onclick=\"location.href='?3'\" /><p>"
echo "<input type=\"button\" value=\"PIN_2.1\" onclick=\"location.href='?4'\" />"
echo "<input type=\"button\" value=\"PIN_2.2\" onclick=\"location.href='?5'\" /><p>"
echo "<input type=\"button\" value=\"PIN_2.3\" onclick=\"location.href='?6'\" />"
echo "<input type=\"button\" value=\"PIN_2.4\" onclick=\"location.href='?7'\" /><p>"
echo "<input type=\"button\" value=\"PIN_2.5\" onclick=\"location.href='?8'\" /><p>"
echo "<input type=\"button\" value=\"ON_ALL\" onclick=\"location.href='?n'\" />"
echo "<input type=\"button\" value=\"OFF_ALL\" onclick=\"location.href='?f'\" /><p>"
echo "</font></pre>"
echo "</body></html>"


Получаем вот такую менюшку с кнопочками:


Осталось убрать со стола мусор, и соединить все вместе:



Вот небольшое видео результата:



Конечно, сфера применения не ограничивается цветомузыкой. Добавляем реле на 5в, и получаем 9 управляемых удаленно(!) с компьютера выходов, которые могут рулить чем угодно — от лампочек в туалете и света в офисе до кондиционеров и силовых щитков.

А еще можно пробросить ssh на сервер, и делать все тоже самое, но из любого места, где есть интернет.
Метки:
Поделиться публикацией
Комментарии 66
  • 0
    Я не понял, почему этот одноплатный компьютер нельзя было напрямую подключить к USB-разъемуплаты. Он разве не определяется как виртуальный COM-порт?
    • 0
      определяется. только там контроллер от ti в качестве usb-uart, какой то TUSB, и я не смог найти на него драйвер.
      • 0
        Этот TUSB в Launchpad реализует стандартный CDC ACM протокол, драйвер для которого можно скомпилить точно так же, как для cp2101 & friends.
        • 0
          было бы классно, но, увы, это за пределами моего скилла. насколько я помню, он еще и прошивку загружает во время запуска с компьютера, а не хранит ее в памяти.
          • 0
            Конкретно на Launchpad'е все грузится с serial EEPROM, находящемся рядом с TUSB.

            • 0
              да, ваша правда. сейчас внимательнее рассмотрел плату.
              • 0
                Вот, сейчас проверил кстати в OpenWRT (пакет kmod-usb-acm) — Launchpad коннектится без проблем.
    • 0
      Разобрать ту маленькую коробочку не пробовали? UART разъем может быть там. Он же и сделан для отладки платы.
      • 0
        ч-черт. ниже комментарий.
      • 0
        комп сам? я разбирал ничего похожего не нашел, к сожалению.
        • 0
          У mele a2000 он есть, но форм фактор другой. И я не уверен что все к нему можно обратиться через андройд. Я как раз с ним занимаюсь. Ваше же устройство видимо отлаживается через usb по adb — android debug bridge. Очень признателен за ссылку! Крайне полезна и актуальна для меня.
        • 0
          А почему топик из песочницы? Хотя автор уже год как зарегестрирован? Или только сейчас решился опубликовать? :)
          • +2
            болел был в ро
            • +2
              Ну с возвращением! :)
              • 0
                С чего вдруг?
                • 0
                  вот за этот обзор. посчитали рекламой
            • 0
              А что вы использовали в качестве силовых ключей?
              • 0
                На картинке твердотельные реле, продаются на eBay по запросу «Solid state relay» по несколько долларов за штуку. Обещают выдерживать 25А и 400В
                • 0
                  обычное реле через транзистор. и переключатель на din рейку, который управляется слаботочкой.
                • 0
                  На чайнике нужно заранее нажимать кнопочку, да и стиральную машину заранее готовить к запуску, тут уж легче таймером обойтись.
                  Остаются конечно другие юзкейсы, например, чтобы эта штука включала кондиционер дома, когда хозяин выезжает с работы.
                  Я купил твердотельные реле как на картинке и арбуино, теперь не могу придумать, к чему это все пристроить, чтобы было целесообразно:)
                  • 0
                    можно вместо кнопки подключить. я постоянно в магазинах вижу чайники с тактовыми кнопками, вместо классических выключателей, правда чуть дороже.
                    • 0
                      Вот вот, стиральная машина это не просто включил и выключил, нужно еще программу задать (и белье загрузить).

                      Необходимо разработать стандарт для всех разработчиков управляемых и потенциально управляемых устройств, по их удаленному управлению.
                  • 0
                    Мечты IT-отделом сбываются! Помнится как-то были мечты сделать на локальном сайте компании сделать кнопку поставить чайник в таком-то кабинете.
                    • 0
                      Кнопка то кнопокой, но воды можно забыть налить, надо еще датчики наполнения.
                      Иначе неровен час, бахнет :)
                      • 0
                        все современные чайники вырубаются, если их включить без воды.
                    • 0
                      Интересный пост, спасибо.
                      • 0
                        Есть ли шанс подобными скриптами направить данные в обратном направлении — от контроллера в web?
                        • 0
                          да легко.
                          stty -F /dev/ttyUSB0 9600
                          /system/bin/echo «s» >/dev/ttyUSB0
                          cat /dev/ttyUSB0 |grep PIN_1 |grep ON
                          сравниваем строку, если там пусто — на пине напряжения нет. но лучше это конечно делать программой(общение с контроллером), а не скриптами.
                          • 0
                            А web часть? Что б на страничке отображалось?
                            • 0
                              что то типа
                              if [`cat /dev/ttyUSB0 |grep PIN_1 |grep ON` == ""]
                              then
                              echo «выключено»
                              else
                              echo «включено»
                              fi

                        • 0
                          Всё это, конечно, хорошо, но во всех подобных системах основная проблема заключается как раз в подключении конечных элементов. Будь то чайник или кондиционер. Практически во всём инициатором работы является кнопка, а не подача энергии. Даже для обычной лампочки нужно подводить провода до самого выключателя и настраивать цепи так, чтобы они были взаимозаменяемыми.
                          Хотя, по-немногу это всё-таки приближает нас к светлому будущему, что не может не радовать.
                          • 0
                            ниже ответил
                          • 0
                            а в чем проблема кнопки? вместо релюшки — оптопара, что дешевле и проще. и подключать можно параллельно кнопке, ни функционал, ни внешний вид не страдает.
                            • 0
                              Спасибо за статью. Как раз валяется miniPC на таком же чипе, и едет 3 платы на MSP430. С утра встал с постели с мыслью, как же это все сдружить и начать работу, а тут такая статья в руку!
                              • 0
                                Отличная работа!
                                • 0
                                  Взломают сайт и дома с ума сойти можно будет конда хакер защелкает всю технику в доме:)
                                  Интересная статья, давно хотел сделать что-то подобное.
                                  • 0
                                    когда уже появятся чайники c wifi с удаленным управлением с мобильного телефона.
                                    • 0
                                      Аха, а то марсоходы они запускают в космос, а к чайнику wi-fi приделать не могут
                                      • –1
                                        И еще чтоб две симки и телевизор с антеной
                                      • 0
                                        а смысл от чайника? это надо все технику оснащать.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                        • 0
                                          управляемый краник конечно же!
                                          включить кран, ждать 3 секунды, выключить кран, включить чайник.
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                            • +1
                                              ага, и еще трубку от чайника до стакана, и стакан чтоб на колесиках до юзверя доехал.
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                • +1
                                                  с чего вы вообще взяли про грабли? прицепились к картинке? так там еще атомный взрыв нарисован, он вас не смущает?
                                                  решение-то универсальное, хочешь — чайник грей, хочешь — кондиху за час до возвращения домой включай. или свет в офисе. или компьютер/роутер/сервер перезагружать, когда завис.
                                                  и еще слаботочка. можно светодиод зажигать, когда почта пришла. или 5 светодиодами загрузку процессора показывать.
                                                  говорить про грабли может только тот, кто не смог придумать применение, а о назначении девайса судит по картинкам.
                                                  • +2
                                                    Короче, запоминай: следующую статью пишешь про управляемого дистанционно Большого Человекоподобного Робота, который будет наливать чайники, стиральные машины бельём заправлять, носки гладить. Тогда народ будет спокоен! :)
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                              • 0
                                                Зачем ждать — датчик уровня, в виде 2-х полосок фольги, наклеенных на внутреннюю поверхность, и все.
                                            • 0
                                              Вот у меня дома например как это использовать? Ну ладно, пусть даже все включается не кнопкой, а просто питанием. Но — чтоб включить — надо к релюшке или оптопаре сигнал подать. А это — сигнальный провод нужен. А их-то нету. И радиоканал на чайник навешивать тоже как-то не кошерно получается. Напрашивается мысль по силовому кабелю сигнал слать. Сие реально приделать к такой схеме? Чтоб по сути остались те же два провода в розетке, но работало бы все так мило-автоматично :)
                                              • 0
                                                реально, но сложно. легче сигнальный провод кинуть. или беспроводное что-нибудь
                                              • +1
                                                Спасибо огромное за статью и за реальный пример применения! Как раз 15 минут назад курьер FedEx принес долгожданную платку для экспериментов ))
                                                • 0
                                                  Дороговата платка для такой ерунды, кажется мне. Вот есть нечто подобное, tv box e66 в нескольких вариациях за 40-60 баксов, лучше говорят с процем wm8710 — он, конечно, проще, но как ethernet-rs-232 сервер должен работать. Никто не сталкивался с рутованием этого устройства и установкой дров конвертера, сервера и т.п.?
                                                  • 0
                                                    ага. у меня вот такой еще есть, он всего за 50$
                                                    • 0
                                                      я провел эксперименты с TV box E66 — адаптер usb-rs232 ttl с чипом Profilic PL2302 заработал без каких либо шаманств с драйвером! на чипе CP2102 ничего не получилось — указанные драйвера не ставились, типа не тот формат…
                                                      Кстати, может ли кто-то дать ссыль на пошаговое руководство (с командами в терминал) как настроить все что дальше подключения адаптера? а то я еще все-таки нуб в линуксе и тем более андроиде наизнанку…
                                                    • 0
                                                      а чем езернет модуль за 5-7 баксов не устраивает?
                                                      на ардуине я так делал we.easyelectronics.ru/woddy/ir-pult-s-ezernet-interfeysom.html
                                                      • +1
                                                        так по приколу же. что было дома — из того и сделал
                                                      • +1
                                                        напомнило серию из «Теории большого взрыва»
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                            • 0
                                                              все равно спасибо, пошел грабить награбленное.
                                                          • +1
                                                            Одноплатный компьютер хорош, но для такой задачи — дороговат, как мне кажется.
                                                            Еще и переходник усб-уарт, плюс еще отладочная…
                                                            Тот роутер, о котором я в своей статье упоминал, TL-MR3020 стоит 800 рублей и у него есть минимум 5 гпио, которые можно легко заюзать. Ну и уарт, разумеется.
                                                            ИМХО, для домашней автоматизации логичнее взять его — достаточно ему на жообратную сторону платы прицепить твердотельное реле за 150 рублей, и будет законченное и полностью рабочее решение, выполняющее все то же самое.
                                                            • 0
                                                              была бы весьма интересная статья об использовании и главное настройке этого чуда…
                                                              • 0
                                                                Да в принципе, все есть в интернете, стоит ли еще раз писать?
                                                                Там все весьма тривиально, даже пересобирать ядро не понадобится. Управление ГПИО и кнопками выведено в юзерспейс через модули ядра, допустим.
                                                              • +1
                                                                вот зачем вы это сказали? теперь я его заказал.

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