ورکشاپ آموزشی - آیسی مدار
رفتن به محتوا

کوچک‌ترین ریموت کنترل جوی‌استیک با ESP32

ابزار و گجت
۰ نظر
۷۷ نفر
کد ۴۳۰۶

ریموت کنترل‌ها همیشه بخش جذابی از پروژه‌های الکترونیکی هستن، اما گاهی اوقات ابعاد بزرگشون باعث میشه تو پروژه‌های جمع‌وجور به مشکل بخوریم. تو این آموزش از آیسی‌مدار، می‌خوایم یه قدم فراتر بریم و یه ریموت کنترل خیلی ریز و کاربردی بسازیم که به راحتی توی مشت جا میشه.

این مینی ریموت با استفاده از یه برد قدرتمند و یه ماژول جوی‌استیک کوچیک ساخته میشه و می‌تونه برای کنترل ماشین‌های کنترلی، باز کردن در گاراژ یا هر وسیله هوشمند دیگه‌ای استفاده بشه. برد ESP32 به خاطر داشتن وای‌فای و بلوتوث داخلی، دستمون رو برای ارتباط بی‌سیم کاملا باز می‌ذاره.

پس وسایلت رو آماده کن و هویه رو بزن به برق تا با هم این گجت خفن و کاربردی رو بسازیم و یه جون تازه به پروژه‌های رباتیکمون بدیم. بریم سراغ ساخت!

قطعات موردنیاز

  • برد XIAO ESP32-C6 (یا نسخه‌های C3 و C5) به همراه آنتن
  • ماژول مینی جوی‌استیک
  • کلید قطع و وصل (سوئیچ)
  • باتری لیتیوم پلیمر 100 میلی‌آمپر ساعتی
  • قاب برای بدنه (پرینت سه‌بعدی، مقوا، چوب یا قوطی فلزی کوچیک)
مرحله ۱

آماده‌سازی قطعات و لحیم‌کاری مدار

اول از همه باید جوی‌استیک رو از روی برد اصلیش جدا کنیم. با یه هیتر (سشوار صنعتی) می‌تونی خیلی راحت و تمیز این کار رو انجام بدی. بعد از جدا کردن قطعه، کافیه ماژول جوی‌استیک رو با یه تیکه چسب دوطرفه مستقیما روی برد ESP32 بچسبونی تا حسابی محکم بشه.

حالا نوبت سیم‌کشی‌هاست. طبق نقشه پیش برو؛ مدار خیلی ساده طراحی شده و پین‌ها کاملا با هم همخونی دارن. بقیه کارها رو هم که نرم‌افزار برامون انجام میده. اتصالات بین جوی‌استیک و برد XIAO ESP32 رو باید به این شکل لحیم کنی:

  1. پین UP به D5
  2. پین RIGHT به D4
  3. پین DOWN به D2
  1. پین GND به GND
  2. پین LEFT به D9
  3. پین MID به D10
مرحله ۲

آشنایی با پروتکل ESP-NOW

برای ارتباط بی‌سیم تو این پروژه، از پروتکل خفن ESP-NOW استفاده می‌کنیم. این پروتکل بر بستر فرکانس 2.4GHz کار می‌کنه و راه‌اندازیش به شدت راحته. جالب اینجاست که برد خیلی خوبی هم داره؛ اگه از آنتن برای فرستنده و گیرنده استفاده کنی، می‌تونی تا مسافت 300 متر هم جواب بگیری! این فاصله برای کنترل یه ماشین کنترلی یا حتی در پارکینگ کاملا ایده‌آله.

مرحله ۳

برنامه‌نویسی و آپلود کدها

اول باید مک آدرس (MAC Address) برد گیرنده رو پیدا کنی. برای این کار از یه کد ساده برای خوندن مک آدرس استفاده کن تا آیدی دقیق رو بهت بده. اینطوری فرستنده ما فقط و فقط با همین گیرنده خاص ارتباط برقرار می‌کنه و تداخلی پیش نمیاد.

نحوه ارسال و دریافت دیتا تو این مینی جوی‌استیک یه کم با مدل‌های آنالوگ و بزرگتر فرق داره. اینجا فقط سیگنال‌های دیجیتال (روشن/خاموش) شناسایی میشن. البته می‌تونی توی کدنویسی این سیگنال‌ها رو به صورت دستورهای مطلق (مثل بالا، پایین، روشن، خاموش) یا حتی مقادیر افزایشی تعریف کنی تا دقیقا همون کاری رو بکنن که نیاز داری.

روی این ماژول می‌تونی تا پنج تا سیگنال کلید رو تشخیص بدی، تازه حالت رها بودن جوی‌استیک (مرکز) رو هم میشه به عنوان یه وضعیت جداگانه به گیرنده فرستاد. حالا وقتشه که کدهای اصلی رو روی برد آپلود کنی و از عملکردش مطمئن بشی.

Arduino
/*
world's smallest remote control joystick
Transmitter: XIAO ESP32 + ESP-NOW
Markus Opitz 2026
instructables.com
*/
#include <WiFi.h>
#include <esp_now.h>
// ================== adjust it ==================
uint8_t receiverMac[] = { 0x.., 0x.., 0x1.. 0x.., 0x.., 0x.. }; // e.g. ESP8266 node MCU Amica
// ==============================================
// ===== Button Pins =====
#define BTN_UP D5
#define BTN_DOWN D2
#define BTN_LEFT D4
#define BTN_RIGHT D9
#define BTN_CENTER D10
// ===== direction Codes =====
enum Direction {
DIR_NONE = 0,
DIR_UP,
DIR_DOWN,
DIR_LEFT,
DIR_RIGHT,
DIR_CENTER
};
// ===== data structure =====
typedef struct {
uint8_t direction;
} ControlData;
ControlData data;
// ===== debounce =====
uint8_t lastStableDirection = DIR_NONE;
uint8_t lastReadDirection = DIR_NONE;
unsigned long lastChangeTime = 0;
const int debounceTime = 30; // ms
void setup() {
Serial.begin(115200);
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_LEFT, INPUT_PULLUP);
pinMode(BTN_RIGHT, INPUT_PULLUP);
pinMode(BTN_CENTER, INPUT_PULLUP);
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW init fail");
return;
}
esp_now_peer_info_t peerInfo = {};
memcpy(peerInfo.peer_addr, receiverMac, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
esp_now_add_peer(&peerInfo);
Serial.println("transmitter ready");
}
uint8_t readDirection() {
// set priority (important!)
if (digitalRead(BTN_CENTER) == LOW) return DIR_CENTER;
if (digitalRead(BTN_UP) == LOW) return DIR_UP;
if (digitalRead(BTN_DOWN) == LOW) return DIR_DOWN;
if (digitalRead(BTN_LEFT) == LOW) return DIR_LEFT;
if (digitalRead(BTN_RIGHT) == LOW) return DIR_RIGHT;
return DIR_NONE;
}
void loop() {
uint8_t currentRead = readDirection();
// change detected
if (currentRead != lastReadDirection) {
lastChangeTime = millis();
lastReadDirection = currentRead;
}
// check debounce
if ((millis() - lastChangeTime) > debounceTime) {
if (lastStableDirection != lastReadDirection) {
lastStableDirection = lastReadDirection;
data.direction = lastStableDirection;
if (data.direction == 1) Serial.println(" ^");
if (data.direction == 2) Serial.println(" v");
if (data.direction == 3) Serial.println(" -->");
if (data.direction == 4) Serial.println("<-- ");
if (data.direction == 5) Serial.println(" button");
//Serial.print("Direction: ");
//Serial.println(data.direction);
esp_now_send(receiverMac, (uint8_t*)&data, sizeof(data));
}
}
delay(5);
}
مرحله ۴

اضافه کردن باتری و کلید پاور

تا اینجای کار ریموت ما با کابل USB به خوبی کار می‌کنه، اما برای اینکه کاملا بی‌سیم بشه به یه باتری نیاز داریم. سیم‌های باتری رو به پدهای زیر برد XIAO ESP32 لحیم کن. یادت نره که حتما یه کلید قطع و وصل هم تو مسیر باتری قرار بدی تا شارژت الکی هدر نره.

حالا باتری رو سر جاش وصل کن. یه نکته مهم رو در نظر داشته باش؛ وقتی می‌خوای باتری رو از طریق کابل USB شارژ کنی، حتما باید کلید پاور روی حالت روشن (ON) باشه.

مرحله ۵

طراحی بدنه و تست نهایی ریموت

دیگه رسیدیم به مرحله آخر! الان فقط باید یه قاب مناسب برای مدارت پیدا کنی. می‌تونی از پرینتر سه‌بعدی استفاده کنی، با چوب و مقوا یه باکس بسازی یا حتی مدار رو توی یه قوطی فلزی کوچیک جا بدی. بعد از اینکه مدار رو تو قاب فیکس کردی، روشنش کن و از این ریموت بندانگشتی لذت ببر.

اگه از ظاهر سرپوش فابریک جوی‌استیک خوشت نمیاد، اصلا جای نگرانی نیست؛ می‌تونی یه سرپوش جدید و کاستوم با پرینتر سه‌بعدی براش چاپ کنی تا کاملا مطابق سلیقه‌ت بشه. امیدوارم از ساخت این پروژه تو آیسی‌مدار حسابی لذت برده باشی. حتما تو بخش کامنت‌ها برامون بنویس که می‌خوای از این ریموت برای کنترل چه وسیله‌ای استفاده کنی!

فایل‌های پیوست

INO Receiver_ESPservos.ino
INO Transmitter_ESP32.ino
INO Transmitter_ESP32_2.ino

تو میتونی اولین سازنده باشی!

اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر

این آموزش با استانداردهای اختصاصی آیسی‌مدار بازنویسی و بهینه‌سازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.

آموزش‌های مشابه

گفتگو‌های کاربران

هنوز نظری ثبت نشده؛ تو شروع کن!