2026-10-14 21:42:24 +00:00
<!DOCTYPE html>
2026-10-18 00:38:48 +00:00
< html lang = "en" data-theme = "colorful" >
2026-10-14 21:42:24 +00:00
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
2026-10-18 00:19:21 +00:00
< title > Multi-Functional RC Controller (MFC) — Projects — Ertunç Özbay< / title >
2026-10-18 00:38:48 +00:00
< meta name = "description" content = "Engineering documentation, C99 ESP-IDF firmware, KiCad schematic downloads, and build commands for the ESP32-S3-N16R8 Multi-Functional RC Controller (MFC) by Ertunç Özbay." >
2026-10-14 21:42:24 +00:00
< link rel = "icon" type = "image/svg+xml" href = "../assets/images/favicon.svg" >
2026-10-18 00:38:48 +00:00
< link rel = "stylesheet" href = "../assets/css/style.css?v=2" >
2026-10-14 21:42:24 +00:00
< / head >
< body >
< a class = "skip-link" href = "#main-content" > Skip to main content< / a >
< header class = "site-header" >
< div class = "container header-inner" >
< a class = "site-brand" href = "../index.html" >
< span class = "brand-mark" aria-hidden = "true" > EÖ< / span >
< span >
Ertunç Özbay
2026-10-18 00:19:21 +00:00
< span class = "brand-subtitle" > embedded // hardware // open-source< / span >
2026-10-14 21:42:24 +00:00
< / span >
< / a >
2026-10-18 00:38:48 +00:00
< div class = "header-controls" >
< div class = "theme-switcher" role = "group" aria-label = "Select UI Theme" >
< button type = "button" class = "theme-btn" data-set-theme = "colorful" aria-pressed = "true" > 🎨 Colorful< / button >
< button type = "button" class = "theme-btn" data-set-theme = "neon" aria-pressed = "false" > 🌈 Neon< / button >
< button type = "button" class = "theme-btn" data-set-theme = "blueprint" aria-pressed = "false" > 📐 Blueprint< / button >
< / div >
< button class = "nav-toggle" type = "button" data-nav-toggle aria-expanded = "false" aria-controls = "primary-navigation" >
< span aria-hidden = "true" > ☰< / span >
< span data-nav-label > Menu< / span >
< / button >
< nav id = "primary-navigation" class = "site-nav" data-site-nav aria-label = "Main navigation" >
< ul class = "nav-list" >
< li > < a class = "nav-link" href = "../index.html" > Home< / a > < / li >
< li > < a class = "nav-link" href = "../about.html" > About< / a > < / li >
< li > < a class = "nav-link" href = "../projects/index.html" aria-current = "page" > Projects< / a > < / li >
< li > < a class = "nav-link" href = "../blog/index.html" > Blog< / a > < / li >
< li > < a class = "nav-link" href = "../lab.html" > Lab< / a > < / li >
< li > < a class = "nav-link" href = "../contact.html" > Contact< / a > < / li >
< / ul >
< / nav >
< / div >
2026-10-14 21:42:24 +00:00
< / div >
< / header >
< main id = "main-content" >
< div class = "container" >
< nav class = "breadcrumb" aria-label = "Breadcrumb" >
< a href = "index.html" > ← Back to Projects< / a >
< / nav >
< article >
< header class = "workshop-hero" >
< div class = "card-meta" >
2026-10-18 00:19:21 +00:00
< span class = "badge badge-progress" > Status: Rev 0.1 Carrier Built → Phase 2 Console Expansion< / span >
< span > Project 01 // ESP32-S3-N16R8 • 2.4 GHz RF • ESP-IDF C99< / span >
2026-10-14 21:42:24 +00:00
< / div >
2026-10-18 00:19:21 +00:00
< h1 > < span class = "gradient-title" > Multi-Functional RC Controller (MFC)< / span > < / h1 >
2026-10-14 21:42:24 +00:00
< p class = "hero-lead" >
2026-10-18 00:19:21 +00:00
A custom 2.4 GHz wireless transmitter and embedded control console powered by an < strong > ESP32-S3-N16R8< / strong > (Dual-Core LX7 @ 240 MHz, 16 MB Flash, 8 MB Octal PSRAM) and an < strong > nRF24L01+ PA+LNA< / strong > RF transceiver.
< / p >
< p class = "reading-width" >
Designed to serve as a universal handheld and desktop transmitter for external robotic platforms (such as my < a href = "rc-autonomous-vehicle.html" > 4WD RC & Autonomous Vehicle< / a > ) while integrating dual K-Silver Hall-effect joysticks, a 1.3" ST7789 IPS TFT display, MicroSD storage, and MAX4466 audio capture.
2026-10-14 21:42:24 +00:00
< / p >
< div class = "button-row" >
2026-10-18 00:38:48 +00:00
< a class = "btn btn-primary" href = "https://github.com/ertunc-ozbay/multi-functional-controller" rel = "noopener noreferrer" > 💻 View GitHub Repo< / a >
2026-10-18 00:40:30 +00:00
< a class = "btn btn-emerald" href = "../assets/downloads/mfc_esp32s3_firmware.c" download = "mmcontroller.c" > ⬇ Download Firmware (mmcontroller.c)< / a >
< a class = "btn btn-cyan" href = "../assets/downloads/mfc-1.kicad_sch" download = "mfc-1.kicad_sch" > 📐 Download KiCad Schematic (.kicad_sch)< / a >
< a class = "btn btn-secondary" href = "https://github.com/ertunc-ozbay/multi-functional-controller/archive/refs/heads/master.zip" > 📦 Repo (.zip)< / a >
2026-10-18 00:19:21 +00:00
< a class = "btn btn-youtube" href = "#poc-video" > 🎬 Watch PoC Video Slot< / a >
2026-10-14 21:42:24 +00:00
< / div >
< / header >
2026-10-18 00:19:21 +00:00
<!-- YouTube Proof - of - Concept Video Placeholder -->
< section id = "poc-video" class = "poc-video-section" aria-labelledby = "mfc-video-heading" >
< div class = "poc-video-card" >
< span class = "section-label" > 🎬 Proof of Concept // YouTube Video Showcase< / span >
< h2 id = "mfc-video-heading" > YouTube Proof-of-Concept Demonstration< / h2 >
< div class = "poc-video-screen" role = "region" aria-label = "YouTube Proof of Concept Video Placeholder" >
< div class = "poc-play-badge" aria-hidden = "true" >
< div class = "poc-play-triangle" > < / div >
< / div >
< span class = "poc-status-pill" > 🎥 YouTube PoC Video — Recording / Coming Soon< / span >
< div class = "poc-video-title" > ESP32-S3 Multi-Functional Controller — Hardware & 2.4 GHz RF Telemetry Demo< / div >
< p class = "poc-video-desc" >
Upcoming YouTube demonstration covering the Rev 0.1 perfboard carrier power-on test, 2.4 GHz nRF24L01+ packet transmission, Hall-effect gimbal ADC sampling, and ST7789 IPS TFT UI rendering.
< / p >
< / div >
< / div >
< / section >
<!-- Early Prototype Hardware Gallery -->
< section class = "section-block" aria-labelledby = "p1-gallery" >
< span class = "section-label" > 01 // Early Prototype Build (Rev 0.1 Perfboard Carrier)< / span >
2026-10-18 00:38:48 +00:00
< h2 id = "p1-gallery" > Very Early Prototype Hardware Gallery (Click to Zoom)< / h2 >
2026-10-18 00:19:21 +00:00
< p class = "reading-width" >
2026-10-18 00:38:48 +00:00
< em > Note:< / em > The photos below show the < strong > very early Phase 1 (Rev 0.1) perfboard carrier build< / strong > . Currently populated: female/male pin header sockets, 100 µF electrolytic bulk decoupling capacitor, ESP32-S3-N16R8 module, nRF24L01+ 2.4 GHz radio header, and 3.3V/5V/GND power distribution rails. These photos will be updated as the Phase 2 DT-100 desktop console modules are installed.
2026-10-14 21:42:24 +00:00
< / p >
2026-10-18 00:19:21 +00:00
< div class = "card-grid" >
< figure class = "card card-amber" style = "margin:0;" >
< img class = "zoomable-img" src = "../assets/images/TOP_VIEW.png" alt = "Top view of the early Rev 0.1 Multi-Functional Controller perfboard carrier" style = "width:100%; height:auto; border-radius:8px; margin-bottom:0.75rem;" >
< figcaption >
< strong > Top View (Rev 0.1):< / strong > Early perfboard carrier showing dual 22-pin female header sockets for the ESP32-S3, power rail pin headers, and the 100 µF bulk capacitor.
< / figcaption >
< / figure >
< figure class = "card card-amber" style = "margin:0;" >
< img class = "zoomable-img" src = "../assets/images/SIDE_VIEW_WITH_ANTENNA.png" alt = "Side view of the Multi-Functional Controller with 2.4 GHz nRF24L01+ SMA duck antenna" style = "width:100%; height:auto; border-radius:8px; margin-bottom:0.75rem;" >
< figcaption >
< strong > RF Transceiver Profile:< / strong > Side profile with the nRF24L01+ PA+LNA 2.4 GHz module and external SMA whip antenna mounted on the carrier.
< / figcaption >
< / figure >
< figure class = "card card-amber" style = "margin:0;" >
< img class = "zoomable-img" src = "../assets/images/BOTTOM_VIEW.png" alt = "Bottom solder-side point-to-point wiring of the Rev 0.1 perfboard carrier" style = "width:100%; height:auto; border-radius:8px; margin-bottom:0.75rem;" >
< figcaption >
< strong > Bottom Solder Routing:< / strong > Hand-soldered point-to-point bus and power distribution traces on the underside of the phenolic perfboard.
< / figcaption >
< / figure >
< / div >
< / section >
2026-10-18 00:38:48 +00:00
<!-- Build, Flash & Clone Commands + C99 Firmware Code -->
< section class = "section-block" aria-labelledby = "p1-code" >
< span class = "section-label" > 02 // Terminal Commands & ESP-IDF C99 Firmware< / span >
< h2 id = "p1-code" > Clone, Build & Flash Commands (ESP-IDF v5.2.2)< / h2 >
< p class = "reading-width" >
To build and flash the ESP32-S3 master firmware on Arch Linux (or any Linux system with ESP-IDF v5.2.2 installed), run the following commands:
< / p >
< div class = "code-window" >
< div class = "code-window-header" >
< span class = "code-window-title" >
< span class = "code-dots" > < span class = "code-dot red" > < / span > < span class = "code-dot amber" > < / span > < span class = "code-dot green" > < / span > < / span >
bash — Clone, Configure Target (esp32s3), Build & Flash
< / span >
< button type = "button" class = "copy-code-btn" data-copy-code > 📋 Copy Commands< / button >
< / div >
< pre > < code > # 1. Clone the Multi-Functional Controller repository
git clone https://github.com/ertunc-ozbay/multi-functional-controller.git
cd multi-functional-controller/firmware
# 2. Export the ESP-IDF v5.2.2 toolchain environment
source ~/esp/esp-idf/export.sh
# 3. Verify target is set to esp32s3 and compile the firmware
idf.py set-target esp32s3
idf.py build
# 4. Flash over USB-JTAG/UART and open real-time serial telemetry monitor
idf.py -p /dev/ttyACM0 flash monitor< / code > < / pre >
< / div >
< h3 > Master Node Pinout & Telemetry Firmware Snippet (< code > firmware/main/mmcontroller.c< / code > )< / h3 >
< p class = "reading-width" >
Below is the hardware pinout and hardware `PCNT` quadrature rotary encoder / ADC1 setup from < a href = "https://github.com/ertunc-ozbay/multi-functional-controller/blob/master/firmware/main/mmcontroller.c" rel = "noopener noreferrer" > < code > firmware/main/mmcontroller.c< / code > < / a > :
< / p >
< div class = "code-window" >
< div class = "code-window-header" >
< span class = "code-window-title" >
< span class = "code-dots" > < span class = "code-dot red" > < / span > < span class = "code-dot amber" > < / span > < span class = "code-dot green" > < / span > < / span >
c99 — firmware/main/mmcontroller.c (ESP32-S3-N16R8 Hardware Definitions)
< / span >
< button type = "button" class = "copy-code-btn" data-copy-code > 📋 Copy Code< / button >
< / div >
< pre > < code > // --- 1. ADC1 ANALOG INPUTS (K-Silver Hall-Effect Joysticks & MAX4466 Mic) ---
#define PIN_JOY_LX GPIO_NUM_4 // ADC1_CH3
#define PIN_JOY_LY GPIO_NUM_5 // ADC1_CH4
#define PIN_JOY_RX GPIO_NUM_6 // ADC1_CH5
#define PIN_JOY_RY GPIO_NUM_7 // ADC1_CH6
#define PIN_MIC_OUT GPIO_NUM_1 // ADC1_CH0 (MAX4466 Audio Preamp)
// --- 2. SHARED SPI2 BUS (nRF24L01+ PA+LNA, ST7789 1.3" IPS TFT & MicroSD) ---
#define PIN_SPI_MOSI GPIO_NUM_11
#define PIN_SPI_SCK GPIO_NUM_12
#define PIN_SPI_MISO GPIO_NUM_13
#define PIN_NRF_CE GPIO_NUM_9
#define PIN_NRF_CSN GPIO_NUM_10
#define PIN_SD_CS GPIO_NUM_39
#define PIN_TFT_CS GPIO_NUM_40
#define PIN_TFT_DC GPIO_NUM_41
#define PIN_TFT_RST GPIO_NUM_42
// --- 3. HARDWARE PCNT ROTARY ENCODER & 2N2222A BJT DRIVER ---
#define PIN_ENC_CLK GPIO_NUM_15
#define PIN_ENC_DT GPIO_NUM_16
#define PIN_ENC_SW GPIO_NUM_17
#define PIN_BJT_BASE GPIO_NUM_21 // Drives 2N2222A base via 1 kOhm resistor< / code > < / pre >
< / div >
< / section >
2026-10-18 00:19:21 +00:00
<!-- KiCad Schematic -->
< section class = "section-block" aria-labelledby = "p1-schematic" >
2026-10-18 00:38:48 +00:00
< span class = "section-label" > 03 // Hardware Schematic Capture< / span >
2026-10-18 00:19:21 +00:00
< h2 id = "p1-schematic" > Early KiCad 9.0 Schematic (< code > mfc-1.svg< / code > )< / h2 >
< figure class = "schematic-frame" >
< img class = "zoomable-img" src = "../assets/images/mfc-1.svg" alt = "KiCad schematic diagram of the ESP32-S3 Multi-Functional Controller" style = "background:#ffffff; border-radius:8px; padding:0.5rem;" >
< figcaption class = "schematic-caption" >
2026-10-18 00:40:30 +00:00
Early prototype KiCad schematic (< code > mfc-1.kicad_sch< / code > ) — click to zoom full-screen or < a href = "../assets/downloads/mfc-1.kicad_sch" download = "mfc-1.kicad_sch" > download the raw KiCad 9.0 file< / a > .
2026-10-18 00:19:21 +00:00
< / figcaption >
< / figure >
2026-10-14 21:42:24 +00:00
< / section >
2026-10-18 00:19:21 +00:00
<!-- Confirmed ESP32 - S3 Pinout -->
< section class = "section-block reading-width" aria-labelledby = "p1-pinout" >
2026-10-18 00:38:48 +00:00
< span class = "section-label" > 04 // Verified ESP32-S3-N16R8 Pinout & Bus Architecture< / span >
2026-10-18 00:19:21 +00:00
< h2 id = "p1-pinout" > Master Node GPIO Allocation< / h2 >
2026-10-14 21:42:24 +00:00
< table class = "spec-table" >
< thead >
< tr >
2026-10-18 00:19:21 +00:00
< th scope = "col" > Subsystem / Peripheral< / th >
< th scope = "col" > ESP32-S3 GPIO< / th >
< th scope = "col" > Interface & Engineering Notes< / th >
2026-10-14 21:42:24 +00:00
< / tr >
< / thead >
< tbody >
< tr >
2026-10-18 00:19:21 +00:00
< td > < strong > Dual Hall-Effect Joysticks (4 Axes)< / strong > < / td >
< td > < code > GPIO 4, 5, 6, 7< / code > < / td >
< td > 12-bit SAR < code > ADC1< / code > (< code > LX, LY, RX, RY< / code > ) — avoids ADC2 Wi-Fi/RF conflicts< / td >
2026-10-14 21:42:24 +00:00
< / tr >
< tr >
2026-10-18 00:19:21 +00:00
< td > < strong > MAX4466 Electret Mic Preamp< / strong > < / td >
< td > < code > GPIO 1< / code > < / td >
< td > < code > ADC1_CH0< / code > analog audio envelope & FFT voice input< / td >
2026-10-14 21:42:24 +00:00
< / tr >
< tr >
2026-10-18 00:19:21 +00:00
< td > < strong > Shared SPI2 Bus (MOSI / MISO / SCK)< / strong > < / td >
< td > < code > GPIO 11 / 13 / 12< / code > < / td >
< td > High-speed SPI2 bus shared by nRF24L01+, ST7789 TFT, and MicroSD< / td >
2026-10-14 21:42:24 +00:00
< / tr >
< tr >
2026-10-18 00:19:21 +00:00
< td > < strong > nRF24L01+ 2.4 GHz Radio< / strong > < / td >
< td > < code > CE: 9, CSN: 10< / code > < / td >
< td > Dedicated 100 µF electrolytic + 100 nF ceramic decoupling on 3.3V rail< / td >
2026-10-14 21:42:24 +00:00
< / tr >
< tr >
2026-10-18 00:19:21 +00:00
< td > < strong > 1.3" ST7789 IPS TFT (240× 240)< / strong > < / td >
< td > < code > CS: 40, DC: 41, RST: 42< / code > < / td >
< td > Hardware Chip Select added so TFT shares SPI2 cleanly with nRF24 & SD< / td >
< / tr >
< tr >
< td > < strong > MicroSD Card Module< / strong > < / td >
< td > < code > CS: 39< / code > < / td >
< td > Stores telemetry logs, profiles, and UI assets over SPI2< / td >
< / tr >
< tr >
< td > < strong > Rotary Encoder (KY-040)< / strong > < / td >
< td > < code > CLK: 15, DT: 16, SW: 17< / code > < / td >
< td > Hardware < code > PCNT< / code > quadrature decoder with 1000 ns glitch filter< / td >
< / tr >
< tr >
< td > < strong > 2N2222A BJT Low-Side Switch< / strong > < / td >
< td > < code > GPIO 21< / code > (via 1 kΩ base R)< / td >
< td > Drives external loads with < code > 1N4001< / code > / < code > 1N5817< / code > flyback protection< / td >
2026-10-14 21:42:24 +00:00
< / tr >
< / tbody >
< / table >
< / section >
2026-10-18 00:19:21 +00:00
<!-- Phase 1 vs Phase 2 BOM -->
< section class = "section-block reading-width" aria-labelledby = "p1-bom" >
2026-10-18 00:38:48 +00:00
< span class = "section-label" > 05 // Build Roadmap & Phase 2 Console BOM< / span >
2026-10-18 00:19:21 +00:00
< h2 id = "p1-bom" > From Rev 0.1 Carrier to the DT-100 Desktop Console< / h2 >
< div class = "callout-box amber" >
< span class = "callout-title" > Phase 2 Hardware Upgrade (Direnc.net Procurement List)< / span >
2026-10-14 21:42:24 +00:00
< p >
2026-10-18 00:19:21 +00:00
The controller is transitioning from the bare Rev 0.1 perfboard carrier into a professional desktop console housing. Once the Phase 2 components below are mounted, the ESP-IDF firmware will be updated with drivers for each module:
2026-10-14 21:42:24 +00:00
< / p >
2026-10-18 00:19:21 +00:00
< ul style = "margin-bottom:0;" >
< li > < strong > Enclosure:< / strong > DT-100 Desktop Instrument Case (Black ABS, < code > 190 × 137 × 59 mm< / code > )< / li >
< li > < strong > Joysticks:< / strong > 2× K-Silver High-Precision Hall-Effect 2-Axis Gimbals< / li >
< li > < strong > Display & Storage:< / strong > 1.3" ST7789 IPS TFT LCD (240× 240) + SPI MicroSD Card Module< / li >
< li > < strong > Audio Preamp:< / strong > MAX4466 Electret Microphone Amplifier with Adjustable Gain< / li >
< li > < strong > Power & Switching:< / strong > MT3608 2A DC-DC Boost Converter, 12– 24V White LED Waterproof Latching Switch, KTS303 3-Pin Toggle Switch, 180° Slide Switch< / li >
< li > < strong > Discrete Protection:< / strong > 2N2222 NPN BJT Transistor, 1N5817 1A 20V Schottky Diode, 1N4001 1A 50V Rectifier Diode (DO-41)< / li >
< / ul >
2026-10-14 21:42:24 +00:00
< / div >
< / section >
< / article >
< / div >
< / main >
< footer class = "site-footer" >
< div class = "container footer-inner" >
< div >
2026-10-18 00:38:48 +00:00
< strong > Ertunç Özbay< / strong > — Electrical & Electronics Engineering Student • < a href = "mailto:ertunc.ozbay@outlook.com" > ertunc.ozbay@outlook.com< / a >
2026-10-14 21:42:24 +00:00
< / div >
< ul class = "footer-links" aria-label = "Footer links" >
< li > < a href = "../projects/index.html" > Projects< / a > < / li >
< li > < a href = "../blog/index.html" > Blog< / a > < / li >
< li > < a href = "../lab.html" > Lab< / a > < / li >
< li > < a href = "../contact.html" > Contact< / a > < / li >
< li > < a href = "https://github.com/ertunc-ozbay" rel = "noopener noreferrer" > GitHub< / a > < / li >
2026-10-18 00:19:21 +00:00
< li > < a href = "https://www.linkedin.com/in/ertunc-ozbay" rel = "noopener noreferrer" > LinkedIn< / a > < / li >
2026-10-14 21:42:24 +00:00
< / ul >
< / div >
< / footer >
2026-10-18 00:38:48 +00:00
< script src = "../assets/js/main.js?v=2" > < / script >
2026-10-14 21:42:24 +00:00
< / body >
< / html >