А вы догадывались, что птицы не настоящие? В действительности это мобильные устройства, оснащённые камерами и микрофонами для ведения правительственной слежки. Вы можете задаться вопросом, почему бы властям просто не использовать сотовые телефоны, которые носит с собой каждый. Даже не знаю. Не я создаю правила.
Теперь, когда я окончательно разрушил свою репутацию на LinkedIn, пора написать реальную статью.
Когда я посещал GrrCon, B-Sides Orlando и Defcon, то брал с собой друга — напечатанную на 3D-принтере птицу с функцией наблюдения. В этом руководстве я расскажу, как можно создать «Not NSA»-версию такой птички (имеется в виду разработанную не Агентством Национальной Безопасности, АНБ).
Вот список необходимых деталей:
- ESP32.
- Миниатюрный сервопривод.
- Батарея (можете взять любую, но я указал ссылку на аналогичную той, которую использовал я).
- USB-кабель (Micro USB/USB A для подключения ESP32 к батарее).
- 2 магнита (по ссылке те, которые подходят конкретно под мою 3D-модель).
- Кабель Dupont (есть варианты получше, но я люблю эти за их простоту).
- Маркеры (полноцветная печать занимает слишком много времени).
Кроме того, понадобятся:
- паяльник,
- пистолет для горячего клея,
- термоусадочная плёнка.
Первым делом мне нужна была птица. На её поиски я отправился в интернет, где нашёл на sketchfab вот эту 3D-модель, спроектированную tomkranis.
Далее мне требовалась камера наблюдения. На Thingiverse я нашёл вот этот дизайн от vogon_poetry и чуть его доработал, чтобы можно было подключить миниатюрную сервосистему.
▍ Проектирование «Птички»
Теперь, когда у меня было всё необходимое, я открыл STL-файл камеры и добавил в её верхней части отверстие для вывода светодиода. Ещё одно отверстие я добавил внизу для подключения сервосистемы. Всё это можно напечатать в цвете. Я же просто раскрасил маркером надпись «Not NSA» и передний экран.
Голова-камера после доработки
Затем я открыл файл голубя и удалил его голову (уж простите), добавил место для сервосистемы и отверстие для прокладывания проводов, которые будут уходить в нижнюю часть брюха «птички». В итоге наш бедняга стал выглядеть так:
Тело голубя V1
Это была первая версия. Проблема в том, что лапки голубя очень хрупкие, и их сложно крепить к рюкзаку. В итоге я нашёл такое решение — сделал сбоку специальный диск, в который можно будет вставить магнит. Так, голубь сможет крепиться к большинству поверхностей, и его центр тяжести не будет находиться слишком высоко. Кроме того, добавив дополнительный магнитный круг под лапки, я исключил их возможную поломку (снова простите).
Итоговая модель тела голубя
Последним элементом для 3D-печати будет держатель магнита. Он разместится в вашем рюкзаке или любом другом предмете, на котором вы планируете базово крепить «птичку». Он не является строго обязательным, но голый металл магнита может царапать предметы, поэтому если для вас это важно, то лучше всё же держатель напечатать. В противном случае просто можете засунуть магниты в рюкзак.
▍ Написание кода
Следующим этапом идёт код, который тоже написать несложно. Нам нужна периодически мигающая лампочка и сервосистема, имитирующая случайные движения. Для этого мы снова используем Tinkercad. Сам код лежит здесь, и далее я поясню каждую его строчку.
Разберём эту простую программу.
Первым делом нам нужно получить библиотеку для сервомеханизма, которая позволит им управлять. Следующая строка определяет объект Servo под названием servo_9
. Я обозначил его девяткой, потому что он будет использовать контакт 9 ввода-вывода.
#include <Servo.h>
Servo servo_9;
Функция настройки запускается единожды при загрузке. Сначала мы устанавливаем pinMode
контакта 8. К нему будет подключён светодиод на макушке «головы». Поскольку мы только отправляем данные по этим контактам и ничего не получаем, то устанавливаем его на OUTPUT
. Далее мы закрепляем сервомеханизм и назначаем его на контакт 9. Значения 500 и 2500 — это минимальное/максимальное число импульсов сервомеханизма в миллисекундах, обозначающие, насколько он может повернуться. Наконец, мы устанавливаем задержку в 7 секунд, чтобы у нас было время разместить птичку удобным образом после её подключения к питанию.
void setup()
{
pinMode(8, OUTPUT);
servo_9.attach(9, 500, 2500);
delay(7000); // Ожидание 7000 миллисекунд (s)
}
Последняя функция — это цикл. Он будет непрерывно выполняться до тех пор, пока устройство получает питание. Мы устанавливаем контакт 8 на высокий уровень (High), тем самым включая светодиод, затем ожидаем 1 секунду и устанавливаем уже на низкий (Low), чтобы выключить. Далее мы поворачиваем сервомеханизм на 90°, ожидаем 5 секунд, поворачиваем его на 15°, ждём 2 секунды, на 45°, ждём ещё 4 секунды, затем на 0° и ещё 6 секунд ожидания. Это создаёт впечатление, что голова движется произвольным образом. Далее привод возвращается в исходное положение, в начале цикла включается светодиод, и всё повторяется.
void loop()
{
digitalWrite(8, HIGH);
delay(1000); // Ожидание 1000 миллисекунд
digitalWrite(8, LOW);
servo_9.write(90);
delay(5000); // Ожидание 5000 миллисекунд
servo_9.write(15);
delay(2000); // Ожидание 2000 миллисекунд
servo_9.write(45);
delay(4000); // Ожидание 4000 миллисекунд
servo_9.write(0);
delay(6000); // Ожидание 6000 миллисекунд
}
Как видите, это не особо навороченная программа, но она делает всё необходимое. Главное, не перемудрить с добавлением чего-то лишнего.
Вот весь скрипт целиком:
#include <Servo.h>
Servo servo_9;
void setup()
{
pinMode(8, OUTPUT);
servo_9.attach(9, 500, 2500);
delay(7000); // Ожидание 7000 миллисекунд
}
void loop()
{
digitalWrite(8, HIGH);
delay(1000); // Ожидание 1000 миллисекунд
digitalWrite(8, LOW);
servo_9.write(90);
delay(5000); // Ожидание 5000 миллисекунд
servo_9.write(15);
delay(2000); // Ожидание 2000 миллисекунд
servo_9.write(45);
delay(4000); // Ожидание 4000 миллисекунд
servo_9.write(0);
delay(6000); // Ожидание 6000 миллисекунд
}
▍ Подключение
Сначала нужно припаять 2 провода к светодиоду, после чего прикрепить его к верхней части камеры при помощи горячего клея. Получиться должно примерно так:
«Голова» с приклеенным светодиодом
Затем зачистите провода сервомеханизма и либо установите на их концах разъёмы Dupont, либо спаяйте и изолируйте с помощью термоусадочной плёнки, как сделал я.
Провода спаяны и изолированы термоусадкой
Вставьте сервомеханизм в тело птички и закрепите на нём камеру. Она должна сесть достаточно плотно. Клеить здесь ничего не нужно. Так с птичкой будет намного проще путешествовать. Пропустите провода через тело в его нижнюю часть.
«Голова» прикреплена
Теперь пора переходить к плате. Ниже показана схема её подключения. Я знаю, что это не лучшее решение, но оно работает и оставляет возможность для дальнейших корректировок. Я лишь добавил на провода немного горячего клея, чтобы они не болтались.
LED (+) — контакт 8
LED (-) — земля
Servo — земля
Servo — 5В
Servo — контакт 9
Схема с wokwi.com
Подключите батарею и наблюдайте, как «птичка» оживает (вскоре добавлю видео).
«Птичка» на моём рюкзаке
Надеюсь, вам понравился этот проект. Если у вас возникнут какие-то идеи по поводу доработок, можете смело присылать их на GiHub. Если же вы возьмётесь этот проект реализовывать, упомяните меня или оповестите.
Автор: Bright_Translate