
Fatdrive
bubbajfett/kicad-guitar-pedals
collection of guitar pedal PCB layouts in kicad

A not-too-simple tracked robot with autonomous navigation and sensor-driven obstacle avoidance, written in Rust with Embassy. v2 reached the limits of its hardware platform; development continues in a new repository.
Simple robot is an open-source printed circuit board by 1-rafael-1, from the 1-rafael-1/simple-robot repository on GitHub. It is a 4-layer board of 100 × 100 mm with 70 parts on 92 nets, routed with 1,065 tracks and 173 vias.
It is built around the CD4049UBD and 10UF 10V. Its parts include 26 capacitors, 17 connectors, 11 resistors, 3 diodes and 2 ICs. It belongs with the robots and motor control and sensors and measurement boards and the RP2350 boards of this library.
A not-too-simple tracked robot with autonomous navigation and sensor-driven obstacle avoidance, written in Rust with Embassy. v2 reached the limits of its hardware platform; development continues in the follow-up explorer-robot repository.
Side view showing the robot's profile — the v2 iteration.
This started out as a hobby project for my 10-year-old son, who wanted me to build a robot for him. The thing started as a rather simple machine (v1) and then I got a little carried away. Check out the v1-robot navigating autonomously, download the demo video here: Autonomous Operation.
Note: The initial version of this robot is preserved in the
v1tag. That version represents a simple but functional obstacle-avoiding robot using basic components. The v2 iteration described here is taggedv2and is now mothballed.
In v1, the robot could move autonomously by avoiding obstacles in a very simple way. That meant driving straight until an obstacle is detected, back up a little and then make a random turn. It was fun to watch and my son was happy with it.
v2 set out to be much more capable. The plan was to add spatial awareness through an IMU and a sweeping ultrasonic sensor, build more sophisticated autonomous navigation modes, and eventually integrate an AI camera module for follow-me and object-finding. Some of that worked out; some of it ran into hardware limits that couldn't be solved on this platform.
People have pointed out to me various things. The gist is that there are of course ready-made chassis solutions, ready-made RTOS for robotics and even probably complete systems available and that I am setting out to solve things that can be solved with much less effort by using existing things in code as well as hardware. This is all true and I do not dispute it. My motivation is different, though: I am not truly that much interested in having the actual robot, I have no use case at all for it, in fact. I just truly enjoy the process of building, figuring out how to do things, learning a ton of new stuff and it passes my rare spare time in a rewarding way.
The v2 firmware is a fully integrated platform built on Embassy async with a task-oriented architecture. A central orchestrator runs an event loop, dispatching sensor events to behavior handlers and UI updates. The drive subsystem uses a single-producer command queue with intents for distance drives, in-place rotations, and brake/coast settling — all with IMU-corrected feedback and ramp-down near targets. Mode-agnostic obstacle detection triggers emergency braking across all modes.
The robot carries a custom 4-layer PCB designed in KiCad, hand-soldered, with an RP2350 at 150 MHz. It drives four TT motors through two TB6612FNG motor drivers, reads four hall-effect encoders, and runs an ICM-20948 9-axis IMU with on-chip DMP sensor fusion. An HC-SR04 ultrasonic sensor on a servo performs 0–160° sweeps with a 30° cone correction algorithm, feeding a shared sweep buffer used by both the OLED's radar visualization and the autonomous navigation modes. Two front-facing IR sensors provide close-range collision detection, and a PCA9555 I2C port expander handles motor direction/standby pins and additional inputs. An RGB LED indicates battery state and obstacle alerts.
The UI is driven by an EC11 rotary encoder with push button and an SSD1306 OLED display. A menu system exposes hardware tests (motors, encoders, IMU, ultrasonic sweep, drive accuracy), calibration routines (motor speed, IMU, distance factor), and autonomous mode selection. Calibration data persists to flash storage.
Two autonomous modes are implemented:
Three side-quest crates were published along the way: hcsr04_async (async HC-SR04 driver), moving_median (moving median filter), and icm20948-rs (ICM-20948 driver with DMP support).
The robot works, but it cannot reach the spatial awareness and navigation precision the original vision demanded. Several hard limits converge:
Spatial awareness is the primary bottleneck. The HC-SR04 ultrasonic sensor, even with servo sweeping and cone correction, is fundamentally imprecise. Its 30° detection cone could have been overcome algorithmically, but it produces false readings far too easily — a carpet, a floor tile seam, or a slightly textured surface registers as an obstacle. That makes reliable navigation impossible. The front-facing IR sensors work but have very short range and would require redesigning the sensor array holder to be truly useful. There is no downward-facing sensor to detect stairs or ledges.
The board is out of pins. The RP2350 on a Pico 2, even with a PCA9555 port expander, has every pin in use. There is no room to add a downward edge sensor, a better spatial sensor, or anything else. Some of those pins are spent on RC receiver inputs and a UART for an AI board that were never fully utilized, and on four motor encoders and two motor driver modules — overhead that a two-motor design would eliminate.
Four TT motors reach a precision ceiling. Two motors per track were necessary to move the Proto-Tank chassis, but that doubled the encoder and PWM pin count. The cheap hall-effect encoders and the inherent variability of TT motors mean no amount of calibration will deliver the positional accuracy needed for reliable dead-reckoning navigation.
The I2C bus is shared between the IMU, the OLED display, and the port expander. Motor direction changes go through the expander on that same bus. This never caused a hard failure in testing, but it is a fragile design with no headroom.
None of these are software problems. They are hardware constraints of a design that started from a simple tank chassis and grew organically. v2 went as far as it could on this platform.
Development continues in the follow-up explorer-robot repository. I am not yet sure where this will go, but the plan is to build a more capable robot with better spatial awareness and navigation precision.
This project uses multiple licenses depending on the component:
src/, build.rs, Cargo.toml, etc.): Licensed under MIT License (see LICENSE-MIT.md)misc/chassis/): Based on the Proto-Tank Chassis by fustyles, licensed under CC BY-SA 4.0 (see attribution below)misc/media/schematic_picture.png): Licensed under CC BY-SA 4.0 (see LICENSE-CC-BY-SA-4.0.md)docs/, README.md): Licensed under CC BY-SA 4.0Please review the individual license files and attribution sections for detailed information.
You can find the KiCad project here: misc/KiCad/simple-robot. Some of the boards I used had no symbols & footprints and so I created them as I went. You can find them here: misc/KiCad/symbols. The Pi Pico symbol I found online here: ncarandini/KiCad-RP-Pico.
The v2 schematic (current design)
The v2 PCB layout (current design)
The robot chassis and various mounting components are designed to be 3D printed. I printed all parts in PLA and they worked quite okay so far. The 3D models are stored in the misc/chassis directory with both FreeCAD source files (.FCStd) and print-ready formats (.3mf, .stl).
For convenient printing with a Bambu Lab 3D printer, two Bambu Studio print projects are included:
The individual component files are also available if you prefer to customize your print settings:
For more details on the chassis components, file formats, and assembly, see misc/chassis/README.md.
Building the thing I found no async driver for the HC-SR04, so I had to make one myself:
This was fun :-)
Testing the ultrasonic sensor I found it gets even more unreliable when moving. So I searched for some moving median filtering solution, found none and made one myself:
A little less fun.
I replaced the initial MPU9250/MPU6050 I never truly got to work with the ICM20948, a more modern 9-axis IMU from the same manufacturer (TDK InvenSense). The ICM20948 offers better performance and I created a driver for it:
The driver supports async I2C operations and includes examples for RP2350. This was to a degree vibe-coded because that is truly out of my league, but it seems to work okay so far. I am sure there are many things that could be done better, but it is a start and I can now get good orientation data from the IMU, which is a big step forward for the project.
The code is written in Rust and makes heavy use of the Embassy framework. The architecture is task‑oriented, with a central orchestration loop handling events and routing them to behavior modules. Tasks stay resident and idle when not needed, which keeps the control flow predictable and makes it easy to evolve the system.
The drive subsystem is explicitly single‑producer/single‑executor: higher‑level modes build queues of drive steps, submit them to the drive queue executor, and await a single queue completion. Per‑step completion is internal to the executor, and interrupts remain available for preemption.
There are two modules, system and task. The system module contains rather general things like the event system and state. The task module contains the tasks that are run by the system.
The global state is split into domain-specific modules under system/state/* to reduce contention and keep hot paths lock-free where possible:
system/state/power.rssystem/state/motion.rssystem/state/perception.rssystem/state/calibration.rsUI mode state lives in task/ui/state.rs (via UI_STATE) and is kept separate from the system state lock order.
When multiple state mutexes must be held at the same time, a uniform lock order is required to avoid deadlocks:
POWER_STATECALIBRATION_STATEPERCEPTION_STATEMOTION_STATEThe main.rs file is the entry point of the program but does nothing besides initializing some resources and then spawning all the tasks.
The firmware uses both cores of the RP2350 at the nominal 150 MHz clock speed: core0 runs the orchestrator, drive subsystem, sensors, and UI; core1 owns the I2C bus and runs the display, IMU, and port expander tasks. It uses a few percent of the flash space and about 20% of the RAM. The single I2C bus is shared between the IMU, the OLED display, and the port expander — this never caused issues in testing, but it is a tight design with no room for additional devices.
The robot's tracked chassis is based on the Proto-Tank project, which is licensed under Creative Commons Attribution 4.0 International.
The Proto-Tank design has been modified and adapted for the simple-robot project to integrate custom motor mounts, PCB solutions, and sensor integration.
See misc/chassis/ATTRIBUTION.md for full attribution details and license information.
I am a hobbyist, I have no formal electronics education and am still relatively new to the hobby (2.5 years now). I am also still as new to Rust and Embedded. By now I have a basic understanding of how things work and of what are higher level things in embedded. Enough for maker-level, far off from actual professional level. So expect imperfections.
I use AI when coding, which has proven to be an excellent teaching tool for learning a new language. It allows me to explore more advanced concepts than I could on my own, making self-teaching much easier than it was just a year or two ago. That being said: The code is my take on how to do this, actual professionals will find a thousand things one could do better. In case you find a thing that could be better: Happy to hear about it, get in touch! :-)
The following is a summary of the components used in the v2 schematic (see KiCad project).
| Ref | Component | Notes |
|---|---|---|
| U1 | Raspberry Pi Pico 2 (RP2350) | Main controller |
| Ref | Component | Notes |
|---|---|---|
| I1 | ICM-20948 module | 9-axis IMU (accelerometer, gyroscope, magnetometer), I2C |
| J11 | HC-SR04 ultrasonic sensor | Connected via JST 4-pin, with servo sweeper |
| J12, J13 | IR obstacle detection sensors (×2) | Right-front and left-front |
| J14 | Grove Vision AI v2 | Camera/AI module, JST 4-pin |
| Ref | Component | Notes |
|---|---|---|
| MD1, MD2 | TB6612FNG motor driver carriers (×2) | Left track & right track |
| J6–J9 | Motor encoders (×4) | LF, LR, RF, RR via JST 3-pin |
| J1, J2, J4, J5 | DC motor connectors (×4) | JST 2-pin |
| Ref | Component | Notes |
|---|---|---|
| P1 | PCA9555 I2C port expander | 16-bit GPIO expander |
| LS_1, LS_2, LS_3 | Bi-directional level shifters (×3) | 3.3V ↔ 5V |
| U2 | CD4049UB | Hex inverting buffer (DIP-16) |
| Ref | Component | Notes |
|---|---|---|
| OLED1 | SSD1306 OLED display module | I2C |
| SW1 | Rotary encoder with push switch | User input |
| LED1 | 5mm RGB LED (common cathode) | Status indicator |
| — | RF receiver | Remote control, via JST 3-pin |
| Ref | Component | Notes |
|---|---|---|
| B1 | LM2596 DC-DC buck converter module | Steps battery voltage down |
| J10 | Screw terminal (2-pin) | Battery input |
| D1, D3 | 1N5819 Schottky diodes (×2) | Power path protection |
| Ref | Component | Notes |
|---|---|---|
| C2–C16, C19–C24, C26 | 100nF ceramic capacitors (×20) | Decoupling |
| C18 | 4700µF 16V electrolytic | Bulk decoupling (motors) |
| C1, C7 | 220µF polarized (×2) | |
| C17 | 220µF 10V | |
| C25 | 10µF 16V | |
| R2, R3 | 47Ω (×2) | |
| R5, R6 | 1kΩ (×2) | |
| R8 | 10kΩ | |
| R4, R7 | 20kΩ (×2) | |
| R10, R11 | 220Ω (×2) | LED current limiting |
| R9 | 330Ω | LED current limiting |
| Qty | Value | Footprint | References |
|---|---|---|---|
| 21 | 100nF_Ceramic | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mm | C2, C3, C10, C11, C12, C13, C14, C15, C16, C19, C20, C21, C22, C23, C24, C26 +5 |
| 3 | Level Shifter | common-hobby-things:Level shifter 4 bi-dir | LS_1, LS_2, LS_3 |
| 2 | 1N5819 | PCM_Diode_THT_AKL:D_DO-41_SOD81_P7.62mm_Horizontal | D1, D3 |
| 2 | 1k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R5, R6 |
| 2 | 20k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R4, R7 |
| 2 | 220ohm | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R10, R11 |
| 2 | 220uF | Capacitor_THT:CP_Radial_D6.3mm_P2.50mm | C1, C7 |
| 2 | 47ohm | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R2, R3 |
| 2 | MountingHole_Pad | MountingHole:MountingHole_3.7mm_Pad_Via | H1, H2 |
| 1 | 10k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R8 |
| 1 | 10uF_10V | Capacitor_THT:CP_Radial_D6.3mm_P2.50mm | C17 |
| 1 | 10uF_16V | Capacitor_THT:CP_Radial_D5.0mm_P2.00mm | C25 |
| 1 | 330ohm | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R9 |
| 1 | 3K3 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1 |
| 1 | 4700uF_16V | Capacitor_THT:CP_Radial_D16.0mm_P7.50mm | C18 |
| 1 | CD4049UB | Package_DIP:DIP-16_W7.62mm_LongPads | U2 |
| 1 | ENC_LF | Connector_JST:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J6 |
| 1 | ENC_LR | Connector_JST:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J7 |
| 1 | ENC_RF | Connector_JST:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J8 |
| 1 | ENC_RR | Connector_JST:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J9 |
| 1 | IR_LF | Connector_JST:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J13 |
| 1 | IR_RF | Connector_JST:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J12 |
| 1 | JST RF_Logic | Connector_JST:JST_EH_B4B-EH-A_1x04_P2.50mm_Vertical | J15 |
| 1 | JST RF_PW | Connector_JST:JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical | J16 |
| 1 | JST03 Servo | Connector_JST:JST_EH_B3B-EH-A_1x03_P2.50mm_Vertical | J3 |
| 1 | JSTHCSR04 | Connector_JST:JST_EH_B4B-EH-A_1x04_P2.50mm_Vertical | J11 |
| 1 | JST_GV | Connector_JST:JST_EH_B4B-EH-A_1x04_P2.50mm_Vertical | J14 |
| 1 | LED_5mm_RGB_Kcom_RKGB | PCM_LED_THT_AKL:LED_D5.0mm-4_RGB_Wide_Pins | LED1 |
| 1 | LM2596 Module | common-hobby-things:LM2596_Module | B1 |
| 1 | LeftTrack | common-hobby-things:TB6612FNG motor driver carrier | MD1 |
| 1 | MotLA | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J1 |
| 1 | MotLB | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J2 |
| 1 | MotRA | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J4 |
| 1 | MotRB | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J5 |
| 1 | Pico2 | PCM_SL_Development_Boards:raspberry_pi_pico_THT | U1 |
| 1 | Port Expander | common-hobby-things:PCA9555 Port Expander | P1 |
| 1 | RightTrack | common-hobby-things:TB6612FNG motor driver carrier | MD2 |
| 1 | RotaryEncoder_Switch | Rotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mm | SW1 |
| 1 | Screw_Terminal_2_P5.00mm | TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-2-5.0-H_1x02_P5.00mm_Horizontal | J10 |
| 1 | ~ | common-hobby-things:SSD1306 | OLED1 |
| 1 | ~ | common-hobby-things:ICM-20948-module | I1 |

bubbajfett/kicad-guitar-pedals
collection of guitar pedal PCB layouts in kicad

pscrespo/Morpheus-STM32
A small 3D printer controller board for use with a "blue pill" STM32F1 generic board. Inspired on http://reprap.org/wiki/SinapTec

TomasFilipCZ/PS4-USB-HEN-ESP32
ESP32-S2 as USB Flash disk emulation for loading GoldHEN for 9.00

Neil427/Speeduino-Hall-Trigger-Conditioner
Speeduino Hall sensor conditioner board with buffering

tobetter/3DPrinterShield
"3D Printer Shield" is a board to run 3D printer using ODROID single board computer, technically this board is designed to control the motor driver modules with TMC2209 (UART) or TMC2130 (SPI) through the on-board GPIO…

R-Mutura/AD_POWER_DEVICE
Highly integrated Single board Computer with RK3566


ddanila/Pico1715
Pico-based SD, RAM and controller replacement for Robotron PC 1715
It measures 100 × 100 mm and has 4 copper layers, 1.6 mm thick.
70 parts, built around the CD4049UBD and 10UF 10V. 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 1-rafael-1/simple-robot repository on GitHub, at the commit this page was made from: the board is misc/KiCad/simple-robot/simple-robot.kicad_pcb and its schematic misc/KiCad/simple-robot/simple-robot.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 1-rafael-1 before reusing the design.