Ir al artículo

Protocolo Extension v9.0

Comprobado 2026-11-01

Formato de cable exacto para su propio cliente. Lea el ciclo de vida de la sesión primero; Los diseños de registro definen tamaños, desplazamientos y rangos de campo. Una instrucción y un selector de bloque son campos de paquete separados incluso cuando sus valores numéricos coinciden.

Solicitud y respuesta de unidifusión de protocolo de extensión

Esta sección describe los mensajes exactos intercambiados entre el host y el servo. Está destinado a lectores que conectan su propio software.

Formato de mensaje y codificación de números.

Cada mensaje es un paquete: una secuencia de bytes que contiene el destino, el comando, los datos y una suma de verificación utilizada para detectar errores de transmisión. Los comandos de extensión utilizan el formato de paquete STS estándar:

Request:  FF FF ID LENGTH INSTRUCTION PARAMETERS... CHECKSUM
Response: FF FF ID LENGTH LEGACY_ERROR EXT_STATUS DATA... CHECKSUM
  • PedidoLENGTH = parameter_bytes + 2.
  • RespuestaLENGTH = data_bytes + 3; el estado de extensión ocupa el primer lugar parámetro de respuesta, por separado del byte de error heredado normal.
  • CHECKSUM = ~(ID + LENGTH + instruction_or_error + all_parameter_bytes) & 0xFF. La suma de la respuesta incluyeEXT_STATUSy cualquier dato.
  • Un campo que ocupa varios bytes envía primero el byte menos significativo (little-endian). Por ejemplo, el número 256 se envía como 00 01 en dos bytes.
  • u8, u16 y u32 son números enteros no negativos que ocupan 1, 2 y 4 bytes. i16 y i32 ocupan 2 y 4 bytes y también pueden representar números negativos. Los valores de extensión firmados utilizan complemento a dos: por ejemplo, −1 es FF FF en un campo i16. Esto difiere de la codificación heredada de valores con signo.
  • Q8 significa que un valor se multiplica por 256 antes de la transmisión para que las fracciones se puedan representar como números enteros. Divide por 256 al leerlo. Por ejemplo, la posición 1000 se envía como 256000 y la ganancia 4,5 se envía como 1152.
  • La posición está en conteos del codificador y la velocidad está en conteos/s. El host maneja cualquier conversión a ángulos de articulación, incluidos cambios de dirección o posición cero.
  • Unicast significa un mensaje dirigido a un servo. Broadcast usa ID 0xFE y llega a todos los servos. Los comandos de extensión de transmisión nunca generan respuestas.

Ejemplo: lea el bloque de capacidades de 8 bytes del servo ID 1:

FF FF 01 04 90 90 08 D2

Un selector identifica un bloque de registro completo, como configuración o retroalimentación. Acceda a él con la extensión READ/WRITE y el tamaño de bloque exacto que se detalla a continuación. No se admite la lectura o escritura de solo una parte de un bloque y los comandos READ/WRITE heredados no pueden acceder a estos bloques.

Instrucciones

Los tamaños de parámetros siguientes excluyen el encabezado del paquete y la suma de comprobación. En una respuesta, EXT_STATUS informa si el comando de extensión tuvo éxito, por separado de LEGACY_ERROR, el byte de error normal del servo. Una lectura exitosa agrega los datos solicitados después de EXT_STATUS; Las escrituras, otros comandos y las lecturas fallidas no tienen datos adicionales.

Instrucción Nombre Parámetros Difusión
0x90 READ selector:u8, count:u8 Ninguna respuesta útil
0x91 WRITE selector:u8, block... No aceptado
0x99 GRAVITY 6 bytes, debajo No aceptado
0x9A TARGETS session:u16 + 1–6 entradas de 9 bytes Aceptado

Números de instrucción 0x92, 0x93, 0x94, 0x95, 0x96, 0x97 y 0x98, y selectores 0xA1, 0xA3, 0xB0, 0xBA, 0xE0 y 0xF0 están reservados y no deben usarse.

Estado de la extensión Significado
0 bien
1 Longitud, selector o valor de campo no válidos
2 El comando no se puede aceptar en el estado actual
3 Reservado
4 Reservado
5 Instrucción no compatible

Una discrepancia de sesión devuelve un estado fallido. Inspeccione tanto el byte de error heredado como el estado de la extensión.

Sesiones y números de secuencia.

El host asigna a cada sesión un número del 1 al 65535 y lo incluye en los comandos de control. Esto permite al servo verificar que un comando pertenece a la sesión actual. Elija un nuevo número para cada inicio; Los números de configuración no se almacenan permanentemente.

Un número de secuencia cuenta los comandos aceptados en orden, lo que permite al host y al servo identificar comandos faltantes, repetidos o desordenados.

TARGETS tiene un contador de secuencia de movimiento por servo. GRAVITY tiene un mostrador separado. Ambos comienzan en cero cuando la habilitación de par inicia el control; normalmente envía 1 primero. Los números aumentan hasta 65535 y luego llegan a 0, sin finalizar la sesión. Se permiten espacios: después de 10, el servo puede aceptar 12 incluso si se perdió o rechazó 11. Los números iguales o mayores se rechazan sin cambiar el comando actual.

Para una comparación exacta, calcule distance = (incoming − accepted) & 0xFFFF. Un comando es más nuevo solo cuando 1 ≤ distance ≤ 32767. Un salto de exactamente 32768 es ambiguo y rechazado. Mantenga la distancia desde el último comando aceptado por debajo de 32768; Si el historial de comandos es incierto, desactive el torque, prepare una nueva ID de sesión y habilite el torque nuevamente. No reutilice paquetes en cola de una sesión o ciclo de contador anterior.

La aceptación aún requiere campos válidos, lecturas actuales del sensor y un movimiento factible. Un comando rechazado no avanza su contador. Estos comandos reemplazan a los objetivos absolutos; no son una cola de waypoints. Para visitar cada punto de ruta, espere cada llegada antes de enviar el siguiente destino.

Al enviar un objetivo de grupo, lea la retroalimentación de cada servo para verificar su secuencia aceptada. Cada servo decide independientemente si puede aceptar su objetivo; uno puede rechazarlo mientras los demás empiezan a moverse.

TARGETS —0x9A

Los primeros dos bytes de parámetros contienen la sesión compartida. Cada entrada siguiente tiene este diseño; Las compensaciones son relativas al inicio de esa entrada:

compensación Tipo campo
0 u8 Identificación de servo, 1–253
1 u16 Nueva secuencia de movimiento para este servo.
3 i32 Posición de destino, Q8 cuenta
7 u16 Velocidad máxima, recuentos/s, distinta de cero

La longitud del parámetro es 2 + 9 × entry_count, como máximo 56 bytes. Las identificaciones deben ser únicas. Cada servo comprueba el formato y los campos obligatorios de todas las entradas antes de manejar las suyas. Un servo que no aparece en la lista no hace nada. Un servo listado verifica su sesión, secuencia, preparación y si el movimiento puede permanecer dentro de sus límites. Un objetivo aceptado comienza inmediatamente y permanece activo hasta que sea reemplazado o desarmado. Los valores están limitados a los límites configurados como se describe en Movimiento de curva S.

GRAVEDAD —0x99

compensación Tipo Campo/restricción
0 u16 Sesión actual
2 u16 Nueva secuencia de gravedad
4 i16 Esfuerzo de gravedad deseado; magnitud ≤ límite de salida configurado

La longitud del parámetro es exactamente de 6 bytes. Requiere una sesión armada con el motor encendido, hardware listo, sin fallas reportadas y lecturas recientes del sensor. No avanza la secuencia de movimiento. El valor solicitado permanece activo hasta que sea reemplazado o desarmado.

Verificar la implementación de un cliente

Verifique la longitud, la suma de verificación, el error heredado y el estado de la extensión por separado. Confirme los TARGETS del grupo a través de la retroalimentación de cada servo listado: la transmisión exitosa no es aceptación. Si el historial de la secuencia es incierto, libere el torque y prepare una nueva sesión en lugar de continuar ciegamente con una cola de paquetes antigua.

El controlador existente codifica y decodifica a través de host/servo-driver/registers/ArmCodec.js y host/servo-driver/bus/ArmExtension.js. El firmware implementa el formato de cable en firmware/app/arm_extension.c.


Inicio de la documentación · Revisión de la fuente: a995f77. Extensión 9.0.