Светодиодная ёлка с подарками, управляемая по Wi-Fi.

Введение

Мой сын Алексей предложил сделать ёлку из светодиодов, для украшения прихожей. Естественно, чтобы она мигала. Ну, папа подумал, подумал… Сделали на ESP8266 (в варианте ESP-201), разноцветных светодиодов, мощных транзисторов (добытых из балластов люминесцентных ламп), сопротивлений, пары разъёмов от флоповодов.
Алексей помогал припаивать светодиоды, Николаю поручили написать программу в среде Arduino, с простенькой веб страничкой для загрузки новых “мелодий”.

Железо

Сначала прикинули с ребёнком рисунок ёлочки и подарков на листе бумаги. Набросали черновой вариант разводки шин питания. Из-за выбранной схемы подключения (см. ниже), общей шиной является +5В (а не земля).

Внимание! Разные светодиоды имеют разное падение напряжение и рассчитаны на разный максимальный ток. Для ограничения тока через светодиод проще всего использовать сопротивление. Поскольку у нас напряжение питания для светодиодов было порядка 5.4 Вольт, можно было некоторые светодиоды (на которых падает < 2.5 Вольт) ставить в пары последовательно. Это увеличивает эффективность схемы (меньше энергии рассеивается на сопротивлении).
Для расчёта сопротивлений можно использовать онлайн калькуляторы.

Для основы вырезали картонку из коробки для пиццы.

Для припаивания ножек светодиодов к железной проволоке использовали флюс, без него припаять трудно. Рассчитанные сопротивления подпаяли сразу к светодиодным блокам. Вышло немного аляповато, зато быстро и наглядно. Чтобы сделать конструкцию модульной, т.е. чтобы “дисплей” можно было отсоединять от платы, отдельные элементы припаял к разъёмам от флоппи дисководов, срезанных с шлейфа проводов компьютерного блока питания.

Для управления используется ESP8266, купленный в варианте ESP-201. (Для тех, кто не знает что это такое ESP8266, можно посмотреть здесь. Грубо говоря, это Arduino с встроенным Wi-Fi. Модули ESP-201 можно приобрести на Aliexpress за ~150р).
Разумеется ESP8266 не может напрямую питать такие мощные нагрузки, поэтому я использовал NPN транзисторы подключенные по схеме с общим эмиттером. Ниже приведена принципиальная схема (на три группы светодиодов). Резисторы R1-R3 нужны для работы самого контроллера, R4-R6 для ограничения тока на выходах контроллера через базы транзисторов, R7-R9 для ограничения тока на светодиодах. Номиналы последних не указаны, поскольку зависят от количества, характеристик и схемы подключения светодиодов (см. онлайн калькулятор выше). В принципе, R1-R6 можно выбирать в широком диапазоне (1к – 20к). При слишком маленьких значениях можно спалить контроллер, при слишком больших не откроется транзистор. Транзисторы выпаял из балластов для люминесцентных ламп (имеющихся в наличии в связи с плановой заменой освещения) и старого компьютерного блока питания.

Схему я сначала собирался спаять на макетной плате для пайки, но с первого раза не получилось. И поскольку время поджимало, использовал макетную плату с гнёздами. К транзисторам припаял трёх штыревые разъёмы.
Внимание! Транзисторы не должны соприкасаться корпусами.
Для преобразования 5 Вольт в 3.3 Вольта, необходимые для контроллера, я использовал готовый миниатюрный преобразователь. Он поддерживает ток до 800мА, что достаточно для контроллера.
Основной блок питания – зарядка от какого-то почившего гаджета, выдающая 5.4 Вольта на 1.850 Ампера. Разъём питания я использовал аналогичные используемым во многих игрушках для зарядки аккумуляторов. Для включения/выключения – микро переключатель.
Вот картинки от использованных компонентов:

Для окончательной сборки “дисплея”, я закрыл заднюю часть второй картонкой и сделал подставку с помощью проволочных “ножек”. Макетная плата размещается внизу и заодно делает конструкцию более устойчивой.

Софт

Для программирования использовалась среда Arduino настроенная для ESP8266. Более подробно на гитхабе. Программа основана на примере стандартного веб сервера. Разбирает POST от формы и на основе значения аргумента, в цикле, настаивает цифровые выходы контроллера. Контроллер подключен в домашнюю Wi-Fi сеть и настроить системы можно с любого компьютера или смартфона.

Коля придумал длинную “мелодию”, которую пока и оставили. Видео есть на Facebook.

Часы с “сетевым” временем из ESP8266, LED матриц, зарядки от сотового и коробки от конфет.

Надоело постоянно подстраивать время на настольных часах в спальне. Едва ли не самые важные часы в квартире постоянно уходили и вообще сбрасывались при отключении электричества.
Решил сделать собственные часы, подключенные к сети по Wi-Fi и получающие время по NTP.

Железо

В качестве управляющего модуля я выбрал ESP8266, для которого уже была заточенная Arduino IDE и некоторый опыт разработки.
1 matrixДля разработки и отладки использовал удобную SDK плату для ESP8266. Несколько LED матриц 8*8 были в наличии. Собирался в них поиграть с детьми, поэтому заказывал с запасом. Матрицы используют микросхему MAX7219 для управления светодиодами. Информация передаётся последовательно, и возможно подключение нескольких модулей последовательно. В интернете есть масса библиотек для таких матриц, в том числе с готовыми шрифтами. Но для этого проекта я сделал свой шрифт, лучше подходящий именно для часов.
Ниже показана сборка из трёх матриц, соединённых последовательно.
4
Я использовал разборные соединения между основными модулями, чтобы упростить сборку/разборку и замену деталей.
2Вот как выглядел весь стенд. Блок питания компьютерный, на нём были необходимые 3 и 5 Вольт с запасом по мощности. Полностью включенные три матрицы потребляют приличный ток, и от компьютерного USB порта работать не будут.

Софт

Программа достаточно простая. У меня уже были готовые примеры: работа с LED матрицами для Arduino, и отправка запроса / разбор ответа NTP для ESP8266. Оставалось слить это в одну работающую программу и кое что добавить:

  • Присоединение к моей домашней Wi-Fi сети, + пересоединение если что-то не работает. Аналогично, несколько NTP серверов, запрашиваемых по кругу.
  • Поскольку внутренних часов у ESP8266 нет, то настройку задержек для удовлетворительной точности автономного хода в течение ~15 минут, после чего делается новый NTP запрос.
  • Новый шрифт (только цифры), максимально использующий экран и видимый близорукими людьми с нескольких метров.
  • Некоторую дополнительную индикацию в нижней строке (есть ли связь с сетью и т.д.)

Прототип

После создания софта и нормальной работы устройства на стенде, я перешёл к созданию более портативного блока питания для собственно прототипа. Для получения 5 Вольт я использовал зарядку от мобильного телефона с испорченным мини-USB разъёмом. LED матрицы запитаны напрямую от 5 Вольт, а для работы ESP модуля использован настраиваемый DC-DC конвертер в 3.3 Вольта.
3Вместе сборки соединил жёсткой проволокой, просто припаянной к макетной плате. Была идея напечатать какой-то каркас на 3D принтере, но руки не дошли. Окончательный вид:

5Всё вместе просто замечательно влезает в бережно хранимую несколько лет коробку от конфет:

6

Результат

Конечно, это было краткое изложение истории. В реальности пришлось пару раз переделать девайс, немного пободаться с Wi-Fi и списать один DC-DC конвертер, из которого вышел весь магический синий дым, на котором он работал.

Но получилось очень симпатично:

7

P.S.

В принципе у идеи есть большой потенциал, ведь практически ничего не стоит добавить индикатор для, например, новой почты, погоды бегущей строкой, состояния вверенных серверов, да что угодно. Может, удастся напрячь ребёнка для развития системы 🙂

Второй этаж

Продолжение истории с устройством для тестирования атаки Deauthentication на Wi-Fi сеть.

Поигравшись с прототипом от предыдущего проекта, понял, что эффективность работы всё таки не достаточна. Последней каплей стал смартфон моего сына, который настолько быстро переподключался, что вообще было не понятно – “в чём прикол”.
Но, сдаваться мы не привыкли 🙂
Поразмыслив, придумал новый вариант улучшения системы. С помощью второго ESP8266 модуля.
Идея такова – разделить систему на две части. Один модуль непрерывно сканирует и ищет абонентские устройства и точки доступа. Он передаёт результаты на второй модуль по последовательному порту. Второй модуль максимально быстро рассылает Deauthenticate, постоянно обновляя список.

Железо

_DSC0120На более длинные планки установлено сразу два ESP модуля. Они подключены к одному преобразователю напряжения. В общем, всё также как и в предыдущем устройстве. Дополнительно Tx последовательного порта одного модуля подключен к Rx другого. (Земля и так общая.) Таким образом, порт работает в симплексном режиме. Какой модуль первый, какой второй – неважно. Программа на них одна (см. ниже).

Из минусов – уменьшилось время жизни батареи. Я точно не измерял, но по ощущениям держит где-то порядка одного часа. Пришлось перейти на лабораторный блок питания для отладки.

Софт

_DSC0121Делать две программы естественно лень. Так что программа одна. После включения модули в течении ~3 секунд передают последовательность 0xFF. Но получает её только один из них (будущий Джамер), поскольку обратно просто нет провода. Так модули понимают, кто из них будет сканером, а кто Джамером. В качестве бонуса остаётся незанятый канал передачи на Джамере, его можно использовать для вывода отладочной информации.

“Сканер” ищет точки доступа и клиентов на каждом канале. Найдя нового клиента на данном канале, отправляет основную информацию на Джамер. Номер канала, MAC’и и порядковый номер последнего пакета. Если около 200 миллисекунд новых пакетов нет, Сканер переходит на следующий канал. При этом сбрасывается счётчик клиентов, чтобы все найденные клиенты были вновь отправлены на Джамер.

Протокол между модулями максимально простой, просто передача 15 байт на одного клиента. Начальная синхронизация основана на том, что первый байт пакета – номер канала, должен быть от 1 до 14, а никак не 0xFF, который 3 секунды посылает Сканер. В принципе, это же может сработать и в дальнейшем, если в канале будут ошибки (что маловероятно, учитывая схему).

Джамер проверяет порт, если есть что-то новенькое – добавляет/обновляет список. Потом отключает всех, кто уже зарегистрирован на этом канале. И идёт на следующий канал.

В результате скорость подавления возросла многократно. Устройство стабильно отключает два смартфона, лэптоп и принтер в двух смежных комнатах от Wi-Fi.

Моддинг

_DSC0123С самого начала меня смущали загнутые проводки антенн модулей. А теперь их стало две, в неприятной близости друг от друга. Также система уже стала механически не очень устойчивой.

Так появился мод – “No-Wi-Fi-Coctail-Party-Edition”. Откуда взялись трубочки я думаю Вы догадались. Антенны теперь расположены на одной оси, что, как я надеюсь, должно уменьшить взаимное влияние (“поле диполя” и далее по тексту :-))

А к батарейке приделан небольшой магнит, он удерживает сборку на любой вертикальной металлической поверхности.

Исходный код на GitHub.

Выходные на Тёмной Стороне

Давным давно я заказал несколько модулей ESP8266 (модификация ESP-201) для создания системы “умный дом”, которую так до сих пор и не закончил. Незадолго до этого я работал над проектом в области безопасности Wi-Fi сетей, и довольно близко познакомился с имеющимся в широко известном дистрибутиве Kali арсеналом утилит для работы с Wi-Fi. Так что, когда модули наконец попали ко мне в руки, я сразу подумал, а нельзя ли их использовать для тестирования атак на Wi-Fi сети. Однако, просмотрев функции, присутствующие в распространяемом на тот момент SDK, я не нашёл ничего подходящего и забросил идею.
Некоторое время назад на Hackaday опубликовали интересную статью, где демонстрировался способ отправки произвольного пакета в сеть. Таким образом, появилась возможность на выходных покопаться и реализовать старый план.

Железо

Внутреннее устройство
Устройство состоит из собственно ESP модуля, миниатюрного конвертера постоянного напряжения, двух планок с отверстиями для пинов, батареи на 9 Вольт и соответствующего разъёма, четырёх резисторов на 4.7 кОм.
Прошивка модуля
Разъём для батареи на 9 Вольт можно достать из аналогичной старой батарейки. Соединения между разъёмом и платой конвертера и между конвертером и планками я сделал из толстой железной проволоки. Они удерживают всю сборку вместе. Сопротивления присоединены так, как требуется для запуска и работы модуля ESP. Выводы CHIP, RST подтянуты к плюсу, вывод 15 к минусу. Вывод 0 подсоединён к трёхпиновому разъёму, закреплённому на боку сборки. Если надеть джампер на этот разъём, вывод 0 подтянется к земле. В такой конфигурации модуль ESP можно прошить, используя последовательный порт и кабель, совместимый с TTL уровнями.
Модуль работает
Если джампер не стоит, после подачи питания модуль запускается и начинает выполнять программу из памяти. Программа выводит диагностические сообщения на последовательный порт, независимо от того, подключен кабель или нет. В качестве бонуса при выводе на последовательный порт мигает маленький светодиод на поверхности ESP модуля. Таким образом можно судить о том, что программа пока работает 🙂

Софт

Я использовал Arduino IDE (1.6.7). Эта среда разработки может работать со всеми платами которые у меня сейчас есть, также она работает как на Linux, так и под Windows. Можно начать проект на Windows и, если нужно, перейти на Linux или наоборот. Конечно, в ней отсутствует много того, к чему я привык в более богатых системах типа Visual Studio, но для маленьких проектов это не так существенно.
Я начал с кода из оригинальной статьи. Сначала адаптировал проект к Arduino, а потом начал вносить изменения и поменял практически всё. Сильно помог исходный код другой известной программы – MDK3. В результате в коде осталась пара мест, которые я не до конца понимаю и подобрал работающий вариант путём тестирования. Наверно, можно покопаться в стандартах и разобраться, но на это не хватило времени.
Ниже приведён снимок экрана системы которую я использовал для мониторинга работы прототипа. Видно как примерно через 10 секунд после подсоединения батареи пропадает пинг на телефон подключенный по Wi-Fi. В дампе Wireshark видны пакеты Deauthentication.
Мониторинг
Программа устроена довольно просто. Она принимает и распознаёт пакеты Beacon и пакеты с данными на заданном радио канале. На основании этих данных она обновляет списки обнаруженных точек доступа и клиентов. После того как в течении примерно 200 миллисекунд не обнаружено новых станций, система посылает команды на отключение для всех обнаруженных клиентов от имени соответствующих точек доступа. После этого система переходит на следующий канал.
Различные устройства по разному реагируют на такую атаку. Один из моих телефонов отключился от Wi-Fi на совсем, а второй временно отключался, но успевал переподключиться пока система проверяла остальные каналы. Для более стабильного результата можно предпринять следующее:

  • После какого-то начального периода перестать искать новые станции и просто быстро отсоединять уже известные по кругу.
  • Поиграть с константами, возможно у меня не оптимальная комбинация.
  • Купить 14 ESP модулей по одному на каждый канал 😉

Есть одна тонкость при работе с SDK от Espressif. В последних версиях они ограничили функцию передачи самодельных пакетов. НО, в более старой версии SDK 1.3.0 есть версия этой функция до введения ограничений. Нужно только дополнить файл заголовков “user_interface.h”:
typedef void (*freedom_outside_cb_t)(uint8 status);
int wifi_register_send_pkt_freedom_cb(freedom_outside_cb_t cb);
void wifi_unregister_send_pkt_freedom_cb(void);
int wifi_send_pkt_freedom(uint8 *buf, int len, bool sys_seq);

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

Исходный код под катом. Проект на GitHub.

Continue reading “Выходные на Тёмной Стороне”