ertuncozbay.dev/projects/multi-functional-controller.html

306 lines
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 &amp; 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="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">💻 View GitHub Repo</a>
<a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/multi-functional-controller/archive/refs/heads/master.zip">⬇ Download Repo (.zip)</a>
<a class="btn btn-cyan" href="https://raw.githubusercontent.com/ertunc-ozbay/multi-functional-controller/master/hardware/mfc-1/mfc-1.kicad_sch" download="mfc-1.kicad_sch">📐 Download KiCad Schematic</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 &amp; 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 &amp; ESP-IDF C99 Firmware</span>
<h2 id="p1-code">Clone, Build &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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="https://raw.githubusercontent.com/ertunc-ozbay/multi-functional-controller/master/hardware/mfc-1/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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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="https://github.com/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>