Hoverboard چه قطعاتی دارد که میتوانیم دوباره استفاده کنیم؟
یک hoverboard (اسکیتبورد الکتریکی) حاوی دو موتور hub wheel بسیار قوی (هر کدام ۲۵۰–۳۵۰W)، یک باتری Li-ion ۳۶V، و یک بورد کنترل است. موتورهای آن BLDC (Brushless DC) هستند با ۱۵ تا ۱۸ مگنت — کارخانههای معروفی مثل Tomoloo و EPIKGO از همین موتورها استفاده میکنند.
ما باتری و بورد کنترل اصلی را کنار میگذاریم (بورد hoverboard پروتکل اختصاصی دارد) و دو موتور را مستقیماً با VESC کنترل میکنیم — یک درایور متنباز که FOC (Field Oriented Control) را پشتیبانی میکند و برای اسکوترهای DIY ایدهآل است.
🛠️ کارت پروژه
| منبع اصلی قطعات | Hoverboard خراب + پروفیل آلومینیوم |
| بودجه | ~۲.۵M تومان (VESC + باتری + hoverboard اسکرپ) |
| حداکثر وزن سوارکار | ~۷۰kg |
BOM
| قطعه | مشخصات | قیمت |
|---|---|---|
| Hoverboard اسکرپ | فقط موتورها لازم | ~۵۰۰K |
| VESC 4.12 dual (یا ۲ عدد تکی) | تا ۵۰V / ۵۰A | ~۱۰۰۰K |
| Arduino Nano | کنترلر PID | ~۱۰۰K |
| MPU-6050 | IMU تعادل | ~۴۰K |
| باتری LiPo 10S 4000mAh | ۳۶V برای موتور | ~۸۰۰K |
| پروفیل آلومینیوم ۴۰×۴۰mm | ۱ متر — دسته و پایه | ~۲۰۰K |
نقشه سیمکشی VESC ← موتورهای Hoverboard
تنظیم VESC برای موتور Hoverboard
- نرمافزار VESC Tool را از vesc-project.com دانلود کن.
- از طریق USB به VESC وصل شو → Motor Wizard را اجرا کن.
- نوع موتور: BLDC Hub (sensored اگر hall sensor دارد، بهتر است).
- جریان Max: 40A برای شروع ایمن.
- FOC را فعال کن — کنترل نرمتر و کارآمدتر از BLDC mode است.
- تست بدون بار: موتور باید آرام و بیصدا بچرخد.
کد PID تعادل اسکوتر
// ارسال دستور سرعت به VESC از طریق UART
// کتابخانه: VescUart (arduino-vesc)
#include "VescUart.h"
#include <Wire.h>
#include <MPU6050.h>
VescUart UART_L, UART_R;
MPU6050 imu;
float Kp=45.0, Ki=1.5, Kd=3.0;
float angle=0, errSum=0, lastErr=0;
unsigned long lastT;
void setup(){
Serial1.begin(115200); UART_L.setSerialPort(&Serial1);
Serial2.begin(115200); UART_R.setSerialPort(&Serial2);
Wire.begin(); imu.initialize();
lastT = millis();
}
void loop(){
int16_t ax,ay,az,gx,gy,gz;
imu.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
float dt=(millis()-lastT)/1000.0; lastT=millis();
float acc=atan2(ax,az)*57.295;
angle=0.98*(angle+(gy/131.0)*dt)+0.02*acc;
float err=0-angle;
errSum+=err*dt; errSum=constrain(errSum,-80,80);
float out=Kp*err+Ki*errSum+Kd*(err-lastErr)/dt;
lastErr=err;
// RPM هدف برای هر موتور
int rpm=(int)constrain(out,-3000,3000);
UART_L.setCurrent(rpm);
UART_R.setCurrent(rpm);
delay(5);
}