Files
hexapod-robot/2026-current/remote/NEXTION.md
T
mangavalkandClaude Opus 5.5 91dac16fca Draft: shared protocol, remote firmware, project docs
Not yet verified on hardware.

- shared/HexapodProtocol: CmdPacket (now 20 bytes, adds remote_roll /
  remote_pitch), FLAG_* bits and radio settings as the single protocol
  definition; static payload size = sizeof(CmdPacket) on both radios.
- robot: use the shared protocol; vx = forward (harness w/x <-> q/e);
  InputMapper adds remote tilt on top of the right stick when
  FLAG_REMOTE_GYRO is set, and robot.ino no longer zeroes stick
  roll/pitch when it's off.
- remote (Teensy 4.1): Sticks (calibration, EEPROM), RemoteIMU,
  RemoteState (interlocks, link-loss disarm, smoothing), PacketBuilder,
  RadioLink, NextionUI, SerialConsole.
- CLAUDE.md, README.md, remote/README.md, remote/NEXTION.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 18:14:00 +02:00

4.2 KiB
Raw Blame History

Nextion HMI build guide

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 %)
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
prints hSpeed.val,1
V + speed byte
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.