🧪 Stanno arrivando nuovi tutorial — dal braccio robotico al sensore
Vai al contenuto
Acquista questo prodottoNegozio ufficialeSito ufficiale

Protocollo, comandi e calibrazione dei servo PWM ​

Questa pagina copre il protocollo seriale del firmware PWM, i comandi, la calibrazione e la regolazione fine dei parametri. Per il cablaggio vedi Cablaggio PWM, per il flashing vedi Avvio rapido PWM, per il controllo desktop/web vedi Applicazione desktop PWM / Controllo web PWM.

I seguenti comandi si eseguono nella directory AmazingHand-PWM/ del repository. Sorgente del firmware: firmware/AmazingHand_Serial/.

1. Panoramica di comandi e gesti ​

Le prime 11 righe sono comandi di gesti; le altre sono comandi di pilotaggio diretto, selezione del lato, ripetizione, arresto e test del collegamento.

Gesto/comandoComandoDescrizione
Sasso0x01Morra cinese: tutte le dita a pugno
Forbici0x02Morra cinese: indice + medio estesi a formare una V
Carta0x03Morra cinese: tutte le dita aperte
Pollice su0x04Pollice alzato, le altre dita a pugno
Beffa 10x05Oscilla l'indice ("no no no")
Beffa 20x06L'anulare si estende e oscilla (sostituisce il mignolo)
Apri0x07Tutte le dita aperte
Pugno0x08Tutte le dita chiuse
OK0x09Gesto OK
Pizzico0x0AGesto di pizzico
Indica0x0CL'indice si estende per fare il gesto di "indicare"
Pilotaggio diretto0xF0Controllo diretto dell'angolo degli 8 servo
Imposta mano destra/sinistra0xF1Cambia la modalità mano sinistra/destra
Ripeti0xFERipete l'esecuzione dell'ultimo gesto
Stop0xFFTermina immediatamente il gesto corrente
NOP0x00Test del collegamento

Nota: il comando 0x0B è disattivato (l'originale "pollice in giù" era ripetuto con "pollice su" ed è stato rimosso).


2. Calibrazione del firmware (opzionale, consigliata al primo uso) ​

La posizione centrale e la larghezza d'impulso dei servo vanno calibrate in base al meccanismo reale e possono essere modificate direttamente nel sorgente del firmware:

  • Modifica middle_pos[8] e min_pw/mid_pw/max_pw[8] all'inizio di components/hand_servo/hand_servo.c.

Dopo la calibrazione è necessario ricompilare e riflashare.


3. Protocollo di comunicazione seriale ​

3.1 Livello fisico ​

ParametroValore
InterfacciaUSB Serial (UART0)
Baudrate115200
Bit di dati8
Bit di paritàNessuno (None)
Bit di stop1
Controllo di flussoNessuno

3.2 Formato dei frame ​

Host → ESP32 (frame di comando) ​

┌────────┬────────┬──────────┬────────────────┬──────────┐
│  0xAA  │ CMD_ID │ DATA_LEN │ DATA[0 .. N-1] │ CHECKSUM │
│ 1 Byte │ 1 Byte │  1 Byte  │    N Bytes     │  1 Byte  │
└────────┴────────┴──────────┴────────────────┴──────────┘
 intestazione  ID comando  lunghezza dati  payload dati  checksum
  • Intestazione: fissa 0xAA, identifica l'inizio di un frame
  • CMD_ID: numero del comando (vedi Riferimento dei comandi)
  • DATA_LEN: numero di byte del payload (0-8; i frame superiori a 8 non sono validi)
  • DATA: payload dei dati, lunghezza determinata da DATA_LEN
  • CHECKSUM: CMD_ID ^ DATA_LEN ^ DATA[0] ^ ... ^ DATA[N-1] (verifica XOR)

Se DATA_LEN = 0, allora CHECKSUM = CMD_ID.

ESP32 → Host (frame di risposta) ​

┌────────┬────────┬────────┬──────────┐
│  0xBB  │ CMD_ID │ STATUS │ CHECKSUM │
│ 1 Byte │ 1 Byte │ 1 Byte │  1 Byte  │
└────────┴────────┴────────┴──────────┘
 intestazione  ID comando  codice di stato  checksum
  • Intestazione: fissa 0xBB
  • CMD_ID: numero del comando originale
  • STATUS: codice di stato (vedi tabella sotto)
  • CHECKSUM: CMD_ID ^ STATUS

Codici di stato ​

STATUSSignificatoDescrizione
0x00OKComando accettato, esecuzione avviata
0x01Comando non validoCMD_ID non presente nella tabella dei comandi
0x02Errore di parametroLunghezza o contenuto dei dati non corretto
0x03OccupatoGesto in esecuzione, non accetta nuovi comandi per ora
0x10CompletatoEsecuzione del gesto terminata

3.3 Sequenza di comunicazione ​

Host                          ESP32
 │                              │
 │──── [AA 01 00 01] ────────→│  Invio del comando "Sasso"
 │                              │
 │←─── [BB 01 00 01] ─────────│  ACK: comando accettato
 │                              │
 │                      (esecuzione del gesto)
 │                              │
 │←─── [BB 01 10 11] ─────────│  Completato: esecuzione del gesto terminata
 │                              │
 │──── [AA 02 00 02] ────────→│  Invio del comando "Forbici"
 │                              │
 │←─── [BB 02 00 02] ─────────│  ACK
 │                              │

3.4 Stop del gesto e timeout dei frame ​

  • Inviando [AA FF 00 FF] è possibile interrompere in qualsiasi momento il gesto in esecuzione
  • Se l'ESP32 non completa la ricezione di un frame entro 200 ms lo scarta automaticamente (per evitare una perdita di sincronizzazione permanente dovuta a byte persi)
  • I frame con checksum non corrispondente vengono scartati silenziosamente; il PC host deve implementare il reinvio con timeout

3.5 Modalità mano destra/sinistra ​

Modalità mano destra predefinita. Invia [AA F1 01 02 F2] per passare alla mano sinistra, [AA F1 01 01 F1] per tornare alla mano destra. La mano destra/sinistra influenza la direzione di movimento del pollice (gesti Sasso/Forbici/Pollice su/OK/Pizzico ecc. che coinvolgono il pollice).


4. Riferimento dei comandi ​

4.1 Comandi dei gesti (0x01–0x0A, 0x0C) ​

Questi comandi non richiedono payload (DATA_LEN=0); l'ESP32 esegue immediatamente il gesto corrispondente.

ComandoFrame HEXRispostaDescrizione
SassoAA 01 00 01BB 01 00 01 → BB 01 10 11Tutte le dita a pugno
ForbiciAA 02 00 02BB 02 00 02 → BB 02 10 12Indice + medio estesi
CartaAA 03 00 03BB 03 00 03 → BB 03 10 13Tutte le dita aperte
Pollice suAA 04 00 04BB 04 00 04 → BB 04 10 14Pollice alzato
Beffa 1AA 05 00 05BB 05 00 05 → BB 05 10 15Oscilla l'indice (circa 2,5 s)
Beffa 2AA 06 00 06BB 06 00 06 → BB 06 10 16Oscilla l'anulare (circa 2,5 s)
ApriAA 07 00 07BB 07 00 07 → BB 07 10 17Tutte le dita aperte
PugnoAA 08 00 08BB 08 00 08 → BB 08 10 18Tutte le dita chiuse
OKAA 09 00 09BB 09 00 09 → BB 09 10 19Gesto OK
PizzicoAA 0A 00 0ABB 0A 00 0A → BB 0A 10 1AGesto di pizzico
IndicaAA 0C 00 0CBB 0C 00 0C → BB 0C 10 1CL'indice si estende per fare il gesto di "indicare"

4.2 Comando di pilotaggio diretto (0xF0) ​

Controllo diretto dell'angolo degli 8 servo; gli 8 byte di dati corrispondono ai servo 1-8, con valore di ciascun byte da 0 a 180.

Esempio: tutti i servo in posizione centrale (90°)

Invio: AA F0 08 5A 5A 5A 5A 5A 5A 5A 5A F8
       │  │  │  └── 8 × 0x5A (90°) ──┘  │
       │  │  │                            └── CHECKSUM
       │  │  └── DATA_LEN = 8
       │  └── CMD_DIRECT_DRIVE
       └── intestazione

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

8 valori 0x5A uguali, XOR a due a due, danno 0x00; alla fine 0xF0 ^ 0x08 ^ 0x00 = 0xF8

Esempio: indice aperto (servo1=170°, servo2=10°), gli altri in posizione centrale (90°)

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

4.3 Impostazione mano destra/sinistra (0xF1) ​

1 byte di dati: 0x01 = mano destra, 0x02 = mano sinistra.

Imposta mano destra: AA F1 01 01 F1
Imposta mano sinistra: AA F1 01 02 F2

4.4 Comandi di controllo ​

ComandoFrame HEXDescrizione
NOPAA 00 00 00Test del collegamento, restituisce immediatamente BB 00 00 00
RipetiAA FE 00 FERipete l'esecuzione dell'ultimo gesto
StopAA FF 00 FFTermina immediatamente il gesto corrente

4.5 Riepilogo delle risposte ​

Alla ricezione di un comando non valido (prendendo come esempio il comando inesistente 0xFC):

Invio: AA FC 00 FC
Risposta: BB FC 01 FD    (STATUS=0x01 comando non valido)

Verifica del checksum: FC ^ 00 = FC, risposta FC ^ 01 = FD


5. Regolazione fine dei parametri dei gesti ​

5.1 Posizione dei parametri ​

L'offset angolare di ogni gesto è definito con macro #define, senza modificare il codice logico, si regolano solo i valori.

  • Versione ESP-IDF: area "parametri dei gesti (regolabili dall'utente)" all'inizio di components/hand_gestures/hand_gestures.c

5.2 Significato dei parametri ​

c
// Esempio: gesto Sasso
#define ROCK_IDX_OFF1    70    // offset del giunto 1 dell'indice
#define ROCK_IDX_OFF2   -70    // offset del giunto 2 dell'indice
  • Valore positivo = flessione/chiusura, valore negativo = estensione/apertura
  • 2 offset per ogni dito, rispetto a middle_pos (predefinito 90°)
  • Struttura differenziale: i due servo sono affiancati con assi collineari; la rotazione nello stesso verso produce la divaricazione laterale, quella in versi opposti produce la flessione; la somma dei due angoli di offset corrisponde alla divaricazione, la differenza alla flessione.

5.3 Procedura di regolazione ​

  1. Trova la macro #define del gesto corrispondente
  2. Modifica il valore (aumentare → ampiezza maggiore; diminuire → ampiezza minore)
  3. Ricompila e riflasha, testa il risultato con l'applicazione desktop
  4. Regola ripetutamente finché il movimento risulta naturale

6. Domande frequenti ​

D1: Il PC host non si connette alla seriale? ​

  1. Verifica che l'ESP32 sia collegato al PC tramite Type-C
  2. Controlla che il numero di porta COM in Gestione dispositivi corrisponda a quello selezionato nella GUI
  3. Verifica il baudrate 115200
  4. Disconnetti gli altri software che occupano la seriale

D2: L'invio di un comando non produce risposta? ​

  1. Invia prima AA 00 00 00 (NOP); dovresti ricevere BB 00 00 00
  2. Verifica che il firmware sia flashato e che il chip target sia ESP32-S3
  3. Controlla il cablaggio (GND in massa comune)

D3: L'ampiezza del gesto è sbagliata o la direzione è invertita? ​

Entra nella regolazione fine dei parametri dei gesti (vedi sezione 5) e regola la macro corrispondente.

D4: Quali gesti sono influenzati dalla modalità mano destra/sinistra? ​

I gesti che coinvolgono il pollice come Sasso/Forbici/Pollice su/OK/Pizzico; dopo il cambio di mano la direzione speculare del pollice cambia.

D5: Le dita si bloccano e non si estendono? ​

Prima di ogni gesto di chiusura viene automaticamente eseguito un «prima apri tutta la mano e poi chiudi», per evitare che le dita vengano bloccate dal gesto precedente. Se il blocco persiste, controlla l'assemblaggio meccanico o riduci l'ampiezza di chiusura.

Pagine correlate ​