2026-08-04 16:08:31 +08:00
---
2026-09-04 14:16:05 +09:00
type: reference
2026-08-04 16:08:31 +08:00
---
# Bill of Materials
2026-10-12 15:55:41 +09:00
## USB port allocation (2026-10-12)
All ports are taken.
| Port | Device | Speed | Typical load |
|------|--------|-------|--------------|
| USB-A | PCAN-USB | full speed (12 Mbit/s) | ≪ 1 Mbit/s |
| USB-A | USB camera | USB 2.0 | up to ~60 Mbit/s (1080p30 MJPEG) |
| USB-A | SIM7600 (Waveshare HAT) | USB 2.0 | up to 150 Mbit/s down (LTE Cat 4) |
| USB-A | IMU (WT61 on a USB-UART adapter; later NEO-M8U) | full speed | ≪ 1 Mbit/s |
| USB-C | Tablet (Orin in device mode: NCM gadget) | USB 2.0 | ~5 MB/s paced down, ~22 MB/s up |
- The four USB-A ports sit behind **one Realtek 4-port hub ** (`0bda:5489` USB 2.0 side, `0bda:0489` USB 3 side). Every device above is
USB 2.0, so they all share **one 480 Mbit/s upstream ** . Worst case ~210 Mbit/s: fits, but a second camera would not leave much room.
- The carrier spec (SP-11324-001 Table 5-3) gives **0.5 A ** for the USB-A VBUS. The modem's transmit peaks are the largest load; if the
LTE link drops under heavy upload, check its supply first.
- Name devices by USB ID or serial in udev, not by port: any device can go in any port.
- Anything more (a USB stick to offload data, a debug serial adapter) needs an external hub. Non-USB expansion is still free: Ethernet,
the header UART and I²C, and the M.2 Key M slots.
2026-08-04 16:21:57 +08:00
| Field | Value |
|-------|-------|
| **Manufacturer ** | PEAK-System Technik GmbH |
| **Model ** | PCAN-USB |
| **USB ID ** | `0c72:000c` |
| **Purpose ** | USB-to-CAN adapter for reading car CAN bus traffic |
2026-08-06 14:08:39 +00:00
| **Interface ** | SocketCAN netdev |
2026-10-09 16:38:44 +09:00
| **Bitrate ** | 500 kbps, measured on the Z27AG OBD port (listen-only by default; see [CAN bitrate plan ](impl/plans/CAN-BITRATE.md )) |
2026-08-04 16:21:57 +08:00
| **Driver ** | PEAK proprietary driver 9.2.0 (netdev build) — out-of-tree module, must be rebuilt after kernel updates |
### Notes
- The mainline kernel driver `peak_usb` is not compiled into the NVIDIA Tegra kernel (JetPack r36.4), so PEAK's proprietary driver is required.
- Must be built with `NET=NETDEV_SUPPORT` for standard SocketCAN tools (`candump` , `ip link` , etc.).
- The module lives at `/lib/modules/$(uname -r)/misc/pcan.ko` and is loaded via `modprobe pcan` .
2026-10-08 01:38:25 +09:00
- Jetson Orin Nano has a built-in CAN controller (exposed by GPIO pins). Kernel `canN` order is not stable, so both are pinned by udev: onboard → `can_onboard` , PCAN-USB → `can_pcan` ([device naming ](impl/reports/DEVICE-NAMING.md )).
2026-08-04 17:08:21 +08:00
## Waveshare SIM7600G-H-M.2
2026-08-06 14:08:39 +00:00
[hat ](https://www.waveshare.com/wiki/SIM7600G-H-M2_4G_HAT ) [module ](https://www.waveshare.com/wiki/SIM7600G-H-M.2 )
2026-08-04 17:08:21 +08:00
| Field | Value |
|-------|-------|
| **Manufacturer ** | Waveshare (SIMCom SIM7600G-H-M.2 module) |
| **Form factor ** | M.2 B KEY |
| **Purpose ** | LTE Cat 4 cellular + multi-constellation GNSS (GPS, Beidou, GLONASS, GALILEO, QZSS) |
2026-10-08 01:36:27 +09:00
| **Interface ** | USB (ttyUSB* for AT commands/NMEA, QMI `cdc-wdm0` + `wwan0` for data) |
2026-08-04 17:08:21 +08:00
| **Power ** | 3V – 4.2V (board rail) |
| **Antennas ** | 3× IPEX (LTE main + LTE diversity + GNSS) |
| **Max data rate ** | 150 Mbps DL / 50 Mbps UL (LTE Cat 4) |
### Required software
| Package | Purpose |
|---------|---------|
| `gpsd` | Decode NMEA from the GNSS ttyUSB port |
2026-10-08 01:36:27 +09:00
| `ModemManager` + `NetworkManager` | Manage the modem and the LTE data connection (QMI) |
| `qmi_wwan` + `cdc-wdm` kernel modules | Not in the Tegra kernel; built out of tree in `~/infra/qmi_wwan/` |
2026-08-04 17:08:21 +08:00
| `minicom` (or `picocom` ) | AT command terminal for module configuration |
### Notes
2026-10-08 01:36:27 +09:00
- The module presents multiple USB serial ports (`/dev/ttyUSB0` – `/dev/ttyUSB4` ) — ttyUSB2/3 for AT commands, ttyUSB1 for NMEA GPS data (symlinked as `/dev/sim7600-gps` ).
- Default USB composition (PID 9001) is used with QMI; no PID switch needed. PPP dial-up does not work with the povo SIM (network detaches).
- Setup details: [SIM7600 setup report ](impl/reports/SIM7600-SETUP.md ).
2026-08-04 17:08:21 +08:00
- M.2 B KEY is **not ** mechanically compatible with Mini-PCIe.
- Supply voltage should be ~4.0 V for reliable operation.
- DO NOT hot-plug while powered.
2026-10-08 09:24:33 +09:00
2026-10-09 17:04:40 +09:00
## Waveshare UPS Power Module (C)
[wiki ](https://www.waveshare.com/wiki/UPS_Power_Module_(C ))
| Field | Value |
|-------|-------|
| **Purpose ** | Keep the Orin running through cranking and short power losses, and give time for a clean shutdown at ignition off |
| **Input ** | 15– 19 V DC (Waveshare recommends a 19 V / 2.37 A adapter). ⚠ A PD trigger at the standard 20 V level is above the rated maximum |
| **Output ** | Input voltage when powered (pass-through); battery voltage (9– 12.6 V) when not |
| **Battery ** | 3 × 21700 Li-ion in series (not included); charging stops when full and resumes below 12 V |
| **Monitoring ** | INA219 on I²C. On the car unit it is **bus 7 (40-pin header), address `0x41` ** |
| **Holdover (bench, 2026-10-09) ** | ≥ 20 s across a supply swap, enough to ride through cranking |
### Notes
- First read-only check (2026-10-09, on input power, charged): bus 12.34 V, shunt ≈ 0 mV (idle). Chip at power-on defaults (config `0x399f` ,
calibration unprogrammed), so read current from the **shunt-voltage register ** (0x01, 10 µV/LSB) rather than the current register.
2026-10-09 17:10:51 +09:00
- Fed from the ignition-switched cigarette socket via a **15 V PD trigger ** (15 V / 3 A, inside the 15– 19 V rating). Plan: [car power ](impl/plans/POWER.md ).
2026-10-09 17:04:40 +09:00
- Ignition-off shutdown (not built yet): on input loss the battery current turns clearly negative (discharging). A small service watches the
INA219, waits out a grace period longer than a crank (30– 60 s), then runs `systemctl poweroff` , with low battery voltage as a hard backstop.
The shunt value is unconfirmed; check the schematic before converting shunt mV to amps.
- No GPIO or shutdown signal on the module; the BOOT button may be needed to wake a battery that stopped outputting (FAQ).
2026-10-11 17:21:10 +09:00
## USB camera (IMX662, Sunplus UVC bridge)
| Field | Value |
|-------|-------|
| **Sensor ** | Sony IMX662 per the seller (1/2.8", STARVIS 2, low-light); the USB bridge does not report it |
| **USB ID ** | `1bcf:2d4f` (Sunplus Innovation Technology, "USB Camera 1080P"), USB 2.0 high-speed |
| **Purpose ** | Camera for the Orin: recording, live view on the tablet, later inference (roles open; see project-yukart roadmap, Phase 5) |
| **Interface ** | UVC (`uvcvideo` , `/dev/video0` ) + UAC microphone (ALSA card `U1080P` , 48 kHz stereo). In-tree drivers, no setup |
| **Formats ** | MJPEG up to 1920× 1080 at 60 fps nominal; YUYV only at low rates (5 fps at 1080p). **No H.264 ** |
| **Documentation ** | None beyond the seller's listing; facts from the device: [USB camera report ](impl/reports/USB-CAMERA.md ) |
### Notes
- Delivered frame rate follows the light: 17– 20 fps indoors with auto exposure, full rate with a short fixed exposure.
- MJPEG is ~245 KB per 1080p frame, ~7.3 MB/s at 30 fps; too much for the tablet link (~5 MB/s) or for recording. The Orin Nano has
**no hardware video encoder ** ; software H.264 (`x264enc` ultrafast) costs ~1.3 cores at 19 fps, ~2 at 30.
- Shares the carrier board's internal USB 2.0 hub with the SIM7600; headroom is ample.
- UVC controls (exposure, white balance, power-line frequency) reset on re-enumeration; set them when opening the device.
2026-10-11 23:55:28 +09:00
## WitMotion WT61 IMU
2026-10-12 15:25:39 +09:00
**Status: shorted on first power-up (2026-10-12) ** , on Dupont wires, after the move from smart-serow; cut off quickly. Cause unknown; whether the module still works is untested.
2026-10-11 23:55:28 +09:00
| Field | Value |
|-------|-------|
| **Manufacturer ** | WitMotion |
| **Model ** | WT61: 6-axis accelerometer + gyroscope, with onboard angle fusion (roll, pitch, yaw) |
| **Purpose ** | Motion data for the recordings: longitudinal and lateral g, yaw rate, road grade |
| **Interface ** | TTL UART on the 40-pin header: **UART1, `/dev/ttyTHS1` ** (free: no console or getty on it). The header I²C stays free for other sensors |
| **Protocol ** | 11-byte packets, `0x55` header: accel `0x51` , gyro `0x52` , angle `0x53` , each three int16 values + temperature + checksum. Reference: smart-serow `arduino/IMU.md` |
| **Rate ** | Planned 115200 baud / 100 Hz (factory default) |
2026-10-12 15:25:32 +09:00
| **Power ** | 3.3 V from header pin 1. Datasheet v24-0429: 3.3– 5.5 V, **5 mA ** working (5 V), 39 µA asleep; data valid ~1 s after power-up |
2026-10-11 23:59:28 +09:00
| **Range ** | ±16 g, ±2000 °/s; roll and yaw ±180°, pitch ±90°. No magnetometer |
2026-10-12 15:25:32 +09:00
| **Datasheet ** | v24-0429: `/mnt/wdelem/dropzone/WT61-datasheet-240429.pdf` . Older: `~/infra/kb/inbox/engineer/raw/WT61_Datasheet.pdf` (raw, not yet in the KB) |
| **Module pins (bare module, 12 pads) ** | 2, 11 VCC · 5, 8 GND · 3 RX · 4 TX · 6 SWIM (programming) · 1, 7, 9, 10, 12 not connected. A breakout board's labels take precedence |
2026-10-11 23:55:28 +09:00
### Wiring (40-pin header)
| WT61 | Header pin |
|------|------------|
| VCC | 1 (3.3 V) |
| GND | 6 |
| TX | 10 (UART1 RX) |
| RX | 8 (UART1 TX), needed only to send config commands |
2026-10-12 15:33:58 +09:00
| * Realign button (optional) * | 7 (GPIO09, `PAC.06` ) through the button to ground on 9; 100 kΩ from 7 to 3.3 V (pin 1 or 17) |
2026-10-12 00:04:52 +09:00
Everything sits in header pins 1– 10, so one 2× 5 connector can carry it. Pins 3/5 (I²C bus 7) carry the UPS monitor.
2026-10-11 23:55:28 +09:00
2026-10-12 15:33:58 +09:00
Header facts (carrier board spec SP-11324-001 v1.3, Table 3-3 and 5-3; raw copy in `/mnt/wdelem/dropzone/` ):
- All signals are 3.3 V. Pins 7, 8 and 10 pass through **TXB0108 level translators ** : their outputs are very weak (±20 µA) and can be
overdriven, and **any pull-up or pull-down on them must be weaker than 50 kΩ ** (I²C excepted). Hence 100 kΩ for the button, not 10 kΩ.
- 3.3 V on the header: 1 A per pin, but **0.1 A in total ** for the header from `VDD_3V3_SYS` . 5 V: 0.5 A in total.
- Pin 8 (UART1 TX) is also a boot strap (`BOOT2_STRAP` ): nothing should drive it while the board powers up. The WT61's RX is an input,
so it does not.
- Pin 7 is `PAC.06` (gpiochip0 line 144), pulled down on the module at power-on.
2026-10-12 15:35:21 +09:00
- UART1 verified after the WT61 short (2026-10-12): loopback with pin 8 jumpered to pin 10, 1024 bytes intact at 9600 and 115200 baud.
2026-10-12 15:33:58 +09:00
2026-10-11 23:55:28 +09:00
### Notes
2026-10-11 23:59:28 +09:00
- **The header is 3.3 V logic and not 5 V tolerant.** Powering the module at 3.3 V keeps every signal at 3.3 V. The datasheet only says
"TTL level", so if it is ever fed 5 V, first check that its idle TX reads ~3.3 V.
2026-10-11 23:55:28 +09:00
- Power comes from the header's 3.3 V supply pin (1 or 17), a regulated rail on the carrier board. Not from a GPIO: a GPIO pin is a signal
and is not meant to power anything.
- The module stores its baud rate and output rate in flash. Leaving smart-serow it is set to **9600 baud / 20 Hz ** . The reader opens at 9600,
sends `FF AA 63` (115200 / 100 Hz), and reopens at 115200. Commands at the wrong baud are ignored, so configuring on every start is safe.
- Mounting mode: `FF AA 65` flat, `FF AA 66` upright. Set it once the car mounting is known.
- Do not zero the accelerometer at startup the way smart-serow's `imu_calibrate()` does: that removes gravity, which tilt and grade need.
- The user needs the `dialout` group to open `/dev/ttyTHS1` .
2026-10-11 23:59:28 +09:00
- The temperature field is the chip's own temperature, not the air's: `raw / 340 + 36.53` °C per the datasheet (smart-serow's `IMU.md`
says 36.25).
- **The gyro zeroes itself at power-up**, and yaw resets to 0. The module must be still while it powers up; it is, if it powers with the
Orin at ignition and the car is parked.
- **Yaw drifts.** With no magnetometer, yaw is integrated gyro and holds only over short spans; use yaw * rate * , not absolute yaw. Roll and
pitch are referenced to gravity and do not drift.
- **Output is low-pass filtered at 10 Hz** by default, even at 100 Hz output. Fine for vehicle motion, but it smooths out bumps and
vibration. A gyro rate under 0.122 °/s reads as 0 (static threshold). Both are set only from WitMotion's PC software; there is no
serial command for them.
2026-10-12 15:33:58 +09:00
- **Realign button parts (optional, not fitted):** one momentary push button (normally open) and one 100 kΩ resistor. The resistor pulls
pin 7 up to 3.3 V, so the pin reads 1, and a press grounds it to 0. Weak on purpose: the pin sits behind a TXB0108 (see header facts);
check both states with `gpioget` once wired. Realigning starts from the tablet app first; the button adds a way
2026-10-12 15:12:03 +09:00
that works without the tablet, triggering the same command.
- **Realign:** a press levels the frame to gravity (the mounting rotation, from averaged accelerometer readings) and sends
2026-10-12 00:04:52 +09:00
`FF AA 52` to zero yaw. The result is stored on disk, not redone every drive. Refuse while moving (gyro or GPS speed); record raw data
plus a realign event, so a bad alignment can be corrected afterwards. Align on level ground: a slope becomes part of the mount.
2026-10-12 15:25:32 +09:00
- I²C mode (`FF AA 62` ) exposes the raw MPU6050 only (no angles) and needs 4.7 kΩ pull-ups. Not used; v24-0429 lists SDA/SCL as not connected.
2026-10-12 15:52:09 +09:00
- **Mounting matters more than the sensor.** An IMU needs a rigid path to the body; a box on carpet, Velcro or isolators smooths the motion
2026-10-12 15:54:17 +09:00
and drifts. **Decided (2026-10-12): the IMU lives outside the enclosure on one USB-A port **
(WT61 behind a 3.3 V USB-UART adapter now; a NEO-M8U over USB-C as the GNSS+IMU upgrade), mounted on the **roll cage ** , clamped close
to a foot or a joint rather than mid-span. The header wiring above stays valid but is no longer the plan. A fault in the sensor now
lands on a USB port (0.5 A limit) rather than the header's 3.3 V rail.
2026-10-12 15:25:32 +09:00
- **No reverse-polarity protection is documented.** A 4-way Dupont housing put on the wrong way round swaps VCC and GND. Check VCC and GND
with a meter before first power-up.
2026-10-11 23:55:28 +09:00
2026-10-08 09:24:33 +09:00
## RTC backup battery
2026-10-08 09:43:47 +09:00
**Status: optional, low priority. ** Battery choice settled (CR2032); footprint/R560 still to verify against NVIDIA's schematic.
2026-10-08 09:24:33 +09:00
| Field | Value |
|-------|-------|
| **Purpose ** | Keep the RTC (`rtc0` , `nvvrs-pseq-rtc` ) running while the board is unpowered, so the clock is correct at boot without network or GPS |
| **Carrier board ** | P3768 (Orin Nano Developer Kit): pads present, **connector not populated ** (needs soldering) |
| **Connector (per NVIDIA docs, as quoted on the forum) ** | Wieson AC2651-0011-003-HH, 2-pin, 1.25 mm pitch. A community-used substitute is Molex 53398-0271 header + 51021-0200 housing |
2026-10-08 09:43:47 +09:00
| **Battery ** | **CR2032 ** (primary 3 V lithium) in a holder with leads. **Not ML2032 or other rechargeables: ** the module datasheet says the backup pin (PMIC_BBAT) does not support charging, so a rechargeable just drains, and it has ~⅓ of the capacity |
| **Expected life ** | RTC draws 12– 50 µA while unpowered (~15 µA measured on the forum) → CR2032 (~220 mAh) lasts ~1.5– 2 years typical, ~6 months worst case. Drains only while the board has no power |
2026-10-08 09:24:33 +09:00
| **Extra parts ** | Forum reports also populating R560 (0.56 Ω, e.g. Panasonic ERJ2BQFR56X); confirm in the P3768 schematic |
### Notes
- Without it the clock boots at a stale date (seen 2026-10-08: June 4) until NTP syncs. See the [time sync report ](impl/reports/TIME-SYNC.md ).
- Forum sources: [RTC battery on Orin Nano DevKit ](https://forums.developer.nvidia.com/t/rtc-battery-on-jetson-orin-nano-developer-kit/296732 ), [How to add RTC battery ](https://forums.developer.nvidia.com/t/how-to-add-rtc-battery-in-jetson-orin-nano/255792 ).
- A reported side effect: the battery lead and socket make the case cover sit unevenly.
2026-10-08 09:43:47 +09:00
- Polarity: one forum post says the positive pad is marked with a white triangle. Confirm with a meter before connecting.
- Test after fitting: power off fully, wait a few minutes, boot with no network, and check `cat /sys/class/rtc/rtc0/date` (should be today, not a reset date).
- Low priority: online almost always means NTP within a minute; the gap only matters for offline drives (see the [time sync report ](impl/reports/TIME-SYNC.md )).