Skip to main content
A travel trailer unhitched at a pine forest campsite at sunset, its jacks down, with the pickup truck parked beside it

Plateau

Know you're sitting level before you unhitch. Plateau tells you which corner is low and how many millimetres of block it needs, so you set up once instead of three times.

What's Inside  /  Module

The Vehicle Leveler

Plateau measures your rig's pitch and roll and turns them into something you can act on: a height for each corner, with the lowest corner at zero. Those numbers are your block heights. It puts them on the TrailCurrent CAN bus, so your dashboard shows them wherever you are standing.

Built from two stock boards and no custom PCB: the Waveshare ESP32-S3 RS485 CAN board running ESP-IDF, and a DFRobot 10-DOF sensor with a Bosch BNO055 on it. A ribbon cable joins them, a Deutsch DTM 4-pin brings in power and CAN, and the whole thing lives in a two-piece 3D printed case with the sensor's axes marked on the lid.

ESP32-S3 ESP-IDF BNO055 IMU CAN Bus FreeRTOS OTA
View on GitHub
TrailCurrent Plateau enclosure rendering, black case with green X, Y and Z axis markings on the lid and a Deutsch connector on the end

At a Glance

What's inside the case and what comes out of the connector.

Compute

Waveshare ESP32-S3 RS485 CAN board. Dual–core Xtensa LX7 running C on ESP-IDF, with an on-board CAN transceiver and USB-C for flashing. 16 MB flash with two OTA slots, so an update that fails rolls back on its own.

Sensor

DFRobot SEN0253 with a Bosch BNO055 on I2C. Plateau reads it every half second and works out pitch, roll, and the height difference front to back and side to side from your rig's length and width.

Vehicle Network

500 kbps CAN through the board's on-board transceiver, out to a Deutsch DTM 4-pin. Tilt and per-corner heights go out at about 30 times a second on 0x37 and 0x38, with a status frame every two seconds.

Bill of Materials

Everything you need to build one Plateau, top to bottom.

Some source links are affiliate links (Amazon, Waveshare). They cost you nothing extra and send a small cut back to the project.

Qty Part Description Source
1 Waveshare ESP32-S3 RS485 CAN Board ESP32-S3 dev board with an on-board isolated CAN transceiver, USB-C, and a 7–36 V input, so it runs straight off the rig's 12 V. Off-the-shelf. Waveshare
1 DFRobot SEN0253 Gravity 10-DOF AHRS Bosch BNO055 motion sensor on a small board, I2C at address 0x28. The pressure sensor on the same board is not used. DFRobot
1 20-pin IDC Ribbon Cable (2×10) From the Waveshare board's user header to the sensor. Only four wires are used: 3.3 V, ground, SDA and SCL. Generic
1 Deutsch DTM04-4P Connector 4-pin receptacle carrying 12 V power and the CAN H / CAN L pair. The TrailCurrent standard for vehicle bus interconnects. Amazon
1 Deutsch W4S Wedgelock The orange lock that holds the pins in the DTM04-4P receptacle. TE Connectivity
1 Case Bottom 3D printed. 123 × 80 × 26 mm including the mounting tabs, with standoffs for both boards and an opening in one end for the DTM 4-pin. ABS. 3D printed (see below)
1 Case Cover 3D printed. 123 × 58 × 7 mm. Raised X, Y and Z axis markings sit directly over the sensor chip. ABS. 3D printed (see below)
4 M2.5 × 6 mm Machine Screws (boards) Two hold the Waveshare board and two hold the sensor board to the standoffs in the case floor. Stainless or zinc-plated. Hardware store
4 M2.5 × 10 mm Machine Screws (cover) Secure the cover to the case bottom at the four corners. Stainless or zinc-plated. Hardware store

Technical Drawings

Orthographic views of the full assembly, straight out of the FreeCAD model.

Plateau top view, 123 by 80 millimetres

Top View

The X, Y and Z markings sit right over the sensor chip, so you can see which way it faces when you mount it. Four mounting tabs on the long sides.

Plateau long side view, 123 by 30 millimetres

Long Side

30 mm tall, so it fits on a floor, against a wall, or under a cabinet without getting in the way.

Plateau plain end view, 80 by 30 millimetres

Plain End

The closed end. The mounting tabs and their gussets sit at the case floor so the screws go straight down into whatever you mount it on.

Plateau connector end view showing the Deutsch DTM 4-pin, 80 by 30 millimetres

Connector End

One Deutsch DTM04-4P for 12 V and CAN. That is the only cable Plateau needs.

Overall dimensions: 123 × 80 × 30 mm. Source CAD lives in the CAD folder of the Plateau repo.

3D Printed Parts

Two pieces, printed in ABS. The STL files are in the CAD folder of the repo, next to the FreeCAD source if you want to change them to suit your rig.

Plateau case bottom, 3D printed, showing the board standoffs and the connector opening

Case Bottom

The main body. Standoffs in the floor hold the Waveshare board and the sensor board, one end frames the DTM 4-pin, and four braced tabs let you screw it to a floor or a wall.

  • Dimensions: 123 × 80 × 26 mm
  • Material: ABS
  • File: BodyPlateauCaseBottom.stl
Plateau case cover, 3D printed, with raised green X, Y and Z axis markings

Case Cover

The lid. A raised panel carries the X, Y and Z markings, lined up with the sensor underneath. Four counterbored holes take the cover screws.

  • Dimensions: 123 × 58 × 7 mm
  • Material: ABS
  • File: BodyPlateauCaseCover.stl

Hardware

Two off-the-shelf boards and a ribbon cable. No custom PCB, no soldering on the boards.

MCU Board

Waveshare ESP32-S3 RS485 CAN board. ESP32-S3 with 8 MB of PSRAM and 16 MB of flash, split into two OTA slots so updates land on the inactive half. The RS485 transceiver on the board is not used.

Power

12 V comes in over the DTM 4-pin and lands on the board's screw terminals, which take anything from 7 to 36 V. The sensor runs from the board's 3.3 V rail through the ribbon cable.

Motion Sensor

The BNO055 calibrates itself as you move it. Once it is calibrated, Plateau saves those numbers to flash on request and switches to reading the accelerometer alone, which is the steadiest way to read tilt on a parked rig.

Three Ways to Mount It

Flat on the floor, or on the left or right wall. Tell Plateau which one and it remaps the sensor's axes, so pitch is always front to back and roll is always side to side.

Assembly

Two boards, eight screws, one connector. An afternoon, including the print.

  1. 1

    Print the case

    Grab BodyPlateauCaseBottom.stl and BodyPlateauCaseCover.stl from the CAD folder and print both in ABS.

  2. 2

    Flash the firmware

    On the bench, plug the Waveshare board into USB-C and flash Plateau straight from your browser with the TrailCurrent Flasher. After that, updates come over the air.

  3. 3

    Mount the Waveshare board

    Set it on its two standoffs along the long wall and fix it with two M2.5 × 6 screws.

  4. 4

    Mount the sensor

    The DFRobot board goes on the other two standoffs with two more M2.5 × 6 screws. It sits flat and square to the case, which is what makes the readings line up with the markings on the lid.

  5. 5

    Run the ribbon

    Plug the IDC ribbon into the board's user header and land wires 1, 3, 13 and 15 on the sensor's 3.3 V, ground, SDA and SCL. The wiring diagram below has the details.

  6. 6

    Fit the connector

    Press the DTM04-4P into the end wall and lock its pins with the wedgelock. Run 12 V, ground, CAN H and CAN L to the board's screw terminals.

  7. 7

    Close the case

    Drop the cover on and secure it with four M2.5 × 10 screws at the corners. Snug, not cranked down.

  8. 8

    Mount it and tell it about your rig

    Screw it to the floor or a wall, square to the rig, and plug in the DTM 4-pin. In Headwaters, set which way it is mounted and your rig's length and width. Plateau saves them and starts reporting corner heights.

Wiring

Four wires on the ribbon. Power and CAN land on the screw terminals.

Plateau ribbon cable wiring between the Waveshare board's 20-pin user header and the DFRobot sensor
IDC Pin GPIO Function
1None3.3 V to sensor VCC
3NoneGround to sensor GND
135I2C SDA
156I2C SCL

CAN TX and RX are GPIO 15 and 16, wired to the board's own transceiver, so there is nothing to connect for them. CAN H, CAN L and 7–36 V go to the screw terminals.

CAN Protocol

Three outbound frames, one inbound config frame, plus the bus-management IDs every TrailCurrent node speaks.

ID Name DLC Payload
0x37 Tilt Data 8 Pitch and roll in hundredths of a degree, then the front-to-back and side-to-side height differences in millimetres. Four signed 16-bit values, big-endian.
0x38 Corner Heights 8 How far to raise front-left, front-right, rear-left and rear-right, in millimetres, with the lowest corner at zero. Four 16-bit values, big-endian.
0x39 Status 4 Sensor connected and saved-calibration flags, the BNO055's four calibration levels packed into one byte, and the mounting orientation. Every two seconds.
0x36 Leveling Config (RX) 1–7 Command byte first. 0x01 sets mounting, rig length and width in centimetres, with an optional save to flash. 0x02 asks for status. 0x03 saves the sensor calibration.
0x04 Version Report 6 Sent once at boot: last three MAC bytes and firmware major / minor / patch.
0x00 OTA Trigger (RX) 3 Last three MAC bytes of the target device. If it matches, Plateau joins WiFi and serves an HTTP upload endpoint for the new firmware.
0x01 WiFi Config (RX) variable Chunked SSID / password provisioning stored in NVS.
0x02 Discovery (RX) 0 Broadcast trigger for mDNS self-discovery so Headwaters can find the module on its own.

Block Heights, Not Angles

Angles are hard to act on with a stack of blocks in your hand. The corner frame does the trigonometry for you and shifts the numbers so the lowest corner reads zero. What is left is how much to add under each of the others.

OTA and Discovery as Tasks

Firmware updates and discovery run as their own tasks, so the CAN task keeps reading the sensor and sending frames while either one is going. They never run at the same time.

Settings That Stick

Mounting, rig size and sensor calibration all live in flash. Pull the power at the end of a trip and Plateau comes back exactly as you left it.

Build Your Own Plateau

Every file is in the repository: the FreeCAD enclosure, the ESP-IDF firmware, the CAN protocol and the wiring diagram. Fork it, build it, make it yours.

Plateau on GitHub