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:
parent
7e3356c383
commit
ac7a3a6e66
14 changed files with 1279 additions and 787 deletions
16
about.html
16
about.html
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<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.">
|
||||
<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>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -145,7 +153,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="projects/index.html">Projects</a></li>
|
||||
|
|
@ -158,6 +166,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="assets/js/main.js"></script>
|
||||
<script src="assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,56 +1,53 @@
|
|||
/* ==========================================================================
|
||||
Ertunç Özbay — Workshop & Portfolio Script (Plain JS, No Dependencies)
|
||||
Handles:
|
||||
1. Accessible mobile navigation menu toggle (with Escape key support)
|
||||
2. Luminous Aurora / Daylight Studio theme switcher (persisted in localStorage)
|
||||
1. Prominent Multi-Theme Switcher (🎨 Colorful Studio [Default] | 🌈 Neon | 📐 Blueprint)
|
||||
2. Accessible mobile navigation menu toggle (with Escape key support)
|
||||
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
|
||||
========================================================================== */
|
||||
|
||||
(function () {
|
||||
"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 savedTheme = null;
|
||||
var validThemes = ["colorful", "neon", "blueprint"];
|
||||
var savedTheme = "colorful";
|
||||
|
||||
try {
|
||||
savedTheme = localStorage.getItem("eo-theme");
|
||||
var stored = localStorage.getItem("eo-studio-theme");
|
||||
if (stored && validThemes.indexOf(stored) !== -1) {
|
||||
savedTheme = stored;
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
if (savedTheme === "light" || savedTheme === "dark") {
|
||||
rootEl.setAttribute("data-theme", savedTheme);
|
||||
function applyTheme(themeName) {
|
||||
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();
|
||||
|
||||
btn.addEventListener("click", function () {
|
||||
var isLight = rootEl.getAttribute("data-theme") === "light";
|
||||
var nextTheme = isLight ? "dark" : "light";
|
||||
rootEl.setAttribute("data-theme", nextTheme);
|
||||
rootEl.setAttribute("data-theme", themeName);
|
||||
try {
|
||||
localStorage.setItem("eo-theme", nextTheme);
|
||||
localStorage.setItem("eo-studio-theme", themeName);
|
||||
} catch (e) {}
|
||||
updateThemeBtnLabel();
|
||||
|
||||
var buttons = document.querySelectorAll("[data-set-theme]");
|
||||
buttons.forEach(function (btn) {
|
||||
var isTarget = btn.getAttribute("data-set-theme") === themeName;
|
||||
btn.setAttribute("aria-pressed", isTarget ? "true" : "false");
|
||||
});
|
||||
|
||||
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
|
||||
var navToggle = document.querySelector("[data-nav-toggle]");
|
||||
var siteNav = document.querySelector("[data-site-nav]");
|
||||
|
|
@ -114,8 +111,8 @@
|
|||
}
|
||||
|
||||
// 4. Copy Email to Clipboard Buttons
|
||||
var copyButtons = document.querySelectorAll("[data-copy-email]");
|
||||
copyButtons.forEach(function (btn) {
|
||||
var copyEmailButtons = document.querySelectorAll("[data-copy-email]");
|
||||
copyEmailButtons.forEach(function (btn) {
|
||||
btn.addEventListener("click", function () {
|
||||
var email = btn.getAttribute("data-copy-email");
|
||||
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");
|
||||
if (zoomImages.length > 0) {
|
||||
var backdrop = document.createElement("div");
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Blog & 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.">
|
||||
<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>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -121,7 +129,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="../projects/index.html">Projects</a></li>
|
||||
|
|
@ -134,6 +142,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../assets/js/main.js"></script>
|
||||
<script src="../assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>[Template] Project Build Log & Technical Note Template — Blog — Ertunç Özbay</title>
|
||||
<meta name="description" content="Reusable static HTML blog post template for Ertunç Özbay's workshop website.">
|
||||
<title>[Template] Project Build Log & Technical Note — Blog — Ertunç Özbay</title>
|
||||
<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="stylesheet" href="../assets/css/style.css">
|
||||
<link rel="stylesheet" href="../assets/css/style.css?v=2">
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -17,10 +17,17 @@
|
|||
<span class="brand-mark" aria-hidden="true">EÖ</span>
|
||||
<span>
|
||||
Ertunç Özbay
|
||||
<span class="brand-subtitle">workshop // notebook // lab</span>
|
||||
<span class="brand-subtitle">embedded // hardware // open-source</span>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -45,91 +53,47 @@
|
|||
<a href="index.html">← Back to Blog</a>
|
||||
</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">
|
||||
<header class="workshop-hero">
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-experimental">Template • Draft Example</span>
|
||||
<time datetime="2026-10-14">YYYY-MM-DD (Template)</time>
|
||||
<span class="badge badge-experimental">Template • Draft</span>
|
||||
<time datetime="2026-10-14">YYYY-MM-DD</time>
|
||||
<span>• Category: Build Log / Technical Note</span>
|
||||
<span>• Reading time: X min read</span>
|
||||
</div>
|
||||
<h1>[Template] Article Title: What I Tested and Learned on the Bench</h1>
|
||||
<h1><span class="gradient-title">[Template] Project Build Log & Technical Note Title</span></h1>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<div class="callout-box amber">
|
||||
<span class="callout-title">Template Notice</span>
|
||||
<p style="margin-bottom:0;">
|
||||
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.
|
||||
</p>
|
||||
<section class="section-block">
|
||||
<h2>1. Goal & Hardware Setup</h2>
|
||||
<p>Describe the circuit, microcontroller, or software module under test.</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 — Example Firmware Snippet
|
||||
</span>
|
||||
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Code</button>
|
||||
</div>
|
||||
<pre><code>// Example code block in post template
|
||||
void app_main(void) {
|
||||
printf("Hello from ESP-IDF!\n");
|
||||
}</code></pre>
|
||||
</div>
|
||||
|
||||
<section class="section-block" aria-labelledby="tpl-sec-1">
|
||||
<h2 id="tpl-sec-1">1. Goal of the Experiment or Build Step</h2>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section class="section-block" aria-labelledby="tpl-sec-2">
|
||||
<h2 id="tpl-sec-2">2. Hardware & Software Setup</h2>
|
||||
<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 & 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">
|
||||
<a class="btn btn-secondary" href="index.html">← Back to Blog Index</a>
|
||||
</div>
|
||||
</section>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Personal workshop, project lab, and learning notebook.
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="../projects/index.html">Projects</a></li>
|
||||
|
|
@ -137,10 +101,11 @@
|
|||
<li><a href="../lab.html">Lab</a></li>
|
||||
<li><a href="../contact.html">Contact</a></li>
|
||||
<li><a href="https://github.com/ertunc-ozbay" rel="noopener noreferrer">GitHub</a></li>
|
||||
<li><a href="https://www.linkedin.com/in/ertunc-ozbay" rel="noopener noreferrer">LinkedIn</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../assets/js/main.js"></script>
|
||||
<script src="../assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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 & 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.">
|
||||
<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>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -17,10 +17,17 @@
|
|||
<span class="brand-mark" aria-hidden="true">EÖ</span>
|
||||
<span>
|
||||
Ertunç Özbay
|
||||
<span class="brand-subtitle">workshop // notebook // lab</span>
|
||||
<span class="brand-subtitle">embedded // hardware // open-source</span>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -48,20 +56,19 @@
|
|||
<article class="reading-width">
|
||||
<header class="workshop-hero">
|
||||
<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>
|
||||
<span>• Category: Personal Learning Reflections</span>
|
||||
<span>• Reading time: 3 min read</span>
|
||||
</div>
|
||||
<h1>Why I Built This Personal Workshop & Learning Notebook</h1>
|
||||
<h1><span class="gradient-title">Why I Built This Personal Workshop & Learning Notebook</span></h1>
|
||||
<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é.
|
||||
</p>
|
||||
<ul class="tag-list" aria-label="Article tags">
|
||||
<li><span class="tag">workshop</span></li>
|
||||
<li><span class="tag">hardware-software</span></li>
|
||||
<li><span class="tag">open-source</span></li>
|
||||
<li><span class="tag">learning-in-public</span></li>
|
||||
<li><span class="tag tag-esp">workshop</span></li>
|
||||
<li><span class="tag tag-c">hardware-software</span></li>
|
||||
<li><span class="tag tag-hw">open-source</span></li>
|
||||
</ul>
|
||||
</header>
|
||||
|
||||
|
|
@ -78,19 +85,17 @@
|
|||
<section class="section-block" aria-labelledby="note-sec-2">
|
||||
<h2 id="note-sec-2">Hardware, Software, and Responsibility</h2>
|
||||
<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.
|
||||
</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.
|
||||
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>
|
||||
</section>
|
||||
|
||||
<section class="section-block" aria-labelledby="note-sec-3">
|
||||
<h2 id="note-sec-3">Related Projects</h2>
|
||||
<ul>
|
||||
<li><a href="../projects/multi-functional-controller.html">Multi-Functional RC Controller</a> (In progress)</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</a> (In progress / Experimental)</li>
|
||||
<li><a href="../projects/multi-functional-controller.html">Multi-Functional RC Controller (ESP32-S3)</a></li>
|
||||
<li><a href="../projects/midi-breadboard-instrument.html">MIDI Breadboard Instrument (ESP32 Dual-Core)</a></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>
|
||||
<div class="button-row">
|
||||
<a class="btn btn-secondary" href="index.html">← Back to Blog Index</a>
|
||||
|
|
@ -104,7 +109,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Personal workshop, project lab, and learning notebook.
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="../projects/index.html">Projects</a></li>
|
||||
|
|
@ -112,10 +117,11 @@
|
|||
<li><a href="../lab.html">Lab</a></li>
|
||||
<li><a href="../contact.html">Contact</a></li>
|
||||
<li><a href="https://github.com/ertunc-ozbay" rel="noopener noreferrer">GitHub</a></li>
|
||||
<li><a href="https://www.linkedin.com/in/ertunc-ozbay" rel="noopener noreferrer">LinkedIn</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../assets/js/main.js"></script>
|
||||
<script src="../assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
58
contact.html
58
contact.html
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Contact & 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="stylesheet" href="assets/css/style.css">
|
||||
<link rel="stylesheet" href="assets/css/style.css?v=2">
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -45,12 +53,13 @@
|
|||
<span class="workshop-eyebrow">✉️ DIRECT CONTACT // OPEN COLLABORATION</span>
|
||||
<h1 id="contact-heading"><span class="gradient-title">Contact & Collaboration</span></h1>
|
||||
<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>
|
||||
<div class="button-row">
|
||||
<a class="btn btn-primary" href="mailto:ertuncozbayh@gmail.com">📧 Email Me on Gmail (ertuncozbayh@gmail.com)</a>
|
||||
<button type="button" class="btn btn-secondary" data-copy-email="ertuncozbayh@gmail.com">📋 Copy Gmail Address</button>
|
||||
<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="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-secondary" href="https://github.com/ertunc-ozbay" rel="noopener noreferrer">💻 GitHub (@ertunc-ozbay)</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
|
@ -58,29 +67,26 @@
|
|||
<div class="section-header">
|
||||
<div>
|
||||
<span class="section-label">01 // Direct Channels</span>
|
||||
<h2 id="contact-links-heading">Email, Socials & GitHub</h2>
|
||||
<h2 id="contact-links-heading">Email, LinkedIn & GitHub</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-grid-2">
|
||||
<!-- Gmail Card -->
|
||||
<!-- Primary Email Card -->
|
||||
<div class="card card-coral">
|
||||
<div class="card-top">
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-coral">Primary Inbox • Gmail</span>
|
||||
<span>Fastest Response</span>
|
||||
<span class="badge badge-coral">Primary Email</span>
|
||||
<span>Direct Inbox</span>
|
||||
</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>
|
||||
My primary personal and engineering Gmail inbox. Ideal for project discussions, schematic/code 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>
|
||||
My official engineering and open-source email inbox. Ideal for project discussions, schematic/firmware questions, internship or collaboration inquiries, and fellow student builders.
|
||||
</p>
|
||||
</div>
|
||||
<div class="card-actions">
|
||||
<a class="btn btn-primary" href="mailto:ertuncozbayh@gmail.com">Send Email (Gmail)</a>
|
||||
<button type="button" class="btn btn-secondary" data-copy-email="ertuncozbayh@gmail.com">📋 Copy Gmail</button>
|
||||
<a class="btn btn-primary" href="mailto:ertunc.ozbay@outlook.com">Send Email</a>
|
||||
<button type="button" class="btn btn-secondary" data-copy-email="ertunc.ozbay@outlook.com">📋 Copy ertunc.ozbay@outlook.com</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -111,7 +117,7 @@
|
|||
<section class="section-block" aria-labelledby="repos-heading">
|
||||
<div class="section-header">
|
||||
<div>
|
||||
<span class="section-label">02 // Public Open-Source Repositories</span>
|
||||
<span class="section-label">02 // Public Open-Source Repositories & Direct Downloads</span>
|
||||
<h2 id="repos-heading">Active Repositories on GitHub</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -126,7 +132,9 @@
|
|||
</p>
|
||||
</div>
|
||||
<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>
|
||||
|
||||
|
|
@ -139,7 +147,9 @@
|
|||
</p>
|
||||
</div>
|
||||
<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>
|
||||
|
||||
|
|
@ -152,7 +162,9 @@
|
|||
</p>
|
||||
</div>
|
||||
<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>
|
||||
|
||||
|
|
@ -188,7 +200,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="projects/index.html">Projects</a></li>
|
||||
|
|
@ -201,6 +213,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="assets/js/main.js"></script>
|
||||
<script src="assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
120
index.html
120
index.html
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Ertunç Özbay — Embedded Systems, Hardware Lab & 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.">
|
||||
<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>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -48,12 +56,12 @@
|
|||
I design embedded hardware, write bare-metal C & FreeRTOS firmware, and build open-source systems from the transistor level up to Linux desktop tooling.
|
||||
</p>
|
||||
<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>
|
||||
<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 & Downloads</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 & Gmail</a>
|
||||
<a class="btn btn-secondary" href="contact.html">✉️ Contact (ertunc.ozbay@outlook.com)</a>
|
||||
</div>
|
||||
|
||||
<div class="stats-strip" aria-label="Workshop highlights">
|
||||
|
|
@ -70,8 +78,8 @@
|
|||
<span class="stat-label">Custom Python RLE MIDI-to-C Compiler</span>
|
||||
</div>
|
||||
<div class="stat-pill">
|
||||
<span class="stat-value">Open Source</span>
|
||||
<span class="stat-label">Schematics, Firmware & Build Logs</span>
|
||||
<span class="stat-value">Direct Downloads</span>
|
||||
<span class="stat-label">Pre-Built Binaries, Firmware & Schematics</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -79,10 +87,10 @@
|
|||
<section class="section-block" aria-labelledby="active-builds-heading">
|
||||
<div class="section-header">
|
||||
<div>
|
||||
<span class="section-label">01 // Featured Hardware & Software Builds</span>
|
||||
<h2 id="active-builds-heading">Projects on My Bench</h2>
|
||||
<span class="section-label">01 // Featured Hardware, Firmware & Software Builds</span>
|
||||
<h2 id="active-builds-heading">Projects, Commands & Downloads</h2>
|
||||
</div>
|
||||
<a href="projects/index.html">View full specifications & PoC video slots →</a>
|
||||
<a href="projects/index.html">View all project code, commands & PoC videos →</a>
|
||||
</div>
|
||||
|
||||
<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-c">ESP-IDF C99</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>
|
||||
</div>
|
||||
<div class="card-actions">
|
||||
<a class="btn btn-primary" href="projects/multi-functional-controller.html">Project Page & 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-primary" href="projects/multi-functional-controller.html">Code, Commands & PoC Video</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>
|
||||
</article>
|
||||
|
||||
|
|
@ -129,12 +138,37 @@
|
|||
</ul>
|
||||
</div>
|
||||
<div class="card-actions">
|
||||
<a class="btn btn-primary" href="projects/midi-breadboard-instrument.html">Project Page & 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-primary" href="projects/midi-breadboard-instrument.html">Code, Commands & PoC Video</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>
|
||||
</article>
|
||||
|
||||
<!-- 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 & 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 & 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">
|
||||
<div class="card-top">
|
||||
<div class="card-meta">
|
||||
|
|
@ -152,39 +186,47 @@
|
|||
</ul>
|
||||
</div>
|
||||
<div class="card-actions">
|
||||
<a class="btn btn-primary" href="projects/rc-autonomous-vehicle.html">Project Page & PoC Video</a>
|
||||
<a class="btn btn-primary" href="projects/rc-autonomous-vehicle.html">Telemetry Structs & PoC Video</a>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Project 4 -->
|
||||
<article class="card card-coral">
|
||||
<div class="card-top">
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-coral">v1.0.0 Released</span>
|
||||
<span>Rust • Linux Systems & Wine</span>
|
||||
<!-- Quick Clone & Build Terminal Showcase -->
|
||||
<section class="section-block" aria-labelledby="quick-cli-heading">
|
||||
<div class="section-header">
|
||||
<div>
|
||||
<span class="section-label">02 // Quick Terminal Access</span>
|
||||
<h2 id="quick-cli-heading">Clone & Run My Open-Source Projects</h2>
|
||||
</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 Desktop</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="card-actions">
|
||||
<a class="btn btn-primary" href="projects/pointblank-linux.html">Project Page & PoC Video</a>
|
||||
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">GitHub Repo</a>
|
||||
|
||||
<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 & Launch Repositories (Arch Linux / ESP-IDF v5.2.2)
|
||||
</span>
|
||||
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Commands</button>
|
||||
</div>
|
||||
</article>
|
||||
<pre><code># 1. ESP32-S3 Multi-Functional Controller (ESP-IDF v5.2.2)
|
||||
git clone https://github.com/ertunc-ozbay/multi-functional-controller.git
|
||||
cd multi-functional-controller/firmware && source ~/esp/esp-idf/export.sh && idf.py build
|
||||
|
||||
# 2. ESP32 16-Track MIDI Breadboard Synthesizer & Python RLE Compiler
|
||||
git clone https://github.com/ertunc-ozbay/midi-breadboard-instrument.git
|
||||
cd midi-breadboard-instrument && 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 && cd pointblank-linux-v1.0.0-linux-x86_64 && ./pointblank-linux</code></pre>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section-block" aria-labelledby="workshop-areas-heading">
|
||||
<div class="section-header">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -217,7 +259,7 @@
|
|||
<span class="section-label">Direct Contact</span>
|
||||
<h3>Collaborate & Connect</h3>
|
||||
<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>
|
||||
</div>
|
||||
<a href="contact.html">View Contact & Email Details →</a>
|
||||
|
|
@ -231,7 +273,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="projects/index.html">Projects</a></li>
|
||||
|
|
@ -244,6 +286,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="assets/js/main.js"></script>
|
||||
<script src="assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
35
lab.html
35
lab.html
|
|
@ -1,15 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Lab & 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.">
|
||||
<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>
|
||||
<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">
|
||||
<div class="container header-inner">
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -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.
|
||||
</p>
|
||||
</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 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>).
|
||||
</p>
|
||||
</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>
|
||||
</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.
|
||||
</p>
|
||||
</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 class="card card-emerald">
|
||||
|
|
@ -116,9 +136,12 @@
|
|||
</div>
|
||||
<h3>RLE MIDI-to-C Struct Compiler (<code>midi_to_c.py</code>)</h3>
|
||||
<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 (`< 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>< MIDI 50</code>) to hardware percussion buzzers.
|
||||
</p>
|
||||
</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>
|
||||
</section>
|
||||
|
|
@ -148,7 +171,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="projects/index.html">Projects</a></li>
|
||||
|
|
@ -161,6 +184,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="assets/js/main.js"></script>
|
||||
<script src="assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Projects — 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.">
|
||||
<title>Projects, Code & 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, Point Blank Linux Launcher in Rust, and 4WD Autonomous Vehicle.">
|
||||
<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>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,15 +44,16 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
<div class="container">
|
||||
<section class="workshop-hero" aria-labelledby="projects-heading">
|
||||
<span class="workshop-eyebrow">⚡ PROJECT SHOWCASE // VERIFIED BUILDS & REPOSITORIES</span>
|
||||
<span class="workshop-eyebrow">⚡ PROJECT SHOWCASE // CODE, COMMANDS, DOWNLOADS & POC VIDEOS</span>
|
||||
<h1 id="projects-heading"><span class="gradient-title">Engineering Projects & Open-Source Builds</span></h1>
|
||||
<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>
|
||||
</section>
|
||||
|
||||
|
|
@ -67,7 +75,7 @@
|
|||
</div>
|
||||
<h3><a href="multi-functional-controller.html">Multi-Functional RC Controller (MFC)</a></h3>
|
||||
<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>
|
||||
|
||||
<ul class="tag-list" aria-label="Confirmed technologies for Multi-Functional RC Controller">
|
||||
|
|
@ -80,13 +88,14 @@
|
|||
</ul>
|
||||
|
||||
<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 & `.zip` archive, 3 prototype photos, and <strong>🎬 YouTube PoC Video slot</strong>.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-actions">
|
||||
<a class="btn btn-primary" href="multi-functional-controller.html">Read Page & 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-primary" href="multi-functional-controller.html">Open Page, Code & PoC</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>
|
||||
</article>
|
||||
|
||||
|
|
@ -112,51 +121,23 @@
|
|||
</ul>
|
||||
|
||||
<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 & C99 Dual-Core FreeRTOS audio engine code, copyable CLI commands, downloadable `.py` & `.zip` links, 3 breadboard photos, and <strong>🎬 YouTube PoC Video slot</strong>.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-actions">
|
||||
<a class="btn btn-primary" href="midi-breadboard-instrument.html">Read Page & 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-primary" href="midi-breadboard-instrument.html">Open Page, Code & PoC</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>
|
||||
</article>
|
||||
|
||||
<!-- Project 3: 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 03 • Robotics & 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 & 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 & PoC Video</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Project 4: Point Blank Linux Launcher -->
|
||||
<!-- Project 3: Point Blank Linux Launcher -->
|
||||
<article class="card card-coral">
|
||||
<div class="card-top">
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-coral">v1.0.0 Shipped</span>
|
||||
<span>Project 04 • Rust & Linux Systems</span>
|
||||
<span class="badge badge-coral">v1.0.0 Shipped Binary</span>
|
||||
<span>Project 03 • Rust & Linux Systems</span>
|
||||
</div>
|
||||
<h3><a href="pointblank-linux.html">Point Blank on Linux — Standalone Community Launcher</a></h3>
|
||||
<p>
|
||||
|
|
@ -171,13 +152,43 @@
|
|||
</ul>
|
||||
|
||||
<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 class="card-actions">
|
||||
<a class="btn btn-primary" href="pointblank-linux.html">Read Page & PoC Video</a>
|
||||
<a class="btn btn-secondary" href="https://github.com/ertunc-ozbay/pointblank-linux" rel="noopener noreferrer">GitHub Repo</a>
|
||||
<a class="btn btn-primary" href="pointblank-linux.html">Open Page, CLI & PoC</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 & 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 & Motor Electronics</span></li>
|
||||
</ul>
|
||||
|
||||
<div class="project-notes">
|
||||
<p><strong>Included on page:</strong> C99 2.4 GHz telemetry receiver packet & 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 & PoC</a>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
|
|
@ -189,7 +200,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="../projects/index.html">Projects</a></li>
|
||||
|
|
@ -202,6 +213,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../assets/js/main.js"></script>
|
||||
<script src="../assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>MIDI Breadboard Instrument (Desk Rave & 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="stylesheet" href="../assets/css/style.css">
|
||||
<link rel="stylesheet" href="../assets/css/style.css?v=2">
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -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.
|
||||
</p>
|
||||
<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-secondary" href="index.html">All Projects</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
|
@ -70,7 +79,6 @@
|
|||
<div class="poc-video-card">
|
||||
<span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span>
|
||||
<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-play-badge" aria-hidden="true">
|
||||
<div class="poc-play-triangle"></div>
|
||||
|
|
@ -116,17 +124,107 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section-block reading-width" aria-labelledby="p3-overview">
|
||||
<span class="section-label">02 // Engineering Challenges Solved</span>
|
||||
<h2 id="p3-overview">From a Squeaking Buzzer to a Dual-Core Synthesizer</h2>
|
||||
<p>
|
||||
Pushing a bare-metal breadboard setup to play recognizable, energetic multi-track music required solving several real embedded systems challenges:
|
||||
<!-- Terminal Commands & Source Code Section -->
|
||||
<section class="section-block" aria-labelledby="p3-code">
|
||||
<span class="section-label">02 // Terminal Commands, Python RLE Compiler & C99 Firmware</span>
|
||||
<h2 id="p3-code">Build, Flash & MIDI Conversion Commands</h2>
|
||||
<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>
|
||||
<ul>
|
||||
<li><strong>The Strobe-Light Bug & 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>
|
||||
<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>
|
||||
<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>
|
||||
</ul>
|
||||
|
||||
<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 — Convert MIDI to C & 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 > 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 (`< 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 & 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 > 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 & drum states
|
||||
if freq == rle_freq and trigger_kick == rle_kick and trigger_hat == rle_hat:
|
||||
rle_dur += duration_ms
|
||||
else:
|
||||
if rle_dur > 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 & 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 & 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 & 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 & PCNT Rotary Scaling
|
||||
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
|
||||
}</code></pre>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section-block reading-width" aria-labelledby="p3-components">
|
||||
|
|
@ -188,9 +286,6 @@
|
|||
<section class="section-block reading-width" aria-labelledby="p3-playlist">
|
||||
<span class="section-label">04 // Flash Memory Playlist</span>
|
||||
<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>
|
||||
<li><strong>Careless Whisper</strong> (Extended Club Edit)</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>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section class="section-block reading-width" aria-labelledby="p3-learning">
|
||||
<span class="section-label">05 // Workshop Notes & Next Steps</span>
|
||||
<h2 id="p3-learning">Current State & Roadmap</h2>
|
||||
<div class="callout-box magenta">
|
||||
<span class="callout-title">Current State & 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>
|
||||
|
||||
</div>
|
||||
|
|
@ -232,7 +313,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="../projects/index.html">Projects</a></li>
|
||||
|
|
@ -245,6 +326,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../assets/js/main.js"></script>
|
||||
<script src="../assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Multi-Functional RC Controller (MFC) — Projects — Ertunç Özbay</title>
|
||||
<meta name="description" content="Engineering documentation 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="stylesheet" href="../assets/css/style.css">
|
||||
<link rel="stylesheet" href="../assets/css/style.css?v=2">
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -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 & Autonomous Vehicle</a>) while integrating dual K-Silver Hall-effect joysticks, a 1.3" ST7789 IPS TFT display, MicroSD storage, and MAX4466 audio capture.
|
||||
</p>
|
||||
<div class="button-row">
|
||||
<a class="btn btn-primary" href="https://github.com/ertunc-ozbay/multi-functional-controller" rel="noopener noreferrer">💻 View GitHub 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-secondary" href="index.html">All Projects</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
|
@ -70,7 +79,6 @@
|
|||
<div class="poc-video-card">
|
||||
<span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span>
|
||||
<h2 id="mfc-video-heading">YouTube Proof-of-Concept Demonstration</h2>
|
||||
<!-- 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-play-badge" aria-hidden="true">
|
||||
<div class="poc-play-triangle"></div>
|
||||
|
|
@ -87,9 +95,9 @@
|
|||
<!-- Early Prototype Hardware Gallery -->
|
||||
<section class="section-block" aria-labelledby="p1-gallery">
|
||||
<span class="section-label">01 // Early Prototype Build (Rev 0.1 Perfboard Carrier)</span>
|
||||
<h2 id="p1-gallery">Very Early Prototype Hardware Gallery</h2>
|
||||
<h2 id="p1-gallery">Very Early Prototype Hardware Gallery (Click to Zoom)</h2>
|
||||
<p class="reading-width">
|
||||
<em>Note:</em> The photos below show the <strong>very early Phase 1 (Rev 0.1) perfboard carrier build</strong> (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>
|
||||
<div class="card-grid">
|
||||
<figure class="card card-amber" style="margin:0;">
|
||||
|
|
@ -113,25 +121,93 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Build, Flash & Clone Commands + C99 Firmware Code -->
|
||||
<section class="section-block" aria-labelledby="p1-code">
|
||||
<span class="section-label">02 // Terminal Commands & ESP-IDF C99 Firmware</span>
|
||||
<h2 id="p1-code">Clone, Build & Flash Commands (ESP-IDF v5.2.2)</h2>
|
||||
<p class="reading-width">
|
||||
To build and flash the ESP32-S3 master firmware on Arch Linux (or any Linux system with ESP-IDF v5.2.2 installed), run the following commands:
|
||||
</p>
|
||||
|
||||
<div class="code-window">
|
||||
<div class="code-window-header">
|
||||
<span class="code-window-title">
|
||||
<span class="code-dots"><span class="code-dot red"></span><span class="code-dot amber"></span><span class="code-dot green"></span></span>
|
||||
bash — Clone, Configure Target (esp32s3), Build & Flash
|
||||
</span>
|
||||
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Commands</button>
|
||||
</div>
|
||||
<pre><code># 1. Clone the Multi-Functional Controller repository
|
||||
git clone https://github.com/ertunc-ozbay/multi-functional-controller.git
|
||||
cd multi-functional-controller/firmware
|
||||
|
||||
# 2. Export the ESP-IDF v5.2.2 toolchain environment
|
||||
source ~/esp/esp-idf/export.sh
|
||||
|
||||
# 3. Verify target is set to esp32s3 and compile the firmware
|
||||
idf.py set-target esp32s3
|
||||
idf.py build
|
||||
|
||||
# 4. Flash over USB-JTAG/UART and open real-time serial telemetry monitor
|
||||
idf.py -p /dev/ttyACM0 flash monitor</code></pre>
|
||||
</div>
|
||||
|
||||
<h3>Master Node Pinout & Telemetry Firmware Snippet (<code>firmware/main/mmcontroller.c</code>)</h3>
|
||||
<p class="reading-width">
|
||||
Below is the hardware pinout and hardware `PCNT` quadrature rotary encoder / ADC1 setup from <a href="https://github.com/ertunc-ozbay/multi-functional-controller/blob/master/firmware/main/mmcontroller.c" rel="noopener noreferrer"><code>firmware/main/mmcontroller.c</code></a>:
|
||||
</p>
|
||||
|
||||
<div class="code-window">
|
||||
<div class="code-window-header">
|
||||
<span class="code-window-title">
|
||||
<span class="code-dots"><span class="code-dot red"></span><span class="code-dot amber"></span><span class="code-dot green"></span></span>
|
||||
c99 — firmware/main/mmcontroller.c (ESP32-S3-N16R8 Hardware Definitions)
|
||||
</span>
|
||||
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Code</button>
|
||||
</div>
|
||||
<pre><code>// --- 1. ADC1 ANALOG INPUTS (K-Silver Hall-Effect Joysticks & MAX4466 Mic) ---
|
||||
#define PIN_JOY_LX GPIO_NUM_4 // ADC1_CH3
|
||||
#define PIN_JOY_LY GPIO_NUM_5 // ADC1_CH4
|
||||
#define PIN_JOY_RX GPIO_NUM_6 // ADC1_CH5
|
||||
#define PIN_JOY_RY GPIO_NUM_7 // ADC1_CH6
|
||||
#define PIN_MIC_OUT GPIO_NUM_1 // ADC1_CH0 (MAX4466 Audio Preamp)
|
||||
|
||||
// --- 2. SHARED SPI2 BUS (nRF24L01+ PA+LNA, ST7789 1.3" IPS TFT & MicroSD) ---
|
||||
#define PIN_SPI_MOSI GPIO_NUM_11
|
||||
#define PIN_SPI_SCK GPIO_NUM_12
|
||||
#define PIN_SPI_MISO GPIO_NUM_13
|
||||
|
||||
#define PIN_NRF_CE GPIO_NUM_9
|
||||
#define PIN_NRF_CSN GPIO_NUM_10
|
||||
#define PIN_SD_CS GPIO_NUM_39
|
||||
#define PIN_TFT_CS GPIO_NUM_40
|
||||
#define PIN_TFT_DC GPIO_NUM_41
|
||||
#define PIN_TFT_RST GPIO_NUM_42
|
||||
|
||||
// --- 3. HARDWARE PCNT ROTARY ENCODER & 2N2222A BJT DRIVER ---
|
||||
#define PIN_ENC_CLK GPIO_NUM_15
|
||||
#define PIN_ENC_DT GPIO_NUM_16
|
||||
#define PIN_ENC_SW GPIO_NUM_17
|
||||
#define PIN_BJT_BASE GPIO_NUM_21 // Drives 2N2222A base via 1 kOhm resistor</code></pre>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- KiCad 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>
|
||||
<figure class="schematic-frame">
|
||||
<img class="zoomable-img" src="../assets/images/mfc-1.svg" alt="KiCad schematic diagram of the ESP32-S3 Multi-Functional Controller" style="background:#ffffff; border-radius:8px; padding:0.5rem;">
|
||||
<figcaption class="schematic-caption">
|
||||
Early prototype KiCad schematic (<code>mfc-1.kicad_sch</code>) — click to zoom full-screen.
|
||||
Early prototype KiCad schematic (<code>mfc-1.kicad_sch</code>) — click to zoom full-screen or <a href="https://raw.githubusercontent.com/ertunc-ozbay/multi-functional-controller/master/hardware/mfc-1/mfc-1.kicad_sch" download="mfc-1.kicad_sch">download the raw KiCad 9.0 file</a>.
|
||||
</figcaption>
|
||||
</figure>
|
||||
</section>
|
||||
|
||||
<!-- Confirmed ESP32-S3 Pinout -->
|
||||
<section class="section-block reading-width" aria-labelledby="p1-pinout">
|
||||
<span class="section-label">03 // Verified ESP32-S3-N16R8 Pinout & Bus Architecture</span>
|
||||
<span class="section-label">04 // Verified ESP32-S3-N16R8 Pinout & Bus Architecture</span>
|
||||
<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">
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
@ -187,7 +263,7 @@
|
|||
|
||||
<!-- Phase 1 vs Phase 2 BOM -->
|
||||
<section class="section-block reading-width" aria-labelledby="p1-bom">
|
||||
<span class="section-label">04 // Build Roadmap & Phase 2 Console BOM</span>
|
||||
<span class="section-label">05 // Build Roadmap & Phase 2 Console BOM</span>
|
||||
<h2 id="p1-bom">From Rev 0.1 Carrier to the DT-100 Desktop Console</h2>
|
||||
<div class="callout-box amber">
|
||||
<span class="callout-title">Phase 2 Hardware Upgrade (Direnc.net Procurement List)</span>
|
||||
|
|
@ -212,7 +288,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="../projects/index.html">Projects</a></li>
|
||||
|
|
@ -225,6 +301,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../assets/js/main.js"></script>
|
||||
<script src="../assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<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="stylesheet" href="../assets/css/style.css">
|
||||
<link rel="stylesheet" href="../assets/css/style.css?v=2">
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -48,8 +56,8 @@
|
|||
<article>
|
||||
<header class="workshop-hero">
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-coral">Status: v1.0.0 Released</span>
|
||||
<span>Project 04 // Rust • Linux Systems • Wine & DirectX 9/11</span>
|
||||
<span class="badge badge-coral">Status: v1.0.0 Pre-Compiled Binary Released</span>
|
||||
<span>Project 03 // Rust • Linux Systems • Wine & DirectX 9/11</span>
|
||||
</div>
|
||||
<h1><span class="gradient-title">Point Blank on Linux — Standalone Community Launcher</span></h1>
|
||||
<p class="hero-lead">
|
||||
|
|
@ -59,8 +67,9 @@
|
|||
Built on Arch Linux without requiring Heroic, Lutris, or external wrappers—featuring automated Wine prefix & Winetricks provisioning, 16-byte TLS-aligned runtime support for DirectX 11, multi-region authentication, and native 1920×1080 borderless fullscreen at 200 FPS.
|
||||
</p>
|
||||
<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-cyan" href="https://github.com/ertunc-ozbay/pointblank-linux/releases" rel="noopener noreferrer">📦 Download v1.0.0 Release</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-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>
|
||||
</div>
|
||||
</header>
|
||||
|
|
@ -70,7 +79,6 @@
|
|||
<div class="poc-video-card">
|
||||
<span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span>
|
||||
<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-play-badge" aria-hidden="true">
|
||||
<div class="poc-play-triangle"></div>
|
||||
|
|
@ -84,21 +92,84 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section-block reading-width" aria-labelledby="p4-overview">
|
||||
<span class="section-label">01 // Systems Engineering Overview</span>
|
||||
<h2 id="p4-overview">Solving Low-Level Windows-on-Linux Compatibility</h2>
|
||||
<p>
|
||||
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.
|
||||
<!-- Download & Terminal Commands Section -->
|
||||
<section class="section-block" aria-labelledby="p4-commands">
|
||||
<span class="section-label">01 // Direct Download & Linux Terminal Commands</span>
|
||||
<h2 id="p4-commands">Quick Download & Launch Commands</h2>
|
||||
<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>
|
||||
|
||||
<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 & 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 & 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 & 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 && 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 & 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>
|
||||
<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>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>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>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 <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 <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>
|
||||
</section>
|
||||
|
||||
<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 & Supported Distros</h2>
|
||||
<table class="spec-table">
|
||||
<thead>
|
||||
|
|
@ -110,22 +181,22 @@
|
|||
<tbody>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
<td><strong>Render Pipelines</strong></td>
|
||||
<td>DirectX 9 & DirectX 11 (1920×1080 Borderless Fullscreen @ 200 FPS)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Supported Linux Distributions</strong></td>
|
||||
<td>Arch Linux / CachyOS / Manjaro, Ubuntu / Debian / Mint / Pop!_OS, Fedora / Nobara</td>
|
||||
<td><strong>Direct Binary Download</strong></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>
|
||||
<td><strong>Source & 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>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
|
@ -139,7 +210,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="../projects/index.html">Projects</a></li>
|
||||
|
|
@ -152,6 +223,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../assets/js/main.js"></script>
|
||||
<script src="../assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="en" data-theme="colorful">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<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="stylesheet" href="../assets/css/style.css">
|
||||
<link rel="stylesheet" href="../assets/css/style.css?v=2">
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main-content">Skip to main content</a>
|
||||
|
|
@ -21,6 +21,13 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<div class="header-controls">
|
||||
<div class="theme-switcher" role="group" aria-label="Select UI Theme">
|
||||
<button type="button" class="theme-btn" data-set-theme="colorful" aria-pressed="true">🎨 Colorful</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="neon" aria-pressed="false">🌈 Neon</button>
|
||||
<button type="button" class="theme-btn" data-set-theme="blueprint" aria-pressed="false">📐 Blueprint</button>
|
||||
</div>
|
||||
|
||||
<button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="primary-navigation">
|
||||
<span aria-hidden="true">☰</span>
|
||||
<span data-nav-label>Menu</span>
|
||||
|
|
@ -37,6 +44,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main-content">
|
||||
|
|
@ -49,7 +57,7 @@
|
|||
<header class="workshop-hero">
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-active">Status: In Progress</span>
|
||||
<span>Project 03 // 4WD Robotics, Control Logic & 2.4 GHz Telemetry</span>
|
||||
<span>Project 04 // 4WD Robotics, Control Logic & 2.4 GHz Telemetry</span>
|
||||
</div>
|
||||
<h1><span class="gradient-title">RC and Autonomous 4WD Vehicle</span></h1>
|
||||
<p class="hero-lead">
|
||||
|
|
@ -57,7 +65,7 @@
|
|||
</p>
|
||||
<div class="button-row">
|
||||
<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>
|
||||
</div>
|
||||
</header>
|
||||
|
|
@ -67,7 +75,6 @@
|
|||
<div class="poc-video-card">
|
||||
<span class="section-label">🎬 Proof of Concept // YouTube Video Showcase</span>
|
||||
<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-play-badge" aria-hidden="true">
|
||||
<div class="poc-play-triangle"></div>
|
||||
|
|
@ -92,8 +99,40 @@
|
|||
</p>
|
||||
</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 & 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 & Telemetry Packet Definition
|
||||
</span>
|
||||
<button type="button" class="copy-code-btn" data-copy-code>📋 Copy Code</button>
|
||||
</div>
|
||||
<pre><code>#include <stdint.h>
|
||||
#include <assert.h>
|
||||
|
||||
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">
|
||||
<span class="section-label">02 // Confirmed Information</span>
|
||||
<span class="section-label">03 // Confirmed Information</span>
|
||||
<h2 id="p2-confirmed">Current Documentation Status</h2>
|
||||
<table class="spec-table">
|
||||
<thead>
|
||||
|
|
@ -122,21 +161,6 @@
|
|||
</tbody>
|
||||
</table>
|
||||
</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 & 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>
|
||||
|
||||
</div>
|
||||
|
|
@ -145,7 +169,7 @@
|
|||
<footer class="site-footer">
|
||||
<div class="container footer-inner">
|
||||
<div>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertuncozbayh@gmail.com">ertuncozbayh@gmail.com</a>
|
||||
<strong>Ertunç Özbay</strong> — Electrical & Electronics Engineering Student • <a href="mailto:ertunc.ozbay@outlook.com">ertunc.ozbay@outlook.com</a>
|
||||
</div>
|
||||
<ul class="footer-links" aria-label="Footer links">
|
||||
<li><a href="../projects/index.html">Projects</a></li>
|
||||
|
|
@ -158,6 +182,6 @@
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../assets/js/main.js"></script>
|
||||
<script src="../assets/js/main.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
Loading…
Reference in a new issue