Executive Summary

BoRider is an instructional robotic platform designed for children aged 6 to 24 months. The project’s core objective was to create a vehicle guided entirely by capacitive touch, allowing a child to direct movement (Forward, Backward, Left, Right) by interacting with the smooth exterior of the chassis.

Tech Stack: Python, Sensor Fusion, Visual Feedback, Audio Engine, 3D Printing, Advanced Materials, Drivetrain.
Documentation: View Source Code on GitHub


System Architecture

BoRider is an instructional robotic platform designed for children aged 6 to 24 months including three modes as the child grows - Manual (Implemented), Instructional (Planned), and Catch-Me (Planned) modes.

1. Hardware Integration & UI

The system is powered by a Raspberry Pi utilizing a distributed multi-processing Python architecture to handle simultaneous telemetry and I/O.

Internal Capacitive Sensor Array

2. Design Constraints & Additive Manufacturing

3. Operational Architecture

Post-Mortem Mechanical-to-Electrical Failure

During high-load stress testing, a 3D-printed drive gear on the main axle experienced mechanical slippage. While performing live troubleshooting on the electrical harness to compensate for the torque loss, an accidental short circuit occurred between the positive and negative power rails. The resulting hardware failure served as a critical validation for the implementation of fused power distribution and reverse-polarity protection in future rapid-prototyping iterations.

# Core logic snippet: Multi-threaded Architecture for Non-Blocking Operations
def main():
    logger.msg('code.py', 'main()', "PROGRAM START")
    
    # Fix: Pass function reference, don't execute it
    p_low_led = Process(target=leds.turn_all_on_low_white)
    p_low_led.start()
    
    is_music_playing = False

    while True:
        try:
            sensor_touched = touch.main()
            logger.msg('code.py', 'main()', "INSIDE LOOP")
            
            if sensor_touched == 'error':
                reset_system(p_low_led)
                is_music_playing = False
                continue  # Jumps back to the top of the while loop safely

            if not is_music_playing:
                is_music_playing = True
                logger.msg('code.py', 'main()', "STARTING AV SUBSYSTEMS")
                
                # Ideally, leds.main() should be non-blocking
                Process(target=leds.main).start() 
                audio.main(category='background_music')
                time.sleep(1)
            pan_distance = abs(pan_error)
            # Apply movement logic to PCA9685 via I2C