🧪 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 de porta série, os comandos, a calibração e a afinação de parâmetros do firmware PWM. Para cablagem, consulte Cablagem PWM; para gravação, Início rápido PWM; para controlo de desktop/web, Aplicação de desktop PWM / Controlo web PWM.

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

1. Visão geral de comandos e gestos ​

As primeiras 11 linhas são comandos de gestos; as restantes são comandos de acionamento direto, seleção de lado, repetição, paragem e teste de ligação.

Gesto/comandoComandoDescrição
Pedra0x01Pedra-papel-tesoura: todos os dedos fechados
Tesoura0x02Pedra-papel-tesoura: indicador + médio esticados em V
Papel0x03Pedra-papel-tesoura: todos os dedos abertos
Fixe0x04Polegar levantado, restantes dedos fechados
Provocação 10x05Abanar o indicador ("não, não, não")
Provocação 20x06Anelar esticado a oscilar (substitui o mindinho)
Abrir0x07Todos os dedos abertos
Punho0x08Todos os dedos fechados
OK0x09Gesto OK
Pinça0x0AGesto de pinça
Apontar0x0CIndicador esticado em gesto de "apontar"
Acionamento direto0xF0Controlo direto dos ângulos dos 8 servos
Definir mão esquerda/direita0xF1Alterna entre modo mão esquerda/mão direita
Repetir0xFERepete o último gesto
Parar0xFFTermina imediatamente o gesto atual
NOP0x00Teste de ligação

Nota: o comando 0x0B está desativado (o antigo "polegar para baixo" repetia o gesto "Fixe" e foi removido).


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

A posição central e a largura de pulso dos servos devem ser calibradas para o mecanismo real; podem ser alteradas diretamente no código-fonte do firmware:

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

Após a calibração, é necessário voltar a compilar e gravar.


3. Protocolo de comunicação série ​

3.1 Camada física ​

ParâmetroValor
InterfaceUSB Serial (UART0)
Baudrate115200
Bits de dados8
Bit de paridadeNenhum (None)
Bits de paragem1
Controlo de fluxoNenhum

3.2 Formato dos frames ​

PC → ESP32 (frame de comando) ​

┌────────┬────────┬──────────┬────────────────┬──────────┐
│  0xAA  │ CMD_ID │ DATA_LEN │ DATA[0 .. N-1] │ CHECKSUM │
│ 1 Byte │ 1 Byte │  1 Byte  │    N Bytes     │  1 Byte  │
└────────┴────────┴──────────┴────────────────┴──────────┘
 Cabeçalho  ID do comando  Comprimento dos dados  Carga útil  Soma de verificação
  • Cabeçalho: 0xAA fixo, identifica o início de um frame
  • CMD_ID: número do comando (ver Referência de comandos)
  • DATA_LEN: número de bytes da carga útil (0-8; frames com mais de 8 são inválidos)
  • DATA: carga útil, com comprimento determinado 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 → PC (frame de resposta) ​

┌────────┬────────┬────────┬──────────┐
│  0xBB  │ CMD_ID │ STATUS │ CHECKSUM │
│ 1 Byte │ 1 Byte │ 1 Byte │  1 Byte  │
└────────┴────────┴────────┴──────────┘
 Cabeçalho  ID do comando  Código de estado  Soma de verificação
  • Cabeçalho: 0xBB fixo
  • CMD_ID: número do comando original
  • STATUS: código de estado (ver tabela abaixo)
  • CHECKSUM: CMD_ID ^ STATUS

Códigos de estado ​

STATUSSignificadoDescrição
0x00OKComando aceite, execução iniciada
0x01Comando inválidoCMD_ID não existe na tabela de comandos
0x02Erro de parâmetroComprimento ou conteúdo dos dados incorreto
0x03OcupadoGesto em execução; não aceita novos comandos por agora
0x10ConcluídoGesto concluído

3.3 Temporização da comunicação ​

PC                            ESP32
 │                              │
 │──── [AA 01 00 01] ────────→│  envia o comando "Pedra"
 │                              │
 │←─── [BB 01 00 01] ─────────│  ACK: comando aceite
 │                              │
 │                      (a executar 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 gestos e timeout de frames ​

  • Enviar [AA FF 00 FF] interrompe a qualquer momento o gesto em execução
  • Se o ESP32 não receber um frame completo em 200 ms, descarta-o automaticamente (para evitar perda permanente de sincronismo por perda de bytes)
  • Frames com soma de verificação errada são descartados silenciosamente; o software de PC deve implementar reenvio com timeout

3.5 Modos de mão esquerda/direita ​

O modo predefinido é mão direita. Envie [AA F1 01 02 F2] para mudar para a mão esquerda e [AA F1 01 01 F1] para voltar à mão direita. A mão esquerda/direita afeta o sentido de movimento do polegar (gestos com polegar, como Pedra/Tesoura/Fixe/OK/Pinça).


4. Referência de comandos ​

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

Estes comandos não requerem carga útil (DATA_LEN=0); o ESP32 executa imediatamente o gesto correspondente ao receber.

ComandoFrame 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 esticados
PapelAA 03 00 03BB 03 00 03 → BB 03 10 13Todos os dedos abertos
FixeAA 04 00 04BB 04 00 04 → BB 04 10 14Polegar levantado
Provocação 1AA 05 00 05BB 05 00 05 → BB 05 10 15Abanar o indicador (cerca de 2,5 s)
Provocação 2AA 06 00 06BB 06 00 06 → BB 06 10 16Anelar a oscilar (cerca de 2,5 s)
AbrirAA 07 00 07BB 07 00 07 → BB 07 10 17Todos os dedos abertos
PunhoAA 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 esticado em gesto de "apontar"

4.2 Comando de acionamento direto (0xF0) ​

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

Exemplo: todos os servos ao centro (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

Soma de verificação = F0 ^ 08 ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A = F8

8 valores iguais a 0x5A fazem XOR dois a dois e dão 0x00, resultando em 0xF0 ^ 0x08 ^ 0x00 = 0xF8

Exemplo: indicador aberto (servo 1=170°, servo 2=10°), restantes ao centro (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 controlo ​

ComandoFrame HEXDescrição
NOPAA 00 00 00Teste de ligação; devolve imediatamente BB 00 00 00
RepetirAA FE 00 FERepete o último gesto
PararAA FF 00 FFTermina imediatamente o gesto atual

4.5 Respostas (referência rápida) ​

Ao receber um comando inválido (usando o comando inexistente 0xFC como exemplo):

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

Verificação da soma: FC ^ 00 = FC, e na resposta FC ^ 01 = FD


5. Afinação dos parâmetros de gestos ​

5.1 Localização dos parâmetros ​

O desvio angular de cada gesto é definido com macros #define, sem necessidade de alterar o código lógico; apenas os valores numéricos.

  • Versão ESP-IDF: secção "Parâmetros de gestos (ajustáveis pelo utilizador)" no topo de components/hand_gestures/hand_gestures.c

5.2 Significado dos parâmetros ​

c
// Exemplo: gesto Pedra
#define ROCK_IDX_OFF1    70    // desvio da articulação 1 do indicador
#define ROCK_IDX_OFF2   -70    // desvio da articulação 2 do indicador
  • Valor positivo = fletir e fechar, valor negativo = estender e abrir
  • Cada dedo tem 2 desvios, relativos a middle_pos (predefinido 90°)
  • Estrutura diferencial: os dois servos ficam lado a lado, com eixos colineares; a rotação no mesmo sentido produz abertura lateral e a rotação em sentidos opostos produz flexão; a soma dos dois desvios corresponde à abertura, e a diferença à flexão.

5.3 Passos de afinação ​

  1. Encontre a macro #define do gesto correspondente
  2. Altere o valor (aumentar → maior amplitude; diminuir → menor amplitude)
  3. Volte a compilar e gravar e teste com o software de PC
  4. Ajuste repetidamente até o movimento ficar natural

6. Perguntas frequentes ​

P1: O software de PC não consegue ligar-se à porta série? ​

  1. Confirme que o ESP32 está ligado ao PC por Type-C
  2. Verifique se o número COM no Gestor de Dispositivos corresponde ao selecionado na GUI
  3. Confirme o baudrate 115200
  4. Feche outros programas que ocupem a porta série

P2: Enviar comandos não produz reação? ​

  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 é o ESP32-S3
  3. Verifique a cablagem (o GND tem massa comum?)

P3: Amplitude do gesto errada ou sentido invertido? ​

Aceda à afinação dos parâmetros de gestos (ver secção 5) e ajuste a macro correspondente.

P4: Que gestos são afetados pelo modo mão esquerda/direita? ​

Gestos com polegar, como Pedra/Tesoura/Fixe/OK/Pinça; ao alternar a mão, o sentido do espelhamento do polegar muda.

P5: Um dedo fica preso e não estica? ​

Antes de executar qualquer gesto de contração, a mão abre totalmente e depois fecha, evitando que os dedos fiquem bloqueados pelo gesto anterior. Se ainda ficar preso, verifique a montagem mecânica ou reduza a amplitude de contração.

Páginas relacionadas ​