
Controller
StuckAtPrototype/Racer
These are structured into their own files. I could have used submodules, but decided against it.

Design and software for a four-wheeled (tracked) mobile robot. Real-time firmware running on STM32H755, high-level control via ROS 2 Humble on NVIDIA Jetson Nano, custom motherboard designed in KiCad, and mechanical…
PCBV2 is an open-source printed circuit board by bejekk, from the bejekk/mobile-robot repository on GitHub. It is a 4-layer board of 115 × 175 mm with 66 parts on 166 nets, routed with 674 tracks and 28 vias.
It is built around the LTSR 6-NP. Its parts include 26 capacitors, 5 ICs, 4 resistors, 2 diodes and 2 fuses.
Available languages: English | Polski
Design and software for a four-wheeled (tracked) mobile robot. Real-time firmware running on STM32H755, high-level control via ROS 2 Humble on NVIDIA Jetson Nano, custom motherboard designed in KiCad, and mechanical models for gearboxes and chassis.
Author: Błażej Kruszka, Nicolaus Copernicus University in Toruń, 2025–2026.
gamepad → ROS 2 (Jetson) → UART 115200 → STM32H755
│ │
└── /telemetry ← PI velocities ← DC encoders, PWM, A4988| Directory | Contents |
|---|---|
firmware/ | STM32CubeIDE project (dual-core STM32H755ZITX), clean without build artifacts |
ros2_ws/ | robot_control package + Dockerfile |
pcb/ | KiCad (schematic, PCB, Gerber) |
mechanical/ | STL models and Fusion 360 archive |
control/ | MATLAB script for PI controller identification |
docs/ | Thesis, presentation, UART protocol specification |
No working notes, CubeIDE dumps, KiCad backups, videos, or external works are stored here.
Open the firmware/ directory in STM32CubeIDE (the dual-core project is named jakie_wyjscia — as generated by CubeMX). Build the CM7 Debug configuration as well as CM4 if dual-core booting needs to be preserved.
User application files:
firmware/CM7/Core/Src/PI.c — encoder velocity measurement, filter, and PI controller with ramp and anti-windupfirmware/CM7/Core/Src/motor_control.c — PWM + H-bridge direction control, stepper sleep/dir handlingfirmware/CM7/Core/Src/main.c — UART parser, 10 ms control loop, telemetryAfter reset, the STM32 waits for the ready command (buzzer signal) before accepting velocity and stepper motor setpoints.
Requirements: ROS 2 Humble, python3-serial, inputs package.
cd ros2_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch robot_control robot.launch.pyThe UART port can be overridden using the stm_bridge node parameter:
ros2 run robot_control stm_bridge --ros-args -p port:=/dev/ttyACM0 -p baudrate:=115200cd ros2_ws
sudo docker build -t robot_control:humble .
xhost +local:root
sudo docker run -it --rm --network host \
--runtime nvidia \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
--device /dev/input/js0 \
--device /dev/ttyACM0 \
robot_control:humbleInside the container: source /home/ros_user/ws/install/setup.bash && ros2 launch robot_control robot.launch.py.
control/pi_identification.m sends a sequence of lspeed/rspeed step inputs and plots the setpoint vs. measured response for all four wheels. Configure portName to your serial port (COM18 on Windows, /dev/ttyACM0 on Linux).
KiCad 8 project: pcb/PCBV2.kicad_pro. Production Gerbers are located in pcb/gerber/. Schematic preview: pcb/PCBV2.pdf.
See docs/uart.md.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 24 | 100nF | Capacitor_SMD:C_0805_2012Metric | C1, C2, C10, C11, C12, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24 +8 |
| 8 | Conn_01x04_Pin | Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical | LeftBack_enc1, LeftFront_enc1, RightBack_enc1, RightFront_enc1, StepMot_LB1, STEPMOT_LF1, StepMot_RB1, StepMot_RF1 |
| 8 | ~ | Connector_PinSocket_2.54mm:PinSocket_1x02_P2.54mm_Vertical | BackB_output1, bat_7V_ac1, bat_7V_dc1, bat_12V_back1, bat_12V_front1, BazkB_output1, FrontA_output1, FrontB_output1 |
| 4 | 3.2K | Resistor_SMD:R_0805_2012Metric | R1, R2, R3, R4 |
| 4 | LTSR6-NP | Sensor_Current:LEM_LTSR-NP | U2, U4, U5, U6 |
| 4 | Pololu_Breakout_A4988 | Module:Pololu_Breakout-16_15.2x20.3mm | leftB1, leftF1, rightB1, rightF1 |
| 2 | 100uF | Capacitor_SMD:C_0805_2012Metric | C5, C13 |
| 2 | D_Filled | Diode_SMD:D_0805_2012Metric | D1, D2 |
| 2 | Fuse | Fuse:Fuseholder_Cylinder-5x20mm_Schurter_0031_8201_Horizontal_Open | F1, F2 |
| 2 | LM2940T-5.0_NOPB | Package_TO_SOT_THT:TO-220-3_Vertical | sabilizator_adc1, sabiliztor_dc1 |
| 2 | TB6612FNG | TB6612:SHIELD_POLOLU-713 | Back1, Front1 |
| 1 | UART1 | Connector_PinSocket_2.54mm:PinSocket_1x03_P2.54mm_Vertical | UART1 |
| 1 | UART2 | Connector_PinSocket_2.54mm:PinSocket_1x03_P2.54mm_Vertical | UART2 |
| 1 | zworaGND | Resistor_SMD:R_0201_0603Metric_Pad0.64x0.40mm_HandSolder | J1 |
| 1 | ~ | STM32_NUCLEO:STM32H755 | U1 |
It measures 115 × 175 mm and has 4 copper layers, 1.6 mm thick.
66 parts, built around the LTSR 6-NP. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the bejekk/mobile-robot repository on GitHub, at the commit this page was made from: the board is pcb/PCBV2.kicad_pcb and its schematic pcb/PCBV2.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask bejekk before reusing the design.

StuckAtPrototype/Racer
These are structured into their own files. I could have used submodules, but decided against it.

hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

MicroCoreLabs/Projects
Ted Fried's MicroCore Labs Projects - FPGA CPU cores and emulators for the 8088, 8086, 8051, 6502, 68000, Z80, Risc-V, and also Typewriter and EPROM Emulator projects.



CRImier/MyKiCad
My KiCad boards. Can't be bothered uploading individually anymore, so here you go.

magkopian/raspberry-pi-compute-module-base-board
Base board for the Raspberry Pi Compute Module

lucanastasio/PCIexpress-KiCad
PCI express libraries and templates for KiCad