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

با ESP32 و پرینتر سه‌بعدی یک گیره رباتیک دوربین‌دار بساز

رباتیک و هوشمندسازی
۰ نظر
۲۷ نفر
کد ۳۱۹۱

دسترسی به جاهای تنگ و تاریک یا برداشتن وسایل از ارتفاع بالا همیشه یک دردسر بزرگه. تصور کن بتونی وسیله‌ای داشته باشی که هم مثل یک چشم اضافه برات عمل کنه و هم مثل یک دست مکانیکی قدرتمند، اجسام رو از راه دور برات برداره و بهت تحویل بده.

توی این پروژه از آیسی‌مدار، می‌خوایم یک چنگک رباتیک هوشمند و دوربین‌دار بسازیم که روی یک میله بلند نصب می‌شه. مغز متفکر این گجت خفن، برد پردازنده XIAO ESP32S3 SENSE هست که تصویر زنده رو مستقیم روی شبکه وای‌فای به گوشی موبایلت می‌فرسته و بهت اجازه می‌ده فقط با لمس صفحه گوشی، گیره رو باز و بسته کنی.

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

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

  • برد توسعه XIAO ESP32S3 SENSE (نسخه دوربین‌دار)
  • قطعات پرینت سه‌بعدی بدنه و بازوها
  • سروو موتور (ترجیحا مدل‌های دنده فلزی)
  • ماژول افزاینده ولتاژ DC به DC مدل MT3608
  • باتری لیتیوم یون 18650 به همراه جاباتری تک‌سلولی
  • ال‌ای‌دی 5 میلی‌متری و مقاومت 15 اهم
  • کلید کشویی خاموش/روشن مینیاتوری
  • پیچ و مهره‌های M2، M3 و M4 در سایزهای مختلف
  • یک لوله یا میله بلند و یک هولدر موبایل
  • برد سوراخ‌دار یا PCB اختصاصی برای مونتاژ راحت‌تر
مرحله ۱

آماده‌سازی و پرینت قطعات مکانیکی بدنه

اول از همه باید استخوان‌بندی و قطعات پلاستیکی این چنگک رو آماده کنیم. تمام فایل‌های سه‌بعدی این پروژه برای پرینت بهینه‌سازی شدن. فایل‌ها رو وارد نرم‌افزار اسلایسر کن و با ارتفاع لایه 0.2 میلی‌متر پرینت بگیر.

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

مرحله ۲

ساخت مدار پایه برای نصب پردازنده

برد پردازنده XIAO به صورت پیش‌فرض سوراخی برای پیچ شدن روی بدنه نداره. برای اینکه بتونیم اون رو محکم سر جاش فیکس کنیم و سیم‌کشی‌ها رو مرتب انجام بدیم، به یک برد واسط نیاز داریم. می‌تونی از یک تیکه برد سوراخ‌دار استفاده کنی یا یک PCB ساده براش طراحی کنی و بسازی.

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

داشتن این برد پایه باعث می‌شه اتصالات خیلی پایدارتر بشن و قطعات تو هوا معلق نمونن.

مرحله ۳

لحیم‌کاری پردازنده و نصب هیت‌سینک

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

مرحله ۴

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

قبل از اینکه مدار رو کامل ببندیم، بهتره کدها رو روی پردازنده آپلود کنیم. برد رو با کابل USB به سیستم وصل کن، نرم‌افزار Arduino IDE رو باز کن و کدهای پروژه رو روی پردازنده بریز. توی این مرحله می‌تونی اسم شبکه وای‌فای، رمز عبور و حتی زاویه‌های حرکتی بازوی سروو موتور رو با توجه به سلیقه خودت تغییر بدی و شخصی‌سازی کنی.

Arduino
#include "esp_camera.h"
#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>
// ====== CAMERA SETTINGS (XIAO ESP32S3 Sense + OV3660) ======
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 10
#define SIOD_GPIO_NUM 40
#define SIOC_GPIO_NUM 39
#define Y9_GPIO_NUM 48
#define Y8_GPIO_NUM 11
#define Y7_GPIO_NUM 12
#define Y6_GPIO_NUM 14
#define Y5_GPIO_NUM 16
#define Y4_GPIO_NUM 18
#define Y3_GPIO_NUM 17
#define Y2_GPIO_NUM 15
#define VSYNC_GPIO_NUM 38
#define HREF_GPIO_NUM 47
#define PCLK_GPIO_NUM 13
// ====== SERVO SETTINGS ======
Servo clawServo;
int servoPin = D0; // D0 on XIAO ESP32S3 = GPIO2
const int GRAB_ANGLE = -5;
const int RELEASE_ANGLE = 170;
// ====== WIFI SETTINGS ======
const char* ssid = "CamClaw";
const char* password = "12345678";
WebServer server(80);
// ====== MODERN HTML PAGE ======
String htmlPage = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />
<title>Cam Claw</title>
<style>
:root{
--bg:#f4f7fb; --card:#ffffff; --accent:#ff5a5a; --blue:#2a9dff; --text:#222;
}
html,body{height:100%; margin:0; font-family: 'Segoe UI', Arial, sans-serif; background:var(--bg);}
.wrap{max-width:820px; margin:20px auto; padding:20px; text-align:center; color:var(--text);}
h1{margin:10px 0 18px; font-size:26px; font-weight:600;}
.card{background:var(--card); border-radius:14px; padding:16px; box-shadow:0 6px 20px rgba(0,0,0,0.1);}
#cam { width:100%; max-width:720px; border-radius:10px; display:block; margin: 10px auto; box-shadow: 0 4px 12px rgba(0,0,0,0.2); }
.buttons{display:flex; gap:14px; justify-content:center; flex-wrap:wrap; margin-top:16px;}
.btn{
min-width:180px;
padding:20px 26px;
font-size:20px;
border-radius:14px;
border:none;
cursor:pointer;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
color:#fff;
transition:transform .12s ease, box-shadow .12s ease;
}
.grab{ background: linear-gradient(180deg,var(--accent),#ff2a2a); }
.release{ background: linear-gradient(180deg,var(--blue),#0077ff); }
.btn:active{ transform:scale(0.96); box-shadow:0 2px 6px rgba(0,0,0,0.2); }
#status{ color:#444; margin-top:12px; font-size:16px; font-weight:500;}
</style>
</head>
<body>
<div class="wrap">
<h1>CAM CALW</h1>
<div class="card">
<img id="cam" src="/capture?ts=0" alt="camera">
<div class="buttons">
<button class="btn grab" onclick="doAction('grab')">Grab</button>
<button class="btn release" onclick="doAction('release')">Release</button>
</div>
<div id="status">Status: idle</div>
</div>
</div>
<script>
const cam = document.getElementById('cam');
const status = document.getElementById('status');
setInterval(()=> { cam.src = '/capture?ts=' + Date.now(); }, 100);
function doAction(act) {
status.innerText = 'Status: ' + act + '...';
fetch('/' + act)
.then(r => r.json())
.then(j => status.innerText = 'Status: ' + j.status + ' (angle=' + j.position + ')')
.catch(e => status.innerText = 'Status: error');
}
</script>
</body>
</html>
)rawliteral";
// ====== HANDLERS ======
void handle_root() { server.send(200, "text/html", htmlPage); }
void handle_capture() {
camera_fb_t * fb = esp_camera_fb_get();
if (!fb) {
server.send(500, "text/plain", "Camera capture failed");
return;
}
server.sendHeader("Content-Type", "image/jpeg");
server.sendHeader("Cache-Control", "no-store");
WiFiClient client = server.client();
client.write((const char*)fb->buf, fb->len);
esp_camera_fb_return(fb);
}
void handle_grab() {
clawServo.write(GRAB_ANGLE);
String payload = String("{\"status\":\"Grabbed\",\"position\":") + GRAB_ANGLE + "}";
server.send(200, "application/json", payload);
}
void handle_release() {
clawServo.write(RELEASE_ANGLE);
String payload = String("{\"status\":\"Released\",\"position\":") + RELEASE_ANGLE + "}";
server.send(200, "application/json", payload);
}
// ====== SETUP ======
void setup() {
Serial.begin(115200);
delay(100);
// Enable camera power (needed on XIAO ESP32S3 Sense)
pinMode(21, OUTPUT);
digitalWrite(21, HIGH);
delay(10);
// Servo init
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
clawServo.setPeriodHertz(50);
clawServo.attach(servoPin, 500, 2400);
clawServo.write(RELEASE_ANGLE);
// Camera config
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
config.frame_size = FRAMESIZE_QVGA;
config.jpeg_quality = 10;
config.fb_count = 2;
if (esp_camera_init(&config) != ESP_OK) {
Serial.println("Camera init failed!");
while (true) delay(1000);
}
sensor_t * s = esp_camera_sensor_get();
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
// Start AP
WiFi.softAP(ssid, password);
Serial.printf("AP started: SSID=%s IP=%s\n", ssid, WiFi.softAPIP().toString().c_str());
// Routes
server.on("/", HTTP_GET, handle_root);
server.on("/capture", HTTP_GET, handle_capture);
server.on("/grab", HTTP_GET, handle_grab);
server.on("/release", HTTP_GET, handle_release);
server.begin();
}
void loop() {
server.handleClient();
}
مرحله ۵

بررسی نقشه اتصالات قطعات

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

مرحله ۶

نصب برد اصلی درون محفظه

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

مرحله ۷

آماده‌سازی سیستم روشنایی و ال‌ای‌دی‌ها

برای اینکه بتونی توی فضاهای تاریک هم به راحتی اشیاء رو ببینی، باید ال‌ای‌دی‌ها رو نصب کنی. پایه‌های اضافه ال‌ای‌دی‌های 5 میلی‌متری رو بچین و اون‌ها رو با یک مقاومت 15 اهم سری کن تا جریانشون کنترل بشه و نسوزن. با یکم چسب حرارتی اون‌ها رو سر جاشون محکم کن.

نکته مهم اینه که موقع انجام این کارها بهتره ماژول حساس دوربین رو موقتا جدا کنی تا آسیبی نبینه و وقتی کار مونتاژ تموم شد دوباره سر جاش نصبش کنی.

مرحله ۸

تنظیم ماژول افزاینده ولتاژ

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

مرحله ۹

نصب محفظه باتری لیتیومی

حالا جاباتری رو داخل بدنه جاگذاری کن. اگه جاباتری که خریدی جای پیچ داره، حتما از پیچ برای محکم کردنش استفاده کن، در غیر این صورت می‌تونی با چسب قوی اون رو به دیواره داخلی بچسبونی تا باتری 18650 کاملا ایمن در جای خودش قرار بگیره.

مرحله ۱۰

جایگذاری کلید روشن و خاموش

روی دیواره کناری بدنه یک شیار مخصوص برای کلید کشویی در نظر گرفته شده. کلید رو با دقت داخل این شیار قرار بده تا جا بیفته. این کلید مستقیما سر راه باتری قرار می‌گیره تا هر وقت خواستی خیلی سریع برق کل ربات رو قطع کنی.

مرحله ۱۱

اتصال آنتن وای‌فای

کابل آنتن وای‌فای رو به سوکت خیلی کوچیکی که روی برد XIAO قرار داره فشار بده تا جا بره. بعد خود آنتن رو با قسمت چسب‌دارش به دیواره داخلی بدنه بچسبون. این آنتن کمک می‌کنه تا وقتی چنگک رو به جاهای دور می‌فرستی، ارتباط تصویر با گوشیت قطع نشه.

مرحله ۱۲

نصب سروو موتور گیره

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

مرحله ۱۳

تکمیل سیم‌کشی‌های داخلی

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

مرحله ۱۴

جاگذاری نهایی ماژول دوربین

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

مرحله ۱۵

تأمین انرژی سیستم

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

مرحله ۱۶

مونتاژ بازوهای مکانیکی

بریم سراغ ساخت خود چنگک! اول دو تا از بازوهای رابط رو با استفاده از پیچ‌های M3 به طول 20 میلی‌متر به قسمت پایه متصل کن. سمت دیگه این بازوها قراره به بازوی دنده‌دار اصلی وصل بشن. مهره‌ها رو ببند. حواست باشه که مهره‌ها رو خیلی سفت نکنی؛ این مفصل‌ها باید بتونن کاملا روان و بدون اصطکاک حرکت کنن.

مرحله ۱۷

نصب گیره‌های نگهدارنده

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

مرحله ۱۸

تکمیل مفاصل گیره رباتیک

چهار تا بازوی رابط باقی‌مونده رو هم از بالا و پایین به قسمت پایه متصل کن و مهره‌هاشون رو ببند. این بازوهای موازی باعث می‌شن تا گیره‌ها موقع باز و بسته شدن فرم هندسی خودشون رو حفظ کنن و یک حرکت کاملا دقیق و یکنواخت داشته باشن.

مرحله ۱۹

اتصال پایه نگه‌دارنده میله

قطعه نگه‌دارنده لوله یا میله رو روی بخش پایه قرار بده و بعد محفظه اصلی که مدارات توش هست رو روی اون سوار کن. با استفاده از پیچ‌های بلند M3 و M4 تمام این ساختار رو به هم متصل کن تا یکپارچه و به شدت محکم بشه.

مرحله ۲۰

نصب رابط فلزی موتور

برای اینکه انتقال قدرت از موتور به گیره‌ها بی‌نقص باشه، رابط فلزی دایره‌ای که روی خود سروو موتور قرار داره رو با چهار تا پیچ روی چرخ‌دنده اصلی چاپ‌شده ببند تا شفت موتور هرز نچرخه.

مرحله ۲۱

تنظیم و اتصال چرخ‌دنده به سروو موتور

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

مرحله ۲۲

بستن درپوش محفظه مدار

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

مرحله ۲۳

راه‌اندازی نرم‌افزاری و رابط کاربری

کار ساخت فیزیکی تموم شد! کلید دستگاه رو روشن کن؛ ال‌ای‌دی‌ها روشن می‌شن و گیره به صورت خودکار به حالت باز تغییر وضعیت می‌ده. حالا این چنگک یک شبکه وای‌فای اختصاصی ایجاد می‌کنه. با گوشیت به این وای‌فای وصل شو و از رمز پیش‌فرض 12345678 استفاده کن.

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

مرحله ۲۴

نصب چنگک روی میله بلند

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

مرحله ۲۵

نصب هولدر موبایل روی دسته

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

مرحله ۲۶

جمع‌بندی پروژه و نتیجه‌گیری

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

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

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

STL Base Plate.stl
F3Z Cam Claw.f3z
STEP Cam Claw.step

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

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

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

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

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

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