307 lines
17 KiB
HTML
307 lines
17 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en" data-theme="colorful">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Multi-Functional RC Controller (MFC) — Projects — Ertunç Özbay</title>
|
||
<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.">
|
||
<link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
|
||
<link rel="stylesheet" href="../assets/css/style.css?v=2">
|
||
</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
|
||
<span class="brand-subtitle">embedded // hardware // open-source</span>
|
||
</span>
|
||
</a>
|
||
|
||
<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>
|
||
</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">
|
||
<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>
|
||
</div>
|
||
<h1><span class="gradient-title">Multi-Functional RC Controller (MFC)</span></h1>
|
||
<p class="hero-lead">
|
||
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.
|
||
</p>
|
||
<div class="button-row">
|
||
<a class="btn btn-primary" href="http://34.57.151.250:3000/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">💻 View GitHub Repo</a>
|
||
<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="/assets/downloads/multi-functional-controller.zip">📦 Repo (.zip)</a>
|
||
<a class="btn btn-youtube" href="#poc-video">🎬 Watch PoC Video Slot</a>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- 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>
|
||
<h2 id="p1-gallery">Very Early Prototype Hardware Gallery (Click to Zoom)</h2>
|
||
<p class="reading-width">
|
||
<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.
|
||
</p>
|
||
<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>
|
||
|
||
<!-- 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 http://34.57.151.250:3000/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="http://34.57.151.250:3000/ertunc-ozbay/multi-functional-controller/src/branch/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>
|
||
|
||
<!-- KiCad Schematic -->
|
||
<section class="section-block" aria-labelledby="p1-schematic">
|
||
<span class="section-label">03 // Hardware Schematic Capture</span>
|
||
<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">
|
||
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>.
|
||
</figcaption>
|
||
</figure>
|
||
</section>
|
||
|
||
<!-- Confirmed ESP32-S3 Pinout -->
|
||
<section class="section-block reading-width" aria-labelledby="p1-pinout">
|
||
<span class="section-label">04 // Verified ESP32-S3-N16R8 Pinout & Bus Architecture</span>
|
||
<h2 id="p1-pinout">Master Node GPIO Allocation</h2>
|
||
<table class="spec-table">
|
||
<thead>
|
||
<tr>
|
||
<th scope="col">Subsystem / Peripheral</th>
|
||
<th scope="col">ESP32-S3 GPIO</th>
|
||
<th scope="col">Interface & Engineering Notes</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<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>
|
||
</tr>
|
||
<tr>
|
||
<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>
|
||
</tr>
|
||
<tr>
|
||
<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>
|
||
</tr>
|
||
<tr>
|
||
<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>
|
||
</tr>
|
||
<tr>
|
||
<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>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</section>
|
||
|
||
<!-- Phase 1 vs Phase 2 BOM -->
|
||
<section class="section-block reading-width" aria-labelledby="p1-bom">
|
||
<span class="section-label">05 // Build Roadmap & Phase 2 Console BOM</span>
|
||
<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>
|
||
<p>
|
||
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:
|
||
</p>
|
||
<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>
|
||
</div>
|
||
</section>
|
||
</article>
|
||
|
||
</div>
|
||
</main>
|
||
|
||
<footer class="site-footer">
|
||
<div class="container footer-inner">
|
||
<div>
|
||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||
</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="http://34.57.151.250:3000/ertunc-ozbay" rel="noopener noreferrer">GitHub</a></li>
|
||
<li><a href="https://www.linkedin.com/in/ertunc-ozbay" rel="noopener noreferrer">LinkedIn</a></li>
|
||
</ul>
|
||
</div>
|
||
</footer>
|
||
|
||
<script src="../assets/js/main.js?v=2"></script>
|
||
</body>
|
||
</html>
|