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

OSCHINA-MIRROR/alicedodo-xaobao_cheap_bus_servo_hack_record

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 21 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 12:14 761b3d2

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

На 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 )

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

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