Авторизация
Регистрация

Напомнить пароль

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

Как утверждает китайская мудрость — если долго сидеть на берегу реки, в конце концов мимо проплывет труп врага недалеко от тебя  свалится дрон. Если очень повезет, то это будет 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 трафик поиметь, с помощью которого она с квадриком общается. А там можно было бы попробовать какою-нибудь ардуину прикрутить трафик моделировать. Типа подключаешь любую батарейку, а ардуино говорит — я свой, буржуинский.

Может у кого в Питере такая аккумуляторная тыква валяется? Моя признательность не имела бы границ. И глядишь — продолжение бы у рассказа появилось бы.

 

 

Добавить в избранное
+35 +44
свернутьразвернуть
Комментарии (33)
RSS
+
avatar
0
Вроде как некоторая часть моделей корпуса в инете находится.
www.printables.com/model/325768-dji-air-2s-drone
+
avatar
+2
Это только внешний вид для красивости, реального прока от этой модели немного.
+
avatar
+2
Только это не модели корпуса, а твердотельная модель для моделирования по ней аксессуаров — просто скан внешки. Внутри монолит.
+
avatar
0
Дрон вёз купленные детальки, заодно попал в список. Очень удачная покупка.
П.С. Хоть и в Питере, не понял, что надо. Напишите в личку, будем думать…
П.П.С. Ну или здесь, Будем думать вместе…
+
avatar
+3
да дохлая батарейка нужна, попытаться взломать протокол. В успехе не уверен, но если не пробовать — точно не получится.
+
avatar
0
Какая именно? Может питатель типа ЛБП поможет? Напряжение выставим любое. Пока полз в туалет покурить, подумал, что бывает редко. Надо снять вентиляторы и запустить от любого питателя. Френк будет думать, что полетел и в этот момент снять прошивку…
+
avatar
+2
Не, там именно в интерфейсе i2c дело, его протокол симулировать надо. И у всех такого рода квадриков батарейка своя, пойдет только от DJI Air 2S и еще одного какого-то, тип не помню.
+
avatar
0
Ну тут я не копенгаген. На Али не пробовали искать? Именно батарею. Ежели что, наверное можно подключиться после батареи перед контроллером. Или контроллер в самой батарее?
+
avatar
+1
Цены тоже не понравились. Для игрушки — дороговато. Чуть ли не в 5 раз дороже, чем мне эта штука обошлась. Там 70-100 евро. БУ дрон такого типа со всеми запчастями и рабочий можно найти за 200-250 евро, ежели подождать или просто свезет.
+
avatar
+1
Так она же не просто кусок лития внутри. Там полноценный контроллер со своей прошивкой и всеми делами
+
avatar
+1
  • DVANru
  • 04 марта 2025, 21:42
П.С. Хоть и в Питере, не понял, что надо. Напишите в личку, будем думать…
Вон, в Улан-Удэ все есть!
+
avatar
+1
А покупать — жаба давит.


Боритесь с жабой, побеждайте ее, пока она Вас душит никакие покупки и следовательно обзоры невозможны.
+
avatar
-2
да дохлая батарейка нужна, попытаться взломать протокол

Красивая " сказка", ничего не понял- но мне очень интересно ))) А как же он касатик без аккумулятора летел, прежде чем приземлиться? Или он перед падением батарею на парашуте катапультировал? сорри
+
avatar
+7
Да шутка юмора же, купил я его просто дохлый.
+
avatar
+1
Сорри, не догнал, вот что коньяк животворящий делает )))
+
avatar
0
А вот этого не надо. Не буду повторяться, прочитайте опус ещё раз… Не мой, а автора.
+
avatar
0
Ещё раз перечитал, и, возможно понял. Квадрик привёз запчасти и улетел. У Батона осталась посылка, в которой нет аккумулятора для сборки Френки. Ну и ещё кое чего. Вот он и рассуждает, как собрать устройство и улететь на фиг с этой планеты.
П.С. Как я его понимаю…
+
avatar
0
  • DVANru
  • 04 марта 2025, 21:34
Ещё раз перечитал, и, возможно понял. Квадрик привёз запчасти и улетел. У Батона осталась посылка, в которой нет аккумулятора для сборки Френки. Ну и ещё кое чего. Вот он и рассуждает, как собрать устройство и улететь на фиг с этой планеты.
П.С. Как я его понимаю…
Я дико извиняюсь, Вы с камрадом Технобахом сейчас отдыхаете?!))))
+
avatar
0
Комрад Технобах в гордом одиночестве " общипанный но не побеждённый" )))
+
avatar
+2
Я тоже поверил, хоть и не пил
+
avatar
+2
никаких следов клея не осталось. По слухам, моментальный клей тоже этот пластик не берет. Значит, старая добрая эпоксидка
тоже вариант так себе. Вам нужен SciGrip (Weld-On) 55
+
avatar
0
И трихлорэтилен не берёт?
+
avatar
0
Под руками не оказалось, да я и словей-то таких не знаю :)
И уже приклеено — не отдирать же.

Под воздействием света и воздуха трихлорэтилен разлагается на фосген и галогенсодержащие кислоты.
+
avatar
0
  • sunpp
  • 04 марта 2025, 22:53
полиуретановый клей?
+
avatar
+3
Без пульта вам батарея не нужна (не слушать же жужжание). Легко можно найти модель rc-n1, их много и никому не нужны уже. Найдёте пульт — увидите что без аккума он включится, но из-за ошибки не взлетит (и не стоит летать, разве что дома). Зато на столе можно изучать и от провода. Протокол гуглить по ключевым dji protocol duml
+
avatar
+3
Спасибо, для меня ценная информация. Я думал, что без батарейки он и пульт игнорировать будет.
А жужжит он и от блока питания неплохо :) — вентилятор гудит так, что и без пропеллеров, наверно, взлетит.
+
avatar
0
  • DVANru
  • 04 марта 2025, 21:28
А так нужно признать ее правоту и идти другим путем, как завещал великий Ленин.
Ильич скопипастил отседова:
+
avatar
+6
  • ACE
  • 04 марта 2025, 21:35
У вас питоновский скрипт пропускает первый байт пакета. Там 0x55 должен быть.
Второй байт посылки — длина в байтах. 0x11 для короткого пакета, 0x53 — длинный. В сумме 0x64 — как раз периодичность данных, судя пол логу терминалки.
55 11 04 92 04 8a 09 b4 00 00 f1 20 02 00 00 61 4f
55 11 04 92 04 8a a9 b7 00 00 f1 20 02 00 00 5f f6
55 11 04 92 04 8a 4a bb 00 00 f1 20 02 00 00 b7 ce
55 11 04 92 04 8a e9 be 00 00 f1 20 02 00 00 3f bc
55 11 04 92 04 8a 8c c2 00 00 f1 20 02 00 00 66 6c
55 11 04 92 04 8a 2b c6 00 00 f1 20 02 00 00 b4 a0
55 11 04 92 04 8a cc c9 00 00 f1 20 02 00 00 69 2d
55 11 04 92 04 8a 6c cd 00 00 f1 20 02 00 00 59 08
55 11 04 92 04 8a 0c d1 00 00 f1 20 02 00 00 19 79
55 11 04 92 04 8a ab d4 00 00 f1 20 02 00 00 74 34
55 11 04 92 04 8a 4c d8 00 00 f1 20 02 00 00 79 33
По коротким пакетам видно двухбайтный счетчик, увеличивающийся на одно и то же (плюс-минус) число — время? Счетчик сквозной, в длинных пакетах он тоже есть.
Последние два байта, очевидно, контрольная сумма. Только CRC16 что-то не подходят, с распространенными полиномами. Что-то не совсем стандартное.
Другие байты в коротком пакете не меняются, может быть что угодно.
В длинном пакете есть «дребезжащие» значения.
0xFFFB/0xFFFC
0x02B3/0x02B4
70/71
Вот ещё интересный: 0xFFFF — 0x0000 — 0x0001 — похоже на знаковое число, от -1 до +1 меняется.
Можно предположить, что это какие-то параметры состояния. Где-то, возможно, напряжение питания, где-то датчики с акселерометров/гироскопов. Можно посмотреть.
Только что это даёт? Полагаю, ничего. У меня тоже ответов нет :)
+
avatar
0
С длиной действительно похоже. Но как я там байт теряю — программа-то три с половиной строки. Что-то не въезжаю. потерять его можно только тут:
    # packet start
    while True:
        data = ser.read(1)
        if data != b'':
            byte_cnt = 1
            buffer.extend(data)
            break   
+
avatar
+2
  • ACE
  • 04 марта 2025, 22:06
Мне кажется, вот этот кусок совсем лишний
    # time between packets
    while True:
        if ser.read(1) != b'':
            break
Ну либо он должен быть перед циклом, для синхронизации первого пакета.
+
avatar
+1
Заработало! Спасибо!
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 True:
        data = ser.read(1)
        if data == b'':
            break
        else:
           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)
В тексте поправил.
+
avatar
+2
Хорошо, что в Мире есть места, в которых можно без опасения подойти и исследовать без последствий, упавший с Неба Mavik… А потом его отремонтировать и запустить, тоже без последствий...
donBaton04 марта 2025, 20:57
Да шутка юмора же, купил я его просто дохлый.
Извините — не сразу заметил.
+
avatar
+1
Какой классный тёплый ламповый реверс-инжениринговый обзор))
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.