feat: make Colorful Studio default UI, add visible 3-mode theme switcher bar, use ertunc.ozbay@outlook.com, and add CLI commands, code blocks & direct downloads

This commit is contained in:
ertunc-ozbay 2026-10-18 03:38:48 +03:00
parent 7e3356c383
commit ac7a3a6e66
14 changed files with 1279 additions and 787 deletions

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About — Ertunç Özbay</title> <title>About — Ertunç Özbay</title>
<meta name="description" content="About Ertunç Özbay: Electrical and Electronics Engineering student at Bülent Ecevit University, exploring hardware, software, embedded systems, C, Rust, and reverse engineering."> <meta name="description" content="About Ertunç Özbay: Electrical and Electronics Engineering student at Bülent Ecevit University, exploring hardware, software, embedded systems, C, Rust, and reverse engineering.">
<link rel="icon" type="image/svg+xml" href="assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="assets/images/favicon.svg">
<link rel="stylesheet" href="assets/css/style.css"> <link rel="stylesheet" href="assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="about.html" aria-current="page">About</a></li> </button>
<li><a class="nav-link" href="projects/index.html">Projects</a></li>
<li><a class="nav-link" href="blog/index.html">Blog</a></li> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="contact.html">Contact</a></li> <li><a class="nav-link" href="index.html">Home</a></li>
</ul> <li><a class="nav-link" href="about.html" aria-current="page">About</a></li>
</nav> <li><a class="nav-link" href="projects/index.html">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> </div>
</header> </header>
@ -145,7 +153,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="projects/index.html">Projects</a></li> <li><a href="projects/index.html">Projects</a></li>
@ -158,6 +166,6 @@
</div> </div>
</footer> </footer>
<script src="assets/js/main.js"></script> <script src="assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load diff

View file

@ -1,56 +1,53 @@
/* ========================================================================== /* ==========================================================================
Ertunç Özbay — Workshop & Portfolio Script (Plain JS, No Dependencies) Ertunç Özbay — Workshop & Portfolio Script (Plain JS, No Dependencies)
Handles: Handles:
1. Accessible mobile navigation menu toggle (with Escape key support) 1. Prominent Multi-Theme Switcher (🎨 Colorful Studio [Default] | 🌈 Neon | 📐 Blueprint)
2. Luminous Aurora / Daylight Studio theme switcher (persisted in localStorage) 2. Accessible mobile navigation menu toggle (with Escape key support)
3. Static blog category filtering on the Blog page 3. Static blog category filtering on the Blog page
4. One-click copy email button on Contact page 4. One-click copy buttons for Email addresses and Code/Command blocks
5. Image lightbox for hardware prototype photos and schematics 5. Image lightbox for hardware prototype photos and schematics
========================================================================== */ ========================================================================== */
(function () { (function () {
"use strict"; "use strict";
// 1. Theme Switcher (Vibrant Aurora Default + Daylight Studio Mode) // 1. Multi-Theme Switcher (Colorful Default, Cyber Neon, Blueprint Lab)
var rootEl = document.documentElement; var rootEl = document.documentElement;
var savedTheme = null; var validThemes = ["colorful", "neon", "blueprint"];
var savedTheme = "colorful";
try { try {
savedTheme = localStorage.getItem("eo-theme"); var stored = localStorage.getItem("eo-studio-theme");
if (stored && validThemes.indexOf(stored) !== -1) {
savedTheme = stored;
}
} catch (e) {} } catch (e) {}
if (savedTheme === "light" || savedTheme === "dark") { function applyTheme(themeName) {
rootEl.setAttribute("data-theme", savedTheme); if (validThemes.indexOf(themeName) === -1) {
} themeName = "colorful";
var navList = document.querySelector(".nav-list");
if (navList && !document.querySelector("[data-theme-toggle]")) {
var li = document.createElement("li");
var btn = document.createElement("button");
btn.type = "button";
btn.className = "theme-toggle";
btn.setAttribute("data-theme-toggle", "");
btn.setAttribute("aria-label", "Toggle color theme");
function updateThemeBtnLabel() {
var isLight = rootEl.getAttribute("data-theme") === "light";
btn.textContent = isLight ? "🌙 Aurora" : "☀️ Daylight";
} }
updateThemeBtnLabel(); rootEl.setAttribute("data-theme", themeName);
try {
localStorage.setItem("eo-studio-theme", themeName);
} catch (e) {}
btn.addEventListener("click", function () { var buttons = document.querySelectorAll("[data-set-theme]");
var isLight = rootEl.getAttribute("data-theme") === "light"; buttons.forEach(function (btn) {
var nextTheme = isLight ? "dark" : "light"; var isTarget = btn.getAttribute("data-set-theme") === themeName;
rootEl.setAttribute("data-theme", nextTheme); btn.setAttribute("aria-pressed", isTarget ? "true" : "false");
try {
localStorage.setItem("eo-theme", nextTheme);
} catch (e) {}
updateThemeBtnLabel();
}); });
li.appendChild(btn);
navList.appendChild(li);
} }
applyTheme(savedTheme);
document.addEventListener("click", function (event) {
var themeBtn = event.target.closest("[data-set-theme]");
if (themeBtn) {
applyTheme(themeBtn.getAttribute("data-set-theme"));
}
});
// 2. Mobile Navigation Toggle // 2. Mobile Navigation Toggle
var navToggle = document.querySelector("[data-nav-toggle]"); var navToggle = document.querySelector("[data-nav-toggle]");
var siteNav = document.querySelector("[data-site-nav]"); var siteNav = document.querySelector("[data-site-nav]");
@ -114,8 +111,8 @@
} }
// 4. Copy Email to Clipboard Buttons // 4. Copy Email to Clipboard Buttons
var copyButtons = document.querySelectorAll("[data-copy-email]"); var copyEmailButtons = document.querySelectorAll("[data-copy-email]");
copyButtons.forEach(function (btn) { copyEmailButtons.forEach(function (btn) {
btn.addEventListener("click", function () { btn.addEventListener("click", function () {
var email = btn.getAttribute("data-copy-email"); var email = btn.getAttribute("data-copy-email");
if (!email || !navigator.clipboard) return; if (!email || !navigator.clipboard) return;
@ -129,7 +126,25 @@
}); });
}); });
// 5. Image Lightbox for Hardware Photos & Schematics // 5. Copy Code / Terminal Commands Buttons
var copyCodeButtons = document.querySelectorAll("[data-copy-code]");
copyCodeButtons.forEach(function (btn) {
btn.addEventListener("click", function () {
var windowEl = btn.closest(".code-window");
if (!windowEl || !navigator.clipboard) return;
var preEl = windowEl.querySelector("pre");
if (!preEl) return;
var originalText = btn.textContent;
navigator.clipboard.writeText(preEl.innerText).then(function () {
btn.textContent = "✓ Copied!";
setTimeout(function () {
btn.textContent = originalText;
}, 2000);
});
});
});
// 6. Image Lightbox for Hardware Photos & Schematics
var zoomImages = document.querySelectorAll(".zoomable-img"); var zoomImages = document.querySelectorAll(".zoomable-img");
if (zoomImages.length > 0) { if (zoomImages.length > 0) {
var backdrop = document.createElement("div"); var backdrop = document.createElement("div");

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blog &amp; Build Notes — Ertunç Özbay</title> <title>Blog &amp; Build Notes — Ertunç Özbay</title>
<meta name="description" content="Static technical blog and learning notebook by Ertunç Özbay covering project build logs, embedded systems, circuit experiments, and C/Rust programming."> <meta name="description" content="Static technical blog and learning notebook by Ertunç Özbay covering project build logs, embedded systems, circuit experiments, and C/Rust programming.">
<link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
<link rel="stylesheet" href="../assets/css/style.css"> <link rel="stylesheet" href="../assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="../index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="../about.html">About</a></li> </button>
<li><a class="nav-link" href="../projects/index.html">Projects</a></li>
<li><a class="nav-link" href="../blog/index.html" aria-current="page">Blog</a></li> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="../lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="../contact.html">Contact</a></li> <li><a class="nav-link" href="../index.html">Home</a></li>
</ul> <li><a class="nav-link" href="../about.html">About</a></li>
</nav> <li><a class="nav-link" href="../projects/index.html">Projects</a></li>
<li><a class="nav-link" href="../blog/index.html" aria-current="page">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> </div>
</header> </header>
@ -121,7 +129,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="../projects/index.html">Projects</a></li> <li><a href="../projects/index.html">Projects</a></li>
@ -134,6 +142,6 @@
</div> </div>
</footer> </footer>
<script src="../assets/js/main.js"></script> <script src="../assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[Template] Project Build Log & Technical Note Template — Blog — Ertunç Özbay</title> <title>[Template] Project Build Log &amp; Technical Note — Blog — Ertunç Özbay</title>
<meta name="description" content="Reusable static HTML blog post template for Ertunç Özbay's workshop website."> <meta name="description" content="Reusable static HTML article template for Ertunç Özbay's engineering blog and build logs.">
<link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
<link rel="stylesheet" href="../assets/css/style.css"> <link rel="stylesheet" href="../assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -17,25 +17,33 @@
<span class="brand-mark" aria-hidden="true">EÖ</span> <span class="brand-mark" aria-hidden="true">EÖ</span>
<span> <span>
Ertunç Özbay Ertunç Özbay
<span class="brand-subtitle">workshop // notebook // lab</span> <span class="brand-subtitle">embedded // hardware // open-source</span>
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="../index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="../about.html">About</a></li> </button>
<li><a class="nav-link" href="../projects/index.html">Projects</a></li>
<li><a class="nav-link" href="../blog/index.html" aria-current="page">Blog</a></li> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="../lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="../contact.html">Contact</a></li> <li><a class="nav-link" href="../index.html">Home</a></li>
</ul> <li><a class="nav-link" href="../about.html">About</a></li>
</nav> <li><a class="nav-link" href="../projects/index.html">Projects</a></li>
<li><a class="nav-link" href="../blog/index.html" aria-current="page">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> </div>
</header> </header>
@ -45,91 +53,47 @@
<a href="index.html">← Back to Blog</a> <a href="index.html">← Back to Blog</a>
</nav> </nav>
<!--
=====================================================================
BEGINNER HOW-TO: HOW TO CREATE A NEW BLOG POST FROM THIS TEMPLATE
1. Duplicate this file (blog/post-template.html) inside the blog/ folder.
2. Rename the new copy, for example: blog/midi-c-conversion-notes.html
3. Edit the <title>, Date, Category, Reading time, Heading (<h1>),
Summary, Tags, and Article sections below.
4. Open blog/index.html and copy one <article class="card"> block to
link to your new filename.
=====================================================================
-->
<article class="reading-width"> <article class="reading-width">
<header class="workshop-hero"> <header class="workshop-hero">
<div class="card-meta"> <div class="card-meta">
<span class="badge badge-experimental">Template • Draft Example</span> <span class="badge badge-experimental">Template • Draft</span>
<time datetime="2026-10-14">YYYY-MM-DD (Template)</time> <time datetime="2026-10-14">YYYY-MM-DD</time>
<span>• Category: Build Log / Technical Note</span> <span>• Category: Build Log / Technical Note</span>
<span>• Reading time: X min read</span>
</div> </div>
<h1>[Template] Article Title: What I Tested and Learned on the Bench</h1> <h1><span class="gradient-title">[Template] Project Build Log &amp; Technical Note Title</span></h1>
<p class="hero-lead"> <p class="hero-lead">
<strong>Summary:</strong> This page is a clearly labeled static HTML template for future blog posts. Copy this file whenever you want to publish a new build log, C programming note, or circuit experiment. Copy this file to create a new static build log entry with hardware notes, copyable code windows, and lessons learned.
</p> </p>
<ul class="tag-list" aria-label="Article tags">
<li><span class="tag">template</span></li>
<li><span class="tag">draft</span></li>
<li><span class="tag">embedded-learning</span></li>
<li><span class="tag">c-programming</span></li>
</ul>
</header> </header>
<div class="callout-box amber"> <section class="section-block">
<span class="callout-title">Template Notice</span> <h2>1. Goal &amp; Hardware Setup</h2>
<p style="margin-bottom:0;"> <p>Describe the circuit, microcontroller, or software module under test.</p>
This entry is a reusable <strong>Template / Draft</strong> kept in the repository so creating new posts requires only copying a single HTML file—no CMS, database, or build script needed. <div class="code-window">
</p> <div class="code-window-header">
</div> <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>
<section class="section-block" aria-labelledby="tpl-sec-1"> c99 — Example Firmware Snippet
<h2 id="tpl-sec-1">1. Goal of the Experiment or Build Step</h2> </span>
<p> <button type="button" class="copy-code-btn" data-copy-code>📋 Copy Code</button>
Write a short paragraph explaining what you set out to build, test, or investigate. Keep it personal and honest—just like explaining the setup to a friend or engineering teammate. </div>
</p> <pre><code>// Example code block in post template
</section> void app_main(void) {
printf("Hello from ESP-IDF!\n");
<section class="section-block" aria-labelledby="tpl-sec-2"> }</code></pre>
<h2 id="tpl-sec-2">2. Hardware &amp; Software Setup</h2> </div>
<p>
List only the confirmed hardware components, tools, or code files you actually used during this session.
</p>
<pre><code>/* Example C code snippet or terminal note */
// Document register settings, MIDI array structures, or test logic here.</code></pre>
</section>
<section class="section-block" aria-labelledby="tpl-sec-3">
<h2 id="tpl-sec-3">3. What Worked and What Failed</h2>
<p>
Documenting what failed is just as valuable as documenting what worked. Note any wiring mistakes, timing bugs, or AI-generated code assumptions that needed manual debugging.
</p>
</section>
<section class="section-block" aria-labelledby="tpl-sec-4">
<h2 id="tpl-sec-4">4. Next Step &amp; Related Projects</h2>
<p>
Link this post back to the relevant project detail page so visitors can follow the full story:
</p>
<ul>
<li><a href="../projects/midi-breadboard-instrument.html">Related Project: MIDI Breadboard Instrument</a></li>
<li><a href="../projects/multi-functional-controller.html">Related Project: Multi-Functional RC Controller</a></li>
<li><a href="../projects/rc-autonomous-vehicle.html">Related Project: RC and Autonomous Vehicle</a></li>
</ul>
<div class="button-row"> <div class="button-row">
<a class="btn btn-secondary" href="index.html">← Back to Blog Index</a> <a class="btn btn-secondary" href="index.html">← Back to Blog Index</a>
</div> </div>
</section> </section>
</article> </article>
</div> </div>
</main> </main>
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Personal workshop, project lab, and learning notebook. <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="../projects/index.html">Projects</a></li> <li><a href="../projects/index.html">Projects</a></li>
@ -137,10 +101,11 @@
<li><a href="../lab.html">Lab</a></li> <li><a href="../lab.html">Lab</a></li>
<li><a href="../contact.html">Contact</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://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> </ul>
</div> </div>
</footer> </footer>
<script src="../assets/js/main.js"></script> <script src="../assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Why I Built This Personal Workshop & Learning Notebook — Blog — Ertunç Özbay</title> <title>Why I Built This Personal Workshop &amp; Learning Notebook — Blog — Ertunç Özbay</title>
<meta name="description" content="Starter note explaining why Ertunç Özbay built a static workshop notebook for hardware, software, and open-source learning."> <meta name="description" content="Starter note explaining why Ertunç Özbay built a static workshop notebook for hardware, software, and open-source learning.">
<link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
<link rel="stylesheet" href="../assets/css/style.css"> <link rel="stylesheet" href="../assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -17,25 +17,33 @@
<span class="brand-mark" aria-hidden="true">EÖ</span> <span class="brand-mark" aria-hidden="true">EÖ</span>
<span> <span>
Ertunç Özbay Ertunç Özbay
<span class="brand-subtitle">workshop // notebook // lab</span> <span class="brand-subtitle">embedded // hardware // open-source</span>
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="../index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="../about.html">About</a></li> </button>
<li><a class="nav-link" href="../projects/index.html">Projects</a></li>
<li><a class="nav-link" href="../blog/index.html" aria-current="page">Blog</a></li> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="../lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="../contact.html">Contact</a></li> <li><a class="nav-link" href="../index.html">Home</a></li>
</ul> <li><a class="nav-link" href="../about.html">About</a></li>
</nav> <li><a class="nav-link" href="../projects/index.html">Projects</a></li>
<li><a class="nav-link" href="../blog/index.html" aria-current="page">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> </div>
</header> </header>
@ -48,20 +56,19 @@
<article class="reading-width"> <article class="reading-width">
<header class="workshop-hero"> <header class="workshop-hero">
<div class="card-meta"> <div class="card-meta">
<span class="badge badge-draft">Example • Starter Note</span> <span class="badge badge-draft">Starter Note</span>
<time datetime="2026-10-14">October 14, 2026</time> <time datetime="2026-10-14">October 14, 2026</time>
<span>• Category: Personal Learning Reflections</span> <span>• Category: Personal Learning Reflections</span>
<span>• Reading time: 3 min read</span> <span>• Reading time: 3 min read</span>
</div> </div>
<h1>Why I Built This Personal Workshop &amp; Learning Notebook</h1> <h1><span class="gradient-title">Why I Built This Personal Workshop &amp; Learning Notebook</span></h1>
<p class="hero-lead"> <p class="hero-lead">
A short starter note on why I want my website to feel like an open engineering workbench rather than a polished corporate résumé. A short starter note on why I want my website to feel like an open engineering workbench rather than a polished corporate résumé.
</p> </p>
<ul class="tag-list" aria-label="Article tags"> <ul class="tag-list" aria-label="Article tags">
<li><span class="tag">workshop</span></li> <li><span class="tag tag-esp">workshop</span></li>
<li><span class="tag">hardware-software</span></li> <li><span class="tag tag-c">hardware-software</span></li>
<li><span class="tag">open-source</span></li> <li><span class="tag tag-hw">open-source</span></li>
<li><span class="tag">learning-in-public</span></li>
</ul> </ul>
</header> </header>
@ -78,19 +85,17 @@
<section class="section-block" aria-labelledby="note-sec-2"> <section class="section-block" aria-labelledby="note-sec-2">
<h2 id="note-sec-2">Hardware, Software, and Responsibility</h2> <h2 id="note-sec-2">Hardware, Software, and Responsibility</h2>
<p> <p>
Whether I am working on my <a href="../projects/midi-breadboard-instrument.html">MIDI Breadboard Instrument</a>, my <a href="../projects/multi-functional-controller.html">Multi-Functional RC Controller</a>, or my <a href="../projects/rc-autonomous-vehicle.html">RC and Autonomous Vehicle</a> project, my goal is to understand how the physical circuit and the code interact. Whether I am working on my <a href="../projects/midi-breadboard-instrument.html">MIDI Breadboard Instrument</a>, my <a href="../projects/multi-functional-controller.html">Multi-Functional RC Controller</a>, my <a href="../projects/pointblank-linux.html">Point Blank Linux Launcher</a>, or my <a href="../projects/rc-autonomous-vehicle.html">RC and Autonomous Vehicle</a> project, my goal is to understand how the physical circuit and the code interact.
</p>
<p>
Just like understanding a car’s steering, brakes, and dynamics makes you a more responsible driver, understanding both hardware and software helps me ask better questions, evaluate AI output critically, spot mistakes, and take responsibility for what I build.
</p> </p>
</section> </section>
<section class="section-block" aria-labelledby="note-sec-3"> <section class="section-block" aria-labelledby="note-sec-3">
<h2 id="note-sec-3">Related Projects</h2> <h2 id="note-sec-3">Related Projects</h2>
<ul> <ul>
<li><a href="../projects/multi-functional-controller.html">Multi-Functional RC Controller</a> (In progress)</li> <li><a href="../projects/multi-functional-controller.html">Multi-Functional RC Controller (ESP32-S3)</a></li>
<li><a href="../projects/rc-autonomous-vehicle.html">RC and Autonomous Vehicle</a> (In progress)</li> <li><a href="../projects/midi-breadboard-instrument.html">MIDI Breadboard Instrument (ESP32 Dual-Core)</a></li>
<li><a href="../projects/midi-breadboard-instrument.html">MIDI Breadboard Instrument</a> (In progress / Experimental)</li> <li><a href="../projects/pointblank-linux.html">Point Blank on Linux (Standalone Rust Launcher)</a></li>
<li><a href="../projects/rc-autonomous-vehicle.html">RC and Autonomous 4WD Vehicle</a></li>
</ul> </ul>
<div class="button-row"> <div class="button-row">
<a class="btn btn-secondary" href="index.html">← Back to Blog Index</a> <a class="btn btn-secondary" href="index.html">← Back to Blog Index</a>
@ -104,7 +109,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Personal workshop, project lab, and learning notebook. <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="../projects/index.html">Projects</a></li> <li><a href="../projects/index.html">Projects</a></li>
@ -112,10 +117,11 @@
<li><a href="../lab.html">Lab</a></li> <li><a href="../lab.html">Lab</a></li>
<li><a href="../contact.html">Contact</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://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> </ul>
</div> </div>
</footer> </footer>
<script src="../assets/js/main.js"></script> <script src="../assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Contact &amp; Collaboration — Ertunç Özbay</title> <title>Contact &amp; Collaboration — Ertunç Özbay</title>
<meta name="description" content="Contact Ertunç Özbay via Gmail (ertuncozbayh@gmail.com), Outlook, LinkedIn, or GitHub to discuss embedded systems, hardware prototyping, C/Rust programming, and open-source projects."> <meta name="description" content="Contact Ertunç Özbay via email (ertunc.ozbay@outlook.com), LinkedIn, or GitHub to discuss embedded systems, hardware prototyping, C/Rust programming, and open-source projects.">
<link rel="icon" type="image/svg+xml" href="assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="assets/images/favicon.svg">
<link rel="stylesheet" href="assets/css/style.css"> <link rel="stylesheet" href="assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="about.html">About</a></li> </button>
<li><a class="nav-link" href="projects/index.html">Projects</a></li>
<li><a class="nav-link" href="blog/index.html">Blog</a></li> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="contact.html" aria-current="page">Contact</a></li> <li><a class="nav-link" href="index.html">Home</a></li>
</ul> <li><a class="nav-link" href="about.html">About</a></li>
</nav> <li><a class="nav-link" href="projects/index.html">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" aria-current="page">Contact</a></li>
</ul>
</nav>
</div>
</div> </div>
</header> </header>
@ -45,12 +53,13 @@
<span class="workshop-eyebrow">✉️ DIRECT CONTACT // OPEN COLLABORATION</span> <span class="workshop-eyebrow">✉️ DIRECT CONTACT // OPEN COLLABORATION</span>
<h1 id="contact-heading"><span class="gradient-title">Contact &amp; Collaboration</span></h1> <h1 id="contact-heading"><span class="gradient-title">Contact &amp; Collaboration</span></h1>
<p class="hero-lead"> <p class="hero-lead">
Whether you want to talk about ESP32 embedded firmware, circuit design, Linux systems programming, or open-source hardware collaboration, feel free to reach out directly via Gmail, LinkedIn, or GitHub. Whether you want to talk about ESP32 embedded firmware, circuit design, Linux systems programming, or open-source hardware collaboration, feel free to reach out directly via email, LinkedIn, or GitHub.
</p> </p>
<div class="button-row"> <div class="button-row">
<a class="btn btn-primary" href="mailto:ertuncozbayh@gmail.com">📧 Email Me on Gmail (ertuncozbayh@gmail.com)</a> <a class="btn btn-primary" href="mailto:ertunc.ozbay@outlook.com">📧 Email Me (ertunc.ozbay@outlook.com)</a>
<button type="button" class="btn btn-secondary" data-copy-email="ertuncozbayh@gmail.com">📋 Copy Gmail Address</button> <button type="button" class="btn btn-secondary" data-copy-email="ertunc.ozbay@outlook.com">📋 Copy Email Address</button>
<a class="btn btn-cyan" href="https://www.linkedin.com/in/ertunc-ozbay" rel="noopener noreferrer">🔗 Connect on LinkedIn</a> <a class="btn btn-cyan" href="https://www.linkedin.com/in/ertunc-ozbay" rel="noopener noreferrer">🔗 Connect on LinkedIn</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay" rel="noopener noreferrer">💻 GitHub (@ertunc-ozbay)</a>
</div> </div>
</section> </section>
@ -58,29 +67,26 @@
<div class="section-header"> <div class="section-header">
<div> <div>
<span class="section-label">01 // Direct Channels</span> <span class="section-label">01 // Direct Channels</span>
<h2 id="contact-links-heading">Email, Socials &amp; GitHub</h2> <h2 id="contact-links-heading">Email, LinkedIn &amp; GitHub</h2>
</div> </div>
</div> </div>
<div class="card-grid-2"> <div class="card-grid-2">
<!-- Gmail Card --> <!-- Primary Email Card -->
<div class="card card-coral"> <div class="card card-coral">
<div class="card-top"> <div class="card-top">
<div class="card-meta"> <div class="card-meta">
<span class="badge badge-coral">Primary Inbox • Gmail</span> <span class="badge badge-coral">Primary Email</span>
<span>Fastest Response</span> <span>Direct Inbox</span>
</div> </div>
<h3><a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a></h3> <h3><a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a></h3>
<p> <p>
My primary personal and engineering Gmail inbox. Ideal for project discussions, schematic/code questions, internship or collaboration inquiries, and fellow student builders. My official engineering and open-source email inbox. Ideal for project discussions, schematic/firmware questions, internship or collaboration inquiries, and fellow student builders.
</p>
<p style="margin-bottom:0;">
<strong>Secondary / Git Email (Outlook):</strong> <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</p> </p>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-primary" href="mailto:ertuncozbayh@gmail.com">Send Email (Gmail)</a> <a class="btn btn-primary" href="mailto:ertunc.ozbay@outlook.com">Send Email</a>
<button type="button" class="btn btn-secondary" data-copy-email="ertuncozbayh@gmail.com">📋 Copy Gmail</button> <button type="button" class="btn btn-secondary" data-copy-email="ertunc.ozbay@outlook.com">📋 Copy ertunc.ozbay@outlook.com</button>
</div> </div>
</div> </div>
@ -111,7 +117,7 @@
<section class="section-block" aria-labelledby="repos-heading"> <section class="section-block" aria-labelledby="repos-heading">
<div class="section-header"> <div class="section-header">
<div> <div>
<span class="section-label">02 // Public Open-Source Repositories</span> <span class="section-label">02 // Public Open-Source Repositories &amp; Direct Downloads</span>
<h2 id="repos-heading">Active Repositories on GitHub</h2> <h2 id="repos-heading">Active Repositories on GitHub</h2>
</div> </div>
</div> </div>
@ -126,7 +132,9 @@
</p> </p>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">Open Repository →</a> <a class="btn btn-primary" href="projects/multi-functional-controller.html">Project Page</a>
<a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/multi-functional-controller/archive/refs/heads/master.zip">⬇ Download ZIP</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">GitHub →</a>
</div> </div>
</div> </div>
@ -139,7 +147,9 @@
</p> </p>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument" rel="noopener noreferrer">Open Repository →</a> <a class="btn btn-primary" href="projects/midi-breadboard-instrument.html">Project Page</a>
<a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument/archive/refs/heads/main.zip">⬇ Download ZIP</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument" rel="noopener noreferrer">GitHub →</a>
</div> </div>
</div> </div>
@ -152,7 +162,9 @@
</p> </p>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">Open Repository →</a> <a class="btn btn-primary" href="projects/pointblank-linux.html">Project Page</a>
<a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/pointblank-linux/releases/latest/download/pointblank-linux-v1.0.0-linux-x86_64.tar.gz">⬇ Download v1.0.0 Binary</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">GitHub →</a>
</div> </div>
</div> </div>
@ -188,7 +200,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="projects/index.html">Projects</a></li> <li><a href="projects/index.html">Projects</a></li>
@ -201,6 +213,6 @@
</div> </div>
</footer> </footer>
<script src="assets/js/main.js"></script> <script src="assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ertunç Özbay — Embedded Systems, Hardware Lab &amp; Open-Source Projects</title> <title>Ertunç Özbay — Embedded Systems, Hardware Lab &amp; Open-Source Projects</title>
<meta name="description" content="Personal engineering studio and workshop of Ertunç Özbay: ESP32/ESP-IDF embedded systems, hardware prototyping, C/Rust/Python tooling, and open-source builds."> <meta name="description" content="Personal engineering studio and workshop of Ertunç Özbay: ESP32/ESP-IDF embedded systems, hardware prototyping, C/Rust/Python tooling, and open-source builds.">
<link rel="icon" type="image/svg+xml" href="assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="assets/images/favicon.svg">
<link rel="stylesheet" href="assets/css/style.css"> <link rel="stylesheet" href="assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="index.html" aria-current="page">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="about.html">About</a></li> </button>
<li><a class="nav-link" href="projects/index.html">Projects</a></li>
<li><a class="nav-link" href="blog/index.html">Blog</a></li> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="contact.html">Contact</a></li> <li><a class="nav-link" href="index.html" aria-current="page">Home</a></li>
</ul> <li><a class="nav-link" href="about.html">About</a></li>
</nav> <li><a class="nav-link" href="projects/index.html">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> </div>
</header> </header>
@ -48,12 +56,12 @@
I design embedded hardware, write bare-metal C &amp; FreeRTOS firmware, and build open-source systems from the transistor level up to Linux desktop tooling. I design embedded hardware, write bare-metal C &amp; FreeRTOS firmware, and build open-source systems from the transistor level up to Linux desktop tooling.
</p> </p>
<p class="reading-width"> <p class="reading-width">
Welcome to my engineering studio and notebook. Here I document my real hardware prototypes—from an <strong>ESP32-S3 2.4 GHz Multi-Functional RC Console</strong> and a <strong>Dual-Core ESP32 16-Track MIDI Synthesizer</strong> to a <strong>4WD Autonomous Vehicle</strong> and a <strong>Standalone Linux Game Launcher written in Rust</strong>. Welcome to my engineering studio and notebook. Here you can inspect my real hardware prototypes, copy build/flash commands, browse source code, and download releases—from my <strong>ESP32-S3 2.4 GHz Multi-Functional RC Console</strong> and <strong>Dual-Core ESP32 16-Track MIDI Synthesizer</strong> to my <strong>4WD Autonomous Vehicle</strong> and <strong>Standalone Linux Game Launcher written in Rust</strong>.
</p> </p>
<div class="button-row"> <div class="button-row">
<a class="btn btn-primary" href="projects/index.html">🚀 Explore All 4 Projects</a> <a class="btn btn-primary" href="projects/index.html">🚀 Explore Projects, Code &amp; Downloads</a>
<a class="btn btn-cyan" href="https://github.com/ertunc-ozbay" rel="noopener noreferrer">💻 GitHub (@ertunc-ozbay)</a> <a class="btn btn-cyan" href="https://github.com/ertunc-ozbay" rel="noopener noreferrer">💻 GitHub (@ertunc-ozbay)</a>
<a class="btn btn-secondary" href="contact.html">✉️ Contact &amp; Gmail</a> <a class="btn btn-secondary" href="contact.html">✉️ Contact (ertunc.ozbay@outlook.com)</a>
</div> </div>
<div class="stats-strip" aria-label="Workshop highlights"> <div class="stats-strip" aria-label="Workshop highlights">
@ -70,8 +78,8 @@
<span class="stat-label">Custom Python RLE MIDI-to-C Compiler</span> <span class="stat-label">Custom Python RLE MIDI-to-C Compiler</span>
</div> </div>
<div class="stat-pill"> <div class="stat-pill">
<span class="stat-value">Open Source</span> <span class="stat-value">Direct Downloads</span>
<span class="stat-label">Schematics, Firmware &amp; Build Logs</span> <span class="stat-label">Pre-Built Binaries, Firmware &amp; Schematics</span>
</div> </div>
</div> </div>
</section> </section>
@ -79,10 +87,10 @@
<section class="section-block" aria-labelledby="active-builds-heading"> <section class="section-block" aria-labelledby="active-builds-heading">
<div class="section-header"> <div class="section-header">
<div> <div>
<span class="section-label">01 // Featured Hardware &amp; Software Builds</span> <span class="section-label">01 // Featured Hardware, Firmware &amp; Software Builds</span>
<h2 id="active-builds-heading">Projects on My Bench</h2> <h2 id="active-builds-heading">Projects, Commands &amp; Downloads</h2>
</div> </div>
<a href="projects/index.html">View full specifications &amp; PoC video slots →</a> <a href="projects/index.html">View all project code, commands &amp; PoC videos →</a>
</div> </div>
<div class="card-grid-2"> <div class="card-grid-2">
@ -101,12 +109,13 @@
<li><span class="tag tag-esp">ESP32-S3-N16R8</span></li> <li><span class="tag tag-esp">ESP32-S3-N16R8</span></li>
<li><span class="tag tag-c">ESP-IDF C99</span></li> <li><span class="tag tag-c">ESP-IDF C99</span></li>
<li><span class="tag tag-hw">nRF24L01+ 2.4GHz</span></li> <li><span class="tag tag-hw">nRF24L01+ 2.4GHz</span></li>
<li><span class="tag tag-hw">KiCad Schematic</span></li> <li><span class="tag tag-python">KiCad Schematic</span></li>
</ul> </ul>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-primary" href="projects/multi-functional-controller.html">Project Page &amp; PoC Video</a> <a class="btn btn-primary" href="projects/multi-functional-controller.html">Code, Commands &amp; PoC Video</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">GitHub Repo</a> <a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/multi-functional-controller/archive/refs/heads/master.zip">⬇ Download ZIP</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">GitHub</a>
</div> </div>
</article> </article>
@ -129,12 +138,37 @@
</ul> </ul>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-primary" href="projects/midi-breadboard-instrument.html">Project Page &amp; PoC Video</a> <a class="btn btn-primary" href="projects/midi-breadboard-instrument.html">Code, Commands &amp; PoC Video</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument" rel="noopener noreferrer">GitHub Repo</a> <a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument/archive/refs/heads/main.zip">⬇ Download ZIP</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument" rel="noopener noreferrer">GitHub</a>
</div> </div>
</article> </article>
<!-- Project 3 --> <!-- Project 3 -->
<article class="card card-coral">
<div class="card-top">
<div class="card-meta">
<span class="badge badge-coral">v1.0.0 Binary Released</span>
<span>Rust • Linux Systems &amp; Wine</span>
</div>
<h3><a href="projects/pointblank-linux.html">Point Blank on Linux — Standalone Community Launcher</a></h3>
<p>
An all-in-one standalone Linux desktop launcher written in <strong>Rust</strong> that runs Point Blank (Zepetto / TAM) on Linux with 100% unmodified official CheatBlocker anti-cheat, automated Wine prefix provisioning, and DirectX 9 / DirectX 11 support.
</p>
<ul class="tag-list" aria-label="Technologies">
<li><span class="tag tag-rust">Rust</span></li>
<li><span class="tag tag-c">Wine / DirectX 11</span></li>
<li><span class="tag tag-python">Linux x86_64 Binary</span></li>
</ul>
</div>
<div class="card-actions">
<a class="btn btn-primary" href="projects/pointblank-linux.html">Setup Commands &amp; PoC Video</a>
<a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/pointblank-linux/releases/latest/download/pointblank-linux-v1.0.0-linux-x86_64.tar.gz">⬇ Download v1.0.0 (.tar.gz)</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">GitHub</a>
</div>
</article>
<!-- Project 4 -->
<article class="card card-emerald"> <article class="card card-emerald">
<div class="card-top"> <div class="card-top">
<div class="card-meta"> <div class="card-meta">
@ -152,39 +186,47 @@
</ul> </ul>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-primary" href="projects/rc-autonomous-vehicle.html">Project Page &amp; PoC Video</a> <a class="btn btn-primary" href="projects/rc-autonomous-vehicle.html">Telemetry Structs &amp; PoC Video</a>
</div> </div>
</article> </article>
</div>
</section>
<!-- Project 4 --> <!-- Quick Clone & Build Terminal Showcase -->
<article class="card card-coral"> <section class="section-block" aria-labelledby="quick-cli-heading">
<div class="card-top"> <div class="section-header">
<div class="card-meta"> <div>
<span class="badge badge-coral">v1.0.0 Released</span> <span class="section-label">02 // Quick Terminal Access</span>
<span>Rust • Linux Systems &amp; Wine</span> <h2 id="quick-cli-heading">Clone &amp; Run My Open-Source Projects</h2>
</div> </div>
<h3><a href="projects/pointblank-linux.html">Point Blank on Linux — Standalone Community Launcher</a></h3> </div>
<p>
An all-in-one standalone Linux desktop launcher written in <strong>Rust</strong> that runs Point Blank (Zepetto / TAM) on Linux with 100% unmodified official CheatBlocker anti-cheat, automated Wine prefix provisioning, and DirectX 9 / DirectX 11 support. <div class="code-window">
</p> <div class="code-window-header">
<ul class="tag-list" aria-label="Technologies"> <span class="code-window-title">
<li><span class="tag tag-rust">Rust</span></li> <span class="code-dots"><span class="code-dot red"></span><span class="code-dot amber"></span><span class="code-dot green"></span></span>
<li><span class="tag tag-c">Wine / DirectX 11</span></li> bash — Clone &amp; Launch Repositories (Arch Linux / ESP-IDF v5.2.2)
<li><span class="tag tag-python">Linux Desktop</span></li> </span>
</ul> <button type="button" class="copy-code-btn" data-copy-code>📋 Copy Commands</button>
</div> </div>
<div class="card-actions"> <pre><code># 1. ESP32-S3 Multi-Functional Controller (ESP-IDF v5.2.2)
<a class="btn btn-primary" href="projects/pointblank-linux.html">Project Page &amp; PoC Video</a> git clone https://github.com/ertunc-ozbay/multi-functional-controller.git
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">GitHub Repo</a> cd multi-functional-controller/firmware &amp;&amp; source ~/esp/esp-idf/export.sh &amp;&amp; idf.py build
</div>
</article> # 2. ESP32 16-Track MIDI Breadboard Synthesizer &amp; Python RLE Compiler
git clone https://github.com/ertunc-ozbay/midi-breadboard-instrument.git
cd midi-breadboard-instrument &amp;&amp; python3 scripts/midi_to_c.py scripts/midillis/Alla_Turca/Alla_Turca.mid
# 3. Point Blank Linux Standalone Launcher (Download Pre-Compiled x86_64 Release)
curl -L -O https://github.com/ertunc-ozbay/pointblank-linux/releases/latest/download/pointblank-linux-v1.0.0-linux-x86_64.tar.gz
tar -xzf pointblank-linux-v1.0.0-linux-x86_64.tar.gz &amp;&amp; cd pointblank-linux-v1.0.0-linux-x86_64 &amp;&amp; ./pointblank-linux</code></pre>
</div> </div>
</section> </section>
<section class="section-block" aria-labelledby="workshop-areas-heading"> <section class="section-block" aria-labelledby="workshop-areas-heading">
<div class="section-header"> <div class="section-header">
<div> <div>
<span class="section-label">02 // Inside This Studio</span> <span class="section-label">03 // Inside This Studio</span>
<h2 id="workshop-areas-heading">How I Approach Engineering</h2> <h2 id="workshop-areas-heading">How I Approach Engineering</h2>
</div> </div>
</div> </div>
@ -217,7 +259,7 @@
<span class="section-label">Direct Contact</span> <span class="section-label">Direct Contact</span>
<h3>Collaborate &amp; Connect</h3> <h3>Collaborate &amp; Connect</h3>
<p> <p>
Reach out directly via Gmail (<code>ertuncozbayh@gmail.com</code>), Outlook, LinkedIn, or GitHub to discuss embedded systems, electronics, or open-source builds. Reach out directly via email at <code>ertunc.ozbay@outlook.com</code>, LinkedIn, or GitHub to discuss embedded systems, electronics, or open-source builds.
</p> </p>
</div> </div>
<a href="contact.html">View Contact &amp; Email Details →</a> <a href="contact.html">View Contact &amp; Email Details →</a>
@ -231,7 +273,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="projects/index.html">Projects</a></li> <li><a href="projects/index.html">Projects</a></li>
@ -244,6 +286,6 @@
</div> </div>
</footer> </footer>
<script src="assets/js/main.js"></script> <script src="assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,15 +1,15 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lab &amp; Experiment Notebook — Ertunç Özbay</title> <title>Lab &amp; Experiment Notebook — Ertunç Özbay</title>
<meta name="description" content="Workshop lab notebook of Ertunç Özbay: ESP32-S3 hardware protection notes, RLE MIDI-to-C compression tools, Linux Wine/DX11 experiments, and reverse-engineering study logs."> <meta name="description" content="Workshop lab notebook of Ertunç Özbay: ESP32-S3 hardware protection notes, RLE MIDI-to-C compression tools, Linux Wine/DX11 experiments, and reverse-engineering study logs.">
<link rel="icon" type="image/svg+xml" href="assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="assets/images/favicon.svg">
<link rel="stylesheet" href="assets/css/style.css"> <link rel="stylesheet" href="assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="index.html#main-content">Skip to main content</a>
<header class="site-header"> <header class="site-header">
<div class="container header-inner"> <div class="container header-inner">
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="about.html">About</a></li> </button>
<li><a class="nav-link" href="projects/index.html">Projects</a></li>
<li><a class="nav-link" href="blog/index.html">Blog</a></li> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="lab.html" aria-current="page">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="contact.html">Contact</a></li> <li><a class="nav-link" href="index.html">Home</a></li>
</ul> <li><a class="nav-link" href="about.html">About</a></li>
</nav> <li><a class="nav-link" href="projects/index.html">Projects</a></li>
<li><a class="nav-link" href="blog/index.html">Blog</a></li>
<li><a class="nav-link" href="lab.html" aria-current="page">Lab</a></li>
<li><a class="nav-link" href="contact.html">Contact</a></li>
</ul>
</nav>
</div>
</div> </div>
</header> </header>
@ -69,6 +77,10 @@
While building the <a href="projects/midi-breadboard-instrument.html">16-Track MIDI Breadboard Instrument</a>, raw MIDI delta-slices caused the LEDs and 1.3" SPI OLED to strobe violently. Writing a custom Run-Length Encoding (RLE) compressor in Python (<code>midi_to_c.py</code>) and transposing bass-heavy tracks like <em>Seven Nation Army</em> +2 octaves solved both flash exhaustion and piezo acoustic roll-off. While building the <a href="projects/midi-breadboard-instrument.html">16-Track MIDI Breadboard Instrument</a>, raw MIDI delta-slices caused the LEDs and 1.3" SPI OLED to strobe violently. Writing a custom Run-Length Encoding (RLE) compressor in Python (<code>midi_to_c.py</code>) and transposing bass-heavy tracks like <em>Seven Nation Army</em> +2 octaves solved both flash exhaustion and piezo acoustic roll-off.
</p> </p>
</div> </div>
<div class="card-actions">
<a class="btn btn-cyan" href="https://raw.githubusercontent.com/ertunc-ozbay/midi-breadboard-instrument/main/scripts/midi_to_c.py" download="midi_to_c.py">🐍 Download midi_to_c.py</a>
<a class="btn btn-secondary" href="projects/midi-breadboard-instrument.html">Full MIDI Project →</a>
</div>
</div> </div>
<div class="card card-amber"> <div class="card card-amber">
@ -82,6 +94,10 @@
On the <a href="projects/multi-functional-controller.html">Multi-Functional RC Controller</a>, the ESP32-S3-N16R8 reserves <code>GPIO 35–37</code> for internal Octal PSRAM/Flash. We remapped the shared SPI2 bus (<code>MOSI: 11, MISO: 13, SCK: 12</code>) with dedicated hardware CS lines for the nRF24L01+ (<code>CSN: 10</code>), MicroSD (<code>CS: 39</code>), and ST7789 IPS TFT (<code>CS: 40</code>). On the <a href="projects/multi-functional-controller.html">Multi-Functional RC Controller</a>, the ESP32-S3-N16R8 reserves <code>GPIO 35–37</code> for internal Octal PSRAM/Flash. We remapped the shared SPI2 bus (<code>MOSI: 11, MISO: 13, SCK: 12</code>) with dedicated hardware CS lines for the nRF24L01+ (<code>CSN: 10</code>), MicroSD (<code>CS: 39</code>), and ST7789 IPS TFT (<code>CS: 40</code>).
</p> </p>
</div> </div>
<div class="card-actions">
<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-secondary" href="projects/multi-functional-controller.html">Full Controller Page →</a>
</div>
</div> </div>
</div> </div>
</section> </section>
@ -106,6 +122,10 @@
In <a href="projects/pointblank-linux.html">pointblank-linux</a>, we engineered a standalone Rust launcher that automatically provisions a 16-byte TLS-aligned <code>ntdll.dll</code> runtime and <code>vcrun2022</code> / <code>d3dx11_43</code> components so Point Blank runs at 200 FPS in DirectX 11 on Linux with unmodified official CheatBlocker anti-cheat. In <a href="projects/pointblank-linux.html">pointblank-linux</a>, we engineered a standalone Rust launcher that automatically provisions a 16-byte TLS-aligned <code>ntdll.dll</code> runtime and <code>vcrun2022</code> / <code>d3dx11_43</code> components so Point Blank runs at 200 FPS in DirectX 11 on Linux with unmodified official CheatBlocker anti-cheat.
</p> </p>
</div> </div>
<div class="card-actions">
<a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/pointblank-linux/releases/latest/download/pointblank-linux-v1.0.0-linux-x86_64.tar.gz">⬇ Download v1.0.0 Binary</a>
<a class="btn btn-secondary" href="projects/pointblank-linux.html">Read Technical Notes →</a>
</div>
</div> </div>
<div class="card card-emerald"> <div class="card card-emerald">
@ -116,9 +136,12 @@
</div> </div>
<h3>RLE MIDI-to-C Struct Compiler (<code>midi_to_c.py</code>)</h3> <h3>RLE MIDI-to-C Struct Compiler (<code>midi_to_c.py</code>)</h3>
<p> <p>
Converts multi-channel `.mid` files into compact C99 <code>SequenceStep</code> struct arrays (`{frequency, duration, kick_drum, hi_hat}`), automatically routing MIDI Channel 10 and low bass notes (`&lt; MIDI 50`) to hardware percussion buzzers. Converts multi-channel `.mid` files into compact C99 <code>SequenceStep</code> struct arrays (<code>{frequency, duration, kick_drum, hi_hat}</code>), automatically routing MIDI Channel 10 and low bass notes (<code>&lt; MIDI 50</code>) to hardware percussion buzzers.
</p> </p>
</div> </div>
<div class="card-actions">
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument/blob/main/scripts/midi_to_c.py" rel="noopener noreferrer">View Script on GitHub →</a>
</div>
</div> </div>
</div> </div>
</section> </section>
@ -148,7 +171,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="projects/index.html">Projects</a></li> <li><a href="projects/index.html">Projects</a></li>
@ -161,6 +184,6 @@
</div> </div>
</footer> </footer>
<script src="assets/js/main.js"></script> <script src="assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Projects — Ertunç Özbay</title> <title>Projects, Code &amp; Downloads — Ertunç Özbay</title>
<meta name="description" content="Hardware and software engineering projects by Ertunç Özbay: ESP32-S3 Multi-Functional RC Controller, ESP32 16-Track MIDI Breadboard Instrument, 4WD Autonomous Vehicle, and Point Blank Linux Launcher in Rust."> <meta name="description" content="Hardware and software engineering projects by Ertunç Özbay: ESP32-S3 Multi-Functional RC Controller, ESP32 16-Track MIDI Breadboard Instrument, Point Blank Linux Launcher in Rust, and 4WD Autonomous Vehicle.">
<link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
<link rel="stylesheet" href="../assets/css/style.css"> <link rel="stylesheet" href="../assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,31 +21,39 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="../index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="../about.html">About</a></li> </button>
<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> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="../lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="../contact.html">Contact</a></li> <li><a class="nav-link" href="../index.html">Home</a></li>
</ul> <li><a class="nav-link" href="../about.html">About</a></li>
</nav> <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> </div>
</header> </header>
<main id="main-content"> <main id="main-content">
<div class="container"> <div class="container">
<section class="workshop-hero" aria-labelledby="projects-heading"> <section class="workshop-hero" aria-labelledby="projects-heading">
<span class="workshop-eyebrow">⚡ PROJECT SHOWCASE // VERIFIED BUILDS &amp; REPOSITORIES</span> <span class="workshop-eyebrow">⚡ PROJECT SHOWCASE // CODE, COMMANDS, DOWNLOADS &amp; POC VIDEOS</span>
<h1 id="projects-heading"><span class="gradient-title">Engineering Projects &amp; Open-Source Builds</span></h1> <h1 id="projects-heading"><span class="gradient-title">Engineering Projects &amp; Open-Source Builds</span></h1>
<p class="hero-lead"> <p class="hero-lead">
Every project documented here is backed by real hardware on my bench or shipped open-source code on my GitHub—complete with verified pinouts, schematics, build photos, and dedicated slots for upcoming <strong>YouTube Proof-of-Concept (PoC) demonstration videos</strong>. Every project documented here includes verified hardware pinouts, build photos, copyable terminal commands, source code snippets, direct download links, and a dedicated <strong>YouTube Proof-of-Concept (PoC) video showcase</strong>.
</p> </p>
</section> </section>
@ -67,7 +75,7 @@
</div> </div>
<h3><a href="multi-functional-controller.html">Multi-Functional RC Controller (MFC)</a></h3> <h3><a href="multi-functional-controller.html">Multi-Functional RC Controller (MFC)</a></h3>
<p> <p>
A custom 2.4 GHz wireless remote controller and multi-purpose embedded console built around the <strong>ESP32-S3-N16R8</strong> and <strong>nRF24L01+ PA+LNA</strong> transceiver. Currently built as an early Rev 0.1 perfboard carrier and transitioning into a <strong>DT-100 (190×137×59 mm) desktop console</strong> with dual K-Silver Hall-effect gimbals and a 1.3" ST7789 IPS TFT display. A custom 2.4 GHz wireless remote controller and multi-purpose embedded console built around the <strong>ESP32-S3-N16R8</strong> and <strong>nRF24L01+ PA+LNA</strong> transceiver. Includes C99 ESP-IDF firmware, KiCad 9.0 schematics, Rev 0.1 perfboard photos, and Phase 2 DT-100 console BOM.
</p> </p>
<ul class="tag-list" aria-label="Confirmed technologies for Multi-Functional RC Controller"> <ul class="tag-list" aria-label="Confirmed technologies for Multi-Functional RC Controller">
@ -80,13 +88,14 @@
</ul> </ul>
<div class="project-notes"> <div class="project-notes">
<p><strong>Includes on page:</strong> 3 early prototype build photos, full KiCad SVG schematic, verified ESP32-S3 GPIO pinout, Phase 2 DT-100 BOM, and <strong>🎬 YouTube PoC Video Placeholder</strong>.</p> <p><strong>Included on page:</strong> Copyable `idf.py` build/flash commands, C99 firmware source code, downloadable KiCad `.kicad_sch` schematic &amp; `.zip` archive, 3 prototype photos, and <strong>🎬 YouTube PoC Video slot</strong>.</p>
</div> </div>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-primary" href="multi-functional-controller.html">Read Page &amp; PoC Video</a> <a class="btn btn-primary" href="multi-functional-controller.html">Open Page, Code &amp; PoC</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">GitHub Repo</a> <a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/multi-functional-controller/archive/refs/heads/master.zip">⬇ Download ZIP</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">GitHub</a>
</div> </div>
</article> </article>
@ -112,51 +121,23 @@
</ul> </ul>
<div class="project-notes"> <div class="project-notes">
<p><strong>Includes on page:</strong> 3 high-res breadboard photos, 16-track playlist table, ESP32 pinout, RLE compression architecture, and <strong>🎬 YouTube PoC Video Placeholder</strong>.</p> <p><strong>Included on page:</strong> Full `midi_to_c.py` Python script &amp; C99 Dual-Core FreeRTOS audio engine code, copyable CLI commands, downloadable `.py` &amp; `.zip` links, 3 breadboard photos, and <strong>🎬 YouTube PoC Video slot</strong>.</p>
</div> </div>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-primary" href="midi-breadboard-instrument.html">Read Page &amp; PoC Video</a> <a class="btn btn-primary" href="midi-breadboard-instrument.html">Open Page, Code &amp; PoC</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument" rel="noopener noreferrer">GitHub Repo</a> <a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument/archive/refs/heads/main.zip">⬇ Download ZIP</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument" rel="noopener noreferrer">GitHub</a>
</div> </div>
</article> </article>
<!-- Project 3: RC and Autonomous Vehicle --> <!-- Project 3: Point Blank Linux Launcher -->
<article class="card card-emerald">
<div class="card-top">
<div class="card-meta">
<span class="badge badge-active">In Progress</span>
<span>Project 03 • Robotics &amp; Control</span>
</div>
<h3><a href="rc-autonomous-vehicle.html">RC and Autonomous 4WD Vehicle</a></h3>
<p>
An ongoing 4WD robotic vehicle platform exploring manual 2.4 GHz RF remote control (paired with the Multi-Functional Controller) alongside autonomous obstacle avoidance, motor driver electronics, and real-time control logic.
</p>
<ul class="tag-list" aria-label="Confirmed focus areas for RC and Autonomous Vehicle">
<li><span class="tag tag-hw">4WD Vehicle Platform</span></li>
<li><span class="tag tag-esp">2.4 GHz RF Receiver Link</span></li>
<li><span class="tag tag-c">Autonomous Control Logic</span></li>
<li><span class="tag tag-hw">Power &amp; Motor Electronics</span></li>
</ul>
<div class="project-notes">
<p><strong>Includes on page:</strong> System scope, manual-to-autonomous control transition notes, and <strong>🎬 YouTube PoC Video Placeholder</strong>.</p>
</div>
</div>
<div class="card-actions">
<a class="btn btn-primary" href="rc-autonomous-vehicle.html">Read Page &amp; PoC Video</a>
</div>
</article>
<!-- Project 4: Point Blank Linux Launcher -->
<article class="card card-coral"> <article class="card card-coral">
<div class="card-top"> <div class="card-top">
<div class="card-meta"> <div class="card-meta">
<span class="badge badge-coral">v1.0.0 Shipped</span> <span class="badge badge-coral">v1.0.0 Shipped Binary</span>
<span>Project 04 • Rust &amp; Linux Systems</span> <span>Project 03 • Rust &amp; Linux Systems</span>
</div> </div>
<h3><a href="pointblank-linux.html">Point Blank on Linux — Standalone Community Launcher</a></h3> <h3><a href="pointblank-linux.html">Point Blank on Linux — Standalone Community Launcher</a></h3>
<p> <p>
@ -171,13 +152,43 @@
</ul> </ul>
<div class="project-notes"> <div class="project-notes">
<p><strong>Includes on page:</strong> Architecture overview, Wine prefix automation breakdown, release links, and <strong>🎬 YouTube PoC Video Placeholder</strong>.</p> <p><strong>Included on page:</strong> Direct pre-compiled `x86_64` release `.tar.gz` download, copyable distro dependency commands (Arch/Ubuntu/Fedora), Rust source build commands, and <strong>🎬 YouTube PoC Video slot</strong>.</p>
</div> </div>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn btn-primary" href="pointblank-linux.html">Read Page &amp; PoC Video</a> <a class="btn btn-primary" href="pointblank-linux.html">Open Page, CLI &amp; PoC</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">GitHub Repo</a> <a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/pointblank-linux/releases/latest/download/pointblank-linux-v1.0.0-linux-x86_64.tar.gz">⬇ Download v1.0.0 (.tar.gz)</a>
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">GitHub</a>
</div>
</article>
<!-- Project 4: RC and Autonomous Vehicle -->
<article class="card card-emerald">
<div class="card-top">
<div class="card-meta">
<span class="badge badge-active">In Progress</span>
<span>Project 04 • Robotics &amp; Control</span>
</div>
<h3><a href="rc-autonomous-vehicle.html">RC and Autonomous 4WD Vehicle</a></h3>
<p>
An ongoing 4WD robotic vehicle platform exploring manual 2.4 GHz RF remote control (paired with the Multi-Functional Controller) alongside autonomous obstacle avoidance, motor driver electronics, and real-time control logic.
</p>
<ul class="tag-list" aria-label="Confirmed focus areas for RC and Autonomous Vehicle">
<li><span class="tag tag-hw">4WD Vehicle Platform</span></li>
<li><span class="tag tag-esp">2.4 GHz RF Receiver Link</span></li>
<li><span class="tag tag-c">Autonomous Control Logic</span></li>
<li><span class="tag tag-hw">Power &amp; Motor Electronics</span></li>
</ul>
<div class="project-notes">
<p><strong>Included on page:</strong> C99 2.4 GHz telemetry receiver packet &amp; differential motor drive code structure, companion controller link, and <strong>🎬 YouTube PoC Video slot</strong>.</p>
</div>
</div>
<div class="card-actions">
<a class="btn btn-primary" href="rc-autonomous-vehicle.html">Open Page, Code &amp; PoC</a>
</div> </div>
</article> </article>
</div> </div>
@ -189,7 +200,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="../projects/index.html">Projects</a></li> <li><a href="../projects/index.html">Projects</a></li>
@ -202,6 +213,6 @@
</div> </div>
</footer> </footer>
<script src="../assets/js/main.js"></script> <script src="../assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MIDI Breadboard Instrument (Desk Rave &amp; 16-Track Symphony) — Projects — Ertunç Özbay</title> <title>MIDI Breadboard Instrument (Desk Rave &amp; 16-Track Symphony) — Projects — Ertunç Özbay</title>
<meta name="description" content="Project notes for the MIDI Breadboard Instrument (Desk Rave & 16-Track Symphony Controller) by Ertunç Özbay: Dual-Core ESP32 synthesizer in ESP-IDF v5.2.2 with RLE Python MIDI-to-C compiler, 30 FPS SPI OLED visualizer, rotary encoder, and triple-buzzer acoustic stage."> <meta name="description" content="Project documentation, Python RLE MIDI-to-C compiler code, ESP-IDF C99 firmware, and downloads for the 16-Track MIDI Breadboard Instrument by Ertunç Özbay.">
<link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
<link rel="stylesheet" href="../assets/css/style.css"> <link rel="stylesheet" href="../assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="../index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="../about.html">About</a></li> </button>
<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> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="../lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="../contact.html">Contact</a></li> <li><a class="nav-link" href="../index.html">Home</a></li>
</ul> <li><a class="nav-link" href="../about.html">About</a></li>
</nav> <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> </div>
</header> </header>
@ -59,9 +67,10 @@
What started as making a passive piezo buzzer squeak evolved into a full 16-track embedded music box with live kick/hi-hat drum transients, hardware PCNT quadrature rotary controls for real-time tempo and volume scaling, and dual-core FreeRTOS task isolation. What started as making a passive piezo buzzer squeak evolved into a full 16-track embedded music box with live kick/hi-hat drum transients, hardware PCNT quadrature rotary controls for real-time tempo and volume scaling, and dual-core FreeRTOS task isolation.
</p> </p>
<div class="button-row"> <div class="button-row">
<a class="btn btn-primary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument" rel="noopener noreferrer">💻 View GitHub Repository</a> <a class="btn btn-primary" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument" rel="noopener noreferrer">💻 View GitHub Repo</a>
<a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/midi-breadboard-instrument/archive/refs/heads/main.zip">⬇ Download Project (.zip)</a>
<a class="btn btn-cyan" href="https://raw.githubusercontent.com/ertunc-ozbay/midi-breadboard-instrument/main/scripts/midi_to_c.py" download="midi_to_c.py">🐍 Download midi_to_c.py</a>
<a class="btn btn-youtube" href="#poc-video">🎬 Watch PoC Video Slot</a> <a class="btn btn-youtube" href="#poc-video">🎬 Watch PoC Video Slot</a>
<a class="btn btn-secondary" href="index.html">All Projects</a>
</div> </div>
</header> </header>
@ -70,7 +79,6 @@
<div class="poc-video-card"> <div class="poc-video-card">
<span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span> <span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span>
<h2 id="midi-video-heading">YouTube Proof-of-Concept Demonstration</h2> <h2 id="midi-video-heading">YouTube Proof-of-Concept Demonstration</h2>
<!-- Ready-to-use YouTube Embed Placeholder: Replace src when uploaded -->
<div class="poc-video-screen" role="region" aria-label="YouTube Proof of Concept Video Placeholder"> <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-badge" aria-hidden="true">
<div class="poc-play-triangle"></div> <div class="poc-play-triangle"></div>
@ -116,17 +124,107 @@
</div> </div>
</section> </section>
<section class="section-block reading-width" aria-labelledby="p3-overview"> <!-- Terminal Commands & Source Code Section -->
<span class="section-label">02 // Engineering Challenges Solved</span> <section class="section-block" aria-labelledby="p3-code">
<h2 id="p3-overview">From a Squeaking Buzzer to a Dual-Core Synthesizer</h2> <span class="section-label">02 // Terminal Commands, Python RLE Compiler &amp; C99 Firmware</span>
<p> <h2 id="p3-code">Build, Flash &amp; MIDI Conversion Commands</h2>
Pushing a bare-metal breadboard setup to play recognizable, energetic multi-track music required solving several real embedded systems challenges: <p class="reading-width">
Clone the repository, convert any `.mid` file into an RLE-compressed C struct array using `scripts/midi_to_c.py`, and flash the 16-track firmware to an ESP32:
</p> </p>
<ul>
<li><strong>The Strobe-Light Bug &amp; RLE Compression (<code>midi_to_c.py</code>):</strong> Raw MIDI files often slice sustained notes into microscopic fragments, causing the LEDs and OLED UI to strobe at 30+ Hz while wasting flash memory. We built a custom Python Run-Length Encoding (RLE) compressor using <code>mido</code> that merges contiguous identical pitch/drum states into solid <code>SequenceStep</code> blocks and routes bass/percussion channels to dedicated drum triggers.</li> <div class="code-window">
<li><strong>Acoustic Hardware Limits (+2 Octave Transposition):</strong> Passive piezo buzzers physically struggle to resonate at low bass frequencies. Tracks with deep basslines like <em>Seven Nation Army</em> were transposed up two full octaves so the piezo disc resonates clearly while the active buzzers carry the rhythmic punch.</li> <div class="code-window-header">
<li><strong>Dual-Core FreeRTOS Lockless IPC:</strong> Core 0 runs <code>oled_visualizer_task</code> (30 FPS SPI DMA framebuffer engine) and <code>button_task</code> (debounced input polling), while Core 1 exclusively runs <code>buzzer_sequence_task</code> for microsecond-accurate LEDC PWM pitch generation and hardware PCNT rotary encoder scaling.</li> <span class="code-window-title">
</ul> <span class="code-dots"><span class="code-dot red"></span><span class="code-dot amber"></span><span class="code-dot green"></span></span>
bash — Convert MIDI to C &amp; Flash ESP32 Firmware (ESP-IDF v5.2.2)
</span>
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Commands</button>
</div>
<pre><code># 1. Clone the repository
git clone https://github.com/ertunc-ozbay/midi-breadboard-instrument.git
cd midi-breadboard-instrument
# 2. (Optional) Convert a custom .mid file into an RLE-compressed C struct array
pip install mido
python3 scripts/midi_to_c.py scripts/midillis/Alla_Turca/Alla_Turca.mid &gt; my_track.h
# 3. Build and flash the 16-track firmware to ESP32
source ~/esp/esp-idf/export.sh
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor</code></pre>
</div>
<h3>Python RLE MIDI-to-C Compiler (<code>scripts/midi_to_c.py</code>)</h3>
<p class="reading-width">
To prevent fragmented MIDI delta-times from strobing the LEDs/OLED at 30+ Hz and exhausting flash memory, <code>midi_to_c.py</code> merges contiguous identical states via Run-Length Encoding and routes Channel 10 + bass notes (`&lt; MIDI 50`) to hardware percussion buzzers:
</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>
python3 — scripts/midi_to_c.py (RLE Compression &amp; Drum Routing Engine)
</span>
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Code</button>
</div>
<pre><code>#!/usr/bin/env python3
import sys, mido
def convert_midi_to_c(midi_filename):
mid = mido.MidiFile(midi_filename)
safe_name = midi_filename.split('/')[-1].replace('.mid', '').replace('-', '_')
print(f"const SequenceStep midi_{safe_name}[] = {{")
active_melody_notes = set()
time_accum = 0.0
trigger_kick = trigger_hat = False
rle_freq, rle_dur, rle_kick, rle_hat = -1, 0, False, False
for msg in mid:
time_accum += msg.time
if msg.type in ['note_on', 'note_off'] and time_accum &gt; 0.01:
duration_ms = int(time_accum * 1000)
freq = int(440.0 * (2.0 ** ((max(active_melody_notes) - 69) / 12.0))) if active_melody_notes else 0
# RLE Engine: coalesce contiguous identical frequency &amp; drum states
if freq == rle_freq and trigger_kick == rle_kick and trigger_hat == rle_hat:
rle_dur += duration_ms
else:
if rle_dur &gt; 0:
print(f" {{{rle_freq}, {rle_dur}, {str(rle_kick).lower()}, {str(rle_hat).lower()}}},")
rle_freq, rle_dur, rle_kick, rle_hat = freq, duration_ms, trigger_kick, trigger_hat
time_accum, trigger_kick, trigger_hat = 0.0, False, False</code></pre>
</div>
<h3>Dual-Core FreeRTOS Music &amp; Visualizer Architecture (<code>main/mmcontroller.c</code>)</h3>
<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 — main/mmcontroller.c (SequenceStep Struct &amp; Dual-Core Task Pinning)
</span>
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Code</button>
</div>
<pre><code>typedef struct {
uint16_t frequency; // Melody pitch in Hz (driven by 13-bit LEDC PWM on GPIO 25)
uint16_t duration; // Step duration in ms (scaled live by PCNT rotary speed)
bool kick_drum; // Triggers Active Buzzer 1 (GPIO 26) + Kick LED (GPIO 21)
bool hi_hat; // Triggers Active Buzzer 2 (GPIO 27) + Hat LED (GPIO 22)
} SequenceStep;
void app_main(void) {
printf("Desk Rave: 16-Track Symphony Edition Initializing...\n");
init_hardware();
// Core 0: 30 FPS SPI OLED Framebuffer Visualizer &amp; 50ms Button Polling
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
// Core 1: Dedicated Real-Time Audio Synthesizer &amp; PCNT Rotary Scaling
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}</code></pre>
</div>
</section> </section>
<section class="section-block reading-width" aria-labelledby="p3-components"> <section class="section-block reading-width" aria-labelledby="p3-components">
@ -188,9 +286,6 @@
<section class="section-block reading-width" aria-labelledby="p3-playlist"> <section class="section-block reading-width" aria-labelledby="p3-playlist">
<span class="section-label">04 // Flash Memory Playlist</span> <span class="section-label">04 // Flash Memory Playlist</span>
<h2 id="p3-playlist">The 16-Track Symphony</h2> <h2 id="p3-playlist">The 16-Track Symphony</h2>
<p>
All 16 tracks are stored in ESP32 flash memory as <code>SequenceStep</code> arrays featuring <code>frequency</code>, <code>duration</code>, <code>kick_drum</code>, and <code>hi_hat</code> triggers:
</p>
<ol> <ol>
<li><strong>Careless Whisper</strong> (Extended Club Edit)</li> <li><strong>Careless Whisper</strong> (Extended Club Edit)</li>
<li><strong>Take On Me</strong> (EDM Build-up Edition)</li> <li><strong>Take On Me</strong> (EDM Build-up Edition)</li>
@ -210,20 +305,6 @@
<li><strong>Mega Man 2</strong> (Dr. Wily Stage)</li> <li><strong>Mega Man 2</strong> (Dr. Wily Stage)</li>
</ol> </ol>
</section> </section>
<section class="section-block reading-width" aria-labelledby="p3-learning">
<span class="section-label">05 // Workshop Notes &amp; Next Steps</span>
<h2 id="p3-learning">Current State &amp; Roadmap</h2>
<div class="callout-box magenta">
<span class="callout-title">Current State &amp; Next Steps</span>
<p>
The firmware is rock-solid on the breadboard: the rotary encoder dynamically scales volume and tempo via lockless IPC variables, all 16 tracks play from flash memory, and the 1.3" SPI OLED renders real-time frequency bars and drum hits at 30 FPS.
</p>
<p style="margin-bottom:0;">
<strong>Next Step:</strong> Migrating the dual-breadboard circuit onto a soldered perfboard or custom KiCad PCB.
</p>
</div>
</section>
</article> </article>
</div> </div>
@ -232,7 +313,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="../projects/index.html">Projects</a></li> <li><a href="../projects/index.html">Projects</a></li>
@ -245,6 +326,6 @@
</div> </div>
</footer> </footer>
<script src="../assets/js/main.js"></script> <script src="../assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Multi-Functional RC Controller (MFC) — Projects — Ertunç Özbay</title> <title>Multi-Functional RC Controller (MFC) — Projects — Ertunç Özbay</title>
<meta name="description" content="Engineering documentation for the ESP32-S3-N16R8 Multi-Functional RC Controller (MFC) by Ertunç Özbay: 2.4 GHz nRF24L01+ PA+LNA telemetry, K-Silver Hall-effect gimbals, ST7789 IPS TFT + MicroSD SPI2 bus, KiCad schematic, and Phase 1/2 hardware build."> <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="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
<link rel="stylesheet" href="../assets/css/style.css"> <link rel="stylesheet" href="../assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="../index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="../about.html">About</a></li> </button>
<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> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="../lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="../contact.html">Contact</a></li> <li><a class="nav-link" href="../index.html">Home</a></li>
</ul> <li><a class="nav-link" href="../about.html">About</a></li>
</nav> <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> </div>
</header> </header>
@ -59,9 +67,10 @@
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. 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> </p>
<div class="button-row"> <div class="button-row">
<a class="btn btn-primary" href="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">💻 View GitHub Repository</a> <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> <a class="btn btn-youtube" href="#poc-video">🎬 Watch PoC Video Slot</a>
<a class="btn btn-secondary" href="index.html">All Projects</a>
</div> </div>
</header> </header>
@ -70,7 +79,6 @@
<div class="poc-video-card"> <div class="poc-video-card">
<span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span> <span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span>
<h2 id="mfc-video-heading">YouTube Proof-of-Concept Demonstration</h2> <h2 id="mfc-video-heading">YouTube Proof-of-Concept Demonstration</h2>
<!-- Ready-to-use YouTube Embed Placeholder: Replace src when uploaded -->
<div class="poc-video-screen" role="region" aria-label="YouTube Proof of Concept Video Placeholder"> <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-badge" aria-hidden="true">
<div class="poc-play-triangle"></div> <div class="poc-play-triangle"></div>
@ -87,9 +95,9 @@
<!-- Early Prototype Hardware Gallery --> <!-- Early Prototype Hardware Gallery -->
<section class="section-block" aria-labelledby="p1-gallery"> <section class="section-block" aria-labelledby="p1-gallery">
<span class="section-label">01 // Early Prototype Build (Rev 0.1 Perfboard Carrier)</span> <span class="section-label">01 // Early Prototype Build (Rev 0.1 Perfboard Carrier)</span>
<h2 id="p1-gallery">Very Early Prototype Hardware Gallery</h2> <h2 id="p1-gallery">Very Early Prototype Hardware Gallery (Click to Zoom)</h2>
<p class="reading-width"> <p class="reading-width">
<em>Note:</em> The photos below show the <strong>very early Phase 1 (Rev 0.1) perfboard carrier build</strong> (click any image to zoom). 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. <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> </p>
<div class="card-grid"> <div class="card-grid">
<figure class="card card-amber" style="margin:0;"> <figure class="card card-amber" style="margin:0;">
@ -113,25 +121,93 @@
</div> </div>
</section> </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 --> <!-- KiCad Schematic -->
<section class="section-block" aria-labelledby="p1-schematic"> <section class="section-block" aria-labelledby="p1-schematic">
<span class="section-label">02 // Hardware Schematic Capture</span> <span class="section-label">03 // Hardware Schematic Capture</span>
<h2 id="p1-schematic">Early KiCad 9.0 Schematic (<code>mfc-1.svg</code>)</h2> <h2 id="p1-schematic">Early KiCad 9.0 Schematic (<code>mfc-1.svg</code>)</h2>
<figure class="schematic-frame"> <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;"> <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"> <figcaption class="schematic-caption">
Early prototype KiCad schematic (<code>mfc-1.kicad_sch</code>) — click to zoom full-screen. 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> </figcaption>
</figure> </figure>
</section> </section>
<!-- Confirmed ESP32-S3 Pinout --> <!-- Confirmed ESP32-S3 Pinout -->
<section class="section-block reading-width" aria-labelledby="p1-pinout"> <section class="section-block reading-width" aria-labelledby="p1-pinout">
<span class="section-label">03 // Verified ESP32-S3-N16R8 Pinout &amp; Bus Architecture</span> <span class="section-label">04 // Verified ESP32-S3-N16R8 Pinout &amp; Bus Architecture</span>
<h2 id="p1-pinout">Master Node GPIO Allocation</h2> <h2 id="p1-pinout">Master Node GPIO Allocation</h2>
<p>
Because the <strong>ESP32-S3-N16R8</strong> reserves <code>GPIO 35–37</code> internally for its 8 MB Octal PSRAM and 16 MB SPI Flash, all peripherals are mapped across safe ADC1, SPI2, and PCNT pins:
</p>
<table class="spec-table"> <table class="spec-table">
<thead> <thead>
<tr> <tr>
@ -187,7 +263,7 @@
<!-- Phase 1 vs Phase 2 BOM --> <!-- Phase 1 vs Phase 2 BOM -->
<section class="section-block reading-width" aria-labelledby="p1-bom"> <section class="section-block reading-width" aria-labelledby="p1-bom">
<span class="section-label">04 // Build Roadmap &amp; Phase 2 Console BOM</span> <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> <h2 id="p1-bom">From Rev 0.1 Carrier to the DT-100 Desktop Console</h2>
<div class="callout-box amber"> <div class="callout-box amber">
<span class="callout-title">Phase 2 Hardware Upgrade (Direnc.net Procurement List)</span> <span class="callout-title">Phase 2 Hardware Upgrade (Direnc.net Procurement List)</span>
@ -212,7 +288,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="../projects/index.html">Projects</a></li> <li><a href="../projects/index.html">Projects</a></li>
@ -225,6 +301,6 @@
</div> </div>
</footer> </footer>
<script src="../assets/js/main.js"></script> <script src="../assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Point Blank on Linux (Standalone Rust Launcher) — Projects — Ertunç Özbay</title> <title>Point Blank on Linux (Standalone Rust Launcher) — Projects — Ertunç Özbay</title>
<meta name="description" content="Point Blank on Linux by Ertunç Özbay: Standalone Linux desktop launcher written in Rust with 100% unmodified official CheatBlocker anti-cheat, automated Wine prefix provisioning, and DirectX 9 / DirectX 11 support."> <meta name="description" content="Download, install, and build commands for Point Blank on Linux by Ertunç Özbay: Standalone Linux desktop launcher written in Rust with 100% unmodified official CheatBlocker anti-cheat and DirectX 9/11 support.">
<link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
<link rel="stylesheet" href="../assets/css/style.css"> <link rel="stylesheet" href="../assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="../index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="../about.html">About</a></li> </button>
<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> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="../lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="../contact.html">Contact</a></li> <li><a class="nav-link" href="../index.html">Home</a></li>
</ul> <li><a class="nav-link" href="../about.html">About</a></li>
</nav> <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> </div>
</header> </header>
@ -48,8 +56,8 @@
<article> <article>
<header class="workshop-hero"> <header class="workshop-hero">
<div class="card-meta"> <div class="card-meta">
<span class="badge badge-coral">Status: v1.0.0 Released</span> <span class="badge badge-coral">Status: v1.0.0 Pre-Compiled Binary Released</span>
<span>Project 04 // Rust • Linux Systems • Wine &amp; DirectX 9/11</span> <span>Project 03 // Rust • Linux Systems • Wine &amp; DirectX 9/11</span>
</div> </div>
<h1><span class="gradient-title">Point Blank on Linux — Standalone Community Launcher</span></h1> <h1><span class="gradient-title">Point Blank on Linux — Standalone Community Launcher</span></h1>
<p class="hero-lead"> <p class="hero-lead">
@ -59,8 +67,9 @@
Built on Arch Linux without requiring Heroic, Lutris, or external wrappers—featuring automated Wine prefix &amp; Winetricks provisioning, 16-byte TLS-aligned runtime support for DirectX 11, multi-region authentication, and native 1920×1080 borderless fullscreen at 200 FPS. Built on Arch Linux without requiring Heroic, Lutris, or external wrappers—featuring automated Wine prefix &amp; Winetricks provisioning, 16-byte TLS-aligned runtime support for DirectX 11, multi-region authentication, and native 1920×1080 borderless fullscreen at 200 FPS.
</p> </p>
<div class="button-row"> <div class="button-row">
<a class="btn btn-primary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">💻 View GitHub Repository</a> <a class="btn btn-emerald" href="https://github.com/ertunc-ozbay/pointblank-linux/releases/latest/download/pointblank-linux-v1.0.0-linux-x86_64.tar.gz">⬇ Download v1.0.0 Linux Binary (.tar.gz)</a>
<a class="btn btn-cyan" href="https://github.com/ertunc-ozbay/pointblank-linux/releases" rel="noopener noreferrer">📦 Download v1.0.0 Release</a> <a class="btn btn-primary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">💻 View GitHub Repo</a>
<a class="btn btn-cyan" href="https://github.com/ertunc-ozbay/pointblank-linux/releases" rel="noopener noreferrer">📦 All GitHub Releases</a>
<a class="btn btn-youtube" href="#poc-video">🎬 Watch PoC Video Slot</a> <a class="btn btn-youtube" href="#poc-video">🎬 Watch PoC Video Slot</a>
</div> </div>
</header> </header>
@ -70,7 +79,6 @@
<div class="poc-video-card"> <div class="poc-video-card">
<span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span> <span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span>
<h2 id="pb-video-heading">YouTube Proof-of-Concept Demonstration</h2> <h2 id="pb-video-heading">YouTube Proof-of-Concept Demonstration</h2>
<!-- Ready-to-use YouTube Embed Placeholder: Replace src when uploaded -->
<div class="poc-video-screen" role="region" aria-label="YouTube Proof of Concept Video Placeholder"> <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-badge" aria-hidden="true">
<div class="poc-play-triangle"></div> <div class="poc-play-triangle"></div>
@ -84,21 +92,84 @@
</div> </div>
</section> </section>
<section class="section-block reading-width" aria-labelledby="p4-overview"> <!-- Download & Terminal Commands Section -->
<span class="section-label">01 // Systems Engineering Overview</span> <section class="section-block" aria-labelledby="p4-commands">
<h2 id="p4-overview">Solving Low-Level Windows-on-Linux Compatibility</h2> <span class="section-label">01 // Direct Download &amp; Linux Terminal Commands</span>
<p> <h2 id="p4-commands">Quick Download &amp; Launch Commands</h2>
Running legacy 32-bit/64-bit online Windows games with kernel/user-mode anti-cheat modules like CheatBlocker on Linux often fails due to unaligned Thread Local Storage (TLS) allocations in `ntdll.dll`, missing Visual C++ MFC redistributables, and broken WebView2 login flows. <p class="reading-width">
You do not need to compile from source—download and run the pre-compiled `x86_64` Linux release archive directly from the terminal:
</p> </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 — Download, Extract &amp; Run Pre-Compiled Release (v1.0.0)
</span>
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Commands</button>
</div>
<pre><code># 1. Download &amp; extract the official pre-compiled Linux x86_64 release archive
curl -L -O https://github.com/ertunc-ozbay/pointblank-linux/releases/latest/download/pointblank-linux-v1.0.0-linux-x86_64.tar.gz
tar -xzf pointblank-linux-v1.0.0-linux-x86_64.tar.gz
cd pointblank-linux-v1.0.0-linux-x86_64
# 2. Make executable and launch (or install desktop menu shortcut)
chmod +x pointblank-linux install-desktop.sh
./install-desktop.sh
./pointblank-linux</code></pre>
</div>
<h3>1. Install System Dependencies (Arch / Ubuntu / Fedora)</h3>
<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 — Install Wine, Winetricks, 32-bit Vulkan &amp; MinGW-w64
</span>
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Commands</button>
</div>
<pre><code># Arch Linux / CachyOS / Manjaro / EndeavourOS (with [multilib] enabled)
sudo pacman -Syu --needed wine wine-mono wine-gecko winetricks mingw-w64-gcc \
lib32-vulkan-icd-loader vulkan-icd-loader cabextract curl unzip
# Ubuntu / Debian / Linux Mint / Pop!_OS
sudo dpkg --add-architecture i386 &amp;&amp; sudo apt update
sudo apt install -y wine wine32 wine64 winetricks gcc-mingw-w64-i686 \
mesa-vulkan-drivers mesa-vulkan-drivers:i386 cabextract curl unzip
# Fedora / Nobara
sudo dnf install -y wine winetricks mingw32-gcc vulkan-loader vulkan-loader.i686 \
cabextract curl unzip</code></pre>
</div>
<h3>2. Build from Source with Cargo (Rust)</h3>
<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 &amp; Compile Rust Source Code
</span>
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Commands</button>
</div>
<pre><code>git clone https://github.com/ertunc-ozbay/pointblank-linux.git
cd pointblank-linux
cargo build --release
./target/release/pointblank-linux</code></pre>
</div>
</section>
<section class="section-block reading-width" aria-labelledby="p4-overview">
<span class="section-label">02 // Systems Engineering Overview</span>
<h2 id="p4-overview">Solving Low-Level Windows-on-Linux Compatibility</h2>
<ul> <ul>
<li><strong>16-Byte TLS-Aligned Runtime for DirectX 11:</strong> Automatically provisions a 16-byte TLS-aligned `ntdll.dll` Wine runtime so both <strong>DirectX 9</strong> (`DXVersion = 9`) and <strong>DirectX 11</strong> (`DXVersion = 11`) render cleanly without crashes.</li> <li><strong>16-Byte TLS-Aligned Runtime for DirectX 11:</strong> Automatically provisions a 16-byte TLS-aligned <code>ntdll.dll</code> Wine runtime so both <strong>DirectX 9</strong> (<code>DXVersion = 9</code>) and <strong>DirectX 11</strong> (<code>DXVersion = 11</code>) render cleanly without crashes.</li>
<li><strong>One-Click Isolated Prefix Provisioning:</strong> Configures `~/.local/share/pointblank-linux/prefix` with `vcrun2022` (`mfc140.dll`, `msvcp140.dll`, `vcruntime140.dll`), `d3dx9_31..43`, `d3dcompiler_43`, `d3dx11_43`, and Edge WebView2 (`109.0.1518.78`).</li> <li><strong>One-Click Isolated Prefix Provisioning:</strong> Configures <code>~/.local/share/pointblank-linux/prefix</code> with <code>vcrun2022</code> (<code>mfc140.dll</code>, <code>msvcp140.dll</code>, <code>vcruntime140.dll</code>), <code>d3dx9_31..43</code>, <code>d3dcompiler_43</code>, <code>d3dx11_43</code>, and Edge WebView2 (<code>109.0.1518.78</code>).</li>
<li><strong>In-Game `F11` Borderless Fullscreen Helper:</strong> Compiles a lightweight MinGW-w64 helper utility for instant 1920×1080 borderless fullscreen switching at 200 FPS.</li> <li><strong>In-Game <code>F11</code> Borderless Fullscreen Helper:</strong> Compiles a lightweight MinGW-w64 helper utility for instant 1920×1080 borderless fullscreen switching at 200 FPS.</li>
</ul> </ul>
</section> </section>
<section class="section-block reading-width" aria-labelledby="p4-specs"> <section class="section-block reading-width" aria-labelledby="p4-specs">
<span class="section-label">02 // Technical Specifications</span> <span class="section-label">03 // Technical Specifications</span>
<h2 id="p4-specs">Confirmed Capabilities &amp; Supported Distros</h2> <h2 id="p4-specs">Confirmed Capabilities &amp; Supported Distros</h2>
<table class="spec-table"> <table class="spec-table">
<thead> <thead>
@ -110,22 +181,22 @@
<tbody> <tbody>
<tr> <tr>
<td><strong>Primary Language</strong></td> <td><strong>Primary Language</strong></td>
<td>Rust (Standalone Linux `x86_64` executable)</td> <td>Rust (Standalone Linux <code>x86_64</code> executable)</td>
</tr> </tr>
<tr> <tr>
<td><strong>Anti-Cheat Compatibility</strong></td> <td><strong>Anti-Cheat Compatibility</strong></td>
<td>100% Unmodified Official CheatBlocker (`CB.exe` + `CB.cbm`)</td> <td>100% Unmodified Official CheatBlocker (<code>CB.exe</code> + <code>CB.cbm</code>)</td>
</tr> </tr>
<tr> <tr>
<td><strong>Render Pipelines</strong></td> <td><strong>Render Pipelines</strong></td>
<td>DirectX 9 &amp; DirectX 11 (1920×1080 Borderless Fullscreen @ 200 FPS)</td> <td>DirectX 9 &amp; DirectX 11 (1920×1080 Borderless Fullscreen @ 200 FPS)</td>
</tr> </tr>
<tr> <tr>
<td><strong>Supported Linux Distributions</strong></td> <td><strong>Direct Binary Download</strong></td>
<td>Arch Linux / CachyOS / Manjaro, Ubuntu / Debian / Mint / Pop!_OS, Fedora / Nobara</td> <td><a href="https://github.com/ertunc-ozbay/pointblank-linux/releases/latest/download/pointblank-linux-v1.0.0-linux-x86_64.tar.gz">pointblank-linux-v1.0.0-linux-x86_64.tar.gz</a></td>
</tr> </tr>
<tr> <tr>
<td><strong>Source &amp; Binary Releases</strong></td> <td><strong>Source Repository</strong></td>
<td><a href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">github.com/ertunc-ozbay/pointblank-linux</a></td> <td><a href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">github.com/ertunc-ozbay/pointblank-linux</a></td>
</tr> </tr>
</tbody> </tbody>
@ -139,7 +210,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="../projects/index.html">Projects</a></li> <li><a href="../projects/index.html">Projects</a></li>
@ -152,6 +223,6 @@
</div> </div>
</footer> </footer>
<script src="../assets/js/main.js"></script> <script src="../assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>

View file

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" data-theme="colorful">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RC and Autonomous 4WD Vehicle — Projects — Ertunç Özbay</title> <title>RC and Autonomous 4WD Vehicle — Projects — Ertunç Özbay</title>
<meta name="description" content="Project notes for the RC and Autonomous 4WD Vehicle by Ertunç Özbay: exploring 2.4 GHz RC telemetry, autonomous obstacle avoidance, motor control electronics, and embedded software."> <meta name="description" content="Project notes and 2.4 GHz telemetry protocol structures for the RC and Autonomous 4WD Vehicle by Ertunç Özbay.">
<link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg"> <link rel="icon" type="image/svg+xml" href="../assets/images/favicon.svg">
<link rel="stylesheet" href="../assets/css/style.css"> <link rel="stylesheet" href="../assets/css/style.css?v=2">
</head> </head>
<body> <body>
<a class="skip-link" href="#main-content">Skip to main content</a> <a class="skip-link" href="#main-content">Skip to main content</a>
@ -21,21 +21,29 @@
</span> </span>
</a> </a>
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation"> <div class="header-controls">
<span aria-hidden="true">☰</span> <div class="theme-switcher" role="group" aria-label="Select UI Theme">
<span data-nav-label>Menu</span> <button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
</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>
<nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation"> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
<ul class="nav-list"> <span aria-hidden="true">☰</span>
<li><a class="nav-link" href="../index.html">Home</a></li> <span data-nav-label>Menu</span>
<li><a class="nav-link" href="../about.html">About</a></li> </button>
<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> <nav id="primary-navigation" class="site-nav" data-site-nav aria-label="Main navigation">
<li><a class="nav-link" href="../lab.html">Lab</a></li> <ul class="nav-list">
<li><a class="nav-link" href="../contact.html">Contact</a></li> <li><a class="nav-link" href="../index.html">Home</a></li>
</ul> <li><a class="nav-link" href="../about.html">About</a></li>
</nav> <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> </div>
</header> </header>
@ -49,7 +57,7 @@
<header class="workshop-hero"> <header class="workshop-hero">
<div class="card-meta"> <div class="card-meta">
<span class="badge badge-active">Status: In Progress</span> <span class="badge badge-active">Status: In Progress</span>
<span>Project 03 // 4WD Robotics, Control Logic &amp; 2.4 GHz Telemetry</span> <span>Project 04 // 4WD Robotics, Control Logic &amp; 2.4 GHz Telemetry</span>
</div> </div>
<h1><span class="gradient-title">RC and Autonomous 4WD Vehicle</span></h1> <h1><span class="gradient-title">RC and Autonomous 4WD Vehicle</span></h1>
<p class="hero-lead"> <p class="hero-lead">
@ -57,7 +65,7 @@
</p> </p>
<div class="button-row"> <div class="button-row">
<a class="btn btn-youtube" href="#poc-video">🎬 Watch PoC Video Slot</a> <a class="btn btn-youtube" href="#poc-video">🎬 Watch PoC Video Slot</a>
<a class="btn btn-secondary" href="multi-functional-controller.html">Companion RC Controller</a> <a class="btn btn-primary" href="multi-functional-controller.html">🎛️ Companion RC Controller</a>
<a class="btn btn-secondary" href="index.html">All Projects</a> <a class="btn btn-secondary" href="index.html">All Projects</a>
</div> </div>
</header> </header>
@ -67,7 +75,6 @@
<div class="poc-video-card"> <div class="poc-video-card">
<span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span> <span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span>
<h2 id="rc-video-heading">YouTube Proof-of-Concept Demonstration</h2> <h2 id="rc-video-heading">YouTube Proof-of-Concept Demonstration</h2>
<!-- Ready-to-use YouTube Embed Placeholder: Replace src when uploaded -->
<div class="poc-video-screen" role="region" aria-label="YouTube Proof of Concept Video Placeholder"> <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-badge" aria-hidden="true">
<div class="poc-play-triangle"></div> <div class="poc-play-triangle"></div>
@ -92,8 +99,40 @@
</p> </p>
</section> </section>
<!-- 2.4 GHz Control Packet Code Snippet -->
<section class="section-block" aria-labelledby="p2-protocol">
<span class="section-label">02 // 2.4 GHz Wireless Protocol Structure</span>
<h2 id="p2-protocol">Packed C99 Telemetry &amp; Drive Structs</h2>
<p class="reading-width">
To guarantee deterministic serialization over the 32-byte nRF24L01+ payload buffer between the controller and the vehicle, the link layer uses packed fixed-width C99 structs:
</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 — Packed 2.4 GHz Control &amp; Telemetry Packet Definition
</span>
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Code</button>
</div>
<pre><code>#include &lt;stdint.h&gt;
#include &lt;assert.h&gt;
typedef struct __attribute__((packed)) {
uint8_t magic; // 0xA5 frame sync byte
uint8_t seq; // Rolling packet sequence number
int16_t throttle_pwm; // -1000 to +1000 normalized longitudinal drive
int16_t steering_pwm; // -1000 to +1000 differential yaw command
uint8_t mode_flags; // Bit 0: Autonomous Mode, Bit 1: Emergency Stop
uint8_t crc8; // Checksum for packet integrity
} RcControlPacket_t;
_Static_assert(sizeof(RcControlPacket_t) == 8, "RcControlPacket_t must be 8 bytes");</code></pre>
</div>
</section>
<section class="section-block reading-width" aria-labelledby="p2-confirmed"> <section class="section-block reading-width" aria-labelledby="p2-confirmed">
<span class="section-label">02 // Confirmed Information</span> <span class="section-label">03 // Confirmed Information</span>
<h2 id="p2-confirmed">Current Documentation Status</h2> <h2 id="p2-confirmed">Current Documentation Status</h2>
<table class="spec-table"> <table class="spec-table">
<thead> <thead>
@ -122,21 +161,6 @@
</tbody> </tbody>
</table> </table>
</section> </section>
<section class="section-block reading-width" aria-labelledby="p2-learning">
<span class="section-label">03 // Workshop Notes</span>
<h2 id="p2-learning">What I Am Currently Learning &amp; Next Steps</h2>
<div class="callout-box">
<span class="callout-title">What I Am Currently Learning</span>
<p>
Understanding how power supply decoupling, motor driver PWM control, and wireless telemetry packets interact when transitioning smoothly between manual remote control and autonomous vehicle behavior.
</p>
<span class="callout-title">Next Step</span>
<p style="margin-bottom:0;">
Publishing the dedicated vehicle repository, chassis photos, and the YouTube Proof-of-Concept drive video once bench and floor testing are complete.
</p>
</div>
</section>
</article> </article>
</div> </div>
@ -145,7 +169,7 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <div>
<strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a> <strong>Ertunç Özbay</strong> — Electrical &amp; Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
</div> </div>
<ul class="footer-links" aria-label="Footer links"> <ul class="footer-links" aria-label="Footer links">
<li><a href="../projects/index.html">Projects</a></li> <li><a href="../projects/index.html">Projects</a></li>
@ -158,6 +182,6 @@
</div> </div>
</footer> </footer>
<script src="../assets/js/main.js"></script> <script src="../assets/js/main.js?v=2"></script>
</body> </body>
</html> </html>