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

دربازکن مکانیکی هوشمند با موتور براشلس و ESP32

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

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

مرحله ۱

داستان این پروژه چیه؟

دربازکن مکانیکی و بی‌سیم

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

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

این دستگاه از یه موتور براشلس (BLDC)، یه برد درایور و چند تا قطعه پرینت سه‌بعدی تشکیل شده که پایین در نصب می‌شه و دستگیره رو دقیقا مثل یه چوب ماهیگیری به سمت پایین می‌کشه.

مرحله ۲

مکانیزم حرکت و سیستم کنترل بی‌سیم

این سیستم چطور کار می‌کنه؟

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

موتوری که اینجا استفاده کردیم مدل ML5010 هست که مقدار 300KV داره. این یعنی به ازای هر 1 ولت، می‌تونه تو حالت تئوری 300 دور بر دقیقه بچرخه که برای پروژه‌های رباتیک مشابه انتخاب خیلی خوبیه.

اما با ولتاژ 12 ولت، این سرعت هنوز خیلی بالاست. با اینکه کدهای فرم‌ور SimpleFOC سرعت رو محدود می‌کنن، ولی بازم سرعت بالا باعث می‌شه گشتاور (زور) موتور کم بشه. برای حل این مشکل، باید از مکانیزم چرخ‌دنده استفاده کنیم تا سرعت رو کم و گشتاور رو زیاد کنیم تا بتونه دستگیره در رو بکشه. برای این کار، از یه سیستم چرخ‌دنده هلیکال پرینت سه‌بعدی با نسبت 5 به 1 استفاده کردم.

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

اما جای نگرانی نیست! انکودر 14 بیتی که تو سیستم نصب شده، اون‌قدر دقیقه که می‌تونه هر 0.022 درجه چرخش رو تشخیص بده (البته تو عمل حدود 0.05 درجه). این یعنی می‌تونی به موتور دستور بدی دقیقا تو یه نقطه مشخص شروع به کار کنه و تو میلی‌متری‌ترین نقطه متوقف بشه، تا هیچ فشار اضافه‌ای به دستگیره نیاد. اگه تا اینجای کار برات جالب بوده، بریم سراغ بخش هیجان‌انگیز ارتباط بی‌سیم.

کنترل از راه دور

حالا که بخش مکانیکی آماده شده، باید یه راهی برای کنترلش پیدا کنیم. خوشبختانه بردی که برای درایو موتور انتخاب کردیم، وای‌فای داخلی داره!

یکی از بهترین روش‌ها برای ارتباط بی‌سیم در این پروژه‌ها، استفاده از پروتکل ESP-NOW هست؛ البته می‌تونی یه وب‌سرور ساده هم بسازی و با گوشیت در رو باز کنی. برای ارسال فرمان‌های ESP-NOW، برد گیرنده ما که مجهز به ESP32-S3 هست به راحتی فرمان‌ها رو دریافت می‌کنه.

برای فرستنده هم می‌تونی از هر برد ESP32 دیگه‌ای به عنوان ریموت کنترل استفاده کنی تا کدهای باز شدن در رو به برد اصلی ارسال کنه. راه‌اندازیش خیلی ساده‌ست.

مرحله ۳

درایور اختصاصی و بررسی کدهای پروژه

پروتکل ESP-NOW برد خیلی خوبی تا حدود 150 متر داره که برای این پروژه بی‌نظیره. اگه می‌خوای از فاصله خیلی دورتر (مثلا وقتی اصلا خونه نیستی) در رو باز کنی، می‌تونی برد رو به مودم وای‌فای وصل کنی و از طریق پروتکل MQTT بهش فرمان بدی.

برد درایور موتور

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

این برد می‌تونه تقریبا هر موتور براشلسی (زیر 10 آمپر) رو درایو کنه و چون امکانات بی‌سیم داخلی داره، برای پروژه‌های خلاقانه این‌چنینی یه انتخاب فوق‌العاده‌ست.

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

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

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

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

برای برنامه‌نویسی این برد از محیط آردوینو (Arduino IDE) و کتابخونه SimpleFOC استفاده می‌کنیم. چون مغز متفکر این برد یه میکروکنترلر ESP32-S3 هست، کاملا با هسته آردوینو سازگاره و کدنویسیش خیلی راحت انجام می‌شه. با حدود 250 خط کد، یه درایور موتور براشلس بی‌سیم و کامل داری! بریم بخش‌های مهمش رو بررسی کنیم.

Arduino
/*
* ERAD2.1 door unlocker example program for ESP32S3-based wireless BLDC motor driver. Check it out at roboticworx.io!
*/
#include <SimpleFOC.h>
#include <SPI.h>
#include <esp_now.h>
#include <WiFi.h>
/* Pins */
// Define the BLDC motor pins
#define BLDC_PWM_UH_GPIO 7
#define BLDC_PWM_UL_GPIO 8
#define BLDC_PWM_VH_GPIO 9
#define BLDC_PWM_VL_GPIO 10
#define BLDC_PWM_WH_GPIO 11
#define BLDC_PWM_WL_GPIO 12
// TMC6200 / gate driver pins
#define DRV0_CSN_PIN 14
#define DRV1_SCK_PIN 13
// Driver enable + user LED
#define ENABLE_PIN 17
#define BLINK_PIN 38
// Encoder (AS5048A) pins
#define AS5_CLK_PIN 15 // SCK
#define AS5_MISO_PIN 16 // MISO
#define AS5_MOSI_PIN 18 // MOSI
#define AS5_CSN_PIN 21 // CS (chip select)
// Motor mechanical configuration
// CHANGE THIS: number of permanent magnets in YOUR motor divided by 2
#define POLE_PAIRS 7
/* Globals */
volatile bool toggle_request = false;
volatile unsigned int cmd_received = 0;
bool pos_state = false; // false -> pos A, true -> pos B
// Callback that triggers when data is received
void receive_cb(const esp_now_recv_info_t *info, const uint8_t *data, int len)
{
// Optionally print the sender MAC (PolyCast5)
Serial.print("From ");
for (int i = 0; i < 6; i++) {
Serial.printf("%02X", info->src_addr[i]);
if (i < 5) Serial.print(":");
}
Serial.print(" | ");
// The received data will be in the form "PolyCast5_Command_Value: %u" for security purposes
// We need to extract the %u (unsigned int) command
#define MAX_BUF_SIZE 65 // Maximum number of bytes the data could be
char buf[MAX_BUF_SIZE]; // Create a buffer to store the data string
// If the received data length is less than the max buffer size, make len the new buffer size
size_t copy_len = len < MAX_BUF_SIZE - 1 ? len : MAX_BUF_SIZE - 1;
memcpy(buf, data, copy_len); // Copy len bytes of the data into the buffer
buf[copy_len] = '\0'; // Null-terminate the string
// Try to parse "PolyCast5_Command_Value: %u" out of the string
if (sscanf(buf, "PolyCast5_Command_Value: %u", &cmd_received) == 1) { // If success -> data is valid and the command is now stored in cmd_received
Serial.print("Command: ");
Serial.println(cmd_received); // The command received
}
else { // Data is not valid
Serial.print("Unexpected data: ");
Serial.println(buf);
}
if (cmd_received != 0) {
toggle_request = true; // Request a toggle once
}
}
unsigned long previousMillis = 0;
bool blinkState = true;
// Angle set point variable
float target_angle = 0; // Default target angle (radians)
// Encoder debug print timing (so we don't spam Serial and slow down FOC)
static unsigned long lastPrintMillis = 0;
/* Motor / Driver / Sensor Instances */
// BLDC motor and driver instance
BLDCMotor motor = BLDCMotor(POLE_PAIRS);
BLDCDriver6PWM driver = BLDCDriver6PWM(
BLDC_PWM_UH_GPIO, BLDC_PWM_UL_GPIO,
BLDC_PWM_VH_GPIO, BLDC_PWM_VL_GPIO,
BLDC_PWM_WH_GPIO, BLDC_PWM_WL_GPIO
);
// Encoder instance (AS5048A SPI absolute magnetic encoder)
MagneticSensorSPI sensor = MagneticSensorSPI(AS5048_SPI, AS5_CSN_PIN);
// Instantiate the commander (SimpleFOC serial command helper)
Commander command = Commander(Serial);
void doTarget(char* cmd) { command.scalar(&target_angle, cmd); }
/* Setup */
void setup()
{
// Use monitoring with serial
Serial.begin(115200);
WiFi.mode(WIFI_STA);
// Initialize ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Register the receive callback
esp_now_register_recv_cb(receive_cb);
// If you want internal SimpleFOC debug prints, uncomment this,
// but it can slow down loopFOC() noticeably.
// motor.useMonitoring(Serial);
// Configure GPIOs
pinMode(ENABLE_PIN, OUTPUT);
pinMode(BLINK_PIN, OUTPUT);
pinMode(DRV0_CSN_PIN, OUTPUT);
pinMode(DRV1_SCK_PIN, OUTPUT);
// Set TMC6200 drive configuration (medium strength)
// (Your board uses these lines to set configuration. Keep as-is.)
digitalWrite(DRV1_SCK_PIN, LOW);
digitalWrite(DRV0_CSN_PIN, HIGH);
// Toggle reset to clear pending errors
digitalWrite(ENABLE_PIN, LOW);
delay(250);
digitalWrite(ENABLE_PIN, HIGH);
// Start SPI bus using your chosen pins
// SPI.begin(SCK, MISO, MOSI, SS)
SPI.begin(AS5_CLK_PIN, AS5_MISO_PIN, AS5_MOSI_PIN, AS5_CSN_PIN);
// Initialize sensor hardware on that SPI bus
// This sets up the driver to read angle data from the AS5048A
sensor.init(&SPI);
// If your motor direction is reversed (e.g. target angle increases but motor moves opposite),
// you can flip the sensor direction:
// sensor.direction = Direction::CW;
// sensor.direction = Direction::CCW;
// Link the motor to the encoder sensor
motor.linkSensor(&sensor);
// Power supply voltage [V]
driver.voltage_power_supply = 24; // Change to your real supply voltage
driver.init();
// Link the motor and the driver
motor.linkDriver(&driver);
// Aligning voltage [V]
// START SMALL THEN INCREASE IF NEEDED.
// This is the voltage used during initial alignment routine
motor.voltage_sensor_align = 1;
// Index search velocity [rad/s]
motor.velocity_index_search = 3;
// Set motion control loop to be used
// angle mode allows holding at a location
motor.controller = MotionControlType::angle;
// Velocity PI controller parameters
// Default parameters are in defaults.h
motor.PID_velocity.P = 0.05f;
motor.PID_velocity.I = 1;
motor.PID_velocity.D = 0;
// Voltage limit [V]
// START SMALL THEN INCREASE IF NEEDED.
motor.voltage_limit = 3;
// Jerk control using voltage ramp
// Default value is 300 volts per sec ~ 0.3V per millisecond
motor.PID_velocity.output_ramp = 100;
// Velocity low pass filtering time constant
motor.LPF_velocity.Tf = 0.01f;
// Angle P controller
motor.P_angle.P = 20;
// Maximal velocity of the position control
motor.velocity_limit = 150;
// Initialize motor hardware (driver + internal state)
motor.init();
// Align sensor and start FOC
// For an absolute encoder like AS5048A, this will:
// - establish electrical angle reference
// - ensure the motor commutation matches the encoder readings
motor.initFOC();
// Add target command "T"
// Example: send "T 1.57" to target ~90 degrees (in radians)
command.add('T', doTarget, "target angle");
Serial.println(F("Motor ready (AS5048A encoder)."));
delay(1000);
}
/* Loop */
void loop()
{
unsigned long currentMillis = millis();
// Demo motion pattern
// Every 500ms, we change the target by "offset" radians.
// After 18 changes, we reverse direction.
if (currentMillis - previousMillis >= 500)
{
// Blink LED for heartbeat
digitalWrite(BLINK_PIN, blinkState);
blinkState = !blinkState;
previousMillis = currentMillis;
}
// Print encoder angle every 100ms
if (currentMillis - lastPrintMillis >= 100)
{
Serial.print("Encoder angle (rad): ");
Serial.println(sensor.getAngle());
lastPrintMillis = currentMillis;
}
// Main FOC algorithm function
// The faster you run this function the better
motor.loopFOC();
if (toggle_request) {
toggle_request = false;
pos_state = !pos_state;
target_angle = pos_state ? cmd_received : 0;
Serial.printf("Toggled target_angle -> %.3f rad\n", target_angle);
}
// Motion control function
// Velocity, position (angle), or voltage depending on motor.controller
motor.move(target_angle);
// User communication
// Allows serial command parsing (e.g., "T 3.14")
command.run();
}

اول از همه متغیرهای سراسری رو داریم. ما می‌خوایم موتور فقط وقتی حرکت کنه که یه فرمان کاملا معتبر دریافت کرده باشه. برای همین از یه متغیر به اسم toggle_request استفاده می‌کنیم تا بفهمیم اصلا پیامی اومده یا نه، و با متغیر cmd_received خود فرمان رو تو حافظه نگه می‌داریم. چون در فقط دو حالت داره (قفل یا باز)، از یه متغیر بولین (pos_state) برای تشخیص وضعیت فعلی سیستم استفاده کردیم.

TXT
volatile bool toggle_request = false;
volatile unsigned int cmd_received = 0;
bool pos_state = false; // false -> pos A, true -> pos B

بخش مهم بعدی، تابع کال‌بک (Callback) هست که به محض دریافت پیام اجرا می‌شه. اینجا باید حتما بررسی کنیم فرمانی که اومده معتبره یا نه؛ چون اصلا دوست نداریم هر کسی که ESP32 داره بتونه درمون رو باز کنه!

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

Arduino
// Callback that triggers when data is received
void receive_cb(const esp_now_recv_info_t *info, const uint8_t *data, int len)
{
// Optionally print the sender MAC (PolyCast5)
Serial.print("From ");
for (int i = 0; i < 6; i++) {
Serial.printf("%02X", info->src_addr[i]);
if (i < 5) Serial.print(":");
}
Serial.print(" | ");
// The received data will be in the form "PolyCast5_Command_Value: %u" for security purposes
// We need to extract the %u (unsigned int) command
#define MAX_BUF_SIZE 65 // Maximum number of bytes the data could be
char buf[MAX_BUF_SIZE]; // Create a buffer to store the data string
// If the received data length is less than the max buffer size, make len the new buffer size
size_t copy_len = len < MAX_BUF_SIZE - 1 ? len : MAX_BUF_SIZE - 1;
memcpy(buf, data, copy_len); // Copy len bytes of the data into the buffer
buf[copy_len] = '\0'; // Null-terminate the string
// Try to parse "PolyCast5_Command_Value: %u" out of the string
if (sscanf(buf, "PolyCast5_Command_Value: %u", &cmd_received) == 1) { // If success -> data is valid and the command is now stored in cmd_received
Serial.print("Command: ");
Serial.println(cmd_received); // The command received
}
else { // Data is not valid
Serial.print("Unexpected data: ");
Serial.println(buf);
}
if (cmd_received != 0) {
toggle_request = true; // Request a toggle once
}
}

یه نکته مهم برنامه‌نویسی: معمولا نباید از دستورات پرینت (Serial.print) داخل توابع کال‌بک استفاده کنی چون سرعت اجرای برنامه رو پایین میارن. اما اینجا برای دیباگ کردن ایرادی نداره. تو این تابع، اول مک‌آدرس (MAC Address) فرستنده رو پرینت می‌کنیم که برای عیب‌یابی عالیه.

بعد دیتای دریافتی رو بررسی می‌کنیم:

Arduino
#define MAX_BUF_SIZE 65 // Maximum number of bytes the data could be
char buf[MAX_BUF_SIZE]; // Create a buffer to store the data string
// If the received data length is less than the max buffer size, make len the new buffer size
size_t copy_len = len < MAX_BUF_SIZE - 1 ? len : MAX_BUF_SIZE - 1;
memcpy(buf, data, copy_len); // Copy len bytes of the data into the buffer
buf[copy_len] = '\0'; // Null-terminate the string
// Try to parse "PolyCast5_Command_Value: %u" out of the string
if (sscanf(buf, "PolyCast5_Command_Value: %u", &cmd_received) == 1) { // If success -> data is valid and the command is now stored in cmd_received
Serial.print("Command: ");
Serial.println(cmd_received); // The command received
}
else { // Data is not valid
Serial.print("Unexpected data: ");
Serial.println(buf);
}

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

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

بعد از تایید پیام و مطمئن شدن از اینکه مقدارش صفر نیست، متغیر toggle_request تغییر می‌کنه تا به سیستم بگه باید وضعیت در رو عوض کنه.

TXT
if (cmd_received != 0) {
toggle_request = true; // Request a toggle once
}

بقیه کدها مربوط به تنظیمات استاندارد SimpleFOC و راه‌اندازی انکودر هست. تو حلقه اصلی (Loop) هم دو تا تایمر داریم؛ یکی برای چشمک زدن ال‌ای‌دی روی برد هر 500 میلی‌ثانیه، و یکی هم برای پرینت کردن اطلاعات دیباگ.

Arduino
if (currentMillis - previousMillis >= 500)
{
// Blink LED for heartbeat
digitalWrite(BLINK_PIN, blinkState);
blinkState = !blinkState;
previousMillis = currentMillis;
}
// Print encoder angle every 100ms
if (currentMillis - lastPrintMillis >= 100)
{
Serial.print("Encoder angle (rad): ");
Serial.println(sensor.getAngle());
lastPrintMillis = currentMillis;
}

در نهایت اگه متغیر فرمان تو کال‌بک فعال شده باشه، سیستم وضعیت رو برعکس می‌کنه و زاویه هدف جدید رو به موتور می‌ده تا دستگیره رو بکشه یا به حالت اول (صفر) برگرده. به همین راحتی!

مرحله ۴

مونتاژ قطعات و نصب روی در

مونتاژ نهایی

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

حالا می‌تونی موتور رو با چهار تا پیچ M3x12 سر جاش محکم کنی. قبل از اینکه جلوتر بری، به یه آهنربای کوچیک نیاز داری که قطب‌های اون در راستای قطرش مگنت شده باشن (Diametrically magnetized). این آهنربا باید دقیقا مرکز پشت موتور چسبونده بشه تا انکودر بتونه چرخش رو تشخیص بده. (می‌تونی این آهنربا رو از ماژول‌های انکودر ارزان‌قیمت جدا کنی).

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

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

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

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

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

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

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

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

اینجا لیست قطعاتی که برای ساخت این پروژه نیاز داری رو برات مرتب نوشتم تا کارت برای تهیه کردنشون راحت‌تر بشه:

  1. فایل‌های پرینت سه‌بعدی قطعات مکانیکی
  2. کدها و برنامه‌های میکروکنترلر
  3. مجموعه‌ای از پیچ و مهره‌های سایز M3
  4. پیچ‌گوشتی و ابزار مونتاژ
  5. آداپتور 12 ولت برای تامین برق موتور از پریز
  6. انکودر و آهنربای مخصوص مگنت شده در راستای قطر
  7. چسب قطره‌ای
  8. گیره دستی برای جا زدن قطعات سفت
  9. بلبرینگ با قطر داخلی 20 و قطر خارجی 32 میلی‌متر
  10. نخ محکم پاراکورد
  11. هویه و ابزار لحیم‌کاری برای آماده‌سازی اتصالات برد
  12. خمیر قلع و سیم لحیم
  13. موتور براشلس (مثل مدل ML5010)
  14. برد درایور موتور سازگار با ESP32
  15. منبع تغذیه متغیر (برای تست‌های اولیه)
  16. فیلامنت پرینتر سه‌بعدی
  17. هیتر هوای گرم (برای لحیم‌کاری قطعات SMD روی برد)

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

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

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

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

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

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

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

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

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