Protocolo Extension v9.0
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.
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 incluiEXT_STATUSe 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 01em dois bytes. u8,u16eu32são números inteiros não negativos que ocupam bytes 1, 2 e 4.i16ei32ocupam 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 FFem um campoi16. 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
0xFEe 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 .
