Заводим машину голосом с помощью Алексы на Raspberry Pi
Друзья, автоматизация с помощью Алексы продолжается и недавно я подумал, а почему бы не дать возможность Алексе голосом заводить мою машину. Все дело в том, что машина располагается на стоянке вдалеке от дома и мой брелок на 868МГц просто не в состоянии завести её с такого расстояния через преграду близлежащих домов. Единственный способ завести машину удалённо возможен с помощью мобильного телефона. Я звоню на сигнализацию, она “поднимает трубку”, затем в тональном режиме я ввожу код запуска двигателя и двигатель запускается удалённо. Ездить мне приходится по нескольку раз в день, а поэтому и заводить машину приходится по нескольку раз заранее на прогрев, т.к. я живу в холодном регионе нашей необъятной страны. Данный пример будет рассматриваться для охранной системы Pandora 5000NEW, но по аналогии вы сможете это сделать для любой другой автомобильной сигнализации с поддержкой GSM.
Вам понадобится
- Голосовой помощник Алекса на Raspberry Pi (RPi) — 1шт.
- Автомобильная охранная система с поддержкой GSM и установленной сим-картой — 1шт.
- GSM-модуль SIM800L v2.02 в комплекте с антенной на 1800МГц — 1шт.
- Соединительные провода Jumper Wires Female x Female — 3шт.
- Micro-SIM карта для SIM800L с посекундной тарификацией голосовых вызовов — 1шт.
- Внешний источник питания на 5В/2.4А для SIM800L — 1шт.
- Электрическая дрель — 1шт.
- Сверло диаметром 6.5мм — 1шт.
Шаг 1 : Подключение модуля SIM800L
Отключаем питание от RPi и подключаем SIM800L согласно схеме:
Только не запитывайте SIM800L от выхода 5В на RPi. При установке соединения с сотовой вышкой GSM-модуль потребляет ток намного превосходящий тот, который вы можете безопасно брать с RPi.
Друзья, привожу фото SIM800L из интернета, т.к. крышка корпуса моего RPi была с трудом закрыта (в корпусе уже очень много проводов) и лишний раз я не хотел их тревожить.. В будущем буду приобретать корпус для RPi больших размеров. Возможно такой.
Для установки антенны, делаем отверстие 6.5мм в любом удобном месте вашего корпуса RPi и устанавливаем антенну.
Подаём питание на RPi (предварительно соединив с LAN кабелем) и заходим на нее через SSH:
ssh pi@192.168.0.XXX
Далее, нам нужно зайти в Rasbian Config и включить поддержку UART (универсального асинхронного приемопередатчика). В терминале набираем:
sudo raspi-config
Идем в раздел 5 — Interfacing Options
и заходим в раздел 6 — Serial
Would you like a login shell to be accessible over serial? — Ставим No
Would you like the serial port hardware to be enabled? — Ставим Yes
Далее, заходим в файл config.txt:
sudo nano /boot/config.txt
И вставляем в разделе [all]
enable_uart=1
Сохраняем файл и перезагружаем RPi:
sudo reboot
Шаг 2 : Проверка SIM800L и прописывание номера сим-карты в сигнализации
Чтобы проверить работоспособность SIM800L нужно установить программу minicom:
sudo apt install minicom
Т.к. у нас RPi с архитектурой ARM, то путь к последовательному порту будет /dev/ttyAMA0
Запускаем mincom:
minicom -s
Идём в раздел Serial port setup, затем нажимаем клавишу A (что соответствует Serial Device) и вписываем путь к последовательному порту /dev/ttyAMA0. Жмём Enter.
Затем, нажимаем клавишу E, попадаем в меню Comm Parameters. Далее, жмём клавишу С (что соответствует скорости 9600), затем нажимаем клавишу Q (что соответствует 8-N-1). 8-N-1 — это сокращённая запись для настройки или конфигурации параметров последовательного порта в асинхронном режиме, в котором есть один стартовый бит, восемь (8) битов данных, нет (N) бита чётности и один (1) стоп бит.
Жмем Enter. Также в меню последовательного порта выбираем разделы F (Hardware Flow Control) и G (Software Flow Control) и для обоих ставим No.
Выходим в главное меню и сохраняем настройки, выбрав Save setup as dfl. Далее, жмём Exit и оказываемся в главном терминальном окне программы minicom.
Пробуем опросить GSM-модуль. Для начала набора команд нужно нажать CTRL+A, а потом клавишу E.
Набираем команду AT нажав Enter. Если GSM-модуль доступен, то после нажатия Enter вы увидите – OK. Это значит, что GSM-модуль мы подключили правильно и он откликается на команды.
Далее, попробуем сделать тестовый звонок на свой мобильный телефон. В этом же окне набираем ATD+7XXXXXXXXXX; (где 7XXXXXXXXXX номер вашего мобильника) и жмём Enter. Если все нормально, то GSM-модуль позвонит Вам, и вы услышите звонок. На звонок не отвечайте, т.к. вы все равно ничего не услышите (у SIM800L нет поддержки микрофона и динамика в принципе). Звонок сбросьте либо на телефоне, либо через minicom, набрав команду ATH, и нажав Enter. Чтобы выйти из minicom, нажимаем сначала CTRL+A, а затем клавишу X.
Далее, берём ноутбук и ставим на него программу Pandora Alarm Studio последней версии. Подключиться к сигнализации можно через USB-кабель либо через беспроводной модуль RPM-03. Т.к. блок охранной сигнализации у меня был надёжно спрятан внутри машины, то единственным интерфейсом подключения без сторонней помощи у меня был беспроводной модуль RMP-03 на 2.4 гигагерц. Вставляем модуль в USB-порт ноутбука. Открываем программу Pandora Alarm Studio. На брелоке сигнализации зажимаем кнопку открытия дверей совместно с кнопкой F и держим три секунды. Так мы войдём в режим программирования. В самой программе нажимаем на значок радио сигнала в правом верхнем углу и нажимаем поиск нового устройства.
Когда произойдёт соединение, выбираем марку нашего автомобиля и идём в расширенные устройства.
В настройках Pandora Alarm Studio нам нужно зайти в раздел VI.GSM / 6.1 Настройки телефонных номеров / 6.1.2 Дополнительный номер владельца. Также нужно ввести гостевой ПИН-код в разделе 6.1.4.
После всего этого сохраняем конфигурацию охранной сигнализации и выходим из режима программирования путём включения и выключения зажигания.
Шаг 3 : Программа дозвона на Python и привязка к Алексе
Заходим на RPi и создаём файл power_train_on.py:
sudo nano power_train_on.py
В него вставляем следующий код:
import serial import RPi.GPIO as GPIO import os, time GPIO.setmode(GPIO.BOARD) port = serial.Serial("/dev/ttyAMA0", baudrate=9600, timeout=1) # Устанавливаем связь с GSM-модулем через последовательный порт port.write(str.encode('AT\r\n')) # Проверяем связь с GSM-модулем time.sleep(0.1) port.write(str.encode('ATE0\r\n')) # Отключаем эхо от GSM-модуля time.sleep(0.1) port.write(str.encode('ATD+7XXXXXXXXXX;\r\n')) # Звоним на охранную сигнализацию, где 7XXXXXXXXXX; - номер ее сим-карты. time.sleep(12) port.write(str.encode('AT+VTS="1,1,1,1,#,1,2,3,*"\r\n')) # В тональном режиме вводим гостевой ПИН-код и код запуска двигателя time.sleep(6) port.write(str.encode('AT+CHUP\r\n')) # Вешаем трубку time.sleep(1)
Сохраняем файл.
Далее, в веб-папке нашего сервера Apache на RPi создаем файл power_train.php и вставляем в него следующий код:
<? if (isset($_POST['code'])) $code = $_POST['code']; else $code = ""; $code_power_train_on = "ViLmwBE4"; $cmd_power_train_on = "/usr/bin/python3 /home/pi/power_train_on.py'"; if ($code == $code_power_train_on) exec($cmd_power_train_on); ?>
Примечание: В данном примере структура сравнения кодов показана в упрощённом варианте для наглядности. В реальности, все мои коды в виде hash-значений сложены в базу данных для большей безопасности. Также файл на веб-сервере должен быть доступен через интернет. Чтобы это сделать нужно иметь фиксированный IP-адрес роутера дома, а также сделать проброс портов от роутера до RPi.
Далее, соединяем этот файл с Алексой через сервис IFTTT. Чтобы не повторяться, об этом можно прочитать в моей инструкции “Я есть универсальный ИК-пульт с голосовым управлением Алексой…”
Теперь за несколько минут до выхода из дома мне достаточно сказать: “Alexa, trigger engine on…” и двигатель заведётся!
Profit! :)
Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!