PicoDeliver
A robotic message and small item delivery system
Author: Sofiia Huzhan
GitHub Project Link: https://github.com/UPB-PMRust-Students/project-demesup
Descriptionβ
PicoDeliver is a robotic system that delivers messages and small items within a local area. Messages can be entered either through the device's display interface or via a web interface. The robot wanders around. When the recipient, and when they signal their presence through the website, the robot stops to deliver its payload.
Motivationβ
I built this because robots are cool. Thereβs something satisfying about making a machine move, react to sensors, and follow commands. Itβs like bringing code to life, and that never gets old.
But beyond just fun, I wanted something more personal than another phone notification. Why text my roommate "Whereβs the charger?" when a little robot could deliver the message instead? Itβs playful, practical, and a great way to learn.
Architectureβ
1. Raspberry Pi Pico (Pico #1)β
Role: Main microcontroller (brains of the operation)
Interfaces:
- GPIO (Digital I/O)
- SPI (for display)
- WiFi (TCP communication)
Functions:
- Reads inputs from sensors (IR, ultrasonic, buttons)
- Controls motors through the motor driver
- Displays data on the SPI screen
- Communicates with a web application
Connections:
- GPIO β Motor Driver (control signals)
- GPIO β IR Proximity Sensors, Ultrasonic Sensor, Buttons
- SPI β Display
- WiFi β Web App (bidirectional)
- Power Input β Battery (5V via Power Supply Module)
2. Motor Driver (L298N or compatible)β
Role: Amplifies control signals to drive motors
Interface:
- GPIO (from Pico)
- Vin (12V power input)
- Motor output channels
Functions:
- Converts low-power signals into high-current motor commands
- Controls motor direction and speed
Connections:
- GPIO β Pico (control pins)
- Vin β Battery (12V power input)
- Output β Left and Right Motors
3. IR Proximity Sensors (Left, Right and Rear)β
Role: Detects nearby objects for navigation or avoidance
Interface: GPIO
Functions:
- Emits IR light and senses reflections
- Provides distance indication
Connections:
- Signal β Pico GPIO
- Power and Ground β Power Supply
4. Ultrasonic Sensor (HC-SR04)β
Role: Measures distance to obstacles
Interface: GPIO (trigger and echo pins)
Functions:
- Sends ultrasonic pulse and receives echo
- Calculates distance based on echo time
Connections:
- Trigger β Pico GPIO
- Echo β Pico GPIO
5. Buttons (Red and Blue)β
Role: Manual input for control
Interface: GPIO (digital)
Functions:
- Allows easier interction with the robot
Connections:
- Signal β Pico GPIO
6. Display (SPI)β
Role: Provides visual feedback
Interface: SPI (MOSI, SCK, CS)
Functions:
- Displays sensor values, status indicators, menus, keyboard
Connections:
- SPI Lines β Pico
7. Web Appβ
Role: Enables remote control and monitoring
Interface: WiFi (TCP/IP)
Functions:
- Sends control commands to Pico
- Receives real-time sensor data
Connections:
- WiFi β Pico (TCP communication)
8. Power Suppliesβ
- Pico: Powered by a battery via Power Supply Module
- Motor Driver: Powered directly from 9V + 4Γ1.5V batteries
Logβ
Week 5 - 11 Mayβ
After receiving the components, I tested their functionality and researched compatible software libraries for my hardware setup. Once verified, I proceeded with system design.
Week 12 - 18 Mayβ
Focused on implementing the remote control functionality and integrating it with the display system. Developed the basic logic for the menu navigation and began working on the on-screen keyboard, including input handling and layout structuring.
Week 19 - 25 Mayβ
Focused on putting everything together: updated all layouts, verified that TCP communication works correctly, and made sure async tasks run smoothly without issues. Focus was on ensuring the system behaves as expected during integration.
Hardwareβ
Component Detailsβ
- Raspberry Pi Pico 2W: The brain of the operation, running all control logic
- DC Motors: 4 gearmotors providing wheel movement (2 per side)
- L298N Driver: Powers and controls motor speed/direction
- Infrared Sensors: Left/right/rear obstacle detection (reflectance sensors)
- Ultrasonic Sensor: Front-facing distance measurement (2cm-400cm range)
- TFT Display: 2.4" color screen with touch input for user interface
- Buttons: Physical input for selection
- Dupont Wires: Jumper cables for all electrical connections
- Chassis: Frame holding all components
- Power Supply Module: 9V battery to 5V regulator, powers up the components
- Motor Power Supply: Direct 9V battery connection(with 4Γ1.5V battery pack as boost power)

Schematicsβ
Here is the KiCad schematics. On the schematics Power Supply Module is denoted as +5V for simplicity
Bill of Materialsβ
| Device | Usage | Price |
|---|---|---|
| Raspberry Pi Pico 2W *2 | Microcontroller board | 39.66 RON each (79.32 RON total) |
| DC Motor (Γ4) | Wheel drive motors | ~7 RON each (28 RON total) |
| L298N Dual Motor Driver Module | Motor control | 10.99 RON |
| Infrared Obstacle Sensor (Γ3) | Object detection | 3.49 RON each (10.47 RON total) |
| HC-SR04 Ultrasonic Sensor | Distance measurement | 6.49 RON |
| 10cm Dupont Wires (40-pin) | Short connections | 5.17 RON |
| 20cm Dupont Wires (40-pin) | Long connections | 5.99 RON |
| 2.4" SPI TFT Display | User interface | 47.99 RON |
| Buttons(Γ2) | Option selection | 1.99 RON each (3.98 RON total) |
| Chasis | Base for the robot | 30 RON |
| Power Supply Module | Power Supply | 4.69 RON |
Softwareβ
| Library | Description | Usage |
|---|---|---|
| embassy-rp | RP2040 HAL and Embassy support | Hardware abstraction, peripheral and SPI management, async runtime |
| embassy-embedded-hal | Embedded HAL traits and utilities | Provides hardware abstraction traits for Embassy |
| embassy-sync | Async synchronization primitives | Mutexes, signals, and shared state between async tasks |
| embassy-executor | Async/await executor for embedded | Runs async tasks and manages concurrency |
| embassy-futures | Utilities for async/await and futures | Used for select, join, and other async combinators |
| embassy-time | Timekeeping, delays, and timers | Delays, timeouts, and scheduling |
| embassy-net | Embedded network stack | Handles TCP/UDP networking and DHCP for WiFi |
| cyw43 | WiFi chip driver | Provides WiFi connectivity for the RP2040 |
| defmt, defmt-rtt | Logging and debug output | Efficient logging for embedded systems |
| cortex-m-rt | Cortex-M runtime support | Startup and interrupt vector table |
| panic-probe | Panic handler for probe-run | Handles panics and outputs debug info |
| embedded-graphics | 2D graphics library | Drawing UI elements on the display |
| display-interface-spi | SPI interface for displays | SPI communication with the ILI9341 display |
| display-interface | Display interface abstraction | Used by display drivers |
| heapless | Fixed-capacity data structures | Used for message buffers and queues |
| embedded-hal-1 | Embedded HAL traits | Hardware abstraction for drivers |
| embedded-io-async | Async IO traits | Async communication with peripherals |
| static_cell | Statically allocated runtime-initialized cell | Used for safe static initialization of peripherals |
| embedded-storage | Traits for non-volatile storage | Access to non-volatile storage |
| ili9341 | ILI9341 display driver | Controls the TFT display |
| xpt2046 | XPT2046 touchscreen driver | Handles touchscreen input |
| embassy-lab-utils | Project-specific utilities | Shared helpers and abstractions for this project |
Linksβ
- Inspiration: Delievery robots