Учебный проект: записываем анимацию на карточки метро

Этот проект мы сделали совместно с моим сыном Николаем. Я помог на начальной стадии со сборкой устройства, программированием на Python занимался Николай.

Железо

Проект сделан на Raspberry Pi B+, NFC датчике от ELECHOUSE на базе чипа PN532, LED матрице 8*8 на базе MAX7219.

RaspberryPiBplus
PN532-7 matrix

Матрица подключена по интерфейсу SPI, для работы использовались библиотеки из этого проекта. NFC датчик также был подключен по SPI, только уже эмулированному на цифровых пинах. Для работы с ним использовались библиотеки от аналогичного модуля от Adafruit.

MiFare Ultralight

Как известно, Московский метрополитен использует бесконтактные карточки Mifare для прохода на станции. Разумеется, тема чтения/записи таких билетов широко известна в узких кругах. Мы тоже начали со считывания и вывода в консоль количества оставшихся поездок. Но поскольку метро мы часто не пользуемся, дублировать метрошный девайс для отображения аналогичной информации было как-то не интересно.
Изучив теорию в популярной форме, мы заинтересовались возможностью записи на карточки и использования их просто как носителей информации. Вообще на карточках Ultralight есть 12 блоков по 4 байта, доступных для записи. На наших билетах нам удалось перезаписывать нижние 8 блоков по 4 байта, т.е. всего 32 байта.

Софт

В качестве полезного упражнения я подал идею записывать на карточки простенький мультфильм для LED матрицы. Таким образом поднося разные карточки к считывателю, можно проигрывать разные анимации. Первоначальная идея была записывать 4 полных кадра. Николай усовершенствовал систему заменив последний кадр на управляющую последовательность, описывающую, как показывать оставшиеся три кадра (повторения, паузы и т.д.).

1Программа на Python’e разрабатывалась под Windows, с использованием IDE JetBrains PyCharm.  На Raspberry была установлен стандартный Raspbian (Jessy), из специальных настроек – был разрешён SPI. Доступ к Raspberry был только по SSH (SuperPutty), SFTP (Filezilla). Так что заодно оттачивалось мастерство работы в shell 🙂

Выводы

Использованные метрополитеновские карточки это интересный ресурс, особенно для недорогих проектов в кружках, лагерях и т.д.

С течение времени у нас появлялись и другие идеи использования карточек в играх, например:

  • В играх типа монополии можно сделать “настоящие” кредитки.
  • В играх с карточками, где у героев есть разные способности, можно автоматически рассчитывать результат сражения.
  • Чипы из карточек можно прикреплять к внешне одинаковым предметам для идентификации.
  • Уникальные неперезаписываемые идентификаторы карточек можно использовать для доступа в помещения, открытия ящиков с вещами и т.п.

Возможно что-то из этого мы и сами сделаем, на то они и каникулы 🙂

Второй этаж

Продолжение истории с устройством для тестирования атаки 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 “Выходные на Тёмной Стороне”

Робот из пылесоса

Проект придумывался для совместной работы с моими детьми: Николаем (12 лет) и Алексеем (8 лет). В попытке заинтересовать детей чем-то развивающим, купил для экспериментов платы Стрела (Arduino Leonardo) и RaspberryPi B+.

После некоторых мучений Стрелу удалось подружить с детской средой разработки Scratch. (Мучения заключались в модификации протокола связи в Scratch 1.4 (сделан на Squeak Smalltalk). На стороне Arduino просто С, так что всё намного проще.)

Мы сделали пару интересных проектов, например, радар из сервопривода и ультразвукового датчика расстояния. С младшим мы написали программу на Скретче для вращения сенсора в секторе 180 градусов, со старшим получали по сети на его компьютере данные о расстоянии до препятствия и текущий угол. Затем рисовали на круговой диаграмме. Делали на PascalABC.NET, они его в школе используют.

Scratch

Но, конечно, всё это стало не интересно когда дети увидели в Интернете многочисленных подвижных роботов на базе Arduino.

Пока я придумывал как-бы к этому подступиться без особых капитальных затрат, у нас сгорел пылесос 🙂 Ну, я его разобрал, там внутри какая-то ерунда (с). Накрылся двигатель, из которого он вообщем-то и состоит. После демонтажа двигателя остался отличный, переживший годы жестокой эксплуатации корпус, с двумя колёсами сзади и одним поворотным роликом впереди. Так мы получили платформу для нашего прототипа. И вот что вышло:

Robot

Управление

Я использовал обе платы. Стрела отвечает за базовые функции “реального времени”. Синхронное управление двигателями, реакция на датчики.

Raspberry отвечает за функции “высокого уровня”. Подключение по Wi-Fi в домашнюю сеть, сервер “Remote Sensors Protocol” для интеграции со Scratch по TCP/IP, небольшой WWW сервер для альтернативного канала управления, видео сервер. Между собой платы общаются по последовательному порту USB, с помощью простенького самодельного текстового протокола. Для Raspberry всё написано на Python’е, ну кроме видео сервера, он готовый.

Платформа

Все печатные платы прикручены к общей панели. Под ней расположена свинцовая аккумуляторная батарея на 12В от ИБП, и два серво мотора постоянного вращения.

_DSC0004 (Small)

Моторы закреплены с помощью изогнутых деталей от детского конструктора (вот где пригодился бы 3D принтер!). Вращение на колёса передаётся через пластиковые “звёздочки”, которые шли в комплекте с мотором. Для них в колёсах пылесоса были сделаны пропилы. Серво двигатели были выбраны из-за большого крутящего момента, тогда как большая скорость не нужна, диаметра колёс достаточно большой.

_DSC0005 (Small)

Питание

Напряжение от 12В батареи подаётся параллельно на три устройства. На плату Стрела, которая имеет собственный стабилизатор напряжения. На DC-DC конвертер для преобразования в 5В для питания Raspberry. И на DC-DC конвертер в 7В для подачи на двигатели. В принципе, двигатели и Raspberry можно было запитать от одного конвертера, но я опасался просадки напряжения при старте или из-за блокировки двигателей и, как следствие, перезагрузки Raspberry. Получилась схема, устойчивая к падению напряжения на батарее до 7В.

Кнопка включения питания взята от самого пылесоса. Замечательная вещь, проработала много лет, коммутируя килловатную нагрузку, и хоть бы что.

_DSC0003 (Small)

Дополнительные сенсоры

Стрела имеет множество цифровых и аналоговых вводов/выводов, а также четыре кнопки и четыре светодиода на борту. Так что потенциал для развития большой. Пока я только подключил ультразвуковой датчик к аналоговому входу. Он позволяет роботу останавливаться перед препятствием, не врезаясь в него.

_DSC0002 (Small)

RaspberryPi B+ имеет четыре порта USB. Кроме Стрелы и Wi-Fi адаптера, я подключил веб камеру и мышку.

Камеру использует стандартный пакет motion, благодаря нему изображение с камеры можно посмотреть в обыкновенном броузере с любого компьютера в квартире. К сожалению, присутствует приличная задержка и Raspberry этот сервис грузит примерно на 25%. Но всё равно дистанционно управлять роботом получая с него картинку реально круто 🙂

Мышка стала попыткой создать датчик движения. Оказалось что в Python’е достаточно просто считывать координаты с USB мышки, вращение колёсика и нажатия кнопок. План был составлять карту передвижений робота и рисовать её на удалённом компьютере.

_DSC0006 (Small)

К сожалению, не могу сказать, что ни одна мышь не пострадала в этом опыте. Но надпись Microsoft на мышке существенно облегчила мои моральные страдания при сверлении дырки и отламывании кнопок 🙂

В принципе идея работает, но обнаружились две проблемы:

  • для корректной работы сенсора мыши нужно, чтобы он был близко к поверхности. Перефокусировать сенсор на большее расстояние не вышло. Под рукой у меня нашлась всего пара линз, и они не подошли. В качестве временного решения я собрал узел для подвижного крепления мыши. Он позволяет мыши скользить по полу и подниматься вверх. Так что робот может наезжать на небольшие препятствия типа ковра или порожка.
  • для полного определения положения робота на плоскости нужно знать две точки (=мышки). С помощью одной, даже расположенной впереди, не получается точно построить траекторию. При повороте колёса пробуксовывают, и нельзя точно определить точку вокруг которой поворачивает корпус даже на ровном месте. Ну и геометрия тут уже получается сложновата для 6-го класса.