Навчимося використовувати пасивний датчик руху (PIR) та ультразвуковий датчик вимірювання відстані, підключених до Arduino, для виявлення руху.
Виявлення руху за допомогою PIR та відправка e-mail
Розглянемо проект підключення датчика PIR (Passive Infrared) до Arduino і організуємо автоматичне відправлення e-mail при спрацьовуванні датчика.
Arduino зчитує показання ІЧ-датчика і при виявленні руху віддає комп'ютеру через порт USB команду відправити лист. Обробку сигналу, який надходить на комп'ютер, реалізуємо за допомогою програми на Python.
Схема підключення PIR-датчика до Arduino
Скетч Arduino
При виявленні руху Arduino посилає повідомлення через зв'язок USB Serial. Але, якщо посилати e-mail при кожному спрацьовуванні датчика, то можна отримати величезну кількість листів. Тому, якщо пройшло ще дуже мало часу від попереднього сигналу, будемо посилати на монітор послідовного порту інше повідомлення. До виводу 13 приєднуємо через опір 100 -200 Ом світлодіод для індикації наявності руху.
//Тестувалось на Arduino IDE 1.6.5
#define pirPin 7 // Визначити 7-й вивід як pirPin – для PIR
#define ledPin 13 // Визначити 13-й вивід як ledPin – для світлодіоду
void setup()
{
Serial.begin(9600); // Задати швидкість обміну послідовного порту 9600 бод
pinMode(pirPin, INPUT); // Задати вивід pirPin вхідним
pinMode(ledPin,OUTPUT); // Задати вивід ledPin вихідним
}
void loop()
{
int pirVal = digitalRead(pirPin); // Прочитати значення на виводі pirPin
if(pirVal == HIGH) //Якщо помітили рух, то…
{
digitalWrite(ledPin, HIGH); // Встановити високий рівень сигналу на ledPin – світлодіод горить
Serial.print("\nMotion detected"); // Вивести фразу
delay(1000); //затримка 1 с
}
else
{
Serial.print("\nNo motion"); // Якщо не помітили рух, то…
digitalWrite(ledPin,LOW); // Встановити низький рівень сигналу на ledPin – світлодіод не горить
delay(1000); //затримка 1 с
}
}
Перед тим, як писати програму на Python для обробки сигналу, який надходить з Arduino на комп'ютер або Raspberry Pi через USB, можна перевірити роботу програми на Arduino, просто відкривши Serial Monitor на Arduino IDE.
Serial Monitor Arduino IDE
Установка Python і PySerial
Якщо в проекті використовується комп'ютер з ОС Linux, наприклад, Raspberry Pi, то Python вже встановлений. Якщо використовується комп’ютер з ОС Windows, то потрібно встановити Python. У будь-якому випадку, необхідно встановити бібліотеку PySerial, щоб забезпечити зв'язок з Arduino.
Установка Python на Windows
Для встановлення Python на Windows, завантажте установник з https://www.python.org/downloads/.
Щоб уникнути проблеми з PySerial на Windows при використанні Python 3, можна використати Python 2, Для тих, хто все ж таки вибере Python 3, нижче наведе посилання для завантаження версії PySerial для нього.
Після установки Python в меню Пуск з'явиться відповідна група. Але для установки PySerial треба буде використовувати Python з командного рядка, тому додаємо до змінної PATH середовища Windows відповідний каталог:
Щоб зробити це, потрібно зайти в Панель управління Windows, знайти System Properties (Властивості системи). Потім натиснути на кнопку з написом Environment Variabes ("Змінні середовища") і у вікні вибрати "Path" в нижній частині System variables (Системні змінні). Натиснути кнопку Edit ("Змінити"), а потім в кінці "Значення змінної», не видаляючи наявний текст, додати "; C: \ Python27". Не забувайте ставити ";" після кожної зазначеної папки.
Щоб перевірити, що змінну PATH змінили коректно, в командному рядку введемо команду "python". Повинне з'являтися подібне зображення:
Установка PySerial
Для ОС Windows завантажуємо інсталятор для PySerial 2.7 із pyserial-2.7.win32.exe, а для Python 3 - pyserial-2.7.win32_py3k.exe.
При використанні комп'ютера з операційною системою Linux, наприклад, при використанні в цьому проекті Raspberry Pi, завантажуємо архів інсталяційного пакету pyserial-2.7.tar.gz, потім відкриваємо термінальну сесію, виконуємо команду "cd" із зазначенням папки куди завантажений архів pyserial-2.7.tar.gz, а потім виконуємо наступну команду, щоб розпакувати установник:
$ tar -xzf pyserial-2.7.tar.gz
Далі у командному рядку виконуємо команду "cd" c зазначенням папки pyserial-2.7 і виконуємо команду:
sudo python setup.py install
Код на Python
Тепер створюємо програму на Python. Для цього копіюємо даний код у файл з ім'ям "movement.py". На Linux можна використовувати «nano» редактор, на Windows, ймовірно, найпростіше створити файл за допомогою редактора Python IDLE" (доступний з групи програм Python в меню Пуск).
import time
import serial
import smtplib
TO = 'This email address is being protected from spambots. You need JavaScript enabled to view it.'
GMAIL_USER = 'This email address is being protected from spambots. You need JavaScript enabled to view it.'
GMAIL_PASS = 'putyourpasswordhere'
SUBJECT = 'Intrusion!!'
TEXT = 'Your PIR sensor detected movement'
ser = serial.Serial('COM4', 9600)
def send_email():
print("Sending Email")
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(GMAIL_USER, GMAIL_PASS)
header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER
header = header + '\n' + 'Subject:' + SUBJECT + '\n'
print header
msg = header + '\n' + TEXT + ' \n\n'
smtpserver.sendmail(GMAIL_USER, TO, msg)
smtpserver.close()
while True:
message = ser.readline()
print(message)
if message[0] == 'M' :
send_email()
time.sleep(0.5)
Перед тим, як запустити програму Python, вносимо деякі зміни (всі вони у верхній частині програми).
Програма передбачає, що електронні листи створюються з облікового запису Gmail. Якщо його немає, то реєструємо (навіть якщо це тільки для цього проекту).
Змінюємо значення змінної "TO" на адресу електронної пошти, куди будуть відправлятися повідомлення.
Змінюємо значення "GMAIL_USER" на адресу електронної пошти Gmail і відповідно пароль в наступному рядку (GMAIL_PASS).
Також можна змінити тему і текст повідомлення для відправки ("SUBJECT" і "TEXT").
Необхідно встановити віртуальний послідовний порт, до якого підключений Arduino, в рядку:
ser = serial.Serial('COM4', 9600)
Для Windows це буде щось типу "COM4", а для Linux - щось типу "/dev/tty.usbmodem621". До якого порту комп'ютера підключена плата, дивимося в правому нижньому кутку Arduino IDE.
Після цих змін запускаємо програму з командного рядка/терміналу:
python movement.py
Тепер, коли PIR-датчик спрацює, незабаром на вказану адресу e-mail приходить повідомлення.
ПРИМІТКА: Деякі пристрої й додатки використовують незахищені технології для входу, у результаті чого рівень захисту вашого облікового запису знижується. Щоб захистити облікові записи користувачів Google Apps, може блокуватися доступ до них із менш безпечних додатків. До таких додатків може бути зарахований і ваш ПК, який надсилає листи автоматично. Ви побачите помилку "Неправильний пароль", коли спробуєте ввійти в обліковий запис Google Apps. Для вирішення проблеми на сторінці "Мій обліковий запис" у розділі "Менш безпечні додатки" потрібно вибрати опцію Надати доступ менш безпечним додаткам. Пам'ятайте, що у Google for Work це налаштування сховано, якщо адміністратор застосував правило безпеки, щоб заблокувати доступ до системи з менш безпечних додатків.
Що ще можна зробити з використанням PIR-датчика
Тепер, освоївши засоби відправлення електронної пошти з Arduino, можна приступити до розширення можливостей проекту. Можна додати інші датчики, і, наприклад, відправляти собі електронною поштою погодинні звіти про температуру.
Безумовно, PIR-датчик можна використати безпосередньо з Arduino без з'єднання з комп'ютером. У цьому випадку при спрацьовуванні датчика можна включати застережливий звуковий сигнал, блимати світлодіодом, або вмикати освітлення в приміщенні (наприклад, через реле).
Відео про використання PIR-датчика:
Виявлення руху за допомогою ультразвукового датчика присутності
Для визначення відстані у найпростішій системі на Ардуїно можна скористатися ультразвуковим датчиком HS-SR 04. На відміну від PIR-датчика, який визначає наявність руху, даний датчик дозволяє визначити відстань до об'єкта. Тобто, в стаціонарному варіанті, коли змінюється відстань чогось до датчика, то це «щось» або наближається, або віддаляється.
- Vcc - позитивний контакт живлення.
- Trig - цифровий вхід. Для запуску вимірювання необхідно подати на цей вхід логічну одиницю тривалістю 10 мкс. Наступний вимір рекомендується виконувати не раніше, ніж через 50 мс.
- Echo - цифровий вихід. Після завершення вимірювання, на цей вихід буде подана логічна одиниця на час, пропорційний відстані до об'єкта.
- GND - негативний контакт живлення («земля»).
Характеристики:
- Напруга живлення - 5 В
- Споживання в режимі тиші - 2 мА
- Споживання при роботі - 15 мА
- Діапазон відстаней - 2-400 см
- Ефективний кут спостереження - 15°
- Робочий кут спостереження - 30°
Датчик заснований на простому принципі явища звукової луни. Мембрана видає ультразвук, а друга мембрана ловить луна-сигнал, відбитий від перешкоди:
Тому формула відстані:
D = VT / 2,
де
D = відстань від перешкоди
V = швидкість звуку
T = виміряний проміжок часу від сигналу запуску до отримання відгуку. Зрозуміло, що ділення на 2 враховує шлях туди і назад.
Зауважимо, що швидкість звуку в повітрі змінюється в залежності від температури таким чином:
V = 331,4 + 0,62 t
де t - температура, виміряна в °С, а швидкість вимірюється в м/сек. У наших експериментах припускаємо, що температура 20 °C і, отже, швидкість звуку становить близько 340 м/с.
У наших розрахунках час вимірюється в мікросекундах і ми хочемо, щоб вихідна відстань була в сантиметрах. Тому попередня формула перетворюється на:
D = 0,017 * T
Схема під’єднання дуже проста:
Всього чотири під'єднання: живлення, земля, вхід і вихід датчика. Для активації використовується короткочасний імпульс тривалістю блтзько 10мкс. Для зчитування відстані треба визначити проміжок часу до отримання повернутого імпульсу і перетворити час у відстань в сантиметрах до об'єкту. Мінімальна відстань досить мала і залежить від швидкодії Ардуїно. Судячи з демо ролика, це близько сантиметра:
Нижче наводиться приклад коду у вигляді «скетчу», який виконує всі необхідні дії:
#include <Serial.h>
const uint8_t trigPin = 4;
const uint8_t echoPin = 2;
void setup() {
// ініціалізація послідовного передавання:
Serial.begin(9600);
}
void loop()
{
uint32_t duration; // тривалість туди і назад
uint32_t cm; // відстань до перешкоди
// запуск короткого імпульсу низького рівня для очищення
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(3);
// запуск сигналу зондування
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// читання сигналу датчика
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
// перетворення часу у відстань
cm = (uint32_t)((duration<<4)+duration)/1000.0; // cм = 17 * duration/1000
Serial.print(cm);
Serial.print(" centimeters");
Serial.println();
delay(100);
}
Замість висновків
Розглянуті вище PIR, які, наприклад, включають світло при наявності руху, - зовсім не є новинкою. Однак, незважаючи на їх певну перевагу, все-таки вони мають кілька суттєвих недоліків. Вони не дуже чутливі, їх спрацьовування залежить від ряду факторів, вони спрацьовують випадково, їх дуже незручно використовувати як датчики присутності, так як складно налаштувати чутливість, при якій мало рухлива людина буде створювати достатній відбитий сигнал.
Є цілий ряд ситуацій, коли необхідно просто відстежити переміщення або наявність об'єкту в зоні дії датчика і виконати якусь дію. Причому, вкрай небажано, щоб при наявності нерухомого об'єкта датчик вимикався. Навіть, якщо цей об'єкт буде нерухомий тривалий час. З цим завданням чудово справляється Arduino Uno з ультразвуковим датчиком.
(За матеріалами: radiogid.ucoz.ru, macduino.blogspot.com, edurobots.ru)