Arduino

Система контроля за территорией и оповещение о проникновении на мобильный телефон + «пугалка» для непрошеных гостей

Эта статья расскажет нам с вами о сборке очень умной, говорящей системы безопасности кемпинга, замаскированной под сову. Это не типичный проект ультразвукового датчика Arduino. Из статьи мы узнаем, как перепроектировать очень недорогие, но гораздо более совершенные датчики парковки (которые устанавливаются в бампер автомобиля). Эти датчики имеют луч гораздо шире, чем классические ультразвуковые датчики типа HC-SR04.

Так же из статьи мы узнаем, как собрать небольшой аудиоусилитель.

Мастер разработал эту систему с учетом следующих требований:
-Раннее оповещение (не нужно ждать, пока вышибут дверь или окно, чтобы сработала тревогу)
-Голосовое оповещение (система автоматически разговаривает с злоумышленником, угрожая вызовом полиции)
-Широкий охват (луч) мониторинга территории
-Отправка уведомления на мобильный телефон при обнаружении вторжения

Инструменты и материалы:
-Фигурка совы;
-Парктроник или аналоги;
-ESP8266;
-Arduino MKR Zero;
-Усилитель Adafruit Mono 2,5 Вт (опционально);
Для самостоятельной сборки усилителя (опционально):
-Аудиоусилитель LM386;
-Динамик 8 Ом 1/2 Вт;
-Резистор 10 Ом;
-Два резистора 4,7 кОм;
-Конденсаторы 10 мкФ;
-Конденсатор 0,1 мкФ;
-Конденсатор 220 мкФ;
-Логический анализатор;
-Цифровой мультиметр;
-Код и 3D-файл;

Шаг первый: особенности Arduino MKR Zero
Для этой сборки мастер выбрал Arduino MKR Zero. Особенности платы следующие:
-Стоимость — 25 долларов США
-10-битный ЦАП
-Позволяет воспроизводить звуковые файлы без дополнительного оборудования
-Слот для SD-карты
-Позволяет загружать десятки звуков
-22 цифровых контакта, SPI и I2C
-Позволяет подключаться к плате датчика парктроника
-Встроенное управление зарядкой аккумулятора
Единственное, чего не хватает в данной плате — это Wi-Fi.

Шаг второй: о парктронике
Датчики парковки автомобиля используют ультразвук, который представляет собой акустическую волну с очень высокой частотой. Частота выше 20 кГц недоступна человеческому слуху. Что в нем удивительного, так это то, насколько он «громкий». Он издает неслышный звук на уровне более 100 дБ — «громче», чем мотоцикл, но не повреждает ухо человека.

Благодаря такой короткой длине волны он имеет хорошую форму луча, которая позволяет проводить надежные измерения для зондирования объектов. Кроме того, поскольку звук распространяется по воздуху, номинально он движется со скоростью 340 м/с.

Шаг третий: протокол обмена данными с датчиком
Если вы купили точно такой же комплект парктроника, какой указан в «материалах», то можно пропустить этот шаг. Если парктроник другой, то в этом шаге мастер научит нас, как взламывать оборудование.

Чтобы взломать парктроник, просто нужно выяснить, как «мозги» парктроника взаимодействуют со своим светодиодным монитором. Поскольку разные производители делают их со своими собственными протоколами, нужно найти кабели протокола связи, а также заземления и напряжения. Примерно нужно сделать следующие шаги:
1) Используйте макетную плату, чтобы проверить схему:
От платы парктроника к дисплею идут четыре провода. С помощью перемычек нужно добавить в схему макетную плату между платой парктроника и дисплеем.
2) Найдите землю, идущую к монитору:
Поскольку это автомобильная технология, для питания платы парктроника используется источник номинального напряжения 12 В. Скорее всего дисплей питается от напряжения не более 5 В.
Для начала нужно установить мультиметр на поиск обрыва цепи. Затем, установив один щуп на заземление на плате, вторым щупом поочередно прозваниваем подходящие к дисплею провода. Звуковой зуммер будет означать, что мы нашли пару проводов заземления.
3) Находим провод 5В:
Этот провод будет использоваться для питания Arduino. Подключаем батарею 9 В для питания модуля и заземляем его. Измеряем оставшиеся три провода. На двух из них напряжение будут колебаться, на третьем — будет 5 В. Это провод питания.
4) Находим провод зуммера:
На дисплеи парктроника есть встроенный зуммер, который предупреждает о приближении к препятствию. Определить провод зуммера очень просто. Нужно просто снять перемычки с одного провода. Если звук прекратится, значит мы нашли необходимый провод. Если звук продолжается, значит, провод оставшийся перемкнутым.
5) Сигнальный провод:
Как вы наверное уже догадались, оставшийся четвертый провод является сигнальным.
6) Взламываем протокол связи:
Оставив всего один провод, можно исключить протоколы связи I2C и SPI. Им нужен другой сигнал.
Это может быть последовательная связь, или какой-то пользовательский протокол широтно-импульсной модуляции (ШИМ), разработанный производителем.
Для дальнейшей работы нужен осциллограф или, еще лучше, дешевый логический анализатор.

Часто последовательная связь имеет сигнал в виде длинного импульса. После длинного импульса идут 8 сегментов, которые могут быть высокими или низкими. Ширина между каждым сегментом фиксирована. Измеряя самый короткий высокий импульс, можно предположить, что это период и, в свою очередь, соответствующая скорость передачи.

В данном случае 9600 бод кажется приемлемым для последовательной связи. Но количество сегментов больше 8. На самом деле после длинного импульса количество ударов не делится равномерно на восемь. Это говорит о том, что производитель создал свою собственную систему обмена сообщениями, используя широтно-импульсную модуляцию на 5 В.

Дальше подключаем по одному ультразвуковому датчику к одному порту за раз. Похоже, что данные сегментируются после очень длинного импульса. (Под длинными имеется в виду «по сравнению с другими импульсами».) Здесь можно увидеть, что есть 4 байта импульсов (байт, представляющий каждый датчик). Короткие импульсы равны нулю, а длинные — 1. Когда датчик подключен, начало байта становится 000 вместо 111. Код взломан.

Протокол связи следующий:
1 очень длинный стартовый импульс (код будет ждать импульса некоторое время, прежде чем вызывать процедуру синтаксического анализа)
1 короткий пусковой импульс
Короткие импульсы означают ноль в каждом периоде, длинные импульсы означают единицу
Для каждого пакета выдано 4 байта, каждый из которых представляет данные датчиков в следующем порядке: Сенсор A, D, C, B
Если первые 3 бита равны нулю в байте, датчик распознается
Последние 5 байт являются двоичными для дециметров расстояния от данного датчика

Шаг четвертый: звуковая система сигнализации
Если вы купили усилитель от Adafruit, указанный в разделе «материалы», то можно пропустить этот шаг и просто подключить усилитель, плату парктроника и ESP8266 к Arduino.

Для тех кто хочет собрать свой усилитель следуем следующим шагам.
Получите техническое описание микросхемы усилителя LM386.
Просмотрите схему на изображениях ниже.
Сделайте макет схемы и протестируйте ее с музыкальным плеером с разъемом 3,5 мм.
Примечание. Земля музыкального плеера подключается к контакту 2 LM386. Этот вывод не соединяется с землей цепи, иначе будет только шума.

При желании изменить схему, можно скачать файлы здесь.

Шаг пятый: программное обеспечение
Если вы приобрели парктроник, который указан разделе расходных материалов, то можно использовать этот код без изменений. В противном случае вам нужно будет настроить код.
Это руководство основано на том, что пользователь знаком с загрузкой кода в Arduino. Следуйте обычной процедуре загрузки.
Для звуковых файлов просто запишите звук и сохраните файл на SD-карту с именами alarm.wav и owlHello.wav .
Также можно получить этот код на GitHub мастера.
Код Arduino MKR Zero:

 Показать / Скрыть текст#include <SD.h>
#include <SPI.h>
#include <AudioZero.h>

int sense_pin = 0;
int alarm_pin = 1;

unsigned long pulse_length;
unsigned long first_pulse;
int sensorValue[32];
unsigned long lengths[32];
int pulse_value;
float A, B, C, D;
float averageDistance, lastAverage;
int first_few_counter=0;

void setup()
{
Serial.begin(115200);
delay(1000);
A=0;B=0;C=0;D=0;
averageDistance=0;lastAverage;
pinMode(sense_pin,INPUT);
pinMode(alarm_pin,OUTPUT);
digitalWrite(alarm_pin,HIGH); // Leave it high and pull it low to alarm.
digitalWrite(A0,HIGH); //kills noise on the line;
if (!SD.begin(SDCARD_SS_PIN)) {
Serial.println(" failed!");
while(true);
}

Serial.println("Starting…");
delay(1000);
PlaySound("owlHello.wav");
}

void loop() {
Sense();
delay(2000);
}

void Sense()
{ Serial.println("Sensing…");
delay(1000);
int i;
//look for starter pulse
pulse_length = pulseIn(sense_pin, HIGH);

// wait for the long pulse to signify the start
while (pulse_length < 1900) {
pulse_length = pulseIn(sense_pin, HIGH);
}
first_pulse=pulse_length;

// consume the throw away bit
pulse_length = pulseIn(sense_pin, HIGH);

// Get the 32 bits to follow
for (i = 0; i < 32; i ++) {
pulse_length = pulseIn(sense_pin, HIGH);

if (pulse_length < 180) {
pulse_value = 0;
}
else {
if (pulse_length > 1000) {
Serial.println("Overran!");
delay(1000);
return; // just exit out of the routine if it fails to sense correctly this time through.
}
pulse_value = 1;
}
sensorValue[i] = pulse_value;
lengths[i]=pulse_length;
}

// Sensor A
if (sensorValue[0]==0) {
//String sensorA=String(sensorValue[3])+String(sensorValue[4])+String(sensorValue[5])+String(sensorValue[6])+String(sensorValue[7]);
//Serial.println(sensorA);
A=16*sensorValue[3] + 8*sensorValue[4] + 4*sensorValue[5] + 2*sensorValue[6] + sensorValue[7];
A=A/(10*.3048); // convert decimeters to feet
Serial.println(A);
}

// Sensor D
if (sensorValue[8]==0) {
D=16*sensorValue[11] + 8*sensorValue[12] + 4*sensorValue[13] + 2*sensorValue[14] + sensorValue[15];
D=D/(10*.3048); // convert decimeters to feet
Serial.println(D);
}

// Sensor C
if (sensorValue[16]==0) {
C=16*sensorValue[19] + 8*sensorValue[20] + 4*sensorValue[21] + 2*sensorValue[22] + sensorValue[23];
C=C/(10*.3048); // convert decimeters to feet
Serial.println(C);
}

// Sensor B
if (sensorValue[24]==0) {
B=16*sensorValue[27] + 8*sensorValue[28] + 4*sensorValue[29] + 2*sensorValue[30] + sensorValue[31];
B=B/(10*.3048); // convert decimeters to feet
Serial.println(B);
}
averageDistance=(A+B+C+D)/4;
if (((abs(lastAverage-averageDistance))/lastAverage)>.1) alarm();
lastAverage=averageDistance;
}
void alarm(){
if (first_few_counter++<3) return; // this keeps it from triggering when you first set it down and turn it on.
digitalWrite(alarm_pin,LOW);
PlaySound("alarm.wav");
delay(5000);
digitalWrite(alarm_pin,HIGH);
}

void PlaySound(String the_sound)
{
File myFile;

// open wave file from sdcard
myFile = SD.open(the_sound);

// until the file is not finished
AudioZero.begin(44100);
AudioZero.play(myFile);
myFile.close();
AudioZero.end();
digitalWrite(A0,HIGH); //kills noise on the line;
}
Для связи с телефоном мастер использует программу Pushbullet для системы обмена сообщениями. Нужно будет установить ключ и заменить им «YOURPUSHBULLETKEY».
Код ESP8266:

 Показать / Скрыть текст#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const char* ssid = "YOURSSID";
const char* password = "YOURPASSWORD";
const char* host = "api.pushbullet.com";
const int httpsPort = 443;
const char* PushBulletAPIKEY = "YOURPUSHBULLETKEY"; //get it from your pushbullet account
// Use web browser to view and copy SHA1 fingerprint of the certificate. Click the lock by the address in the browser and then click view certificate.
// Alternately, go to <a href="https://www.grc.com/fingerprints.htm"> <a href="https://www.grc.com/fingerprints.htm" rel="nofollow"> https://www.grc.com/fingerprints.htm </a> </a> and enter api.pushbullet.com
const char* fingerprint = "BB FC 9F 1B C1 3C D9 96 F2 68 A2 E3 41 29 D1 47 8F B9 33 BE";
void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
pushBullet("The Owl Orb of Protection Has Started!");
pinMode(2,INPUT_PULLUP);
}
void pushBullet(String the_msg){
// Use WiFiClientSecure class to create TLS connection
WiFiClientSecure client;
Serial.print("connecting to ");
Serial.println(host);
if (!client.connect(host, httpsPort)) {
Serial.println("connection failed");
return;
}

if (client.verify(fingerprint, host)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
}
String url = "/v2/pushes";
String messagebody = "{"type": "note", "title": "ESP8266", "body": ""+the_msg+""}rn";
Serial.print("requesting URL: ");
Serial.println(url);

client.print(String("POST ") + url + " HTTP/1.1rn" +
"Host: " + host + "rn" +
"Authorization: Bearer " + PushBulletAPIKEY + "rn" +
"Content-Type: application/jsonrn" +
"Content-Length: " +
String(messagebody.length()) + "rnrn");
client.print(messagebody);

Serial.println("request sent");

//print the response

while (client.available() == 0);

while (client.available()) {
String line = client.readStringUntil('n');
Serial.println(line);
}
}
void loop() {
delay(200);
if (digitalRead(2)==LOW) {//Wait for pin 2 to go to ground to trigger.
pushBullet("The Owl has detected something!");
delay(5000);
}

Шаг шестой: корпус
Для основания можно взять любую водонепроницаемую коробку. Мастер напечатал корпус на 3D-принтера.
Файлы для печати можно скачать здесь.

Шаг седьмой: сова
Теперь самое интересное — сборка.
Выдавите сове глазные яблоки.
Используя кольцевую пилу, входящую в комплект датчика, расширьте отверстия под диаметр датчиков.
Пропустите два провода датчика через отверстия.
Подключите провода к базе.

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

Источник

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть
Закрыть