FIT mesuré sur le gabarit P0.
✔ Maintenant (~200 €) — groupes A, B, C, F, G, H : actionneurs, roulements, filament, énergie/sécurité, câblage, visserie. Rien n'en dépend.
◆ Après une décision — servos à bus série ou PWM (+30 €, mais
HeadState devient
une mesure au lieu d'une estimation) : ça change la référence des
servos, du palonnier et de l'alimentation.
⏸ Après la spécification vidéo (~186 €) — groupes D et E : deux Camera Module 3 ne sont pas synchronisées matériellement. Si l'écart gauche/droite gêne en stéréo, la réponse est une caméra stéréo USB à capteurs synchronisés — et le Pi 5, justifié par ses deux connecteurs CSI, n'est plus forcément le bon choix. Commander avant, c'est parier 186 € sur un capteur non tranché.
Les cases à cocher sont enregistrées dans ce navigateur — utilisable comme liste d'achat.
A — Actionneurs ✔ commandable — après le choix bus série / PWM
| Réf. | Désignation | Qté | Total | Note | |
|---|---|---|---|---|---|
| S1 | Servo yaw — Feetech STS3215 (bus série, 30 kg·cm, 12 V) | 1 | 16 € | position mesurée en retour | |
| S2 | Servo pitch — Feetech STS3215 | 1 | 16 € | ID à attribuer avant montage | |
| S3 | Micro-servo roll — MG90S métal (2 kg·cm) | 1 | 5 € | jamais le SG90 plastique | |
| S4 | Palonnier métal 25T | 2 | 6 € | métal obligatoire | |
| S5 | Palonnier métal 21T (MG90S) | 1 | 3 € | ||
| Sous-total A | 46 € |
B — Roulements et guidage
| Réf. | Désignation | Qté | Total | Note | |
|---|---|---|---|---|---|
| R1 | Roulement 6810ZZ (Ø50 × 65 × 7) — couronne de yaw | 1 | 7 € | reprend le porte-à-faux | |
| R2 | Roulement 608ZZ (8 × 22 × 7) — contre-palier pitch | 1 | 1 € | réf. de skateboard | |
| R3 | Roulement 623ZZ (3 × 10 × 4) — contre-palier roll | 1 | 1 € | ||
| R4 | Vis M8 × 40 + écrou nylstop — axe de pitch | 1 | 1 € | frein-filet | |
| R5 | Vis M3 × 30 + écrou nylstop — axe de roll | 1 | 1 € | ||
| Sous-total B | 11 € |
C — Structure imprimée 3D
Toute la structure est imprimable — aucun usinage, aucune pièce d'aluminium. Détail dans l'onglet Pièces 3D.
| Réf. | Désignation | Qté | Total | Note | |
|---|---|---|---|---|---|
| C1 | Bobine PETG 1 kg (≈ 385 g utilisés) | 1 | 22 € | PLA = fluage sous servos chauds | |
| C2 | TPU 95A (pieds P9) — optionnel | 1 | 0-25 € | ou 4 patins caoutchouc (2 €) | |
| Sous-total C | ≈ 25 € |
D — Vision ⏸ après la spec vidéo
| Réf. | Désignation | Qté | Total | Note | |
|---|---|---|---|---|---|
| V1 | Raspberry Pi Camera Module 3 (IMX708) | 2 | 68 € | version Wide utile pour le micro-roll | |
| V2 | Nappe FPC 22 ↔ 15 broches, 300 mm | 2 | 10 € | 300 mm, pas plus court | |
| Sous-total D | 78 € |
E — Calcul et interface moteurs ⏸ partiellement : E1-E3 après la spec vidéo
| Réf. | Désignation | Qté | Total | Note | |
|---|---|---|---|---|---|
| E1 | Raspberry Pi 5 (4 ou 8 Go) | 1 | 80 € | 2 connecteurs CSI = stéréo natif | |
| E2 | Carte microSD A2 64 Go | 1 | 12 € | ||
| E3 | Refroidissement actif officiel Pi 5 | 1 | 6 € | obligatoire (throttling = latence) | |
| E4 | Interface bus servo TTL half-duplex | 1 | 10 € | sert aussi à attribuer les ID | |
| E5 | PCA9685 (PWM I²C) — pour le MG90S | 1 | 6 € | évite le PWM logiciel (gigue) | |
| Sous-total E | ≈ 108 € |
F — Énergie et sécurité (F7)
| Réf. | Désignation | Qté | Total | Note | |
|---|---|---|---|---|---|
| F1 | Alimentation 12 V / 5 A (bus série) | 1 | 15 € | ||
| F2 | UBEC 6 V / 5 A (MG90S) | 1 | 10 € | ||
| F3 | Alimentation officielle Pi 5, 27 W USB-C | 1 | 14 € | rail séparé | |
| F4 | Condensateur 1000 µF / 25 V | 1 | 1 € | au plus près des servos | |
| F5 | Porte-fusible + fusible 5 A | 1 | 3 € | protection blocage mécanique | |
| F6 | Bouton d'arrêt d'urgence coup-de-poing NC | 1 | 10 € | coupure physique | |
| F7 | Relais / MOSFET haut-côté piloté GPIO | 1 | 4 € | coupure logicielle (watchdog) | |
| Sous-total F | 57 € |
G — Câblage et connectique
| Réf. | Désignation | Qté | Total | Note | |
|---|---|---|---|---|---|
| G1 | Fil silicone 18 AWG rouge/noir | 2 × 2 m | 6 € | silicone : reste souple sur un axe mobile | |
| G2 | Fil silicone 24 AWG (signal) | 3 m | 3 € | ||
| G3 | Connecteurs XT60 (paires) | 2 | 3 € | ||
| G4 | Borniers WAGO 221 | 5 | 4 € | masses communes | |
| G5 | Dupont F/F + JST-XH assortis | 1 lot | 6 € | ||
| G6 | Gaine tressée Ø6 + spiralée | 2 m | 5 € | ||
| G7 | Serre-câbles + adhésif Kapton | 1 lot | 5 € | Kapton tient la chaleur | |
| Sous-total G | 32 € |
H — Visserie et inserts
| Réf. | Désignation | Qté | Total | Note | |
|---|---|---|---|---|---|
| H1 | Inserts laiton M3 à chaud (Ø4,6 × L5) | 24 | 8 € | lot de 50 | |
| H2-H7 | Coffret visserie BTR inox M2/M3 (vis, écrous nylstop, rondelles) | 1 | 18 € | M3×8/12/16, M2×6/10 | |
| H8 | Frein-filet moyen (bleu) | 1 | 6 € | palonniers + axes ; jamais du fort | |
| Sous-total H | ≈ 30 € |
I — Outillage (achat unique)
| Réf. | Outil | Indispensable | Prix | |
|---|---|---|---|---|
| I1 | Pied à coulisse numérique | oui — règle des cotes mesurées | 15-25 € | |
| I2 | Fer à souder + panne à inserts laiton | oui | 25-40 € | |
| I3 | Jeu de clés Allen 1,5-6 mm | oui | 8 € | |
| I4 | Tournevis de précision | oui | 10 € | |
| I5 | Multimètre | oui — recette électrique | 20 € | |
| I6 | Inclinomètre / rapporteur numérique | oui — calibration des butées | 15-25 € | |
| I7 | Imprimante 3D | non — impression en service possible | — | |
| I8 | IMU 9 axes sur le plateau caméras (BNO085 / MPU6050) | oui — seule mesure indépendante de la dynamique et des vibrations | 10-15 € |
Ce qui s'imprime, ce qui ne s'imprime pas
hardware/cad/ en OpenSCAD
paramétrique, ./hardware/cad/render-all.sh pour
régénérer les STL. ~385 g de filament, ~29 h, sur n'importe quelle
FDM d'entrée de gamme (volume requis 190 × 150 × 110 mm).
Matériau
PETG recommandé. Les servos chauffent en maintien de position et le PLA flue — exactement le défaut qui ruinerait la stabilité de la calibration stéréo après quelques sessions. PLA acceptable pour un montage à blanc, ASA/ABS meilleur mais caisson requis, TPU uniquement pour les pieds.
Réglages communs
| Réglage | Valeur | Pourquoi |
|---|---|---|
| Buse / couche | 0,4 mm / 0,2 mm (0,15 pour P5) | P5 porte la géométrie stéréo |
| Parois | 4 minimum | la rigidité FDM vient des parois, pas du remplissage |
| Remplissage | 40 % gyroïde (60 % pour P2 et P4) | isotrope ; P2/P4 transmettent le couple |
| Haut / bas | 5 couches | |
| Refroidissement | 30-50 % en PETG | trop de ventilation = pièce cassante entre couches |
| Orientation | efforts dans le plan des couches | une pièce FDM casse d'abord entre ses couches |
Les 10 pièces
| Réf. | Pièce | Qté | Matière | Masse | Temps | Supports | Inserts | |
|---|---|---|---|---|---|---|---|---|
| P0 | Gabarit de test d'ajustement — à imprimer en premier | 1 | PETG | 36 g | 3 h | non | 2 | |
| P1 | Socle / base — loge S1, porte R1 | 1 | PETG | 166 g | 13 h | minimes | 8 | |
| P2 | Plateau tournant de yaw — passage de câbles centré sur l'axe | 1 | PETG | 45 g | 3 h | non | 4 | |
| P3 | Fourche en U — servo à gauche, contre-palier à droite | 1 | PETG | 55 g | 4 h | oui | 4 | |
| P4 | Berceau de roll — porte S3 et R3 | 1 | PETG | 20 g | 2 h | minimes | 4 | |
| P5 | Plateau caméras — entraxe 65 mm ± 1 mm | 1 | PETG | 18 g | 1 h 30 | non | 4 | |
| P6 | Bagues d'ajustement (0,5 / 1 / 1,5 / 2 mm) | 4 | PETG | 1 g | 20 min | non | — | |
| P7 | Platine électronique (Pi, interface, alim, arrêt d'urgence) | 1 | PETG | 34 g | 3 h | non | 4 | |
| P8 | Guide-câbles (1 par axe) | 3 | PETG | 4 g | 30 min | non | — | |
| P9 | Pieds antivibratoires | 4 | TPU | 4 g | 30 min | non | — | |
| Total | ≈ 385 g | ≈ 29 h | 24 + 2 |
P0 — le gabarit, à imprimer avant tout le reste
Chaque imprimante sort les trous 0,1 à 0,4 mm trop petits. Le gabarit (une plaquette nervurée 118 × 55 × 8 mm et trois jauges séparées, 187 × 116 mm sur le plateau, ~3 h) porte les alésages des trois roulements aux écarts 0 / +0,10 / +0,20 mm, deux trous d'insert pour s'entraîner, une empreinte de palonnier, un gabarit de corps de servo et les perçages d'axe.
Critère : le bon logement est celui où le roulement entre
à la main ferme, sans outil et sans jeu. On reporte l'écart
dans le paramètre FIT et toute la CAO en
hérite. Ne rien imprimer d'autre avant d'avoir ce chiffre —
c'est 3 heures contre 26.
Paramètres à mesurer avant de modéliser
La CAO doit être paramétrée sur ces variables, jamais sur des cotes en dur. Tableau complet dans DOC/16 § 0.
| Paramètre | Nominal | Utilisé par |
|---|---|---|
SERVO_L / W / H | 40 × 20 × 26,5 mm | P1, P3 |
SERVO_LUG (entraxe pattes) | 49,5 mm | P1, P3 |
HORN25_D / PCD | ~21 mm / à mesurer | P2, P4 |
MG90_* / MG90_LUG | 23 × 12 × 22,5 mm / 32 mm | P4 |
BRG_YAW_OD / ID | 65 / 50 mm | P1, P2 |
BRG608_OD / BRG623_OD | 22 mm / 10 mm | P3, P4 |
CAM_PCB / CAM_HOLES | 25 × 24 mm / à mesurer | P5 |
INSERT_OD | 4,6 mm | toutes |
FIT | déterminé par P0 | toutes |
hardware/cad/ ; les STL se
régénèrent avec render-all.sh et ne sont pas
versionnés. Chaque pièce est vérifiée manifold et d'un seul tenant.
Ce qui n'est pas validé : l'ajustement — aucun de ces
modèles n'a encore rencontré un vrai roulement. C'est le rôle du
gabarit P0.
Chaîne cinématique
sol / bride androïde
│
[P1] SOCLE ─────────────── S1 servo yaw (axe vertical)
│ + R1 roulement de couronne
[P2] PLATEAU TOURNANT
│
[P3] FOURCHE EN U ──────── S2 servo pitch (axe transversal)
│ + R2 contre-palier
[P4] BERCEAU DE ROLL ───── S3 micro-servo roll (axe optique)
│ + R3 contre-palier arrière
[P5] PLATEAU CAMÉRAS ───── 2 × caméra, entraxe 65 mm
Ordre yaw → pitch → roll = convention d'Euler du casque (YXZ). La chaîne série dans cet ordre donne un driver 1 angle du protocole = 1 moteur, sans matrice de mixage et avec une calibration axe par axe. Toute permutation coûte du code pour zéro gain mécanique.
Règle 1 — dimensionner par la charge réelle
Dans une chaîne série, un axe ne porte que ce qui vient après lui.
| Axe | Charge portée | Couple nécessaire | Servo retenu |
|---|---|---|---|
| Yaw | toute la chaîne (~450 g) | surtout dynamique (axe vertical) | 20-30 kg·cm |
| Pitch | berceau + roll + tête (~300 g) à ~60 mm | ~2 kg·cm statique | 20-30 kg·cm |
| Roll | plateau caméras seul (~130 g) à ~25 mm | ~0,35 kg·cm | 2 kg·cm (MG90S) |
Condition de validité : bloc caméras < 250 g. Au-delà (écran, carénage, micro), requalifier S3.
Actionneurs — pourquoi le bus série
- HeadState devient une mesure, plus une estimation : c'est le principe directeur du passage au matériel (le driver doit renvoyer les angles mesurés, pas la consigne).
- Le PCA9685 et le câblage PWM disparaissent pour les axes principaux : 3 fils, adressage par ID.
- F7 devient implémentable : erreur de suivi, surcharge et température lisibles → défaillance signalée explicitement au lieu d'un échec silencieux.
Piège : attribuer les ID des servos avant montage — un servo enfermé dans la structure est pénible à ré-adresser. Et le couple annoncé suppose le rail 12 V (−35 % sous 7,4 V).
Vision — les deux points durs
- Nappes 22 ↔ 15 broches obligatoires sur Pi 5, en 300 mm, avec boucle de service à chaque axe. Les FPC ont un sens et se délaminent sur un pli vif : courbes larges uniquement.
- Synchronisation : deux Camera Module 3 sur un Pi 5 ne sont pas synchronisées matériellement. L'écart gauche/droite doit rester sous 1 frame. Si ça gêne en stéréo, l'alternative est une caméra stéréo USB à capteurs synchronisés (global shutter, 80-150 €) — à trancher dans le chantier vision.
- Wide ou standard : le Wide laisse de la marge pour absorber ± 5-10° de micro-roll par rotation logicielle du crop, au prix d'une distorsion à corriger.
Chaîne de puissance et sécurité
12 V (F1) ─ fusible F5 ─ bouton F6 (NC) ─ relais/MOSFET F7 ─┬─ servos bus (S1,S2)
└─ UBEC F2 ─ MG90S (S3)
condensateur F4 ─┘ (au plus près des servos)
Les deux coupures sont complémentaires : F7 (GPIO) protège du bug logiciel, F6 (coup-de-poing) protège du logiciel entier — y compris d'un driver planté qui ne coupe plus rien. Le bouton doit être accessible sans se pencher sur la machine.
Les 10 points de vigilance
| # | Point |
|---|---|
| 1 | Attribuer les ID des servos bus avant montage |
| 2 | Vérifier la variante 180° / 270° si servo PWM (fausse toute la calibration) |
| 3 | MG90S métal, jamais SG90 plastique |
| 4 | Palonniers métal ; une cannelure ne s'imprime pas |
| 5 | Ajustement des roulements validé sur le gabarit P0 |
| 6 | Inserts laiton partout où une vis se démonte |
| 7 | Nappes 22 ↔ 15 broches obligatoires sur Pi 5 |
| 8 | Entraxe stéréo 65 mm ± 1 mm, capteurs coplanaires |
| 9 | Servos jamais alimentés par le Pi ; masses communes |
| 10 | Deux coupures : logicielle (F7) et physique (F6) |
Ordre de montage
| # | Étape | |
|---|---|---|
| 1 | Imprimer P0, monter les roulements dessus, en déduire FIT, corriger la CAO | |
| 2 | Imprimer P1-P9 avec les cotes corrigées | |
| 3 | Poser les inserts laiton (fer + panne d'insertion) sur toutes les pièces | |
| 4 | Axe yaw : S1 dans P1, roulement R1, plateau P2 — valider T3 sur cet axe seul avant d'aller plus loin | |
| 5 | Fourche P3 : S2 à gauche, contre-palier R2 + axe R4 à droite (coaxialité !) | |
| 6 | Berceau P4 : S3, contre-palier R3 + axe R5 | |
| 7 | Plateau P5 et caméras V1 — entraxe 65 mm (T4) | |
| 8 | Câblage : puissance (F1 → F5 → F6/F7 → servos, F4 au plus près), bus/PWM, nappes V2 avec boucle de service | |
| 9 | Recette T1 → T10 ci-dessous | |
| 10 | Calibration du modèle F3 (échelon 0 → 60° chronométré), puis casque |
Recette mécanique — go / no-go
| # | Contrôle | Méthode | Critère | |
|---|---|---|---|---|
| T1 | Ajustements imprimés | gabarit P0 + roulements réels | entrée à la main ferme, sans jeu | |
| T2 | Amplitudes | inclinomètre sur P5 | yaw ≥ ±90°, pitch ≥ ±45°, roll ≥ ±40° sans contact | |
| T3 | Jeu angulaire | servos en maintien, pousser la tête à la main | < 0,5° par axe — sinon reprendre R2/R3 | |
| T4 | Entraxe stéréo | pied à coulisse entre centres optiques | 65 mm ± 1 mm, capteurs coplanaires | |
| T5 | Résonance | balayage lent de chaque axe | aucune oscillation entretenue en fin de mouvement | |
| T6 | Échauffement | 10 min en position extrême | corps de servo < 50 °C | |
| T7 | Courant | multimètre en série sur le rail servo | pic < 4 A (marge sous le fusible) | |
| T8 | Arrêt d'urgence | appui sur F6 en plein mouvement | les 3 axes se figent, aucun mouvement résiduel | |
| T9 | Coupure logicielle | GPIO → F7 depuis le driver | idem T8 + remontée d'état à la couche logicielle | |
| T10 | Chaîne complète | scripts/e2e-check.ts avec WS_URL=ws://<pi>:8791 | les 7 scénarios passent sur le matériel réel |
Recette dynamique — la tête suit-elle ?
vitesse × latence. Ce retard est invisible tant qu'il
reste sous la marge de champ disponible pour recadrer l'image
dans le casque — (FOV_caméra − FOV_affiché) / 2 —, et
devient un bord de capteur visible au-delà.
Conséquence d'achat : avec une caméra standard (~75° H) face à un casque de 90-100°, cette marge est nulle. La version Wide n'est pas un confort, c'est une condition.
| # | Contrôle | Méthode | Critère | |
|---|---|---|---|---|
| T11 | Retard et dépassement | npm run essai:echelon | retard avant mouvement < 50 ms · dépassement < 2 % | |
| T12 | Bande utile | npm run essai:frequence | gain ≥ 0,7 à 2 Hz · aucun gain > 1 (résonance) | |
| T13 | Poursuite d'un mouvement réel | npm run essai:trace sur ≥ 3 traces du vrai cas d'usage | < 2 % du temps au-delà de la marge · erreur max < marge | |
| T14 | Perception | A/B en aveugle au casque (LATENCY_MS) | la latence du système n'est pas distinguée de la latence nulle |
T13 décide ; T11 et T12 expliquent pourquoi il passe ou échoue ; T14 confirme que le critère physique correspond au ressenti. Ces quatre essais tournent aussi en simulation, avant le matériel : même protocole WebSocket. Protocole complet et interprétation dans DOC/17.
Risques et pièges
| Risque | Conséquence | Parade |
|---|---|---|
| Cotes imprimées trop justes / trop lâches | roulement qui tourne dans son logement → jeu | P0 en premier, corriger avant les grosses pièces |
| Nappes caméra non adaptées au Pi 5 | rien ne se branche | commander V2 avec les caméras |
| Servos alimentés par le Pi | redémarrages en pleine session | rails séparés, masses communes, condensateur F4 |
| Filetages taraudés dans le plastique | vis arrachée au démontage | inserts laiton partout |
| PLA sous des servos chauds | fluage, calibration stéréo perdue | PETG minimum |
| Couple de roll sous-estimé | tremblement du plateau caméras | peser le bloc stéréo avant de figer S3 |
| Câbles dans le chemin du roll | arrachement de nappe | boucle de service + guide-câbles P8 dès le montage |
| Butées atteintes en force | engrenage cassé | butées logicielles calibrées avant tout pilotage casque |
Variante recommandée — bus série
| Groupe | Total |
|---|---|
| A — Actionneurs | 46 € |
| B — Roulements et axes | 11 € |
| C — Impression 3D (filament) | 25 € |
| D — Vision | 78 € |
| E — Calcul et interface | 108 € |
| F — Énergie et sécurité | 57 € |
| G — Câblage | 32 € |
| H — Visserie et inserts | 30 € |
| Total matériel | ≈ 387 € |
| I — Outillage (achat unique) | 95-130 € |
Variante économique — servos PWM
2 × DS3218 PWM au lieu des STS3215, PCA9685 au lieu de l'interface bus, UBEC seul : ≈ 355 €, soit ~30 € d'économie.
HeadState renvoie alors une estimation (consigne
filtrée) et non une mesure, et F7 perd la détection d'erreur de
suivi (servo bloqué, butée forcée). Recommandation : ne pas
économiser ici.
Variante « sans imprimante 3D »
Faire imprimer P1-P9 en service (JLC3DP, Craftcloud, Fablab local, réseau d'impression entre particuliers) : 60-110 € le jeu complet en PETG au lieu de 25 € de filament. Total matériel ≈ 420-470 € sans achat d'imprimante — le chemin le plus rapide pour un exemplaire unique.
Variante « acheter au lieu de construire »
Une nacelle caméra brushless 3 axes d'occasion (carte SimpleBGC / Storm32, 80-150 €) remplace les groupes A, B et C : boucle fermée à encodeurs, sans jeu mécanique et silencieuse — or le jeu est le défaut n°1 des servos low-cost et il se voit directement dans le casque.
À vérifier avant achat : amplitude de yaw (souvent < ± 90°),
charge utile compatible avec le bloc stéréo, API série à adapter
dans src/driver/.
Ce que la v1.5 doit satisfaire
| Réf. | Exigence | Cible |
|---|---|---|
| M1 | Rotation yaw | ± 90° min |
| M2 | Rotation pitch | ± 45° min |
| M3 | Rotation roll | ± 40° |
| M4 | Bloc stéréo | entraxe 65 mm ± 1 mm |
| M5 | Rigidité inter-caméras | la calibration survit à une session |
| M6 | Jeu angulaire en bout de chaîne | < 0,5° par axe |
| M7 | Retour d'état | position mesurée par axe |
| M8 | Coupure de puissance | logicielle + physique |
| M9 | Masse du bloc mobile | < 300 g |