کره هولوگرامی POV با برد ESP32 و حلقههای LED
تا حالا نمایشگرهای هولوگرامی چرخشی رو دیدی که تو هوا تصاویر سهبعدی و جذاب میسازن؟ به این تکنولوژی Persistence of Vision یا همون خطای دید (POV) میگن. امروز تو آیسیمدار میخوایم با هم یه کره هولوگرامی خفن و حرفهای بسازیم. قلب تپنده این پروژه برد قدرتمند ESP32 هست که با پردازنده دو هستهای خودش، پردازش سنگین تصاویر رو انجام میده. برای نمایشگر هم از نوارهای الایدی مدل DotStar استفاده میکنیم که سرعت رفرش خیرهکنندهای دارن.
این پروژه هم بخش مکانیکی داره و هم الکترونیکی؛ از پرینت سهبعدی و مونتاژ پروفیلهای آلومینیومی گرفته تا برنامهنویسی پیشرفته با FreeRTOS تو محیط VS Code و PlatformIO. پس اگه آمادهای یه گجت سایبرپانکی و بینظیر بسازی که هر کسی با دیدنش شگفتزده بشه، بریم سراغ قطعات و شروع کار!
قطعات موردنیاز
- برد توسعه ESP32 (مدل WROOM-32 دو هستهای)
- آیسی بافر و مبدل ولتاژ 74AHCT125N (دو عدد)
- نمایشگر OLED تکرنگ 0.96 اینچ (رابط I2C)
- انکودر مغناطیسی AS5600
- روتاری انکودر سوئیچدار
- ترانزیستور 2N2222 (دو عدد)
- ماسفت کانال N مدل IRF3204
- مقاومتهای 3.3 و 10 کیلواهم، خازنهای 0.1 و 470 میکروفاراد
- ماژول اسلیپرینگ (Slip Ring) دوازده پین
- سیم و کانکتورهای جامپر نری و مادگی
- برد مدار چاپی (PCB) یا برد سوراخدار
- پک باتری لیتیومی 3 سل (18650) همراه با ماژول BMS
- ماژول کاهنده ولتاژ (باک) 12 به 5 ولت (حداقل 2 تا 3 آمپر)
- کلید پاور، فیوز و جک شارژ
- یک متر نوار الایدی مدل DotStar با تراکم 144
- نیم متر نوار الایدی مدل DotStar با تراکم 144
- پروفیل آلومینیومی شیاردار 2020 با طول 150 میلیمتر
- براکت و نبشی مخصوص پروفیل 2020
- بلبرینگ سایز 10x26x8 (شش عدد)
- لوله توخالی با قطر 10 میلیمتر (طول 400 میلیمتر)
- تسمه تایم GT2 (عرض 6 میلیمتر، طول 400 میلیمتر)
- پولی 60 دندانه GT2 با سوراخ داخلی 10 میلیمتر (دو عدد)
- موتور گیربکسدار 12 ولت DC با سرعت 550 دور در دقیقه
- کوپلینگ شفت 6 به 10 میلیمتر
- کوپلینگ شفت 8 به 10 میلیمتر
- طوقه و نگهدارنده شفت 10 میلیمتری (چهار عدد)
- تخته چوبی یا پلکسی برای پایه کار
- قطعات پرینت سهبعدی بدنه (کاور باتری، پایه موتور، حلقههای الایدی)
طراحی اولیه و مدلسازی ساختار
قبل از اینکه دست به آچار بشیم و قطعات رو برش بزنیم، همیشه بهتره ایده تو ذهنمون رو روی کاغذ پیاده کنیم و طرحهای اولیهمون رو بکشیم. این کار جلوی سردرگمی موقع ساخت رو میگیره.
بعد از اینکه ایده کلی دستمون اومد، میتونیم بریم سراغ نرمافزارهای طراحی مثل Fusion 360 تا ابعاد دقیق پروفیلها و محل قرارگیری قطعات مکانیکی رو بررسی کنیم. اینطوری مطمئن میشیم که موقع مونتاژ نهایی همهچیز دقیقا سر جای خودش فیکس میشه و نیازی به آزمون و خطای قطعات گرونقیمت نیست.
مونتاژ مکانیکی و استخوانبندی کره
برای بخش مکانیکی چند تا هدف مهم داشتیم که باید رعایت میشد:
- طراحی تمیز کره: هیچ سیم آویزون، برد یا مدار اضافهای نباید داخل خود کره در حال چرخش باشه.
- ساختار باید کاملا محکم و بدون لرزش طراحی بشه تا چرخش موتور باعث پرش تصویر نشه.
- ظاهر پروژه باید حس و حال مکانیکی و استیمپانک جذابی داشته باشه.
- از قطعات پرینت سهبعدی برای ساخت پایهها، نگهدارندهها و مفاصل استفاده بشه.
برای بدنه اصلی از پروفیلهای آلومینیومی 2020 استفاده کردیم. لوله توخالی 10 میلیمتری، بلبرینگها و کوپلینگها هم برای متصل کردن لوله به موتور و اسلیپرینگ به کار گرفته شدن که ساختار خیلی سرراست و استانداردیه.
پروفیلهای 2020 معمولا تو طولهای استاندارد 150 میلیمتری تو بازار هستن، پس نیازی به برشکاری پروفیل نداری. فقط کافیه لوله 400 میلیمتری رو به دو قسمت 300 و 100 میلیمتری برش بزنی.
همه قطعات به کمک کوپلینگها و براکتهای فلزی روی یک پایه چوبی محکم پیچ میشن. نیروی موتور از طریق یک تسمه GT2 به محور اصلی منتقل میشه. برای سفت کردن تسمه هم فقط لازمه ستون موتور رو کمی به عقب هل بدی و پیچهای پایش رو محکم کنی.
بزرگترین چالش، انتقال برق و دیتا به الایدیهای روی کره در حال چرخش بود. برای این کار از ماژول اسلیپرینگ استفاده کردیم. این ماژول به پایه وصل میشه و 12 رشته سیم اون از داخل لوله توخالی محور عبور میکنن تا در نهایت بالای کره به الایدیها متصل بشن.
پایه موتور و نگهدارنده بلبرینگها رو با پرینتر سهبعدی ساختیم. برای اینکه محور مرکزی موقع سرعت بالا لنگ نزنه، از بلبرینگهای دوبل روی محور اصلی استفاده کردیم.
فعلا از یه موتور گیربکسدار ساده استفاده کردیم که کار رو راه میندازه، اما اگه خواستی پروژه رو ارتقا بدی، میتونی از موتورهای براشلس (Brushless) استفاده کنی که هم صدای کمتری دارن و هم نویز الکتریکی تولید نمیکنن.
پرینت سهبعدی قطعات
حالا نوبت آماده کردن قطعات پلاستیکی بدنه، مثل پایه موتور و نگهدارندههای محوره. برای پرینت این قطعات میتونی از فیلامنت PLA معمولی با تنظیمات ارتفاع لایه 0.2 میلیمتر و عرض خط 0.4 میلیمتر استفاده کنی. این تنظیمات هم استحکام خیلی خوبی به قطعه میده و هم دقت بالایی برای فیکس شدن بلبرینگها داره.
ساخت حلقههای نوری و نصب LEDها
چهار تا حلقه پلاستیکی که پرینت کردی رو بردار و با چسب دوقلوی قوی (مثل چسب JB-Weld) به کانکتورهای بالا و پایین متصل کن. محور اصلی از وسط این حلقهها رد میشه. برای محکم شدن طوقهها به شفت، ممکنه نیاز بشه دو تا سوراخ کوچیک روی هر طوقه دریل و قلاویز کنی.
سیمهای اسلیپرینگ که از داخل محور لولهای اومدن بالا رو باید بین حلقهها تقسیم کنی. از 12 سیم، 8 تاش برای پینهای دیتا و کلاک استفاده میشه (برای هر حلقه 2 عدد) و 4 تای باقیمونده به پایههای مثبت و منفی تغذیه میرن. برای اینکه بعدا بتونی راحت قطعات رو باز و بسته کنی، سر سیمها رو به پینهدرهای جامپر لحیم کن.
از اونجایی که سیمکشیها بالای کره ممکنه یه مقدار شلوغ و شلخته به نظر برسه، یه کاور پلاستیکی کوچیک پرینت کردیم تا همه سیمها رو زیر خودش پنهان کنه.
برای چسبوندن نوارهای الایدی روی حلقهها از چسب دوطرفه قوی استفاده کن. روی هر حلقه 48 تا الایدی قرار میگیره. یه نکته فوقالعاده مهم اینه که الایدیها باید دقیقا تو یک راستای عمودی چسبونده بشن. اگه حتی یه مقدار کج بشن، تصویر نهایی دچار اعوجاج میشه؛ پس موقع چسب زدن از یه سطح صاف کمک بگیر و با گیره محکمشون کن.
اگه محور اصلی لوله فلزی کاملا صاف نباشه و یه مقدار انحنا داشته باشه، موقع چرخش لرزش ایجاد میکنه و پیکسلهای تصویر تو هوا پرش پیدا میکنن. اگه به تجهیزات کارگاهی دسترسی داری، میتونی بعدا این حلقهها رو از جنس فلز بسازی تا دوام خیلی بالاتری موقع چرخش سریع داشته باشن.
مدیریت تغذیه و ساخت پک باتری
برای اینکه نمایشگر هولوگرامی کاملا بیسیم و پرتابل باشه، از یک پک باتری دستساز با 6 تا باتری لیتیومی 18650 (آرایش 3S-2P) استفاده کردیم. نوارهای الایدی میتونن جریان خیلی بالایی بکشن، اما این موضوع کاملا به پترنها و سطح روشنایی بستگی داره. تو استفادههای معمولی جریان کشی زیر 1 آمپره.
اما از نظر تئوری، اگه هر 4 حلقه و مجموعا 192 تا الایدی رو روی رنگ سفید با نهایت روشنایی روشن کنی، جریان وحشتناکی بالای 11 آمپر از مدار کشیده میشه که باید حواست بهش باشه!
شاید بپرسی چرا از نوارهای سهسیمه مثل WS2812 استفاده نکردیم؟ جواب سرعت رفرشه! نوارهای DotStar چهارسیمه هستن و پایه کلاک مجزا دارن، به همین خاطر میتونن با سرعت خیرهکننده 20 تا 32 مگاهرتز آپدیت بشن، در حالی که مدلهای معمولی نهایتا 800 کیلوهرتز سرعت دارن.
کل سیستم به دو ولتاژ 12 و 5 ولت نیاز داره. موتور گیربکسدار مستقیما با همون 12 ولت باتریها تغذیه میشه. اما برای رسوندن برق به ESP32، نوارهای الایدی و آیسیها، از یک ماژول کاهنده (Buck) برای ساخت 5 ولت پایدار استفاده میکنیم.
چون الایدیها مصرف اصلی رو دارن، مطمئن شو که ماژول باک حتما بتونه حداقل 2 تا 3 آمپر جریان واقعی بده. خروجی 3.3 ولت خود برد ESP32 هم برای تغذیه انکودر و نمایشگر OLED کاملا کافیه و نیازی به رگولاتور جداگانه نداری.
البته میتونی کلا بیخیال باتری بشی و از یه آداپتور 12 ولت قوی استفاده کنی، اما ساخت پک باتری پروژه رو خیلی خفنتر میکنه. اگه خواستی پک باتری بسازی، حتما ماژول محافظ شارژ و دشارژ (BMS) رو نصب کن تا باتریهات منفجر یا خراب نشن!
طراحی مدار کنترلر و مغز متفکر
مغز متفکر این پروژه برد قدرتمند ESP-WROOM-32 هست. دلیل انتخاب این برد، پردازنده دو هستهای، حافظه بالا و پشتیبانی بینظیر از سیستمعامل بیدرنگ (FreeRTOS) بود تا بتونیم همزمان پردازشهای مختلف رو مدیریت کنیم.
برد ESP32 به صورت مداوم دیتای انکودر مغناطیسی AS5600 که روی شفت موتور نصب شده رو میخونه تا سرعت (RPM) و زاویه لحظهای رو محاسبه کنه. سپس از طریق یک حلقه کنترلی PID و ارسال پالسهای PWM به ماسفت و ترانزیستورها، سرعت موتور رو کاملا ثابت و پایدار نگه میداره.
از اونجایی که ولتاژ منطقی ESP32 روی 3.3 ولته و پینهای دیتای نوارهای DotStar به سیگنال 5 ولتی نیاز دارن، از آیسی بافر 74AHCT125N به عنوان مبدل سطح ولتاژ (Level Shifter) استفاده کردیم. رزولوشن فریم ما 120 ستون در 48 سطر هست.
یه ترفند مهندسی جالب تو این مدار اینه که ما به جای دو تا نوار الایدی، از چهار تا استفاده کردیم. اگه فقط دو حلقه داشتیم، برای رسیدن به نرخ 25 فریم بر ثانیه باید موتور با سرعت سرسامآور 750 دور در دقیقه میچرخید که ماژول اسلیپرینگ تحملش رو نداشت! با چهار حلقه، هر نوار فقط باید یک چهارم فریم رو بسازه و سرعت چرخش به 375 دور در دقیقه کاهش پیدا میکنه.
البته این کار باعث میشه پردازنده به ازای هر آپدیت ستون، مجبور بشه دادههای چهار نوار رو به صورت همزمان روی پروتکل سختافزاری SPI/DMA پمپاژ کنه که نیاز به پهنای باند بالایی داره.
روی مدار یک نمایشگر OLED و یک روتاری انکودر هم تعبیه شده تا یه منوی جذاب برای انتخاب انیمیشنها، تنظیم روشنایی و سرعت چرخش داشته باشیم.
طراحی شماتیک و PCB این پروژه تو نرمافزار EasyEDA انجام شده. تمام قطعات به صورت دیپ (DIP) در نظر گرفته شدن تا لحیمکاریشون برای همه آسون باشه و نیازی به ابزارهای پیچیده قطعات نصب سطحی (SMD) نباشه.
موقع لحیمکاری قطعات، حتما حواست به پایههای ترانزیستور 2N2222 باشه. گاهی اوقات چاپ راهنمای روی بردهای مدار چاپی برعکس میشه و ممکنه پایههای امیتر و کلکتور رو جابهجا لحیم کنی. همیشه پایهها رو با دیتاشیت چک کن!
برنامهنویسی حرفهای با معماری FreeRTOS
بخش برنامهنویسی این پروژه یکی از جذابترین و البته چالشبرانگیزترین قسمتهاست. کدهای این مدار تماما با زبان C++ و تو محیط حرفهای VS Code همراه با افزونه PlatformIO نوشته شده.
وقتی با نمایشگرهای POV کار میکنی، همهچیز به زمانبندی دقیق بستگی داره. کوچکترین تاخیر تو اجرای کدها باعث میشه پیکسلها جابهجا روشن بشن و تصویر نهایی کاملا بههمریخته بشه.
به همین دلیل، ما برنامهنویسی معمولی آردوینو رو کنار گذاشتیم و رفتیم سراغ قابلیتهای پیشرفته برد ESP32 تا از تمام قدرت پردازشی این غول کوچک استفاده کنیم.
این برد دارای پردازنده دو هستهایه و از سیستمعامل بیدرنگ FreeRTOS پشتیبانی میکنه. این یعنی میتونیم وظایف رو دقیقا بین دو هسته تقسیم کنیم.
کدها به چند ماژول اصلی تقسیم شدن: کنترل موتور، رابط کاربری، رندر کردن گرافیک و مدیریت تصاویر. با این کار، مدیریت و توسعه کدهای پروژه خیلی راحتتر میشه.
تمام وظایف سنگین اما غیرحساس به زمان (مثل خواندن سنسورها، دکمهها و آپدیت منوها) رو انداختیم روی هسته صفر (Core 0). این هسته درگیر محاسبات گرافیکی هم هست.
برای جلوگیری از تداخل، هسته صفر خودش به سه زیر-وظیفه (Task) مجزا تقسیم شده. FreeRTOS به هر کدوم از این تسکها زمان اجرای مشخص و اولویت خاصی میده. این معماری تسکمحور باعث میشه اگه مثلا منوی OLED تو یک حلقه گیر کرد، چرخش موتور و رندر تصاویر متوقف نشه.
اما هسته یک (Core 1) فقط و فقط یک ماموریت حیاتی داره: اجرای بیوقفه حلقه رندرینگ نوارهای DotStar با استفاده از پروتکل سختافزاری DMA. این هسته نباید با هیچ وقفه اضافهای درگیر بشه.
سیستم ما به صورت دو-بافره (Double Buffering) عمل میکنه. یعنی هسته صفر اطلاعات فریم بعدی رو تو پسزمینه آماده میکنه و به محض آماده شدن، یک پرچم (Flag) رو فعال میکنه.
هسته یک با دیدن این پرچم، بافرها رو جابهجا میکنه و بلافاصله دیتای جدید رو به الایدیها میفرسته. بعد از اون هسته صفر میره سراغ ساخت فریم بعدی.
رزولوشن تصویری که روی این کره تشکیل میشه، 120 پیکسل در طول چرخش و 48 پیکسل در ارتفاعه. ما هر 3 درجه که کره میچرخه، یک ستون جدید رو آپدیت میکنیم.
از اونجایی که پردازنده خیلی سریعه، حتی میشه این رزولوشن رو تا 150 پیکسل هم بالا برد تا جزئیات خیلی دقیقتری رو تو هوا معلق ببینیم. یکی از چالشهای عجیب این بود که انکودر AS5600 برای ارتباط لحظهبهلحظه کمی کند عمل میکرد و زمانبندی هسته یک رو به هم میریخت.
برای حل این مشکل، وظیفه خواندن سنسور رو به هسته صفر منتقل کردیم تا با سرعت کمتری دادهها رو بخونه. سپس از طریق یک حلقه قفل فاز نرمافزاری (PLL) تو هسته یک، زاویه لحظهای شفت رو شبیهسازی کردیم.
این ترفند مهندسی باعث شد هسته یک بتونه زاویه موتور رو در حد چند میکروثانیه پیشبینی کنه، بدون اینکه نیازی به معطل شدن برای سنسور داشته باشه.
حالا که مغز سیستم آمادهست، میتونیم انواع گرافیکها رو روش پیاده کنیم. کلاسهای گرافیکی این پروژه امکانات فوقالعادهای بهت میدن:
- توابع پایه گرافیکی (Primitives): برای کشیدن خط، دایره، مربع، آرک و متن متحرک.
- توابع ترکیبی (Composites): برای ساخت تصاویر ترکیبی از چند شکل پایه.
- انیمیشنها (Animations): برای ساخت فریمهای متحرک بر اساس توابع ریاضی و تغییر فاز.
- سناریوها (Scenes): ماشینهای وضعیتی که میتونن به گرافیکها زمانبندی بدن. مثلا افکت انفجار ترقه بعد از چند ثانیه، یا روشن شدن یک پیکسل خاص در زمانی مشخص.
- ذرات معلق (Particles): برای روشن کردن یک پیکسل که به مرور زمان خاموش میشه؛ دقیقا مثل ساخت افکت بارش شهابسنگ.
این کلاسها فقط نقطه شروع هستن! با درک این ساختار میتونی افکتهای جذاب و شخصیسازیشده خودت رو خلق کنی. مطمئن باش برنامهنویسی برای این کره به شدت اعتیادآوره و میتونه ساعتها تو رو سرگرم اجرای ایدههای گرافیکی جدید کنه.
جمعبندی و تست کره جادویی
مونتاژ و راهاندازی این پروژه یه تجربه یادگیری بینظیر بود که هم مهارتهای مکانیکی رو به چالش کشید و هم درک عمیقتری از معماری دو هستهای میکروکنترلرها بهمون داد.
البته همیشه جای ارتقا وجود داره. مثلا میتونی سیستم تراز محورها رو دقیقتر کنی تا کوچکترین لرزشی حس نشه و پیکسلها مثل آینه صاف و بدون لرزش بمونن.
علاوه بر این، جایگزین کردن موتور فعلی با یه موتور براشلس (Brushless) میتونه صدای چرخش رو به حداقل برسونه. امیدواریم از این آموزش تو آیسیمدار لذت برده باشی، حتما نظراتت رو برامون بنویس و اگه این گجت خفن رو ساختی، عکسش رو با ما به اشتراک بذار!
فایلهای پیوست
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































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