Содержание статьи
Появившийся в 1998 году гипертекстовый протокол управления кофеваркой HTCPCP/1.0 ныне незаслуженно забыт. Чтобы воскресить заложенные в него создателями идеи, реализуем кофеварку с управлением от Raspberry Pi.
Многие любители кофе мечтают, чтобы к пробуждению их уже ждал горячий кофе. На мечты наложились разговоры про «умный дом», контроллеры, сенсоры, а тут еще я заказал плату Raspberry Pi (RPi) «на поиграть» — в общем, судьба ее была решена. Если в 1998-м управление кофеваркой через веб действительно выглядело забавным, то в наше время это вполне можно сделать своими руками. С такой же игрушкой, как RPi, радости будет вдвойне. На ее фоне пылящийся в коробке Ардуино Мега 2560 кажется случайно попавшим в будущее из мира 8-разрядных процессоров 80–90-х годов раритетом, к которому зачем-то прикрутили Wi-Fi, шилды и сенсоры.
Но вернемся на кухню за кофе. Кофеварку включаем с помощью реле, реле управляем с RPi, доступ к RPi из браузера по Wi-Fi. Проснувшись, прямо из кровати с помощью браузера в телефоне. И смотрим, как оно заваривается, через веб-камеру. Либо детектируем движение, и кофе начинает завариваться в тот момент, когда мы заходим на кухню или включаем свет. Настоящий гик сможет включить кофеварку из постели через SSH, настоящий лентяй — просто зайдя на кухню, простой же пользователь вроде меня — через браузер.
ВЫБОР КОФЕВАРКИ
От кофеварки требуется немного. Тип — капельный: и цена значительно меньше, и кофе, на мой вкус, мягче, чем в эспрессо. И главное — минимум электроники. Все управление должно состоять из одного механического выключателя, чтобы можно было включить кофеварку, просто подав на нее электропитание. Дома кофеварка большого объема ни к чему, большая мощность тоже не нужна: ниже ток — меньше требования к управляющим компонента. Хотя в кофеварках такого типа полностью автоматизировать процесс приготовления невозможно и нужно будет каждый вечер заправлять ее водой и молотым кофе.
Выбор кофеварок небольшого объема и мощности невелик, большинство предложений — объемом больше литра, но почти сразу мне приглянулась Moulinex BCA 1.L1 Little Solea. Мощность 640 Вт, кофейник 0,6 л.
Скручиваем все вместе
В первой ревизии плат RPi стоят неудачные предохранители (рис. 2), из-за которых почти всю USB-периферию приходится подключать через USB-хаб с дополнительным питанием. В более поздних ревизиях эта проблема была исправлена, однако из-за того, что мощность источника питания невелика, USB-хаб все равно может понадобиться.
![Коды моделей Raspberry Pi](https://xakep.ru/wp-content/uploads/2014/11/table.jpg)
На двух мониторах, которые я опробовал, при настройках по умолчанию была черная кайма по краям экрана. Это корректируется настройками режима overscan, в моем случае это решилось его выключением в конфигурационном меню.
Операционная система
Основной операционной системой на данный момент является Raspbian, основанный на Debian, с поддержкой аппаратного сопроцессора для операций с плавающей запятой. На странице загрузки можно загрузить не только его (нужен Raspbian «wheezy»), но и несколько других, также основанных на Linux, вместе с необходимыми утилитами.
Образ карты нужно скачать на диск, разархивировать, затем, если все делается под Windows, залить с помощью утилиты Win32DiskImager (ссылка есть на странице загрузки), на SD-карту, размер которой должен быть от 2 Гб. Далеко не любая SD-карта заработает — есть список совместимых карт и другого оборудования, но даже использование карт из этого списка не гарантирует, что конкретная карта не является подделкой. Если RPi не грузится из образа, только что залитого на карту, первое, что стоит попробовать, — сменить карту SD.
После установки SD-карты в RPi, включения и загрузки (имя пользователя по умолчанию pi, пароль — raspberry) выводится начальное конфигурационное меню, в котором нужно обязательно расширить файловую систему с 2 Гб образа на всю SD-карту и разрешить SSH. Кроме того, стоит задать раскладку клавиатуры, языки, временную зону и сменить пароль по умолчанию.
С оверклокингом лучше экспериментировать отдельно, сразу после его изменения проверяя стабильность RPi. Но попробовать его стоит, так как увеличение скорости работы заметно визуально . В конфигурационное меню всегда можно вернуться командой:
$ sudo raspi-config
После завершения начальной настройки перезагрузиться:
$ sudo reboot
Следующим шагом стоит обновить пакеты — разработка под RPi идет очень активно, и крупные обновления выходят очень часто.
$ sudo apt-get update
$ sudo apt-get upgrade
![Рис. 1. Конфигурационное меню raspi-config](https://xakep.ru/wp-content/uploads/2014/11/pic11.jpg)
Настройка Ethernet и Wi-Fi
Имевшаяся у меня Wi-Fi-карта D-Link DWA-140 B2 значилась в списке совместимого оборудования. Подключил, проверил, что успешно определилась:
$ lsusb
<..>
Bus 001 Device 006: ID 07d1:3c0a D-Link System DWA-140 RangeBooster N Adapter(rev.B2) [Ralink RT3072]
$ iwconfig
lono wireless extensions.
eth0 no wireless extensions.
wlan0 IEEE 802.11bgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:on
Wi-Fi можно настроить в соответствии с документацией.
SSH И VNC
Старт сервера SSH разрешается в меню начальной конфигурации. Для доступа с Windows-машины можно использовать Putty, с телефона под Андроид — Irssi ConnectBot. Но тут уже на вкус и цвет…
Если недостаточно SSH и нужен доступ к рабочему столу RPi (например, просмотреть снимки, сделанные Motion, не копируя их на локальную машину), можно получить его через vncviewer из TightVNC, а для доступа с Андроида — с помощью androidVNC. Для этого нужно установить VNC, используя рекомендации bit.ly и bit.ly.
ВЕБ-КАМЕРА И MOTION
В качестве веб-камеры в моем варианте используется Logitech HD Webcam C525. При приобретении новой веб-камеры стоит свериться со списком оборудования, совместимого сRPI, некоторым может потребоваться USB-хаб с дополнительным питанием. Кроме того, стоит проверить совместимость с Motion по ссылкам «Working Devices» и «Non Working Devices». Если камеры нет в списке «Working Devices», это еще не значит, что она не заработает, но из второго списка камеру покупать точно не стоит.
$ lsusb
<..>
Bus 001 Device 007: ID 046d:0826 Logitech, Inc.
Проверить камеру можно, попробовав сделать скриншот с камеры:
$ sudo apt-get install uvccapture
$ uvccapture -S80 -B80 -C80 -G80 -x800 -y600
В текущем каталоге должен появиться файл snap.jpg (даже если были сообщения об ошибках), который можно открыть на RPi с помощью Image Viewer. Motion — приложение для мониторинга сигнала с камеры, позволяющее установить, что значительная часть изображения изменилась (то есть определить движение в кадре), и в этом случае сохранять изображения и запускать внешние программы. Домашняя страница проекта.
$ sudo apt-get install motion
Чтобы разрешить автозапуск Motion:
$ sudo nano /etc/default/motion
# set to 'yes' to enable the motion daemon
start_motion_daemon=yes
Разрешить доступ к веб-интерфейсу Motion с внешних хостов:
$ sudo nano /etc/motion/motion.conf
webcam_localhost off
control_localhost off
В этом же файле хранятся настройки детектирования движения, начала и завершения записи с камеры и запуска внешней программы при детектировании движения.
$ sudo nano /etc/motion/motion.conf
# Command to be executed when a motion frame is detected (default: none)
on_event_start sudo /home/pi/motion-det
/home/pi/motion-det — сценарий, который будет выполняться при детектировании движения. Ему понадобятся права root для управления портами. Добавить пользователя Motion (motion) в список sudoers:
$ sudo visudo
дописав следующую строку в конце файла:
motion ALL=(ALL) NOPASSWD: ALL
Запуск с выводом информации в консоль:
$ sudo motion -n
Когда Motion запущен, настройки можно изменить из браузера по адресу: //:8080
Вместо нужно подставить фактический IP-адрес RPi. Увидеть изображение с камеры можно по адресу //:8081
В Firefox обновление изображения может происходить некорректно. В Chrome все ОK. Предустановленные на RPi браузеры вообще не могут его отобразить. Для настройки определения движения предусмотрен конфигурационный режим
$ sudo motion -s
В этом режиме при просмотре изображении с камеры будет показано различными цветами непосредственно детектирование движения, и можно будет скорректировать параметры детектирования на странице настроек.
Изображения с камеры сохраняются в каталоге /tmp/motion, формат отдельных изображений по умолчанию jpg, роликов — swf. Формат можно изменить в конфигурационном файле. А отключить сохранение файлов можно так:
output_normal off
ffmpeg_cap_new off
ПОРТЫ GPIO — ОСОБЕННОСТИ И УПРАВЛЕНИЕ
У RPi есть встроенные порты ввода-вывода. Называются они GPIO, General Purpose Input/Output, то есть порты ввода-вывода общего назначения. Строго говоря, подключить исполнительное устройство можно без особых проблем и к простому ПК, но не держать же ПК на кухне? Тем и хороша недорогая и миниатюрная RPi — ее спокойно можно разместить рядом с исполнительным устройством.
GPIO-порты работают на уровнях 3,3 В. При этом на плате RPi не предусмотрено защиты портов, и случайное замыкание 5 В на них может оказаться смертельным.
Максимальный выходной ток, который может держать отдельно взятый порт, — 16 мА. Это значение задается программно, в диапазоне от 2 до 16 мА, после сброса оно составляет 8 мА. Однако источник питания 3,3 В спроектирован из расчета, что максимальный ток по каждому порту (предполагая, что к ним подключена максимальная нагрузка) не превышает 2 мА. То есть если ко всем портам подключить нагрузку в 16 мА, ее не выдержит источник 3,3 В. Более подробно о допустимом токе можно прочитать здесь, а пример на С, как им можно управлять, — здесь.
Распайка портов и примеры доступа к ним из различных языков программирования приведены здесь: bit.ly/StAJXA.
Есть две основных версии плат, Revision 1 и 2, в них немного различается распайка и назначение портов. Чтобы определить, какая версия, нужно ввести команду cat /proc/cpuinfo и найти hardware revision code в таблице: Дополнительная информация о различиях Revision 1 и 2 есть здесь.
Питание +5 В и 3,3 В, земля (GND) и порт GPIO 4, который мы будем дальше использовать, в обеих версиях размещаются на тех же контактах. Разработчики RPi неоднократно отмечают опасность сжечь порт или всю RPi при неправильном подключении порта. Чтобы этого не произошло, порт рекомендуется защитить от ошибочных действий. Схемы защиты портов (а кроме того, примеры подключения различной периферии) можно посмотреть здесь.
Доступ к портам
Самый простой способ управления портом — из командной строки. Состояние порта при этом можно проконтролировать вольтметром. Все действия делают под рутом.
$ sudo -i
Начало работы с портом:
$ echo "4" > /sys/class/gpio/export
Режим работы — вывод:
$ echo "out" > /sys/class/gpio/gpio4/direction
Вывод значений:
$ echo "1" > /sys/class/gpio/gpio4/value
$ echo "0" > /sys/class/gpio/gpio4/value
Режим работы — ввод:
$ echo "in" > /sys/class/gpio/gpio4/direction
Считать значение на входе порта:
$ cat /sys/class/gpio/gpio4/value
Завершить работу с портом:
$ echo "4" > /sys/class/gpio/unexport
Подготовим скрипт для управления заданным портом, который будем использовать позже:
$ sudo nano switch_gpio
Текст:
#! /bin/bash
PORT_NUM=$1
if [ $2. == 'on.' ]; then
NEW_VALUE=1
else
if [ $2. == 'off.' ]; then
NEW_VALUE=0
else
echo 'Usage: $0 PORT_NUM on|off'
exit
fi
fi
# Настраиваем порт GPIO на вывод
if [ ! -e /sys/class/gpio/gpio$PORT_NUM ]
then echo $PORT_NUM > /sys/class/gpio/export
fi
# Читаем старое состояние
OLD_VALUE=$(cat /sys/class/gpio/gpio$PORT_NUM/value)
if [ $OLD_VALUE == 1 ]; then
OLD_VALUE_TEXT='on'
else
OLD_VALUE_TEXT='off'
fi
echo "out" > /sys/class/gpio/gpio$PORT_NUM/direction
echo -ne 'Switching GPIO '$PORT_NUM' from '$OLD_VALUE_TEXT' to '$2'...'
echo $NEW_VALUE > /sys/class/gpio/gpio$PORT_NUM/value
echo ' done.'
Права на исполнение:
$ chmod +x switch_gpio
И проверим:
$ switch_gpio 4 on
$ switch_gpio 4 off
МОДУЛЬ РЕЛЕ
Подключение реле реализовано по схеме из этой статьи. В нормальном положении, когда на выходе порта GPIO логический ноль и нулевой потенциал, транзистор закрыт и напряжение на нагрузку не подается. Если на GPIO подать логическую единицу, 3,3 В через резистор откроют транзистор, через него потечет ток и реле сработает. Диод предназначен для снятия отрицательных бросков при отключении реле.
Задействованы другое реле (по нему чуть позже) и транзистор с диодом — те, которые оказались под рукой, близкие по характеристикам. Резистор R1 (1 кОм), диод типа КД522 (1N4148), транзистор H547. В статье есть рекомендации, как выбрать аналоги. Дополнительно стоит проверить выходной ток порта при включенном реле.
![Рис. 3. Принципиальная схема модуля подключения реле](https://xakep.ru/wp-content/uploads/2014/11/pic31.jpg)
Подключаемая к схеме нагрузка составляет 640 Вт. Это значит, что при напряжении в 220 В ток составит 640 Вт / 220 В = 2,9 А. Еще одно требование к реле — чтобы замыкались и размыкались сразу два провода и нагрузка полностью обесточивалась. Один из вариантов, подходящий под такие требования, — реле TRIL-5VDC-SD-2CM-R, управляемое от 5 В и способное коммутировать до 8 А переменного тока 250 В.
Начать монтаж можно на контактной макетной плате. Конечно, для серьезных задач она не подходит, но такие вот небольшие схемы на ней можно быстро собрать и отладить. Сначала запитываем от отдельного источника +5 В, все проверяем без подключения к RPi, заменив подключение к порту резистором и кнопкой к +5 В, промеряем все токи и ставим разъем для подключения к основной плате RPi. Подключать 220 В к такой плате категорически нельзя, поэтому все равно придется брать паяльник в руки и переносить это на печатную плату.
Для подключения к основной плате RPi можно собрать шлейф из пары разъемов и плоского кабеля, подключить к нему промежуточную плату, на которой уже разводятся нужные порты и питание на шлейфы к периферийным устройствам, пока всего на один, уже не 26-, а 4-проводной шлейф. Он подключается к монтажной плате, на которой собирается в точности то же, что и в первом варианте, добавлением клеммников для 220 В. Клеммники распаиваем на реле проводом сечением 0,75, аккуратно проверяем тестером работоспособность схемы, пощелкав реле. Дополнительно можно развести землю. Затем подключаем провода к клеммам, также сечением 0,75, на одномй из которых ставится вилка, на другой — розетка на провод.
![Рис. 4. Первый вариант модуля реле на контактной макетной плате](https://xakep.ru/wp-content/uploads/2014/11/pic41.jpg)
Дальше осторожно и аккуратно: 220 В частотой 50 Гц — напряжение, при неаккуратной работе с которым последствия могут быть намного трагичнее, чем сгоревшая RPi. Визуально проверяем пайку на плате реле, проверяем надежность закрепления проводов 220 В в клеммники. Фиксируем плату, а лучше устанавливаем ее в закрытый корпус, чтобы случайно не задеть открытые контакты под напряжением. Не торопимся и последовательно на каждом шагу проверяем тестером. Отключаем плату реле от основной платы RPi, втыкаем вилку в 220. Дыма нет. Отключаем от сети, подключаем основную плату RPi, опять включаем в 220. Дыма опять нет, RPi жива. Щелкаем реле, видим 220 на розетке. Отключаем реле и 220, подключаем к розетке настольную лампу, подаем 220, щелкаем реле. Ура!
![Рис. 5. Второй вариант модуля реле, распаянный на печатной макетной плате с промежуточной коммутационной платой](https://xakep.ru/wp-content/uploads/2014/11/pic51.jpg)
с промежуточной коммутационной платой
Переводим дух и, установив плату реле в корпус на постоянной основе, пробуем уже в окончательном варианте, с кофеваркой в качестве нагрузки.
УПРАВЛЕНИЕ ПОРТАМИ С ПОМОЩЬЮ WEBIOPI
Самый простой способ достучаться до портов GPIO через веб — установить WebIOPi. Это приложение, позволяющее визуально задавать направление работы порта (ввод/вывод), видеть его состояние при вводе и задавать значение на выводе.
Установка подробно описана здесь.
$ sudo apt-get install apache2 php5
Для работы WebIOPi использует модуль rewrite и переопределение конфигурации (.htaccess):
$ sudo a2enmod rewrite
$ sudo nano /etc/apache2/sites-enabled/000-default
В разделе <Directory /var/www/> изменить строку «AllowOverride None» на «AllowOverride All»:
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
Добавить пользователя Apache (www-data) в список sudoers:
$ sudo visudo
Дописав следующую строку в конце файла:
www-data ALL=(ALL) NOPASSWD: ALL
Рестартовать Apache:
$ sudo /etc/init.d/apache2 restart
Загрузка и разархивация WebIOPi:
$ wget //webiopi.googlecode.com/files/WebIOPi-0.3.tar.gz
$ tar xvzf WebIOPi-0.3.tar.gz
Переместить файлы в соответствующий каталог:
$ sudo mv webiopi /var/www
Основной интерфейс доступен по адресу: //localhost/webiopi.
Если открывать страницу непосредственно с RPi, то нужно это делать в Chromium или Midori, ни в NetSurf, ни в Dillo она не работает из-за отсутствия в них поддержки JavaScript.
СВЯЗЫВАЕМ ВСЕ ВМЕСТЕ
Для управления портом из браузера через веб вполне достаточно веб-интерфейса WebIOPi, при желании его можно настроить под свои нужды. Для включения реле при детектировании движения добавим старт Motion в заданное время утром, например в 8:00, в /etc/crontab:
0 8* * * echo $(date)': '$(service motion start) >> /var/log/motion_start.log
Заставим Cron перечитать его:
crontab /etc/crontab
Создадим скрипт, который будет запускаться из Motion:
$ nano /home/pi/motion_det
Текст:
#!/bin/bash
/home/pi/switch_gpio 4 on
service motion stop
sleep 1800
/home/pi/switch_gpio 4 off
Права на исполнение:
chmod +x /home/pi/motion_det
Теперь в восемь утра будет запущен Motion, который начнет детектировать движение. Когда движение будет обнаружено, запустится скрипт motion_det, который выдаст логическую единицу на порт GPIO 4, подав напряжение на реле и включив кофеварку, остановит Motion, подождет 30 минут и выдаст на тот же порт логический ноль, отключив нагрузку.
ЗАКЛЮЧЕНИЕ
Большая часть компонентов приобретена в «Чип и дип» (включая корпуса, кабельные вводы, платы, переходник и так далее). Это магазин с хорошим выбором, в который можно зайти, посмотреть и потрогать, но недешевый, есть ощутимо бюджетнее. Те, кто не хочет долго ждать доставки RPi, уже могут ее приобрести, например в «Терраэлектронике», хотя и совсем не за 25 долларов.
Чтобы не помешала темнота зимними утрами, вместо камеры (или в дополнение к ней) можно подключить ИК датчик движения. Можно разобраться в кофеварке эспрессо с автоматическим приготовлением и не задумываться вечером о том, что нужно засыпать кофе на следующее утро. Можно подключить реле через ZygBee, добавить других исполнительных устройств, например светильник в спальне. Можно реализовать управление через SMS, подключив 3G-модем, либо с обычного телефона через DTMF, подняв Asterisk или Freeswitch. А можно написать приложение для Андроида и iPhone/iPad.
Вариантов очень много, и с появлением RPi возможности экспериментировать на границе между программированием и физическим миром резко расширились. Да, и, конечно, ближайшего первого апреля нужно будет задуматься о полной поддержке стандарта RFC 2324.