Simulation - sim/: the unchanged robot firmware compiled into hexapod_sim.dll against PC stand-ins (Arduino, Servo, Wire + register-level MPU6050, RF24 with matching-config radio), a kinematic body model (support plane + planted-foot odometry) that also drives the simulated IMU, and a headless smoke test (sim_smoke). build.ps1 builds and tests. - Hexapod_Simulation_Unity/ folded in (history kept in a bundle outside the repo). Assets/HexapodSim loads the DLL, drives the existing leg rig, and offers joystick / keyboard / robot-serial input plus a test panel. Robot (all found or confirmed in the simulation) - Config.h geometry taken from the Unity model. - IK femur elevation sign, gait stance direction, body pose rotation direction, yaw lever arm. - Stance feet integrated from the current command; gait restarts at mid-stance; heading integrates the applied turn rate, only while walking. - Leg clearance and reach checks (Limits::feetFeasible); walk command and body pose scaled as a whole, pose scale rate-limited, planted feet guarded so the body never snaps or legs collide. - Robot-gyro self-leveling as an integrator. - Heading mode: steering relative to the body; S walks backward. - Standing height from the remote (STANCE_HEIGHT_RANGE_MM). Protocol v3 (reflash both boards) - CmdPacket gains body_height (22 bytes). Remote - Height slider (Nextion hHeight/nHeight, serial [ ]). - Fixed unspecified I2C read order in RemoteIMU. LEGACY/: owner's old Nextion HMI and remote hardware assets. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
84 lines
4.7 KiB
Markdown
84 lines
4.7 KiB
Markdown
# Nextion HMI build guide
|
||
|
||
> The owner's earlier 6-page HMI is in `LEGACY/remote/remote.HMI`. This
|
||
> guide describes the minimal single page the current firmware expects.
|
||
> To reuse the old HMI instead, `NextionUI` has to be changed to match
|
||
> its component names.
|
||
|
||
The firmware drives the display by **component name**, and the display
|
||
talks back with small custom frames sent from each button's touch event.
|
||
Build one page in Nextion Editor to match the tables below. Layout, fonts
|
||
and colors are up to you. The names and event code must match exactly.
|
||
|
||
The remote is authoritative. Use **plain Button** components (not
|
||
Dual-state buttons) and don't toggle anything locally in the HMI. The
|
||
remote repaints every label and color from its own state, including a
|
||
full redraw every 2 s and whenever the display reboots.
|
||
|
||
## Program.s / page setup
|
||
|
||
In **Program.s**, before `page 0`, add:
|
||
|
||
```
|
||
bauds=115200
|
||
```
|
||
|
||
This sets the display to the `NEXTION_BAUD` in `remote/Config.h`. The
|
||
display ships at 9600, and `bauds=` persists across power cycles.
|
||
|
||
Name the page `main` (page 0). The firmware never changes pages.
|
||
|
||
## Components
|
||
|
||
Text components need **txt_maxl** at least as large as the longest string
|
||
the firmware writes. Button bounds here allow some slack.
|
||
|
||
| Name | Type | txt_maxl | Firmware writes |
|
||
|----------|---------|----------|----------------------------------------------|
|
||
| `bArm` | Button | 10 | `ARMED` / `DISARMED`, bco red / gray |
|
||
| `bKill` | Button | – | nothing (static "DISARM" label, make it red) |
|
||
| `bStand` | Button | 6 | `STAND` / `SIT`, bco green / gray |
|
||
| `bGait` | Button | 8 | `TRIPOD` / `WAVE` |
|
||
| `bMode` | Button | 8 | `DIRECT` / `HEADING` |
|
||
| `bRs` | Button | 10 | `R: ROTATE` / `R: MOVE` |
|
||
| `bRGyro` | Button | – | bco green / gray (label it "REMOTE GYRO") |
|
||
| `bBGyro` | Button | – | bco green / gray (label it "ROBOT GYRO") |
|
||
| `hSpeed` | Slider | – | `val` 0..255 (set **maxval = 255**) |
|
||
| `nSpeed` | Number | – | `val` 0..100 (speed %) |
|
||
| `hHeight`| Slider | – | `val` 0..200, 100 = default (set **maxval = 200**) |
|
||
| `nHeight`| Number | – | `val` -100..100 (height offset %) |
|
||
| `bCal` | Button | 9 | `CAL` / `SAVE CAL`, bco orange while active |
|
||
| `bCalX` | Button | – | nothing (static "CANCEL CAL") |
|
||
| `bZero` | Button | – | nothing (static "LEVEL") |
|
||
| `tLink` | Text | 10 | `LINK 97%` / `NO LINK`, pco green / red |
|
||
| `tMsg` | Text | 40 | status / rejection messages |
|
||
|
||
## Touch events
|
||
|
||
Put this in each component's **Touch Release Event** (the Speed slider
|
||
uses **Touch Move** as well so the value tracks your finger). Frame format:
|
||
`'#'` (0x23), length, command byte, optional value byte.
|
||
|
||
| Component | Event code | Command |
|
||
|-----------|------------------------------------------|--------------------------------|
|
||
| `bArm` | `printh 23 01 41` | `A` toggle arm (needs sticks centered) |
|
||
| `bKill` | `printh 23 01 4B` | `K` disarm, always accepted |
|
||
| `bStand` | `printh 23 01 53` | `S` toggle sit/stand |
|
||
| `bGait` | `printh 23 01 47` | `G` tripod ↔ wave |
|
||
| `bMode` | `printh 23 01 4D` | `M` direct ↔ heading-hold |
|
||
| `bRs` | `printh 23 01 58` | `X` right stick rotate ↔ translate |
|
||
| `bRGyro` | `printh 23 01 52` | `R` remote-gyro tilt on/off |
|
||
| `bBGyro` | `printh 23 01 42` | `B` robot self-stabilize on/off |
|
||
| `hSpeed` | `printh 23 02 56`<br>`prints hSpeed.val,1` | `V` + speed byte |
|
||
| `hHeight` | `printh 23 02 48`<br>`prints hHeight.val,1` | `H` + height byte (Touch Move + Release) |
|
||
| `bZero` | `printh 23 01 5A` | `Z` zero handset level |
|
||
| `bCal` | `printh 23 01 43` | `C` start / save stick calibration |
|
||
| `bCalX` | `printh 23 01 51` | `Q` cancel calibration |
|
||
|
||
**Uncheck "Send Component ID"** on every component. The firmware ignores
|
||
standard touch frames, and they only add serial traffic.
|
||
|
||
Protocol details and the parser live in `NextionUI.h/.cpp`. To add a
|
||
control, pick an unused command byte, add it to `NextionUI::decodeCustom()`
|
||
and `UiCmd`, handle it in `RemoteState::handle()`, and add a row here.
|