Ir ao artigo

Protocolo Extension v9.0

Verificado 2026-11-01

Formato de fio exato para seu próprio cliente. Leia o ciclo de vida da sessão primeiro; Layouts de registro definem tamanhos de campo, deslocamentos e intervalos. Uma instrução e um seletor de bloco são campos de pacote separados, mesmo quando seus valores numéricos coincidem.

Solicitação e resposta unicast de protocolo de extensão

Esta seção descreve as mensagens exatas trocadas entre o host e o servo. Destina-se a leitores que conectam seu próprio software.

Formato de mensagem e codificação de número

Cada mensagem é um pacote: uma sequência de bytes contendo o destino, o comando, os dados e uma soma de verificação usada para detectar erros de transmissão. Os comandos Extension usam o formato de pacote STS padrão:

Request:  FF FF ID LENGTH INSTRUCTION PARAMETERS... CHECKSUM
Response: FF FF ID LENGTH LEGACY_ERROR EXT_STATUS DATA... CHECKSUM
  • Solicitação LENGTH = parameter_bytes + 2 .
  • Resposta LENGTH = data_bytes + 3; o status da extensão ocupa o primeiro parâmetro de resposta, separadamente do byte de erro herdado normal.
  • CHECKSUM = ~(ID + LENGTH + instruction_or_error + all_parameter_bytes) & 0xFF. A soma da resposta inclui EXT_STATUS e quaisquer dados.
  • Um campo que ocupa vários bytes envia primeiro o byte menos significativo ( little-endian ). Por exemplo, o número 256 é enviado como 00 01 em dois bytes.
  • u8, u16 e u32 são números inteiros não negativos que ocupam bytes 1, 2 e 4. i16 e i32 ocupam bytes 2 e 4 e também podem representar números negativos. Os valores de extensão assinada usam o complemento de dois : por exemplo, – 1 é FF FF em um campo i16. Isso difere da codificação herdada de valores assinados.
  • Q8 significa que um valor é multiplicado por 256 antes da transmissão para que as frações possam ser representadas como números inteiros. Divida por 256 ao lê-lo. Por exemplo, as contagens de posição 1000 são enviadas como 256000 e o ganho 4.5 é enviado como 1152.
  • A posição está nas contagens do codificador e a velocidade está nas contagens/s. O host lida com qualquer conversão em ângulos de junta, incluindo mudanças de direção ou posição zero.
  • Unicast significa uma mensagem endereçada a um servo. Broadcast usa ID 0xFE e atinge todos os servos. Os comandos de extensão de transmissão nunca geram respostas.

Exemplo: leia o bloco de recursos de -byte 8 do ID do servo 1:

FF FF 01 04 90 90 08 D2

Um seletor identifica um bloco de registro completo, como configuração ou feedback. Acesse-o com a extensão READ/WRITE e o tamanho exato do bloco listado abaixo. A leitura ou gravação apenas de parte de um bloco não é suportada e os comandos READ/WRITE herdados não podem acessar esses blocos.

Instruções

Os tamanhos dos parâmetros abaixo excluem o cabeçalho do pacote e a soma de verificação. Em resposta, EXT_STATUS informa se o comando de extensão foi bem-sucedido, separadamente de LEGACY_ERROR , o byte de erro normal do servo. Uma leitura bem-sucedida adiciona os dados solicitados após EXT_STATUS; gravações, outros comandos e leituras com falha não possuem dados extras.

Instrução Nome Parâmetros Transmitir
0x90 READ selector:u8, count:u8 Nenhuma resposta útil
0x91 WRITE selector:u8, block... Não aceito
0x99 GRAVITY Bytes 6, abaixo Não aceito
0x9A TARGETS session:u16 + 1 – entradas 6 de bytes 9 Aceito

Números de instrução 0x92 , 0x93 , 0x94 , 0x95 , 0x96 , 0x97 e 0x98 , e seletores 0xA1 , 0xA3 , 0xB0 , 0xBA , 0xE0 e 0xF0 , são reservados e não devem ser usados.

Estado Extension Significado
0 OK
1 Comprimento, seletor ou valor de campo inválido
2 O comando não pode ser aceito no estado atual
3 Reservado
4 Reservado
5 Instrução não suportada

Uma incompatibilidade de sessão retorna uma falha de estado. Inspecione o byte de erro herdado e o status da extensão.

Sessões e números de sequência

O host atribui a cada sessão um número de 1 a 65535 e o inclui nos comandos de controle. Isto permite ao servo verificar se um comando pertence à sessão atual. Escolha um novo número para cada startup; os números de configuração não são armazenados permanentemente.

Um número de sequência conta os comandos aceitos em ordem, permitindo que o host e o servo identifiquem comandos ausentes, repetidos ou fora de ordem.

TARGETS possui um contador de sequência de movimento por servo. GRAVITY possui um contador separado. Ambos iniciam em zero quando a habilitação de torque inicia o controle; normalmente envie 1 primeiro. Os números aumentam 65535 e depois passam para 0 , sem encerrar a sessão. São permitidas lacunas: após 10, o servo pode aceitar 12 mesmo que 11 tenha sido perdido ou rejeitado. Números iguais ou mais antigos são rejeitados sem alterar o comando atual.

Para uma comparação exata, calcule distance = (incoming − accepted) & 0xFFFF . Um comando é mais recente somente quando 1 ≤ distance ≤ 32767 . Um salto exatamente 32768 é ambíguo e rejeitado. Mantenha a lacuna do último comando aceito abaixo de 32768 ; se o histórico de comandos for incerto, desligue o torque, prepare um novo ID de sessão e habilite o torque novamente. Não reutilize pacotes enfileirados de uma sessão anterior ou de um ciclo de contador.

A aceitação ainda requer campos válidos, leituras atuais do sensor e um movimento viável. Um comando rejeitado não avança seu contador. Esses comandos substituem alvos absolutos; eles não são uma fila de waypoints. Para visitar todos os pontos de passagem, aguarde cada chegada antes de enviar o próximo destino.

Ao enviar um alvo de grupo, leia o feedback de cada servo para verificar sua sequência aceita. Cada servo decide independentemente se pode aceitar seu alvo; um pode rejeitá-lo enquanto os outros começam a se mover.

ALVOS — 0x9A

Os primeiros dois bytes de parâmetro contêm a sessão compartilhada. Cada entrada seguinte possui este layout; os deslocamentos são relativos ao início dessa entrada:

Deslocamento Tipo Campo
0 u8 ID do servo, 1 – 253
1 u16 Sequência de movimento mais recente para este servo
3 i32 Posição de destino, Q8 conta
7 u16 Velocidade máxima, contagens/s, diferente de zero

O comprimento do parâmetro é 2 + 9 × entry_count , no máximo 56 bytes. Os IDs devem ser exclusivos. Cada servo verifica o formato e os campos obrigatórios de todas as entradas antes de manipular as suas próprias. Um servo que não está listado não faz nada. Um servo listado verifica sua sessão, sequência, prontidão e se o movimento pode permanecer dentro de seus limites. Um alvo aceito inicia imediatamente e permanece ativo até ser substituído ou desarmado. Os valores são limitados aos limites configurados conforme descrito em Movimento da curva S.

GRAVIDADE — 0x99

Deslocamento Tipo Campo/restrição
0 u16 Sessão atual
2 u16 Sequência de gravidade mais recente
4 i16 Esforço de gravidade desejado; magnitude ≤ limite de saída configurado

O comprimento do parâmetro é exatamente 6 bytes. Requer uma sessão armada com o motor ligado, hardware pronto, nenhuma falha relatada e leituras recentes do sensor. Não avança a sequência de movimento. O valor solicitado permanece ativo até ser substituído ou desarmado.

Verifique uma implementação do cliente

Verifique o comprimento, a soma de verificação, o erro legado e o status Extension separadamente. Confirme os TARGETS do grupo através do feedback de cada servo listado: a transmissão de transmissão bem-sucedida não é aceitação. Se o histórico da sequência for incerto, libere o torque e prepare uma nova sessão em vez de continuar cegamente uma fila de pacotes antiga.

O driver existente codifica e decodifica por meio de host/servo-driver/registers/ArmCodec.js e host/servo-driver/bus/ArmExtension.js. O firmware implementa o formato de fio em firmware/app/arm_extension.c .


Início da documentação · Revisão de origem: a995f77 . Extension 9.0 .