Overview
Tutorials (17 lessons)
01 — Zephyr Introduction
West tool, board support, first blinky, and project structure
02 — STM32 → Jetson Pipeline
Full architecture: sensors → MCU → SPI → Jetson → ROS2
03 — ZBus Message Bus
Publish/subscribe inter-thread communication in Zephyr
04 — nanopb Protobuf
Protocol Buffers on bare metal — zero-allocation serialization
05 — SPI Slave + DMA
Double-buffered DMA transfers for zero-copy SPI slave
06 — DMA Deep Dive
Direct Memory Access: channels, cache coherency, chaining
07 — Jetson ROS2 Bridge
SPI master on Jetson + ROS2 publisher for sensor data
08 — SPI Protocol
Clock polarity, phase, frame format, and multi-device bus
09 — I2C Bus
Addressing, clock stretching, repeated starts, and Zephyr API
10 — CAN Bus
Controller Area Network: arbitration, frames, filters
11 — UART
Async serial: baud rate, framing, interrupt vs polling vs DMA
12 — Zephyr Threads
Multitasking: priorities, stacks, scheduling, and deadlines
13 — Kernel Services
Semaphores, mutexes, message queues, and work queues
14 — Devicetree
Hardware description, overlays, bindings, and macros
15 — Interrupts & GPIO
ISR design, NVIC priorities, GPIO callbacks, and debounce
16 — ROS2 Fundamentals
Nodes, topics, services, actions — the robot middleware
17 — Jetson Orin Hardware
GPU, DLA, pinmux, power modes, and thermal management
Exercises
01 — Zephyr Foundations
Build, flash, GPIO, shell, and first sensor reads
02 — I2C, CAN, UART Sensors
Multi-protocol sensor integration exercises
03 — ZBus + nanopb
Message bus patterns with protobuf serialization
04 — SPI Slave + DMA
Double-buffered DMA slave implementation
05 — Jetson + ROS2 + EKF
End-to-end: spidev → ROS2 → extended Kalman filter
06 — CAN + UART GPS
CAN bus encoder + UART NMEA GPS parsing
06a — CAN Encoder Frames
Receive and decode motor encoder CAN frames
07 — nanopb + RT + EKF
Bridge, Jetson RT setup, and EKF integration
07a — UART GPS NMEA
Ring-buffer NMEA parser with checksum validation
08 — Multi-Sensor Bridge
Fuse IMU + encoder + GPS over ZBus with nanopb encoding
09 — Jetson RT Profiling
RT-PREEMPT setup, SPI baseline, and latency profiling
Deep Dives (12 labs)
Overview
Deep-dive series structure and prerequisites
00 — Logic Analyzer Guide
Sigrok/PulseView setup for protocol debugging
01 — First Build & Debug
West build, flash with J-Link, and GDB session
02 — SPI First Frame
Capture and verify the first SPI slave frame on wire
03 — DMA + Cache Gotchas
D-cache invalidation, alignment, and corruption traps
04 — IMU I2C Reads
ICM-42688-P burst reads, FIFO, and timestamping
05 — 100 Hz SPI Bridge
Deterministic 100 Hz STM32 → Jetson SPI pipeline
06 — ROS2 IMU Publisher
Publish sensor_msgs/Imu from spidev with QoS tuning
07 — CAN Encoder Frames
Receive and decode wheel encoder CAN messages
08 — UART GPS NMEA
Ring-buffer NMEA parser with interrupt-driven UART
09 — ZBus + nanopb Bridge
Multi-sensor frame encoding for SPI transport
10 — Jetson RT Setup
RT-PREEMPT kernel, CPU isolation, and spidev baseline
11 — EKF Integration
End-to-end pipeline validation with robot_localization
12 — HardFault Decode
Decode Cortex-M fault registers and stack frames
Study Notes
Foundations Notes
Key takeaways from Zephyr basics
Sensors Notes
Protocol comparison and sensor integration patterns
ZBus + nanopb Notes
Message bus design patterns and protobuf tips
SPI + DMA Notes
Buffer management and timing analysis
Jetson + ROS2 Notes
Integration lessons and performance benchmarks