Мир глазами WiFi роутера
Рассказ о попытках увидеть окружающий мир в совершенно ином свете и как это в итоге привело к созданию устройства, позволяющего «видеть» WiFi. В процессе будет использован популярный модуль ESP8266. Без Arduino, к сожалению, тоже не обойдется.
N-лет назад, группой молодых исследователей из Германии был описан концепт тепловизора, базирующийся всего-навсего на одном датчике. Суть работы устройства сводилась к следующему: с помощью конструкции из двух сервоприводов ИК-датчик последовательно наводился по вертикали и горизонтали на нужную область, постепенно сканируя изображение. Такое интересное решение позволяло резко сократить цену устройства, и получать занятные картинки распределения температуры, вроде этих:
Система механической развертки изображения —, а именно этим конструкция из сервоприводов и является, оказалась крайне интересной вещью. Сразу же после постройки подобного устройства возникает вопрос —, а почему бы не заменить ИК-датчик чем либо еще, что позволит используя тот же принцип, визуализировать например радиоволны?
Глаз человека, хоть и довольно сложный, но весьма ограниченный инструмент. Диапазон видимого нами света представляет собой ну очень маленькую часть спектра электромагнитного излучения.
Оцените масштаб трагедии — большая часть информации об окружающем мире, просто-напросто скрыта от нас. Разумеется, было бы очень здорово расширить природные рамки и обрести способность видеть за пределами, очерченными природой. Потому и и были осуществлены нижеприведенные эксперименты с использованием системы механической развертки.
Для отработки технологии я сделал простую «однопиксельную» камеру, которая работает в уже привычном нам видимом диапазоне. В качестве датчика использовал солнечную батарею от китайской игрушечной машинки:
Конечно, площадь такого фотоэлемента очень большая, а значит надо как-то обеспечить узкое поле зрения, потому добавим к ней линзу от фонарика. Поставим на сервоприводы и подключим к Arduino.
Солнечная батарея поворачивается к необходимому участку будущего изображения, после чего контроллер считывает сигнал, который пропорционален количеству света, падающего на батарею. Конечно такая камера в итоге выдаст черно-белое изображение.
Чтобы обрабатывать результаты сканирования, с помощью QT была реализована программка с простеньким интерфейсом. (Уроки по тому, как реализовать общение Arduino и Qt можно легко раздобыть на youtube). Программа состоит из пары кнопок для ручного управления сервоприводами и поля QGraphicsScene, где рисуются квадратики-пиксели, цвет которых зависит от величины сигнала в конкретной точке. Использование простое — сначала вручную приводы наводятся в левую верхнюю точку будущего изображения, после чего производится автоматическое сканирование области, во время которого строится картинка. Вот что из всего этого получилось в итоге:
Что-же изображено на данной визуализации? Конечно, это самый очевидный объект для съемки в случае, если ваша камера представляет собой солнечную батарею — это солнце.
Тем не менее, сигнал с батареи слишком слабенький, чтобы получать адекватные картинки при комнатном освещении, потому она была заменена на фоторезистор, а линза от фонарика уступила место половинке сломанного театрального бинокля.
Это творение оказалось более удачным, и уже появилась возможность делать более-менее узнаваемые фотографии:
Люстра
Машина на дороге
Вид из окна
И даже облака на небе
Удовлетворившись таким результатом, я решил, что пора наконец сделать полноценный радиовизор, заменив фоторезистор на направленную антенну. Самый подходящий диапазон для этого — это СВЧ, так как направленная антенна не занимает много места, да и в нашей жизни сегодня есть много устройств, заботливо излучающих в этом диапазоне.
Сначала задумал использовать рупорную антенну, которая есть в автомобильных радар-детекторах (они как правило работают в диапазоне 10,525 Ггц или 24,15 Ггц). Попытки вычленить из схемы такого детектора аналоговый сигнал, пропорциональный величине регистрируемого излучения не увенчались успехом, возможно из-за недостатка моих познаний, а возможно потому что такового там нет вовсе, так как он работает по принципу сравнения. (привет китайским братьям, собравшим это чудо). Хотелось конечно вытащить саму антенну и соорудить что-то свое, но ломать хороший прибор ради этого я не стал.
Второе, что пришло мне в голову — соорудить детектор поля по одной из схем, которые в изобилии водятся на радиолюбительских порталах и прицепить к нему самодельную направленную антенну, например очень популярный и довольно простой в изготовлении биквадрат Харченко. Но как оказалось, самый главный элемент — детекторный СВЧ-диод очень трудно найти, легко потерять и вообще он стоит дороговато, потому пришлось долго и упорно искать нужную детальку.
Через какое-то время, мне удалось раздобыть германиевый детекторный диод еще советских времен и собрать следующую схему:
Полученное устройство уверенно работало, но на очень маленьком расстоянии, где-то 5–10 см от мобильного телефона, выступающего в роли источника излучения. Этого разумеется было недостаточно для поставленной задачи.
После всех этих мытарств, в итоге ко мне попал модуль ESP8266, который умеет отображать RSSI (Показатель уровня принимаемого WiFi сигнала) найденных точек доступа. Для этого используется команда AT+CWLAP в стандартной прошивке модуля. Я решил применить эту функцию вкупе с самодельной направленной WiFi антенной-биквадратом, упомянутой ранее. Таким образом и появилось сие чудо техники:
Сам ESP8266 закреплен на обратной стороне антенны и хорошенько экранирован медными листами. Светящиеся циферки показывают напряжение на выходе импульсного DC-DC преобразователя, который понижает 12В от блока питания до 3.3В, необходимых для работы модуля (он очень прожорливый, поэтому запитывать его от Arduino чревато нестабильной работой).
Arduino как и раньше управляет сервоприводами и кроме того посылает AT команды ESP8266 с применением библиотеки SoftwareSerial. Один из сложных моментов — вместо стандартных библиотек SoftwareSerial и Servo пришлось перейти на их аналоги, так как оригинальные конфликтуют при одновременном использовании.
Конечно, можно услышать упреки, что Arduino здесь вовсе является лишним элементом, так как ESP8266 и сам может справиться с таким функционалом. Но так уж исторически сложилось, что по ходу создания устройства я изначально ориентировался на Arduino как центральное звено итогового устройства, а ESP8266 играет роль своеобразного датчика.
Программа на QT, написанная еще для «солнечной камеры» подверглась значительной доработке.
По ходу сканирования области для каждой найденной точки доступа создается свой массив значений сигнала, что позволяет при завершении сканирования посмотреть как «светят» разные WiFi роутеры, и даже попробовать прикинуть их примерное месторасположение. Чем сильнее сигнал в конкретной точке, тем более яркий синий цвет будет у соответствующего пикселя.
Ну и наконец, поставив устройство в разные части своего жилища, я получил следующие изображения. К счастью в моем доме довольно много сетей wifi, а с подобной направленной антенной можно поймать даже весьма удаленные.
Диван и часть ковра. Если обратите внимание, очень качественное изображение по сравнению с остальными получается у точки «SkyNet» — это мой домашний роутер. Он находится ближе всех к месту съемок, что видимо играет не последнюю роль в процессе.
Снова люстра. Сигналы некоторых сетей не отражаются от потолка, либо от люстры. Скорей всего по этим признакам можно попытаться определить физическое расположение передатчика.
Ванна, наполненная водой. Как всем известно, радиоволны под водой передаются плохо.
Стоит отметить, что фото в видимом диапазоне лишь примерно соответствуют отсканированной области. Также необходимо учесть, что при работе антенна как-бы описывает полусферу, а это тоже влияет на результат. Разрешение в принципе ограничено только ходом антенны и временем, которое нужно чтобы обвести всю область. При этом получение данных для каждого пикселя требует 4–5 сек. Хотелось бы получить менее размытые изображения, но для этого нужна антенна с более узкой диаграммой направленности.
Исходные коды, включая скетч для Arduino