Привет Хабражители! Я думаю, многие из вас слышали о Raspberry Pi, более того, думаю, довольно большое количество из вас видели его лично.
В начале 2014 года я решил, что пора и мне заказать парочку RPi и сделать с ними что-нибудь интересное.
Так как я iOS-разработчик, меня вдохновила идея прикрепить к этому проекту iOS-приложение.
Ну а поскольку RPi достаточно хорошо умеет работать со сторонним оборудованием, поэтому я решил, что сделаю небольшую систему безопасности для личного использования.
Введение
Первое, что нужно было сделать в этом случае, это определить, чего я хочу от этой системы.Я считаю, что для такой задачи нет ничего лучше, чем интеллект-карта.
В общем после 5 минут глубоких раздумий получилось вот что:
Примерно через месяц я получил две модели A RPi из Великобритании, т. е.
с одним USB и без Ethernet. Купил флешку на 16Гб и установил на нее Raspbian. И тут начал вырисовываться первый из подводных камней — драйвера и Интернет. У меня уже был 3G-роутер, который я выиграл на конкурсе пару лет назад, и именно его я планировал подключить к RPi, чтобы там появился Интернет. Как я ошибался.
Через полчаса я уже стоял в магазине в поисках переходника USB-Ethernet; Продавец с трудом нашел мне один экземпляр от D-Link. Перед отъездом я решил перестраховаться и купить еще и Wi-Fi адаптер от ASUS, потому что… Было поздно, а мне очень хотелось сегодня приступить к работе, поэтому права на ошибку просто не было.
Оба устройства, естественно, могли похвастаться поддержкой Linux.
Придя домой, я целый час пытался установить с диска, а затем найти в Интернете последние версии драйверов для D-Link. Оказалось, что ребята из этой компании 2 года назад просто прекратили поддержку данного устройства! Я понял, что мне продали барахло( которые я на следующий день успешно обменял еще на две флешки ).
Мне остался план Б, который на удивление сработал без всяких драйверов, я просто вставил переходник от ASUS в USB и он сразу распознался в системе как сетевая карта.
Скажу сразу, на RPi модели А работать в режиме графической оболочки просто невозможно, все очень сильно тормозит, после Макбука с SSD это ад. Поэтому я решил его не мучить, а просто настроил ssh под себя.
Далее встал вопрос о языке, на котором я буду писать систему работы с железом.
Из всех я выбрал Python, так как он работает с железом «из коробки», нет необходимости устанавливать какие-то дополнительные библиотеки и тому подобное, плюс я давно хотел выучить этот язык.
Примерно за неделю я освоил все необходимое из Python, это была очень интересная неделя.
Помните, в 9-й серии первого сезона «Теории большого взрыва» главные герои прикрепили к некоторым устройствам в своей квартире выключатели, которыми можно было управлять через Интернет, и каждый мог включать/выключать свет или аудиосистему? Я сделал то же самое со светодиодом, подключенным к RPi. Это, конечно, не аудиосистема, но когда от щелчка мышкой на противоположном полушарии планеты загорелся светодиод, ощущения были неописуемые :)
Работаем с железом
Следующий вопрос, который мне пришлось решить, это как подключить и управлять железом, ведь датчик движения и дыма не светодиод, там все несколько сложнее.С этим вопросом я обратился к своему хорошему знакомому, который просто хорошо разбирается в схемотехнике и лучше меня владеет паяльником.
С этого момента над проектом начали работать два человека, и я стал частым посетителем магазина радиолюбителей.
Подробнее о работе схемы я расскажу в другой статье, а пока кратко расскажу, как все работает.
На этой схеме слева расположен датчик движения, справа автосигнализация, а внизу подключение к источнику питания.
Забегая вперед, хочу сказать, что из схемы был исключен автоматический переход на питание от аккумулятора, поскольку был куплен аккумулятор, который просто подключается параллельно питанию от сети и автоматически начинает питание схемы при пропадании 220В.
Было решено заменить концевой выключатель двери на герконовые.
Для подключения и питания всей схемы были изготовлены две отдельные платы, на одной реализована работа с железом через оптроны, а на другой преобразование сетевого напряжения 220В в постоянное 12В и 5В.
Наши датчики и сирена питаются от 12В, а RPi от 5В соответственно.
Все это хорошо, но еще интереснее был следующий вопрос, как нам получить данные с датчиков.
Всю работу с железом мы решили делать через GPIO, если честно, я думаю, что это единственный путь, остальные входы/выходы предназначены для конкретного оборудования, а нам просто нужно получить состояние с датчиков в форма 1 или 0.
GPIO имеет 26 контактов, из них: 2 — 5В, 2 — 3В, 5 — земля, остальные могут быть как входами, так и выходами, в зависимости от установленной вами конфигурации.
Программирование аппаратной системы
Я решил сделать трехуровневую архитектуру: RPi — веб-сервер — iOS .Во-первых, для повышения отказоустойчивости, ведь если исключить сервер из цепочки, то вся система становится очень уязвимой из-за того, что RPi может выйти из строя и мы никогда об этом не узнаем.
Во-вторых, я решил отказаться от отправки СМС и дозвона в пользу push-уведомлений, которые, естественно, будет отправлять сервер.
Итак, для программирования аппаратной системы я выбрал Python 2.5. Первое, что нужно сделать, это установить ВебИОПи .
Это отличный проект с открытым исходным кодом, позволяющий удобно отлаживать работу с оборудованием через браузер.
Он показывает состояние портов GPIO, позволяет настроить их как вход/выход и вручную установить для них выход 0 или 1. Установить все это очень просто; в Интернете есть даже подробные инструкции на русском языке.
Как я писал выше, Python умеет работать с GPIO «из коробки»; для этого вам просто нужно подключить специальную библиотеку.
GPIO имеет два режима нумерации контактов: по учетной записи на плате и по внутреннему контактному номеру.import RPi.GPIO as GPIO
Рекомендую использовать нумерацию счетов, это проще.
GPIO.setmode(GPIO.BOARD)
Перед запуском системы нам необходимо инициализировать все необходимые порты, а именно указать, как они будут работать, на ввод или вывод, а также указать начальное значение порта.
GPIO.setup(12, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
Чтобы прочитать порт, вам нужно использовать следующий код: if (GPIO.input(11) == GPIO.HIGH)
Чтобы установить выход на порт 1 или 0: GPIO.output(12, GPIO.HIGH)
GPIO.output(12, GPIO.LOW)
Так как датчик движения выдает сигнал очень короткий промежуток времени, нам нужно постоянно читать порты, и здесь надо сказать, что RPi.GPIO реализует это очень удобно.
Можно сделать так, чтобы при поступлении на вход 1 или 0 вызывалась определенная функция.
Частота чтения также устанавливается для каждого порта.
GPIO.add_event_detect(11, GPIO.FALLING, callback=move_sensor_callback, bouncetime=500)
Несколько важных ошибок.
В цикле программы необходимо выполнить Sleep(1), иначе процессор всегда будет загружен на 100%; также рекомендуется выполнить GPIO.cleanup() при выходе из программы.
try:
while True:
sleep(1)
finally:
Теги: #Raspberry Pi #python #охранная сигнализация #сделай сам #сделай сам #разбери пирог #python
-
2Гис Для Iphone
19 Oct, 24 -
Хабрацитатник
19 Oct, 24 -
Xkcd — Дыры В Безопасности.
19 Oct, 24