haptic_skin_firmware/config.rs
1//! Constantes de configuration matérielle pour HAPTIC.SKIN.
2//!
3//! Archi v1 : pilotage **direct** des 8 moteurs ERM par 8 sorties PWM
4//! matérielles du RP2040 (pas de PCA9685, pas de ULN2803A).
5
6/// Nombre de moteurs du collier (8 directions cardinales).
7pub const MOTOR_COUNT: usize = 8;
8
9/// Valeur TOP du compteur PWM. Fréquence ≈ 125 MHz / (TOP + 1).
10/// 6249 → ≈ 20 kHz : au-dessus de l'audible, doux pour le transistor de commande.
11pub const PWM_TOP: u16 = 6249;
12
13/// Intensité max appliquée à un moteur (échelle 0..=255).
14///
15/// Les moteurs montés en v1 sont des cylindres **BOJACK 3 V** (colis du 17/06)
16/// alimentés depuis le 5 V de l'USB via l'étage transistor. Plafonner le duty à
17/// 150/255 ≈ 59 % ramène la tension moyenne à ~2.9 V → on reste dans le nominal
18/// du moteur (sinon surchauffe / usure prématurée à 5 V plein régime).
19///
20/// Si on rebranche les anciens QYF-740 (5 V), on peut remonter à 255.
21pub const MOTOR_MAX_DUTY: u8 = 150;
22
23/// Power-guard : pas plus de 6 moteurs simultanés, plafonnés à 60 % de duty,
24/// pour rester sous les 500 mA du bus USB (cf. `hardware/README.md`).
25///
26/// Ce plafond ≈ 153 et `MOTOR_MAX_DUTY` (150) sont **deux garde-fous distincts** :
27/// `MOTOR_MAX_DUTY` protège le moteur 3 V (tension), `POWER_GUARD_DUTY_CAP` protège
28/// le bus USB (courant). En config v1, MOTOR_MAX_DUTY (150) étant le plus bas, c'est
29/// lui qui borne en pratique ; le cap power-guard reste actif comme filet si l'on
30/// remonte MOTOR_MAX_DUTY (ex. moteurs 5 V QYF-740 → 255).
31pub const POWER_GUARD_MAX_CONCURRENT: usize = 6;
32pub const POWER_GUARD_DUTY_CAP: u8 = (255_u32 * 60 / 100) as u8; // ≈ 153
33
34/// Identité USB CDC-ACM.
35pub const USB_VID: u16 = 0x16c0;
36pub const USB_PID: u16 = 0x27dd;
37pub const USB_MANUFACTURER: &str = "haptic.skin";
38pub const USB_PRODUCT: &str = "HAPTIC.SKIN controller";
39
40/// GPIO de la LED de statut (LED externe sur la controller box + résistance
41/// série vers GND). On prend GP16 : libre (les moteurs occupent GP0..GP14 pairs)
42/// et hors des pins réservés au CYW43 (GP23/24/25/29).
43///
44/// ⚠️ Sur le Pico **W**, la LED *on-board* n'est PAS sur un GPIO mais derrière la
45/// puce WiFi CYW43 → la piloter demanderait le driver `cyw43` (blobs + PIO).
46/// Reporté en V1.5 ; en v1 on utilise une LED externe sur ce pin.
47pub const STATUS_LED_PIN_DESC: &str = "GP16";