Квадрокоптер доктора Франкенштейна

Как утверждает китайская мудрость — если долго сидеть на берегу реки, в конце концов мимо проплывет труп врага недалеко от тебя свалится дрон. Если очень повезет, то это будет DJI дрон.
Вот и недалеко от меня упало такое счастье по имени DJI Air 2S. При падении оно повредило корпус и подвес камеры. В клюве держало пакетики с запчастями. Но среди них не было ни батареи, ни пульта управления, ни зарядника.
(Это типа шутка юмора — купил я его на самом деле, причем за смешные деньги.)

Первая мысль была — ну, корпус я заклею. Вторая — а зачем, наверняка они продаются готовые, кусок пластика дорого стоить не будет.


Но как я заблуждался — самая элементарная пластмассина на али стоила 60-80 долларов. Они там что, рыбный суп что ли кушали? Напечатать такую конструкцию тоже не вариант — во-первых, кто ее нарисует? И прочность будет не та.


Владельцы таких штук утверждают, что оригинальный пластик трескается безо всяких причин — так что прочность оригинала тоже вопрос. Возвращаемся к первоначальной мысли — будем клеить. Клей с ультрафиолетовым отверждением очень удобен — зажал, посветил и готово. Как у стоматолога. Только небольшая разница — у него держится, а тут сразу отвалилось. Даже никаких следов клея не осталось. По слухам, моментальный клей тоже этот пластик не берет. Значит, старая добрая эпоксидка. Может, и не приклеит, но что-то наподобие панциря сделает. Если еще и дырок рядом насверлить.

Корпус дрона DJI Air 2S сделан из специального поликарбоната, который обладает высокой прочностью, но при этом плохо поддается склеиванию. Это связано с его химической структурой — поверхность поликарбоната не имеет пор, что затрудняет адгезию большинства клеев. Эпоксидная смола, хотя и не идеальна, может создать механическую связь, особенно если поверхность предварительно зашкурить и обезжирить.
Худо-бедно — изделия доктора Франкенштейна готово. Хотя доктору было проще — у него было несколько заготовок, а тут единственный трупик.

По хорошему, чтобы проверить работоспособность, нужны аккумуляторы, зарядка к ним и пульт управления. Но горизонт чист, и никаких новых падений ништяков с неба не предвидится. А покупать — жаба давит. Если бы была малейшая уверенность, что эта штука работает — с жабой можно было бы подискутировать. А так нужно признать ее правоту и идти другим путем, как завещал великий Ленин.

Ну еще маленький нюанс — запустить мне эту штуку даже в полной исправности не судьба. Я и на ногах едва держусь, и со зрением напряженка, причем дело не в очках, а в мозгах, которые информацию от глаз перерабатывать должны. Но не могут.
Подключаем квадрик к внешнему источнику питания и кидаем USB кабель к компьютеру. При включении питания подопытный много пищал, крутил камерой и мигал светодиодиками. В конце-концов на компьютере появился новый внешний диск. Так-так, где-то я подобную структуру видел. Неужели это телефон?

Пишут, что дрон создает WiFi сеть к которой можно подключится — но это какая-то включаемая и выключаемая опция. Я никаких сетей не увидел. Так же есть возможность подключить его по USB к программе DJI Assistant — аналогично, в моем случае DJI Assistant никаких дронов поблизости не обнаружил.
Пытаемся подключиться по другому, по-телефонному:
adb devices
list of devices attached
— и дальше Малевич.
Судя по интернету, дрон может находится в разных режимах, и в режиме диска для adb он не представляет никакой ценности.
Роем дальше. Смотрим список USB устройств:
lsusb
Вот он, разлюбезный:
Bus 001 Device 062: ID 2ca3:001f DJI Technology Co., Ltd. e1e
Пытаемся выяснить подробности:
lsusb -v -d 2ca3:001f
Вываливается длинный лист малопонятной информации.
Ищем там bInterfaceClass и находим:
bInterfaceClass 10 CDC Data
Это уже лучше, значит, он у нас изображает еще и виртуальный последовательный порт, может до Линукса достучаться можно будет.
Запускаем терминалку, у меня это CuteCom. Действительно, в списке портов есть новый — /dev/ttyACM0

Подключаемся к нему и видим кучу мусора, мало похожего на текстовое сообщение. Переключаемся в двоичный режим — уже лучше. Видно, что постоянно встречается повторяющаяся последовательность 00 00 71 80 — предположим, что это заголовок пакета.

Все бы хорошо, но при повторном включении этой последовательности уже нет от слова совсем. Но есть уже другая. Опять идем другим путем. Видим, что пакеты идут не постоянно, а выбрасываются с некоторой задержкой. Пробуем это использовать — пишем программу, принимающую информацию с последовательного порта с обнаружением паузы.
import serial
# Настройки последовательного порта
port = '/dev/ttyACM0'
baudrate = 115200
timeout = 0.1
# Функция для записи данных в файлы
def write_data(packet_number, data):
with open('data.bin', 'ab') as bin_file:
bin_file.write(data)
with open('data.txt', 'a') as txt_file:
#txt_file.write(f"{packet_number}: {binascii.hexlify(data).decode('utf-8')}\n")
txt_file.write(f"{packet_number}: {' '.join(f'{b:02x}' for b in buffer)}\n")
# Инициализация последовательного порта
ser = serial.Serial(port, baudrate, timeout=timeout)
buffer = bytearray()
packet_number = 0
byte_cnt = 0
while ser.read(1) == b'':
pass
while True:
packet_number += 1
buffer = bytearray() # clear buffer
# packet start
while (data := ser.read(1)) == b'':
pass
byte_cnt = 1
buffer.extend(data)
#packet
while (data := ser.read(1)) != b'':
buffer.extend(data)
byte_cnt += 1
print("Packet "+ str(packet_number)+": bytes="+str(byte_cnt))
print(' '.join(f'{b:02x}' for b in buffer))
write_data(packet_number, buffer)
Программа выдает кучу пакетов, но что с ними делать?
2: 55 11 04 92 04 8a 23 16 00 00 f1 20 02 00 00 15 2a
3: 55 53 04 98 03 0a d6 17 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 d6 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 b1 99
4: 55 11 04 92 04 8a c8 19 00 00 f1 20 02 00 00 e7 e7
5: 55 53 04 98 03 0a 7d 1b 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 09 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 46 37
6: 55 11 04 92 04 8a 69 1d 00 00 f1 20 02 00 00 2a 8f
7: 55 53 04 98 03 0a 1e 1f 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 3b 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 9f 4d
8: 55 11 04 92 04 8a 0b 21 00 00 f1 20 02 00 00 60 d3
9: 55 53 04 98 03 0a c0 22 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 6d 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 cc ec
10: 55 11 04 92 04 8a ae 24 00 00 f1 20 02 00 00 f7 05
11: 55 53 04 98 03 0a 61 26 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 9f 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 71 2e
12: 55 11 04 92 04 8a 50 28 00 00 f1 20 02 00 00 59 cf
13: 55 53 04 98 03 0a 05 2a 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 d1 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 2f 0a
14: 55 11 04 92 04 8a f1 2b 00 00 f1 20 02 00 00 9a 3b
15: 55 53 04 98 03 0a a4 2d 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 04 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 dc 16
16: 55 11 04 92 04 8a 92 2f 00 00 f1 20 02 00 00 19 ea
17: 55 53 04 98 03 0a 45 31 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 36 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 4e ff
18: 55 11 04 92 04 8a 33 33 00 00 f1 20 02 00 00 10 f4
19: 55 53 04 98 03 0a e5 34 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 68 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 92 f3
20: 55 11 04 92 04 8a d2 36 00 00 f1 20 02 00 00 01 fb
21: 55 53 04 98 03 0a 87 38 00 03 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 00 fc ff a4 02 01 00 00 70 80 00 00 00 00 00 9a 01 00 00 00 0f 8a 20 42 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 07 1a 84
Тем, кто искал тут ответы (в том числе на на главный вопрос о жизни, вселенной и всего такого) — не свезло, у меня самого пока больше вопросов. Птица обломинго где-то рядом пролетела :)
Пульт купить вроде как и можно, хотя и не совсем дешево. А вот на батарейки цены конские. А мне по сути дела аккумулятор и не нужен — нужен корпус от него и плата BMS. А там можно было бы и поиграться, хотя батарея при любой неисправности и просто провалявшись без дела с год блокируется и превращается в тыкву, но с такой тыквы можно какой-никакой I2C трафик поиметь, с помощью которого она с квадриком общается. А там можно было бы попробовать какою-нибудь ардуину прикрутить трафик моделировать. Типа подключаешь любую батарейку, а ардуино говорит — я свой, буржуинский.
Может у кого в Питере такая аккумуляторная тыква валяется? Моя признательность не имела бы границ. И глядишь — продолжение бы у рассказа появилось бы.
+42 |
1207
33
|
+22 |
4921
109
|
www.printables.com/model/325768-dji-air-2s-drone
П.С. Хоть и в Питере, не понял, что надо. Напишите в личку, будем думать…
П.П.С. Ну или здесь, Будем думать вместе…
Боритесь с жабой, побеждайте ее, пока она Вас душит никакие покупки и следовательно обзоры невозможны.
Красивая " сказка", ничего не понял- но мне очень интересно ))) А как же он касатик без аккумулятора летел, прежде чем приземлиться? Или он перед падением батарею на парашуте катапультировал? сорри
П.С. Как я его понимаю…
И уже приклеено — не отдирать же.
А жужжит он и от блока питания неплохо :) — вентилятор гудит так, что и без пропеллеров, наверно, взлетит.
Второй байт посылки — длина в байтах. 0x11 для короткого пакета, 0x53 — длинный. В сумме 0x64 — как раз периодичность данных, судя пол логу терминалки.
По коротким пакетам видно двухбайтный счетчик, увеличивающийся на одно и то же (плюс-минус) число — время? Счетчик сквозной, в длинных пакетах он тоже есть.
Последние два байта, очевидно, контрольная сумма. Только CRC16 что-то не подходят, с распространенными полиномами. Что-то не совсем стандартное.
Другие байты в коротком пакете не меняются, может быть что угодно.
В длинном пакете есть «дребезжащие» значения.
0xFFFB/0xFFFC
0x02B3/0x02B4
70/71
Вот ещё интересный: 0xFFFF — 0x0000 — 0x0001 — похоже на знаковое число, от -1 до +1 меняется.
Можно предположить, что это какие-то параметры состояния. Где-то, возможно, напряжение питания, где-то датчики с акселерометров/гироскопов. Можно посмотреть.
Только что это даёт? Полагаю, ничего. У меня тоже ответов нет :)
Ну либо он должен быть перед циклом, для синхронизации первого пакета.
В тексте поправил.