1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/alicedodo-xaobao_cheap_bus_servo_hack_record

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Исследование некоего сервопривода с зубчатой передачей

На Taobao я купил два подержанных одноосных сервопривода (продавец представил их как сервомоторы с определёнными суставами на некоторых популярных роботах) по очень низкой цене — 11,5 юаней. Если вы посмотрите на Taobao, то увидите, что полный комплект такого сервопривода стоит дороже.

Низкая цена имеет свои причины, но у этих сервоприводов нет документации и протоколов. Поэтому я разобрал их и решил изучить, чтобы понять протокол связи и использовать Arduino для управления ими.

Если вы чувствуете, что этот сервопривод вас заинтересовал, пожалуйста, посетите мой магазин и сделайте заказ на странице ниже. Я не зарабатываю на этом проекте, все средства идут на поддержку разработки.

Этот документ представляет собой полное исследование этого сервопривода.

Небольшая реклама:

Если вам понравился этот проект, пожалуйста, поддержите его. Вы можете сделать заказ на моей странице на Taobao. Цена — всего один юань. Все деньги пойдут на благотворительность.

Ссылка на страницу: https://item.taobao.com/item.htm?spm=a230r.7195193.1997079397.9.75b524d6Pn7IlS&id=593044206467&abbucket=20

Примечание: в Bilibili есть пользователь, который обнаружил проблему: если вы просматриваете эту страницу как гость, некоторые изображения могут быть недоступны. Я также столкнулся с этой проблемой на Code Cloud: файлы размером более 1 МБ нельзя просматривать без учётной записи Gitee.

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

Текст

1. Внешний вид

2. Разборка

3. Анализ схемы платы управления

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

4. Использование avrdude для чтения данных с главной платы

Из схемы разборки можно увидеть, что на передней панели платы управления есть шестиконтактный разъём для пайки. Сначала я предположил, что это интерфейс для записи программы через ISP. После проверки с помощью мультиметра оказалось, что моё предположение верно.

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

Затем я использовал следующую команду для попытки прочитать данные с микросхемы Mega8: avrdude -cusbasp -pm8 -U flash:r:mega8_servo.hex:i

Оказалось, что автор прошивки поступил очень благородно!

Я сохранил прочитанные данные в файле mega8_servo.hex.

5. Дизассемблирование

Итак, я получил файл hex. Следующим шагом было дизассемблировать его и получить код сборки. Команда была следующей: avr-objdump -D -m avr mega8_servo.hex > mega8_servo.s

Файл с кодом сборки также был сохранён в проекте. Стоит отметить, что файл, который вы видите в проекте сейчас, не является исходным файлом после дизассемблирования. Я добавил много комментариев.

6. Обзор кода сборки

Здесь есть небольшая история: когда я начал анализировать код, я случайно нашёл на одном сайте документацию по протоколу определённого сервопривода (документация PDF также находится в этом проекте). Когда я впервые увидел её, я был очень рад, думая, что мне не придётся анализировать код. Однако, внимательно изучив её, я понял, что она не содержит всей необходимой информации.

Вот скриншот:

В этой документации подробно описан формат протокола, но информация о параметрах остаётся неясной. Например, для команды 0x01:

  • целевое положение: в каких единицах измеряется значение? Какой диапазон значений? Поддерживает ли он отрицательные числа?
  • время движения: что означает это значение? В каких единицах оно измеряется? Какой диапазон значений? (Этот параметр я полностью понял только после анализа кода.)
  • время завершения движения: аналогично предыдущему вопросу.

Таким образом, анализ кода всё ещё необходим для полного понимания протокола. Эта документация служит важным ключом к анализу деталей протокола.

После примерно 20 дней работы в свободное время я проанализировал почти весь код, кроме загрузчика. Мои результаты превзошли ожидания:

  • все детали протокола;
  • общая структура программы;
  • скрытые сюрпризы;
  • несколько ошибок (без вреда).

Честно говоря, эта программа написана довольно небрежно:

  • код не оптимизирован, много повторяющегося кода;
  • управление потоком не использует конечный автомат, глобальные переменные повсюду;
  • множество ненужных глобальных переменных и операций;
  • почти все важные функции не имеют параметров, функции обмениваются данными через глобальные переменные;
  • таймер имеет ошибку.

Вот некоторые внутренние особенности этой прошивки (если вы хотите проанализировать дизассемблированный код самостоятельно, эти сведения будут полезны):

  • на 99% это не скомпилировано с использованием avr-gcc;
  • Mega8 имеет 8 КБ флэш-памяти, 1 КБ используется для загрузчика, остальная часть для прошивки;
  • после включения или сброса Mega8 сразу же начинает выполнять прошивку, и единственный способ перейти к загрузчику — использовать скрытую команду протокола;
  • параметры последовательного порта соответствуют документации;
  • последовательный порт RX имеет прерывание Rx Complete, которое обрабатывает команды в ISR;
  • последовательный порт TX использует опрос для отправки ACK-фраз;
  • PWM-выход использует Timer1, режим быстрой ШИМ, частота 15 кГц;
  • внутренний таймер использует Timer0, период 100 мкс (перезагружается вручную в ISR, неточный), используется для запуска ADC-выборки, которая выполняется в T0_OVF_ISR через несколько счётчиков для получения частот 300 мкс и 1,1 мс (вероятно, ошибка, должно быть 200 мкс) и других сигналов через изменение соответствующих глобальных BOOL-переменных для уведомления других ISR или основного цикла;
  • выборка угла выполняется в соответствующем ISR каждые 100 мкс, результат сохраняется в глобальной переменной и связывается с глобальной BOOL-переменной;
  • перед использованием значения АЦП применяется упрощённое сглаживание путём усреднения восьми предыдущих значений, сглаживание выполняется в основном цикле;
  • алгоритм управления двигателем использует только пропорциональное управление, без дифференциального или интегрального, просто выбирает различные коэффициенты пропорциональности в зависимости от размера ошибки, чем больше ошибка, тем больше коэффициент, используется перерегулирование для контроля ошибки.

7. Подробное описание протокола

Подробное описание протокола с большим количеством комментариев уже загружено (doc каталог UBTECH_protocol_detail.pdf), вы можете скачать его самостоятельно.

8. Самодельная плата для однолинейной последовательной связи

За исключением формата протокола, почти все трёхлинейные последовательные интерфейсы для сервомашин работают одинаково: Сигнальная линия фактически является линией TTL-уровня, TX и RX совместно используют эту линию, хост и все сервомашины подключены к ней, один хост — много ведомых. Одновременно может передавать данные только один узел, остальные узлы слушают сигнальную линию.

Процесс управления сервомашиной:

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

Поняв процесс работы, становится легче понять назначение коммуникационной платы. Просто соединить TX и RX хоста вместе и подключить их к сигнальной линии не получится, так как TX будет отправлять данные обратно через RX. Необходимо использовать схему для изоляции TX хоста во время передачи данных и разрешения RX принимать данные от других узлов.

Здесь я предлагаю метод создания собственной коммуникационной платы, схема разработана мной самостоятельно. Она состоит из модуля CH340 USB-TTL, одной микросхемы 74HC125, двух резисторов 10 кОм и макетной платы. Стоимость не превысит 5 юаней.

Начните с рисования схемы:

И соберите плату:

Эта плата полностью соответствует требованиям, описанным выше. Принцип работы здесь не рассматривается, вы можете проанализировать его самостоятельно. Производительность: я собрал две платы и протестировал их на скорость связи, они легко справляются со скоростью менее 1 Мбит/с!

Если вы хотите создать собственную коммуникационную плату на основе предоставленной схемы, обратите внимание на следующие моменты:

  • источник питания сервомашины должен быть независимым, не используйте источник питания коммуникационной платы (на схеме моя коммуникационная плата подключена к источнику питания сервомашины только для удобства подключения, между ними нет соединения);
  • источники питания коммуникационной платы и сервомашины должны быть общими;
  • если вы планируете использовать Arduino для управления сервомашинами, подключите VCC/GND/TX/RX на плате к Arduino. 9. Arduino-управление рулевым механизмом

В проекте используется файл arduino_bus_servo_demo.ino, который содержит код для Arduino. Также существует дополнительный тестовый код arduino_bus_servo_demo.py, предназначенный для тестирования рулевого механизма на ПК с использованием самодельной платы управления. Логика управления в обеих демонстрационных версиях полностью идентична.

Рисунок: Схема подключения демонстрационной программы.

Кроме того, чтобы наглядно продемонстрировать эффект от демонстрации, я записал видео и загрузил его на Bilibili (B站). Ссылка на видео: https://www.bilibili.com/video/av51309465. Добро пожаловать к просмотру!

10. Сравнение и тестирование четырёх моделей рулевых механизмов, доступных на платформе Taobao

На данный момент я собрал на платформе только четыре модели рулевых механизмов. Различия между ними можно увидеть по задней крышке. Для удобства дальнейшего объяснения я присвоил каждой модели кодовое обозначение на рисунке.

A, C и D имеют полностью медные зубчатые колёса; B имеет стальные зубчатые колёса. Данные о крутящем моменте для A, B и C были получены путём предположения на основе информации о маркировке на обратной стороне печатной платы и предполагаемого значения тока блокировки. Я считаю, что точность этих данных очень высока.

Также на рисунке указаны типы основных контроллеров MCU и типы микросхем управления двигателем.

(Примечание: Я не смог найти информацию о микросхеме драйвера A4959xxx на сайте ALLEGRO или в интернете. Если у вас есть информация об этой микросхеме, пожалуйста, поделитесь ею со мной через комментарии или личные сообщения. Заранее благодарю!)

Результаты теста на рабочий ток и защиту от перегрузки (условия теста: напряжение питания рулевого механизма 7,4 В):

Рисунок: Результаты теста.

Наконец, несколько слов о проблеме с рулевыми дисками:

A и C имеют одинаковые оси рулевого диска, 24T. Диски для этих двух моделей взаимозаменяемы, но диски, доступные на платформе, не подходят для использования. В настоящее время можно использовать только оригинальные диски из разобранных устройств.

Рулевой диск модели B имеет отдельный стандарт. Точное количество зубьев неизвестно, но диаметр оси кажется меньше, чем у A и C.

Диск рулевого механизма модели D более распространён, имеет 25 зубьев и может быть использован с обычными дисками рулевого механизма типа 996.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

На Алибаба я купил два рулевых механизма с полым валом по очень низкой цене, 11.5 юаней, но без документации и без протокола. Поэтому я разобрал их и изучил. Конечная цель — разобраться в протоколе связи и использовать Arduino для управления ими. Этот документ представляет собой полный отчёт об исследовании этих рулевых механизмов. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/alicedodo-xaobao_cheap_bus_servo_hack_record.git
git@api.gitlife.ru:oschina-mirror/alicedodo-xaobao_cheap_bus_servo_hack_record.git
oschina-mirror
alicedodo-xaobao_cheap_bus_servo_hack_record
alicedodo-xaobao_cheap_bus_servo_hack_record
master