🧪 Novos tutoriais em andamento — do braço robótico ao sensor
Ir para o conteúdo
Compre este produtoLoja oficialSite oficial

Protocolo, comandos e calibração dos servos PWM ​

Esta página cobre o protocolo serial, os comandos, a calibração e o ajuste fino de parâmetros do firmware PWM. Fiação em Fiação PWM; gravação em Início rápido com PWM; controle de desktop/web em Aplicativo de desktop PWM / Controle web PWM.

Os comandos abaixo são executados no diretório AmazingHand-PWM/ do repositório. Código-fonte do firmware: firmware/AmazingHand_Serial/.

1. Visão geral dos comandos e gestos ​

As primeiras 11 linhas são comandos de gesto; as demais são comandos de acionamento direto, seleção de lado, repetição, parada e teste de link.

Gesto/comandoComandoDescrição
Pedra0x01Pedra-papel-tesoura: todos os dedos fechados
Tesoura0x02Pedra-papel-tesoura: indicador + médio estendidos em V
Papel0x03Pedra-papel-tesoura: todos os dedos abertos
Joinha0x04Polegar levantado, os demais dedos fechados
Provocação 10x05Balança o indicador ("não, não, não")
Provocação 20x06Anelar estendido e balançando (no lugar do mindinho)
Abrir0x07Todos os dedos abertos
Punho fechado0x08Todos os dedos fechados
OK0x09Gesto OK
Pinça0x0AGesto de pinça
Apontar0x0CIndicador estendido fazendo o gesto de "apontar"
Acionamento direto0xF0Controla diretamente o ângulo dos 8 servos
Definir mão esquerda/direita0xF1Alterna entre os modos mão esquerda/mão direita
Repetir0xFERepete o último gesto
Parar0xFFEncerra imediatamente o gesto atual
NOP0x00Teste de link

Nota: o comando 0x0B foi desativado (o antigo "polegar para baixo" era repetido com "joinha" e foi removido).


2. Calibração do firmware (opcional, recomendada na primeira vez) ​

A posição central e a largura de pulso dos servos precisam ser calibradas conforme o mecanismo real; é possível ajustar diretamente no código-fonte do firmware:

  • Edite middle_pos[8] e min_pw/mid_pw/max_pw[8] no início de components/hand_servo/hand_servo.c.

Após a calibração, é preciso recompilar e gravar.


3. Protocolo de comunicação serial ​

3.1 Camada física ​

ParâmetroValor
InterfaceUSB Serial (UART0)
Baudrate115200
Bits de dados8
ParidadeNenhuma (None)
Bits de parada1
Controle de fluxoNenhum

3.2 Formato do quadro ​

Host → ESP32 (quadro de comando) ​

┌────────┬────────┬──────────┬────────────────┬──────────┐
│  0xAA  │ CMD_ID │ DATA_LEN │ DATA[0 .. N-1] │ CHECKSUM │
│ 1 Byte │ 1 Byte │  1 Byte  │    N Bytes     │  1 Byte  │
└────────┴────────┴──────────┴────────────────┴──────────┘
 Cabeçalho   CMD_ID   Tam. dados    Dados        Checksum
  • Cabeçalho: fixo em 0xAA, marca o início de um quadro
  • CMD_ID: número do comando (veja Referência de comandos)
  • DATA_LEN: número de bytes da carga de dados (0-8; quadros com mais de 8 são inválidos)
  • DATA: carga de dados, com comprimento definido por DATA_LEN
  • CHECKSUM: CMD_ID ^ DATA_LEN ^ DATA[0] ^ ... ^ DATA[N-1] (verificação XOR)

Se DATA_LEN = 0, então CHECKSUM = CMD_ID.

ESP32 → host (quadro de resposta) ​

┌────────┬────────┬────────┬──────────┐
│  0xBB  │ CMD_ID │ STATUS │ CHECKSUM │
│ 1 Byte │ 1 Byte │ 1 Byte │  1 Byte  │
└────────┴────────┴────────┴──────────┘
 Cabeçalho   CMD_ID   Status   Checksum
  • Cabeçalho: fixo em 0xBB
  • CMD_ID: número do comando original
  • STATUS: código de status (veja a tabela abaixo)
  • CHECKSUM: CMD_ID ^ STATUS

Códigos de status ​

STATUSSignificadoDescrição
0x00OKcomando aceito, iniciando a execução
0x01Comando inválidoCMD_ID não está na tabela de comandos
0x02Erro de parâmetrocomprimento ou conteúdo dos dados incorreto
0x03Ocupadogesto em execução, não aceita novos comandos no momento
0x10Concluídogesto terminado

3.3 Sequência de comunicação ​

Host                          ESP32
 │                              │
 │──── [AA 01 00 01] ────────→│  envia o comando "pedra"
 │                              │
 │←─── [BB 01 00 01] ─────────│  ACK: comando aceito
 │                              │
 │                      (executando o gesto)
 │                              │
 │←─── [BB 01 10 11] ─────────│  Concluído: gesto terminado
 │                              │
 │──── [AA 02 00 02] ────────→│  envia o comando "tesoura"
 │                              │
 │←─── [BB 02 00 02] ─────────│  ACK
 │                              │

3.4 Parar o gesto e timeout de quadro ​

  • Enviar [AA FF 00 FF] interrompe a qualquer momento o gesto em execução
  • Se o ESP32 não receber um quadro completo em 200 ms, ele o descarta automaticamente (para evitar desincronização permanente por perda de bytes)
  • Quadros com checksum incorreto são descartados silenciosamente; o software de PC deve implementar reenvio por timeout

3.5 Modo mão esquerda/direita ​

O modo padrão é mão direita. Envie [AA F1 01 02 F2] para alternar para a mão esquerda e [AA F1 01 01 F1] para voltar à mão direita. A escolha de mão afeta a direção de movimento do polegar (gestos com polegar, como pedra/tesoura/joinha/OK/pinça).


4. Referência de comandos ​

4.1 Comandos de gesto (0x01–0x0A, 0x0C) ​

Esses comandos não precisam de carga de dados (DATA_LEN=0); o ESP32 executa o gesto correspondente assim que os recebe.

ComandoQuadro HEXRespostaDescrição
PedraAA 01 00 01BB 01 00 01 → BB 01 10 11todos os dedos fechados
TesouraAA 02 00 02BB 02 00 02 → BB 02 10 12indicador + médio estendidos
PapelAA 03 00 03BB 03 00 03 → BB 03 10 13todos os dedos abertos
JoinhaAA 04 00 04BB 04 00 04 → BB 04 10 14polegar levantado
Provocação 1AA 05 00 05BB 05 00 05 → BB 05 10 15balança o indicador (cerca de 2,5 s)
Provocação 2AA 06 00 06BB 06 00 06 → BB 06 10 16anelar balançando (cerca de 2,5 s)
AbrirAA 07 00 07BB 07 00 07 → BB 07 10 17todos os dedos abertos
Punho fechadoAA 08 00 08BB 08 00 08 → BB 08 10 18todos os dedos fechados
OKAA 09 00 09BB 09 00 09 → BB 09 10 19gesto OK
PinçaAA 0A 00 0ABB 0A 00 0A → BB 0A 10 1Agesto de pinça
ApontarAA 0C 00 0CBB 0C 00 0C → BB 0C 10 1Cindicador estendido fazendo o gesto de "apontar"

4.2 Comando de acionamento direto (0xF0) ​

Controla diretamente o ângulo dos 8 servos; os 8 bytes de dados correspondem aos servos 1-8, cada byte com valor de 0-180.

Exemplo: todos os servos no meio (90°)

Envio: AA F0 08 5A 5A 5A 5A 5A 5A 5A 5A F8
       │  │  │  └── 8 × 0x5A (90°) ──┘  │
       │  │  │                            └── CHECKSUM
       │  │  └── DATA_LEN = 8
       │  └── CMD_DIRECT_DRIVE
       └── cabeçalho

Checksum = F0 ^ 08 ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A = F8

Os 8 valores 0x5A iguais, combinados dois a dois por XOR, dão 0x00; no final, 0xF0 ^ 0x08 ^ 0x00 = 0xF8

Exemplo: indicador aberto (servo 1 = 170°, servo 2 = 10°), os demais no meio (90°)

Envio: AA F0 08 AA 0A 5A 5A 5A 5A 5A 5A 58
               └─170°  └─10°

4.3 Definir mão esquerda/direita (0xF1) ​

1 byte de dados: 0x01 = mão direita, 0x02 = mão esquerda.

Definir mão direita: AA F1 01 01 F1
Definir mão esquerda: AA F1 01 02 F2

4.4 Comandos de controle ​

ComandoQuadro HEXDescrição
NOPAA 00 00 00teste de link, retorna imediatamente BB 00 00 00
RepetirAA FE 00 FErepete o último gesto
PararAA FF 00 FFencerra imediatamente o gesto atual

4.5 Consulta rápida de respostas ​

Ao receber um comando inválido (usando o 0xFC, que não existe, como exemplo):

Envio: AA FC 00 FC
Resposta: BB FC 01 FD    (STATUS=0x01 comando inválido)

Verificação do checksum: FC ^ 00 = FC; na resposta, FC ^ 01 = FD


5. Ajuste fino dos parâmetros dos gestos ​

5.1 Localização dos parâmetros ​

O deslocamento angular de cada gesto é definido por macros #define; não é preciso alterar o código de lógica, só os valores.

  • Versão ESP-IDF: seção "Parâmetros dos gestos (ajustáveis pelo usuário)" no início de components/hand_gestures/hand_gestures.c

5.2 Significado dos parâmetros ​

c
// exemplo: gesto de pedra
#define ROCK_IDX_OFF1    70    // deslocamento da junta 1 do indicador
#define ROCK_IDX_OFF2   -70    // deslocamento da junta 2 do indicador
  • Valor positivo = flexionar/fechar, valor negativo = estender/abrir
  • Cada dedo tem 2 deslocamentos, relativos a middle_pos (padrão 90°)
  • Estrutura diferencial: os dois servos ficam lado a lado, com eixos colineares; rotação no mesmo sentido gera abdução lateral e em sentidos opostos gera flexão/extensão; a soma dos dois ângulos de deslocamento corresponde à abdução e a diferença à flexão/extensão.

5.3 Passos do ajuste ​

  1. Localize a macro #define do gesto correspondente
  2. Altere o valor (aumentar → amplitude maior; diminuir → amplitude menor)
  3. Recompile e grave, e teste o resultado no software de PC
  4. Ajuste repetidamente até o movimento ficar natural

6. Perguntas frequentes ​

Q1: O software de PC não conecta à porta serial? ​

  1. Confirme que o ESP32 está conectado ao PC via Type-C
  2. Verifique se o número da COM no Gerenciador de Dispositivos é o mesmo selecionado na GUI
  3. Confirme o baudrate 115200
  4. Desconecte outros softwares que estejam usando a porta serial

Q2: Enviar um comando não tem efeito? ​

  1. Envie primeiro AA 00 00 00 (NOP); deve receber BB 00 00 00
  2. Confirme que o firmware foi gravado e que o chip alvo é ESP32-S3
  3. Verifique a fiação (se o GND tem aterramento comum)

Q3: A amplitude do gesto está errada ou a direção invertida? ​

Vá ao ajuste fino dos parâmetros dos gestos (veja seção 5) e ajuste a macro correspondente.

Q4: Quais gestos o modo mão esquerda/direita afeta? ​

Os gestos com polegar, como pedra/tesoura/joinha/OK/pinça; ao alternar a mão, a direção do polegar é espelhada.

Q5: Um dedo trava e não estende? ​

Antes de executar qualquer gesto de contração, o firmware automaticamente "abre a mão inteira e depois fecha", para evitar que um dedo fique preso pelo gesto anterior. Se ainda travar, verifique a montagem mecânica ou reduza a amplitude de contração.

Páginas relacionadas ​