GuitarE Tuner
A real-time guitar tuner using FFT on the Raspberry Pi Pico W
Author: Yelyzaveta Basiuk
GitHub Project Link: https://github.com/UPB-PMRust-Students/project-yomotoua
Descriptionβ
This project is a digital guitar tuner that captures audio signals through a microphone, processes the signal using Fast Fourier Transform (FFT), and displays the nearest musical note in real time. It runs on a Raspberry Pi Pico W using Rust.
Motivationβ
I recently started learning how to play guitar, and I thought it would be fun and useful to build a tuner myself. I'm also just getting into embedded systems and Rust programming, so this project is a way to explore both while building something real. Itβs a learning experience where I get to combine simple electronics, sound processing, and coding.
Architectureβ
The diagram above shows the overall system architecture of the guitar tuner.
Architecture Detailsβ
Raspberry Pi Pico Wβ
Role: Reads the analog signal from the microphone, processes the signal using FFT to extract the frequency, handles note selection from button input, controls the display, and manages LED output.
Connections:
- ADC pin for microphone input
- GPIO pins for button inputs
- GPIO pins for LEDs
- I2C for the LCD display
- Powered via USB or regulated 5V from a battery
Microphone Module (Analog)β
Interface: ADC
Role: Captures the sound produced by the guitar strings and converts it to an analog signal.
Connections:
- Signal output connected to ADC pin
- Powered with 3.3V and GND
Push Buttons (x2)β
Interface: GPIO
Role: Used to scroll left/right through available tuning notes (E, A, D, G, B, e).
Connections:
- Each button connected to a GPIO pin
- Configured with pull-up/pull-down resistors and interrupts
LEDs (x6)β
Interface: GPIO
Role: Indicates which note is currently selected by lighting up the corresponding LED.
Connections:
- Connected to GPIO pins
- Each with a 220Ξ© current-limiting resistor
LCD Display (I2C)β
Interface: I2C
Role: Displays the detected frequency, and a tuning status indicator (flat / in tune / sharp).
Connections:
- SDA, SCL
- Powered from vbus and GND
Power Supplyβ
Interface: USB or battery + regulator
Role: Provides power to the whole system.
Connections:
- USB via micro-USB (for development)
- Optional 9V battery connected via voltage regulator (outputting 5V)
Logβ
Week 5 - 11 Mayβ
This week I finalized the basic design for the project and gathered all the necessary components. I focused on checking that everything works correctly and started outlining the system architecture. I also worked on the initial documentation. I began testing the microphone to see if I can get a stable signal through the ADC. If that works, Iβll move on to the next steps in signal processing and note detection.
Week 12 - 18 Mayβ
Week 19 - 25 Mayβ
Hardwareβ
The system is built around a Raspberry Pi Pico W. It uses an analog microphone to capture the guitar sound, two push buttons to select the target note, and LEDs to indicate which note is currently selected. A small LCD display shows the detected frequency and tuning status. The project is powered by a 9V battery with proper voltage regulation for portability.
Fig.1 β Prototype setup on breadboard
Fig.2 -
Schematicsβ
Fig.3 β Initial Schematic
Bill of Materialsβ
Device | Usage | Price |
---|---|---|
Raspberry Pi Pico W | The microcontroller | 35 RON |
Amplificator Microfon MAX9814 | Captures guitar sound | ~10 RON |
I2C LCD Display | Displays selected note and detected frequency | ~25 RON |
Push Buttons x2 | Used to select target note | ~0.35 RON |
LEDs x6 | Indicate selected note | ~3 RON |
Resistors & Breadboard Wires | For basic circuit setup | ~15 RON |
9V Battery + Holder | Power source | ~8 RON |
Softwareβ
Library | Description | Usage |
---|---|---|
embassy | Async embedded framework for Rust | Used for async task management, timers, and peripherals |
microfft | Lightweight FFT implementation | Used to extract frequency from microphone input |
hd44780-driver | LCD driver for HD44780-compatible screens | Used to display detected frequency and note |
defmt | Embedded logging crate | Used for debugging and printing ADC/frequency values |
libm | Math library for no_std environments | Used for floating-point math in signal processing |
num-complex | Complex number support | Used to work with FFT results from microfft |