مکعب نوری ۸x۸x۸: پروژه حرفهای با آردوینو و میکروکنترلر
شاید در نگاه اول فکر کنی ساختن یه ماتریس از 512 تا الایدی کار خیلی پیچیده و سختیه، اما واقعیت اینه که همهچیز بر پایه منطق سادهی دیجیتال (خاموش و روشن شدن) کار میکنه.
توی این پروژه از آیسیمدار، صفر تا صد ساخت یه مکعب الایدی 8x8x8 رو با هم پیش میبریم. اول یاد میگیریم چطور پایههای الایدیها رو خم کنیم و یه ساختار محکم بسازیم. بعدش سراغ طراحی یه برد کنترلر با آیسیهای لچ و میکروکنترلر میریم تا بتونیم این تعداد زیاد الایدی رو فقط با چند تا پایه کنترل کنیم. در نهایت هم کدهای جذابی برای خلق افکتهای سهبعدی، مثل بارش باران و آتشبازی، مینویسیم.
اگر قبلا پروژههای سادهتری ساختی و حالا دنبال یه چالش حسابی برای ارتقای مهارتهای لحیمکاری و برنامهنویسیت هستی، این پروژه دقیقا برای تو طراحی شده. هویه رو گرم کن که کار زیادی داریم!
مهارتهای اولیهای که برای این پروژه نیاز داری
در نگاه اول، وصل کردن این همه قطعه ممکنه ترسناک به نظر برسه، اما چون داریم با الکترونیک دیجیتال کار میکنیم، همهچیز فقط صفر و یکه! مدارهای آنالوگ معمولا حساسن و با تغییر کوچیک یه مقاومت ممکنه کلا از کار بیفتن، اما دنیای دیجیتال خیلی منعطفتره.
تو مدارهای میکروکنترلری، قطعات فقط باید بتونن سطح ولتاژ بالا و پایین رو تشخیص بدن. همین موضوع کار رو بهشدت راحت میکنه و بهت اجازه میده پروژههای بزرگی مثل این رو بسازی.
البته برای اینکه وسط کار گیر نکنی، بهتره یه سری مهارتهای پایه رو بلد باشی. این پروژه برای کسی که تا حالا هویه دست نگرفته، شاید شروع خوبی نباشه. دونستن موارد زیر حسابی بهت کمک میکنه:
- آشنایی با قطعات پایه الکترونیک (اگه تاحالا پروژه نساختی، باز هم خوندن این آموزش دید خوبی بهت میده).
- مهارت لحیمکاری تمیز و اصولی.
- تسلط به استفاده از مولتیمتر برای عیبیابی.
- آشنایی با زبان برنامهنویسی C (اختیاریه، چون کدهای آماده رو در اختیارت میذاریم).
لیست قطعات و لوازم مورد نیاز
برای ساخت این مکعب نوری، به قطعات زیر نیاز داری:
- 512 عدد الایدی (چندتایی هم بیشتر بگیر برای خرابیهای احتمالی)
- 64 عدد مقاومت (مقدارش رو در مراحل بعدی محاسبه میکنیم)
- 1 یا 2 عدد برد سوراخدار بزرگ (ترجیحا از مدلهای فایبرگلاس)
- 1 عدد میکروکنترلر ATmega32 (یا مدل مشابه مثل ATmega16)
- 3 عدد الایدی معمولی برای نشانگر وضعیت
- 3 عدد مقاومت محدودکننده جریان برای نشانگرها
- 8 عدد آیسی لچ 74HC574
- 16 عدد ترانزیستور PN2222
- 16 عدد مقاومت 1 کیلواهم
- 1 عدد آیسی دیکودر 74HC138
- 1 عدد آیسی درایور پورت سریال MAX232
- 1 عدد کریستال کوارتز 14.7456 مگاهرتز
- 2 عدد خازن عدسی 22 پیکوفاراد
- 16 عدد خازن عدسی 100 نانوفاراد (0.1 میکروفاراد)
- 3 عدد خازن الکترولیت 1000 میکروفاراد
- 3 عدد خازن الکترولیت 10 میکروفاراد
- 1 عدد خازن الکترولیت 100 میکروفاراد
- 8 عدد سوکت آیسی 20 پین
- 1 عدد سوکت آیسی 40 پین
- 2 عدد سوکت آیسی 16 پین
- 1 عدد ترمینال پیچی 2 پین برای تغذیه
- تعدادی پینهدر و کانکتور مخابراتی (نری و مادگی 8، 10 و 16 پین)
- کابل فلت رنگی
- 2 عدد دکمه فشاری (میکروسوئیچ)
- سوکت کابل سریال به همراه کانکتور 4 پین
- یک تکه چوب تمیز برای ساخت شابلون و پایه مکعب
- 8 عدد مقاومت پولآپ (اختیاری برای لایهها)
- یک منبع تغذیه 5 ولت جریان بالا
تهیه قطعات باکیفیت برای جلوگیری از دردسر
خیلی مهمه که قطعات، مخصوصا الایدیها رو از فروشگاههای معتبر تهیه کنی. اگه وسط کار یه الایدی سوخته از آب دربیاد یا نورش با بقیه فرق داشته باشه، تعویض کردنش تو لایههای داخلی مکعب واقعا کلافهکنندهست. پس حتما کیفیت رو فدای هیچچیز نکن.
مکعب نوری سهبعدی دقیقاً چیه؟
مکعب نوری رو مثل یه صفحهنمایش در نظر بگیر، با این تفاوت که به جای یه سطح صاف، بعد سوم هم بهش اضافه شده. انگار داری به یه سری نمایشگر شفاف و رزولوشنپایین که پشت سر هم ردیف شدن نگاه میکنی.
تو نمایشگرهای معمولی پیکسلها رو به هم میچسبونن تا تصویر باکیفیت بشه، اما تو مکعب ما باید بتونیم لایههای پشتی رو هم ببینیم. بنابراین باید بین هر لامپ (که اینجا بهش وکسل یا پیکسل سهبعدی میگیم) فاصله مناسبی باشه. این فاصله باید جوری تنظیم بشه که هم شکلهای سهبعدی خوب دیده بشن و هم دید رو مسدود نکنن.
ساخت یه نمایشگر 8 در 8 فقط 64 تا الایدی میخواد، اما وقتی صحبت از یه مکعب میشه، همون ابعاد به 512 الایدی نیاز داره! دقیقا به همین دلیله که مکعبهای نوری رو خیلی متراکم نمیسازن، چون حجم لحیمکاری و سیمکشیها بهشدت بالا میره.
جالبه بدونی مکعب نوری الزامی نداره که حتما متقارن باشه؛ میتونی یه ماتریس با ابعاد غیرمتقارن هم بسازی، ولی خب شکل مکعبی ظاهر حرفهایتری داره.
منطق عملکرد مکعب الایدی
ساختار داخلی: لایهها و ستونها چطور وصل میشن؟
بیا یکم دقیقتر به ساختار فیزیکی مکعب نگاه کنیم. هر الایدی یه پایه مثبت (آند) و یه پایه منفی (کاتد) داره. برای روشن شدنش هم باید جریان از آند به سمت کاتد حرکت کنه.
کل مکعب ما به یه سری ستون و لایه تقسیم میشه. ساختارش به این شکله که پایههای کاتد تمام الایدیهایی که تو یه سطح افقی (یه طبقه) هستن، به هم وصل میشن و یه "لایه مشترک" میسازن.
از اون طرف، پایههای آند تمام الایدیهایی که تو یه خط عمودی (از بالا به پایین) قرار دارن، به هم وصل میشن و "ستونها" رو تشکیل میدن.
با این کار، ما 64 تا ستون مجزا و 8 تا لایه افقی داریم. هر کدوم از این 64 ستون با یه سیم مجزا به برد کنترلر وصل میشه تا بتونیم جداگانه کنترلشون کنیم. 8 تا لایه افقی هم هر کدوم سیم مخصوص خودشون رو دارن.
هر لایه به یه ترانزیستور وصل میشه که نقش یه کلید الکترونیکی رو بازی میکنه. وقتی ترانزیستور یه لایه روشن میشه، جریان میتونه از ستونهایی که مثبت شدن به سمت اون لایه خاص حرکت کنه و الایدیهای تقاطعشون رو روشن کنه. در این حالت بقیه لایهها خاموش هستن، پس هیچ نوری تو طبقات دیگه روشن نمیشه.
حالا برای اینکه کل مکعب روشن به نظر برسه، برد کنترلر با سرعت خیلی بالا (مثلا هزار بار در ثانیه) لایه اول رو روشن میکنه، دیتای ستونهاش رو میفرسته، بعد اون رو خاموش میکنه و میره سراغ لایه دوم. چون این چرخه با سرعت فوقالعادهای تکرار میشه، چشم ما همهچیز رو روشن و سهبعدی میبینه (خطای دید ماندگاری تصویر).
پس یادت باشه: از این به بعد به اتصالات افقی میگیم "لایههای کاتد" یا طبقات، و به اتصالات عمودی میگیم "ستونهای آند".
چالش پینهای میکروکنترلر و محاسبه جریان
برای کنترل این مکعب، ما به دو دسته پایه خروجی نیاز داریم. یه دسته برای تغذیه کردن ستونهای آند و یه دسته دیگه برای زمین کردن لایههای کاتد. تعداد پایههای مورد نیاز برای ستونها برابر با مساحت مکعب (x به توان 2) هست. برای مکعب 8 در 8 ما، به 64 پایه برای آندها و 8 پایه برای لایهها نیاز داریم. در مجموع یعنی 72 تا پایه خروجی!
هرچی ابعاد مکعب رو بزرگتر کنی، این اعداد بهصورت تصاعدی بالا میرن. مثلا برای یه مکعب بزرگتر باید به فکر روشهای پیچیدهتری باشی.
اگه مکعبت کوچیک بود (مثل 3x3)، شاید میشد لایهها رو مستقیم به میکروکنترلر وصل کرد. اما تو ابعاد 8x8، وقتی تمام 64 الایدی یه لایه روشن بشن (حتی اگه هر کدوم فقط 10 میلیآمپر بکشن)، حدود 0.64 آمپر جریان از پایه لایه عبور میکنه که برای میکروکنترلر کشندهست.
برای همین حتما باید از ترانزیستورهایی استفاده کنیم که تحمل جریان کشی بالای یه لایه کامل رو داشته باشن و بتونن بهعنوان یه سوئیچ قدرتمند عمل کنن.
افزایش پایههای خروجی با تکنیک مالتیپلکسینگ (لچها)
همونطور که دیدیم، به 72 تا پایه نیاز داریم، اما هیچ میکروکنترلر معمولی با پکیج DIP (که بشه راحت رو برد سوراخدار لحیم کرد) این همه پایه نداره. برای حل این مشکل، یه مدار مالتیپلکسر میسازیم.
این مدار باهوش بهمون اجازه میده تا فقط با استفاده از 11 تا از پایههای میکرو، تمام 64 ستون رو مدیریت کنیم. قلب تپنده این مدار قطعهای به نام "لچ" (Latch) هست. ما از آیسی 74HC574 استفاده میکنیم که یه لچ 8 بیتیه.
این آیسی پایههای زیر رو داره:
- 8 پایه ورودی داده (D0-D7)
- 8 پایه خروجی (Q0-Q7)
- 1 پایه کلاک یا لچ (CP)
- 1 پایه فعالساز خروجی (OE)
کار لچ اینه که مثل یه حافظه موقت عمل میکنه. میتونه وضعیت 8 تا ورودی رو تو خودش ذخیره کنه و همون رو روی خروجیهاش نگه داره. فرض کن یه الایدی به پایه Q0 وصله.
برای روشن کردنش، اول به ورودی D0 ولتاژ میدی (منطق یک). بعد پایه کلاک (CP) رو برای یک لحظه از حالت پایین به بالا میبری (لبه بالا رونده). وقتی این اتفاق میفته، آیسی وضعیت ورودیها رو عکسبرداری میکنه و تو خروجی نگه میداره. حالا حتی اگه وضعیت پایههای ورودی رو تغییر بدی، خروجی ثابت میمونه تا زمانی که دوباره به پایه کلاک پالس بدی.
چون ما 64 تا ستون داریم، از 8 تا از این آیسیهای لچ استفاده میکنیم. پایههای ورودی همه این 8 تا آیسی رو به هم وصل میکنیم و یه "گذرگاه دیتا" (دیتا باس) 8 بیتی میسازیم که به یه پورت میکروکنترلر وصل میشه.
حالا پروسه خیلی ساده میشه: اطلاعات 8 تا الایدی اول رو میذاریم روی باس. بعد به آیسی لچ اول پالس میدیم تا این دیتا رو ذخیره کنه. بعد اطلاعات 8 تای دوم رو میذاریم رو باس و به آیسی دوم پالس میدیم.
همین کار رو برای هر 8 تا آیسی تکرار میکنیم. با این ترفند، تو یه زمان خیلی کوتاه، اطلاعات 64 تا ستون با استفاده از فقط 8 پایه ورودی آپدیت میشه.
تنها مشکلی که میمونه اینه که برای پالس دادن به پایه کلاک این 8 تا آیسی، باید 8 تا پایه میکرو رو درگیر کنیم! برای حل این موضوع، یه آیسی دیکودر به اسم 74HC138 میذاریم. این آیسی 3 تا ورودی و 8 تا خروجی داره.
وقتی یه عدد باینری (از 0 تا 7) به 3 تا پایه ورودیش میدیم، دقیقا یکی از 8 تا خروجیهاش رو فعال (صفر) میکنه. ما این 8 تا خروجی رو وصل میکنیم به پایه کلاک آیسیهای لچ.
با یه حلقه کد ساده میشه کل این مدار رو راهاندازی کرد. مثلا با ریختن دیتا روی PORTA (دیتاباس) و تغییر دادن آدرس روی PORTB (متصل به دیکودر)، خیلی شیک و تمیز لچها یکی پس از دیگری آپدیت میشن.
چون خروجیهای 74HC138 در حالت عادی یک (High) هستن و فقط پین انتخابشده صفر (Low) میشه، و از اون طرف لچ 74HC574 برای ذخیره دیتا نیاز به تغییر از صفر به یک داره، وقتی تو کد آدرس دیکودر رو عوض میکنی، پایه لچ قبلی از صفر به یک برمیگرده و دقیقا همون لحظه دیتا رو تو خودش قفل میکنه.
برای اینکه دیتای درست تو آیسی درست قفل بشه، باید آدرسدهی دیکودر همیشه یک قدم جلوتر از شمارندهمون باشه تا لبهی بالارونده تو زمان درست به لچ هدف برسه. وقتی شمارنده به آخر میرسه و ریست میشه، دیکودر سیکل خودش رو کامل میکنه و مدار کاملا با هماهنگی به کارش ادامه میده. این ترکیب از لچ و دیکودر، یکی از قویترین و پایدارترین روشها برای ساخت ماتریسهای نوری بزرگه.
روش جایگزین با شیفترجیسترها
البته استفاده از آیسی لچ تنها راه افزایش تعداد خروجیها نیست. ما این روش رو انتخاب کردیم چون آیسیهاش رو دم دست داشتیم! یه روش خیلی رایج دیگه، استفاده از شیفترجیسترها (Shift Registers) هست.
مثلا آیسی 74HC164 یا معروفتر از اون 74HC595، شیفترجیسترهای 8 بیتی هستن که اطلاعات رو بهصورت سریال (پشت سر هم) میگیرن و بهصورت موازی رو پایههای خروجیشون نشون میدن.
- پایه دیتا (Data)
- پایه کلاک (Clock)
تو این روش فقط با دو یا سه تا پایه از میکرو، میتونی بینهایت خروجی بسازی. کافیه بیتها رو یکییکی رو پایه دیتا بذاری و با پایه کلاک شیفتشون بدی تا کل 64 بیت وارد آیسیها بشن.
تأمین جریان کافی برای تغذیه مکعب
بخش تغذیه یکی از جاهاییه که خیلیا نادیدهاش میگیرن. درسته که یه دونه الایدی جریان کمی مصرف میکنه، اما فرض کن وسط یه افکت، یه لایه کامل یعنی 64 تا الایدی همزمان روشن بشن. در کنارش میکروکنترلر و آیسیهای لچ رو هم داری که برای خودشون جریان میکشن.
برای اینکه بدونی چقدر توان نیاز داری، یه الایدی رو با همون مقاومتی که انتخاب کردی به ولتاژ 5 ولت وصل کن و با مولتیمتر جریانش رو بخون. این عدد رو ضربدر 64 کن. بعد حدود 30 تا 40 میلیآمپر هم برای مصرف خود آیسیها در نظر بگیر. این میشه حداکثر جریانی که مدارت لازم داره.
ما اول سعی کردیم از یه رگولاتور معمولی LM7805 و یه آداپتور 12 ولت استفاده کنیم. اما چون جریان مدار بالا بود (حدود 500 میلیآمپر به بالا)، رگولاتور به طرز وحشتناکی داغ میکرد و افت ولتاژ میداد.
آخرش بیخیال رگولاتور خطی شدیم و تصمیم گرفتیم از یه منبع تغذیه سوئیچینگ 5 ولت کامپیوتری استفاده کنیم که جریان خروجی صاف و قدرتمندی داره.
خرید منبع تغذیه آماده
اگه قطعات لازم برای ساخت یه تغذیه پایدار رو نداری، راحتترین کار اینه که یه آداپتور سوئیچینگ 5 ولت صنعتی بخری. این آداپتورها معمولا بدنه فلزی سوراخدار دارن و برای راهاندازی تابلوهای الایدی استفاده میشن. با یه هزینه معقول میتونی یه منبع تغذیه 5 ولت با جریاندهی عالی تهیه کنی که خیالت رو از بابت ریست شدن میکروکنترلر راحت کنه.
استفاده از پاور کامپیوتر بهعنوان تغذیه آزمایشگاهی
یه ترفند خیلی عالی برای پروژههای الکترونیکی اینه که از پاورهای قدیمی کامپیوتر استفاده کنی. پاور کامپیوتر خروجیهای 5 ولت و 12 ولت با جریاندهی خیلی بالایی داره و برای پروژههایی مثل مکعب نوری که ولتاژ رگولهشده میخوان، فوقالعادهست.
برای روشن کردن پاورهای ATX خارج از کیس، کافیه سیم سبزرنگ کانکتور مادربرد رو به یکی از سیمهای مشکی (زمین) وصل کنی تا فن پاور روشن بشه و ولتاژ تو مدار جریان پیدا کنه.
ما خودمون از قاب یه هارد اکسترنال قدیمی استفاده کردیم و توش یه پاور رو جا دادیم تا ظاهر تمیزتری داشته باشه و برای خروجیهاش از ترمینالهای پیچی استفاده کردیم.
سادهترین راه برای گرفتن ولتاژ از پاور، استفاده از سوکتهای مولکس (سوکتهای IDE هارد) هست. سیم قرمز 5 ولته، سیم زرد 12 ولته و سیمهای مشکی هم زمین هستن.
با این روش یه منبع تغذیه آزمایشگاهی دستساز و قدرتمند داری. ما حتی روی یکیش ماژول آمپرمتر گذاشتیم تا مصرف مدار رو لحظهای ببینیم و از یکی از خروجیها برای روشن کردن یه فن مکنده دود لحیمکاری استفاده کردیم. آموزشهای زیادی برای تبدیل پاور کامپیوتر به منبع تغذیه هست که میتونی تو آیسیمدار یا سایتهای دیگه پیداشون کنی.
انتخاب بهترین الایدی برای مکعب نوری
انتخاب الایدی مناسب خیلی مهمه و باید چند تا نکته رو در نظر بگیری: اولا مکعب باید از هر چهار طرف به یه اندازه روشن دیده بشه. برای همین شدیدا توصیه میکنم از الایدیهای مات (Diffused) استفاده کنی. الایدیهای شفاف (Clear) بیشتر نور رو به سمت بالا میتابونن.
یه الایدی مات نور رو به تمام جهات پخش میکنه. مشکل الایدی شفاف اینه که وقتی روشن میشه، نورش میخوره به الایدیهای لایهی بالایی و اونا رو هم روشن میکنه! اینطوری تو افکتهات یه هالهی نور مزاحم یا به اصطلاح شبحسازی (Ghosting) ایجاد میشه.
ما خودمون الایدی مات سفارش دادیم اما اشتباها مدل شفاف به دستمون رسید. چون نمیخواستیم وقت رو هدر بدیم با همونها ساختیمش.
مکعبمون قشنگ شد، ولی از زاویه بالا خیلی پرنورتر از زاویه بغل بود. پس تو این اشتباه رو تکرار نکن و حتما نوع مات بخر. دوم اینکه سایز الایدی هم مهمه.
الایدیهای 5 میلیمتری پیکسلهای درشتتری میسازن ولی چون مکعب 8 لایه عمق داره، فضای داخلش کیپ میشه و دیدن لایههای عقبی سخت میشه. ما از الایدیهای 3 میلیمتری استفاده کردیم تا مکعبمون تا حد امکان شفاف و توخالی به نظر برسه.
سومین نکته کیفیته. تو بستههای هزارتایی ارزونقیمت، ممکنه چند تایی سوخته یا کمنور پیدا بشه. حتما از جای معتبر بخر که تلورانس نوری الایدیهاش کم باشه.
چهارم، الایدیهای مربعی هم ظاهر مدرن و قشنگی دارن، اما سوراخ کردن چوب شابلون براشون خیلی سخته! همون 3 میلیمتری گرد بهترین گزینهست چون با یه متهی 3 میلیمتری ساده کارت راه میافته.
نکته پنجم: چون روش کار مکعب به صورت مالتیپلکس هست، هر الایدی فقط یکهشتم زمان روشنه (دیوتی سایکل 1/8). پس باید از الایدیهایی استفاده کنی که تو این پالسهای کوتاه، درخشندگی خوبی داشته باشن.
و در نهایت طول پایهها! تو این روش ما از خود پایههای الایدی به عنوان اسکلت مکعب استفاده میکنیم. پس طول پایهها باید بلندتر از فاصلهای باشه که برای بین الایدیها در نظر گرفتی تا بتونی به هم لحیمشون کنی.
محاسبه دقیق مقاومتها برای جلوگیری از آسیب
برای انتخاب مقاومت ستونها باید سه تا محدودیت رو در نظر بگیریم: خود الایدی، آیسی لچ 74HC574 و ترانزیستورهای سوئیچینگ. اول از همه باید دیتاشیت الایدی رو ببینی. معمولا دو تا عدد برای جریان داره: جریان پیوسته و جریان پالسی (بیشترین جریانی که تو لحظه میتونه تحمل کنه).
چون الایدیهای ما یکهشتم زمان روشنن، میتونیم با خیال راحت مبنا رو روی جریان پالسی بذاریم. اما محدودیت دوم مال آیسی لچه. این آیسی نمیتونه هر چقدر که دوست داری جریان بده.
تو دیتاشیت 74HC574 نوشته که هر پایه خروجیش نهایت میتونه 25 میلیآمپر بده. مهمتر از اون، کل جریانی که از پایههای تغذیه (VCC یا GND) آیسی میگذره نباید بیشتر از 50 میلیآمپر بشه! از اونجایی که این آیسی 8 تا خروجی داره، اگه هر 8 تا با هم روشن بشن، سهم هر الایدی میشه چیزی حدود 6.25 میلیآمپر.
محدودیت سوم ترانزیستورهاست. اگه هر الایدی 20 میلیآمپر بکشه، وقتی یه لایه (64 تا لامپ) کامل روشن بشه، ترانزیستور باید 1.28 آمپر جریان رو سوئیچ کنه! ترانزیستورهای معمولی ما نهایتا 400 میلیآمپر رو تحمل میکردن.
با در نظر گرفتن همه این محدودیتها، ما به این نتیجه رسیدیم که مقاومت 100 اهم بهترین تعادل رو بین نوردهی الایدیها و محافظت از آیسیها و ترانزیستورها ایجاد میکنه. تا قطعاتت از راه برسن میتونی با مقاومتهایی که تو خونه داری یه آدمک مقاومتی بسازی و سرگرم شی!
تعیین فاصله بین الایدیها و ابعاد مکعب
ما میخواستیم مکعب رو با کمترین قطعات اضافه بسازیم. خیلیا برای ساختارسازی از مفتولهای فلزی ضخیم استفاده میکنن، اما این کار معمولا باعث میشه مکعب یکم کجوکوله بشه.
بهترین و تمیزترین روش اینه که از پایههای خود الایدیها بهعنوان داربست کار استفاده کنیم. پایه کاتد یکی از الایدیها رو خم کردیم و دیدیم اندازهاش از مرکز لنز حدود 26 میلیمتره. پس اگه فاصله مرکز تا مرکز الایدیها رو 25 میلیمتر در نظر بگیریم، حدود 1 میلیمتر فضای همپوشانی برای لحیمکاری باقی میمونه.
با الایدی 3 میلیمتری و فاصله 25 میلیمتری، فضای خالی داخل مکعب به قدری زیاده که راحت میشه تمام لایههای عقبی رو دید. میتونستیم مکعب رو متراکمتر هم بسازیم، اما اونوقت مجبور بودیم نوک همهی پایهها رو دونهدونه کوتاه کنیم و دیدمون هم کور میشد. پیشنهاد میکنم تو هم بیشترین فاصلهای که پایهی الایدیهات اجازه میده رو انتخاب کنی و فقط یک میلیمتر برای لحیمکاری کم کنی.
ترفند صاف کردن سیمهای مفتولی برای داربست
برای اینکه مکعبت کاملا تراز و هندسی دربیاد، نیاز به چند تا سیم مفتول کاملا صاف داری. مفتولهایی که ما داشتیم دور قرقره پیچیده شده بودن و هر کاری کردیم با دست صاف نشدن. انواع و اقسام روشها رو برای خم کردن و صاف کردنشون امتحان کردیم اما همیشه یه قوسی روشون میموند.
تا اینکه یاد یکی از قسمتهای مستند "چگونه ساخته میشود" افتادیم که نشون میداد تو کارخونه، مفتولهای ضخیم رو با کشیدن از تو سوراخهای باریک، کاملا صاف میکنن. ایده کشیدن سیم به ذهنمون رسید و در کمال تعجب فوقالعاده جواب داد! اینطوری میتونی سیمهای قرقره رو مثل خطکش صاف کنی:
- طولی که از مفتول نیاز داری رو بهعلاوه چند سانت اضافه ببر.
- اگه سیمت روکش پلاستیکی داره حتما جداش کن.
- دو سر سیم رو با دو تا انبردست یا دمباریک محکم بگیر.
- با تمام قدرت سیم رو بکش!
- یهو احساس میکنی سیم یه کوچولو کش میاد و تسلیم میشه؛ الان کاملا صافه.
اول یه نمونه کوچیکتر بساز تا دستت بیاد!
اگه دقت کرده باشی، برنامههای تلویزیونی مثل "افسانهزدایان" (MythBusters) همیشه قبل از اینکه برن سراغ تستهای خیلی بزرگ و پیچیده، اول یه ماکت کوچیک میسازن تا چم و خم کار دستشون بیاد. تو هم بهتره همین کار رو بکنی.
قبل از اینکه درگیر لحیم کردن 512 تا الایدی بشی، پیشنهاد میکنم اول یه مکعب 4x4x4 بسازی تا قلق لحیمکاری و نحوه قرارگیری پایهها رو خوب یاد بگیری. اینطوری وقتی میری سراغ پروژه اصلی، دیگه خیالت راحته که ساختارت کجوکوله درنمیاد.
ساخت شابلون چوبی برای لحیمکاری دقیق
راز زیبایی یه مکعب نوری تو اینه که فاصلهها و زاویهها کاملا متقارن باشن. اگه فقط یه الایدی کج باشه، کل ظاهر مکعبت رو خراب میکنه.
بهترین راه برای تضمین این تقارن، ساختن یه شابلون چوبی یا پلاستیکیه. یه تکه چوب تمیز (مثل امدیاف) که از سایز مکعبت بزرگتر باشه پیدا کن. حالا باید متهای رو انتخاب کنی که الایدی دقیقا تو سوراخش چفت بشه؛ نه اونقدر تنگ که موقع درآوردن به زور نیاز داشته باشی و نه اونقدر گشاد که الایدی توش کج بایسته.
با خطکش و گونیا، یه شبکه 8 در 8 رسم کن که تقاطعهاش دقیقا به همون فاصلهی 25 میلیمتری (که قبلا حساب کردیم) باشن. برای اینکه مته روی چوب سر نخوره، حتما قبل از دریلکاری، نقاط تقاطع رو با یه میخ یا سنبه یه مقدار سوراخ کن.
همه 64 تا سوراخ رو با دقت دریل کن. بعد از اتمام کار، یه الایدی بردار و دونهدونه سوراخها رو تست کن که خیلی تنگ نباشن. یه علامت یا فلش هم کنار یکی از ضلعهای شابلون بکش تا جهت بالا و پایین لایهها موقع درآوردن یادت بمونه. این علامت برای اینه که بدونی مفتولهای تقویتی رو کجای هر لایه قرار بدی.
نکات طلایی برای لحیمکاری الایدیها بدون آسیب
تو این پروژه قرار پایههای الایدی رو خیلی نزدیک به بدنه پلاستیکیش لحیم کنی. گرمای زیاد دشمن الایدیه؛ مخصوصا اگه از برندهای ارزونقیمت استفاده میکنی. برای همین باید یه سری اصول لحیمکاری رو رعایت کنی. اولین و مهمترین چیز، تمیزی نوک هویهست.
هر بار که هویه رو برمیداری، حتما نوکش رو روی اسفنج نسوز مرطوب بکش. نوک هویه باید همیشه براق و تمیز باشه. اگه دیدی نوک هویه سیاه شده یا قلع روش میماسه، همون لحظه تمیزش کن.
هویهی تمیز حرارت رو تو کسری از ثانیه منتقل میکنه و نیازی نیست هویه رو مدت طولانی روی قطعه نگه داری. سرعت عمل اینجا حرف اول رو میزنه.
کمی قلع به نوک هویه بزن، بعد هویه رو به نقطه اتصال دو تا پایه بچسبون. اجازه بده پایهها زیر نیم ثانیه داغ بشن و بلافاصله سیم لحیم رو به طرف دیگه اتصال بزن تا ذوب بشه.
یه اتصال محکم با مقدار کمی لحیم به دست میاد؛ تلنبار کردن یه حباب بزرگ قلع، فقط کار رو زشت میکنه و اصلا اتصال رو محکمتر نمیکنه.
اگه دیدی اتصال خوب نگرفت یا پایهها تکون خوردن، بلافاصله دوباره هویه رو روش نذار! چون الایدی الان بهشدت داغ شده و حرارت مجدد حتما میسوزوندش. برو سراغ یه الایدی دیگه تا قبلیه خنک بشه و بعدا برگرد سراغش.
حتما از سیم لحیم نازک (مثلا 0.5 میلیمتری) استفاده کن تا کنترل بیشتری روی حجم قلع داشته باشی. سیم لحیمهای قطور برای این ظریفکاریها مناسب نیستن. سیم لحیمی بخر که داخلش روغن فلاکس مرغوب داشته باشه تا اتصالاتت سریع و براق جوش بخورن. شاید پیش خودت بگی اینقدر وسواس لازمه؟
باور کن بله! ما خودمون قبل از ساختن این مکعب، تمام 512 تا الایدی رو دونهدونه تست کردیم و تازه بعد از ساخت هر لایه هم دوباره یه تست کامل ازش میگرفتیم. با این حال بازم چندتایی حین کار خراب شدن. بدترین کابوس این پروژه اینه که مکعبت کامل بشه و ببینی یه الایدی تو مرکز مکعب روشن نمیشه. اگه لایههای اول باشه میشه یه کاریش کرد، اما لایههای مرکزی فقط با جراحی میکروسکوپی قابل تعویضن!
تست تکتک الایدیها قبل از شروع به کار
این مرحله فوقالعاده مهمه. ما الایدیهامون رو خیلی ارزون خریدیم و موقع تست اتفاقی متوجه شدیم یکیشون خیلی کمنورتر از بقیهست. همین باعث شد تصمیم بگیریم تکتکشون رو تست کنیم.
نتیجهاش این شد که چند تا الایدی کاملا سوخته و چندتایی هم کمنور از توشون پیدا کردیم. داشتن یه الایدی کمنور وسط یه انیمیشن جذاب، کل زیبایی کارت رو زیر سؤال میبره. حتی اگه الایدیهای گرونقیمت گرفتی، بازم ارزشش رو داره که چند دقیقه وقت بذاری و تستشون کنی.
یه برد بورد بردار، تغذیه و یه مقاومت مناسب روش وصل کن و الایدیها رو یکییکی تست کن. یه ایده خوب اینه که یه الایدی مرجع رو بهصورت دائم روشن روی برد بورد بذاری تا نور بقیه رو با اون مقایسه کنی؛ اینطوری الایدیهای کمنور سریع خودشون رو لو میدن.
لحیمکاری اولین لایه با کمک شابلون
هر لایه از 8 ردیف تشکیل میشه که پایههای الایدیها اسکلتش رو میسازن. تو ردیف بالایی هر لایه، الایدیها باید 90 درجه در جهت عقربههای ساعت بچرخن تا پایهشون به الایدی ردیف کناری برسه. پایهی بیرونیترین الایدی این ردیف آزاد میمونه تا بعدا ازش برای اتصال زمین استفاده کنیم.
بیا قدم به قدم پیش بریم. اول 64 تا الایدی بردار و پایه کاتد همهشون رو دقیقا با زاویه 90 درجه خم کن. حواست باشه جهت خم شدن تو همه یکسان باشه.
حالا الایدیها رو از بالا سمت راست شابلون بچین. طوری تنظیمشون کن که پایه کاتد هر کدوم روی پایه قبلی قرار بگیره تا برسی به آخرین الایدی سمت چپ. این ردیف رو لحیم کن.
اگه راستدستی، لحیمکاری ستونها رو از سمت چپ شابلون شروع کن تا دستت راحت روی چوب تکیه کنه و نلرزه. دومین الایدی ستون رو بذار و پایهاش رو مماس با قبلی لحیم کن و همینطور برو پایین تا ستون تکمیل بشه.
وقتی هر 8 ستون رو لحیم کردی، لایهات شبیه یه شونه میشه. الان ساختارش خیلی ضعیف و لرزونه، پس باید دو تا مفتول تقویتی صافی که تو مراحل قبل ساختیم رو یکی وسط و یکی پایین لایه اضافه کنیم. مفتول رو تنظیم کن، اول یه سرش رو لحیم کن تا ثابت بشه، بعد سراغ بقیه ستونها برو و دونهدونه بهشون وصلش کن.
حالا که لایه محکم شد، قبل از درآوردنش حتما تستش کن (تو قدم بعدی میگم چطوری). بعد از تست، وقتشه لایه رو از شابلون آزاد کنی. اصلا سعی نکن لایه رو یهویی بگیری و بکشی بیرون، چون حتما کج میشه یا الایدیها میشکنن. خیلی آروم با نوک انگشت یا یه پیچگوشتی ریز، هر الایدی رو یکیدو میلیمتر بده بالا تا آزاد بشه.
وقتی مطمئن شدی همهشون از چوب آزاد شدن، با دو دست لایه رو بردار. تبریک میگم، اولین لایهات آمادهست! همین پروسه رو باید برای 7 لایه دیگه هم تکرار کنی. راستی، برای دیدن عکسها با کیفیت اصلی میتونی عکس رو باز کنی و زوم کنی تا جزئیات اتصالات و خمیدگیها رو واضحتر ببینی.
تست کامل لایه قبل از جداسازی از شابلون
چون لحیمکاری رو بیخ گلوی الایدی انجام دادی، ممکنه گرمای هویه به چیپ داخلیش آسیب زده باشه. به هیچ وجه لایه رو بدون تست از شابلون درنیار. همون پایهای که تو گوشه بالا سمت راست آزاد گذاشته بودی رو به قطب منفی (زمین) تغذیهات وصل کن. حالا یه سیم از قطب 5 ولت بکش و یه مقاومت (مثلا 470 اهم) سر راهش بذار.
این سیم رو به آرومی به هر 64 تا پایه آند که سیخ رو به بالا موندن تماس بده. هر الایدی باید روشن بشه. اگه روشن نشد، سه تا حالت داره: 1. اتصالت خوب لحیم نشده و جریان رد نمیکنه. 2. الایدی از شدت حرارت سوخته.
3. سیم تستت رو خوب به پایه وصل نکردی (دوباره امتحان کن). اگه همهچیز عالی بود، لایه رو به همون روشی که گفتم از شابلون دربیار و برو سراغ ساختن لایه بعدی.
تراز کردن پایهها برای اتصال دقیق لایهها
مکعب نوری در واقع یه اثر هنریه و زیبایی اون تو متقارن و صاف بودن خطوطشه. وقتی لایه رو تو شابلون میسازی، احتمالا بعضی از پایههای آند یکم کج میشن و کاملا صاف رو به بالا نمیمونن.
قبل از درآوردن لایه، از لبهی همسطح شابلون به پایهها نگاه کن و با دست پایههایی که کج شدن رو کاملا عمود کن (زاویه 90 درجه). بعد شابلون رو بچرخون و از زاویه دیگه هم تراز بودن پایهها رو چک کن تا کاملا شاقول بشن.
خم کردن هوشمندانه پایههای آند
برای اینکه تو ستونهای مکعب، الایدی بالایی دقیقا مرکز الایدی پایینی قرار بگیره، باید پایههای آند رو یه خورده تغییر فرم بدیم. پایههای الایدی معمولا نیم میلیمتر از لبهی پلاستیک دورش فاصله دارن.
برای ایجاد یه اتصال لحیم خوب بدون کج شدن ساختار، کافیه حدود 3 میلیمتر مونده به انتهای پایه آند رو با انبردست به سمت داخل (سمت کاتد) یه خم ریز بدی. همین خم کوچیک باعث میشه پایه دور الایدی پایینی بشینه و اتصال عالی و محکمی بسازه.
اتصال لایهها به هم و مونتاژ نهایی مکعب
رسیدیم به بخش چالشبرانگیز ماجرا؛ روی هم گذاشتن لایهها! لایههای اول و دوم قبل از اینکه به هم متصل بشن، خیلی شل و ول هستن. بهتره لایه اول رو برگردونی داخل شابلون تا جای محکمی داشته باشه.
برای اینکه فاصله لایهها دقیقا یکسان بشه، به یه اسپیسر یا فاصلهانداز نیاز داری. باورت میشه ضخامت یه باتری کتابی 9 ولت دقیقا نزدیک به همون 25.5 میلیمتریه که ما نیاز داریم؟
نکته خیلی مهم: قطبهای فلزی باتری میتونن پایههای الایدی رو اتصال کوتاه کنن یا حتی با ولتاژ 9 ولتش الایدیها رو بسوزونن! حتما روی قطبهای باتریها رو با چسب برق ضخیم بپوشون.
چهار تا باتری 9 ولت رو تو چهار گوشه لایه اول بذار، بعد لایه دوم رو آروم روی پایهها قرار بده. همهچیز رو تراز کن و چهار تا الایدی گوشهها رو لحیم کن. حالا باتریها رو بکش بیرون و دورتادور مکعب بچرخون و الایدیهای لبهها رو هم لحیم کن.
این روش باعث میشه لایهها کاملا موازی باشن. وقتی لبهها محکم شدن، باتری رو هول بده وسط مکعب و پایههای مرکزی رو هم لحیم کن.
البته از یه جایی به بعد ساختار اینقدر محکم میشه که شاید دیگه نیازی به باتری تو بخشهای مرکزی نداشته باشی، اما برای لبهها حتما استفاده کن تا شکم نده.
بعد از لحیم کردن کامل یه لایه، حتما دوباره تستش کن. یادت میاد گفتم پایههای گوشه هر لایه رو بلند بذار؟ حالا وقت استفاده از اوناست.
پایه منفی تغذیهت رو وصل کن به پایهی آزاد لایهی زیری و پایهی آزاد لایهی بالایی رو با یه تیکه سیم موقتا بهش وصل کن. حالا با تسترت به پایههای آند بالایی ولتاژ بده.
باید هر دو تا الایدی اون ستون (تو لایه اول و دوم) با هم روشن بشن. اگه الایدی پایینی روشن نشد، یعنی تو اون ستون لحیمکاریت مشکل داره و اتصال برقرار نشده! پیدا کردن این مشکل تو این مرحله خیلی بهتر از اینه که کل 8 لایه رو سوار کنی و تازه بفهمی وسط مکعب قطعی داری. تا اینجای کار دو لایه از 8 لایه مکعبت آماده شد! برای 6 لایهی بعدی هم دقیقا همین روال رو تکرار کن.
فقط هر بار از بالا به مکعب نگاه کن تا مطمئن بشی الایدیها تو یه خط صاف قرار دارن و کج نشدن.
ساخت پایه مکعب با همون شابلون چوبی
ما برای ساخت یه باکس شیک ابزار خاصی دم دستمون نبود، به همین خاطر تصمیم گرفتیم از همون شابلون چوبی بهعنوان پایه مکعب استفاده کنیم. تو میتونی با پلکسیگلاس یا پرینتر سهبعدی یه پایهی خیلی جذابتر بسازی.
چون موقع ساخت شابلون فقط یکی دو میلیمتر تو چوب فرو رفته بودیم، حالا باید تمام اون 64 تا سوراخ رو با دریل تا انتها سوراخ کنیم تا پایهها ازش رد بشن. علاوه بر اون، 8 تا سوراخ کوچیک هم تو حاشیه چوب میزنیم تا بتونیم سیمهای منفی لایهها (کاتدها) رو به زیر پایه انتقال بدیم.
رنگ چوبی اصلا به ظاهر مدرن مکعب الایدی نمیاد. چون رنگ مشکی نداشتیم، با یه ماژیک مارکر مشکی پهن، کل سطح چوب رو رنگ کردیم. نتیجهاش فراتر از انتظارمون بود و خیلی مات و جذاب شد!
نصب مکعب روی کفه چوبی
نصب مکعب روی کفه یکی از اون کاراییه که گفتنش راحته ولی انجام دادنش مهارت میخواد. باید 64 تا پایهی مفتولی رو همزمان از 64 تا سوراخ رد کنی!
انگار میخوای 64 تا سوزن رو همزمان نخ کنی. بهترین روش اینه که از یه گوشه شروع کنی و پایهها رو یکییکی هدایت کنی. اگه پایهای لج کرد و وارد سوراخ نشد، با یه خودکار یا پیچگوشتی کوچیک آروم هدایتش کن. وقتی تمام پایهها از زیر چوب زد بیرون، کفه رو آروم به پهلو بخوابون. حالا پایهها رو 90 درجه خم کن تا به چوب بچسبن.
همین خم کردن باعث میشه مکعبت چنان سفت روی پایه فیکس بشه که دیگه نیازی به هیچگونه چسبی نداشته باشی.
رسوندن اتصال زمین به ۸ لایهی مکعب
الان ما 64 تا پایهی آند زیر کفه چوبی داریم که آماده سیمکشی هستن. اما اتصال منفی اون 8 لایهی طبقاتی چی؟ یادت میاد 8 تا سوراخ ریز کنار چوب دریل کردیم؟
الان وقت استفاده از اوناست. برای هر لایه باید یه مفتول صاف کنار مکعب بیاری بالا. اول از لایهی صفر (پایینترین لایه) شروع میکنیم.
یه تیکه مفتول صاف بردار، حدود 10 میلیمتر مونده به سرش رو خم کن و از سوراخ مربوط به لایه صفر ردش کن تا بره زیر پایه چوبی. قسمت بالایی مفتول باید دقیقا روی سیم کاتد اون لایه بشینه. حالا لحیمش کن.
برای لایههای بالاتر (1 تا 7) کار یکم ظریفتره و داشتن یه پایه کمکی (گیره مونتاژ) خیلی به دردت میخوره. مفتولهای بلندتری ببر، سرشون رو خم کن و از سوراخهای خودشون رد کن. هر مفتول باید به لایهی مختص خودش تکیه داده بشه و بعد لحیم بشه. این کار رو تا بالاترین طبقه انجام بده.
در نهایت مکعب رو به پهلو بخوابون و اون 8 تا سیمی که از زیر چوب زدن بیرون رو هم خم کن تا محکم بشن.
اتصال کابلهای فلت برای ارتباط با کنترلر
ما الان در مجموع 72 تا نقطه اتصال (64 آند + 8 کاتد) زیر کفه داریم که باید با سیم به برد کنترلر وصل بشن. استفاده از کابل فلت (روبانی) بهترین راه برای جلوگیری از شلوغی و گره خوردن سیمهاست.
برای اون 8 تا اتصال کاتد، از یه فلت 8 رشتهای استفاده میکنیم. برای 64 تا آند، میتونیم از 4 تا کابل 16 رشتهای استفاده کنیم که سر و تهشون رو به سوکتهای 8 پین تقسیم میکنیم. سر کابلها کانکتور مادگی (مثل کانکتورهای مخابراتی) میزنیم تا راحت روی پینهدرهای برد کنترلر سوار بشن.
این کانکتورها از یه قاب پلاستیکی و پینهای فلزی تشکیل شدن. پینهای فلزی رو باید با آچار پرس سوکت به سیمها پرس کنی. اگه آچار مخصوصش رو نداری، با دمباریک به دقت جمعشون کن و برای اطمینان یه ذره لحیم هم بهشون بزن تا سیم بیرون نیاد.
روند کار به این شکله:
کابلها رو به طول دلخواه ببر. پینها رو پرس کن و داخل قاب پلاستیکی جا بزن. سر لخت سیمها رو قبل از لحیمکاری روی مکعب، حتما قلعاندود کن.
بعد کابل فلت 8 رشتهای رو به اون 8 تا پایه منفی لایهها لحیم کن. حالا به ترتیب کابلهای 16 رشتهای رو به پایههای 64 گانه لحیم کن. حواست باشه رشتهی قرمزرنگ کابل رو همیشه برای پین صفر (بیت صفر) در نظر بگیری تا ترتیب پینها قاطی نشه. برای اینکه کابلها کشیده نشن، با یه گیره یا بست پلاستیکی سیمها رو به زیر پایه مهار کن.
تو عکسها میتونی نحوه اتصال سوکتها به بردهای کنترلر رو ببینی. اگه سوکتی رو برعکس زدی و انیمیشن مکعب برعکس شد، کافیه کانکتور رو در بیاری و 180 درجه بچرخونی.
طراحی برد کنترلر: جانمایی هوشمندانه قطعات
بزرگترین برد سوراخداری که داشتیم رو آوردیم تا قطعات کنترلر رو روش بچینیم. خیلی زود متوجه شدیم که چپوندن میکروکنترلر و 8 تا آیسی لچ و کلی خازن روی یه برد اصلا ایده خوبی نیست و سیمکشیهاش به یه کابوس تبدیل میشه. تصمیم گرفتیم مدار رو به دو تا برد مجزا تقسیم کنیم: یه برد برای پردازش و یه برد برای لچها و خروجیها.
ارتباط بین این دو تا برد هم از طریق یه کابل فلت کوچیک برقرار میشه. این کار باعث شد فضای کافی برای اضافه کردن قطعات جدید مثل دکمهها و پورتها داشته باشیم.
شاید بردی که تو داری ابعادش متفاوت باشه، پس قبل از لحیم کردن، قطعاتت رو روی برد بچین و جابهجا کن تا بهترین مسیر برای سیمکشی رو پیدا کنی.
تنظیم کلاک میکروکنترلر برای ارتباط بدون خطا
ما برای کلاک این میکرو از یه کریستال خارجی 14.7456 مگاهرتز استفاده میکنیم. شاید بپرسی چرا یه عدد رند مثل 16 مگاهرتز نذاشتیم؟ دلیلش ارتباط سریال بین مکعب و کامپیوتره.
ارتباط سریال RS232 بهشدت به زمانبندی دقیق وابستهست. اگه کلاک میکرو حتی یه مقدار کوچیک با کامپیوتر اختلاف داشته باشه، بعضی از بیتها جا میمونن یا دو بار شمرده میشن. چون ما هیچ الگوریتم تصحیح خطایی تو کدهامون نداریم، یه خطای کوچیک تو دریافت دیتا باعث میشه یهو یه الایدی اشتباهی وسط مکعب روشن بشه.
برای داشتن یه ارتباط سریال بینقص، باید از فرکانسی استفاده کنیم که بر نرخ انتقال دیتا (Baud Rate) بخشپذیر باشه. کریستال 14.7456 مگاهرتز بر تمام مقادیر استاندارد ارتباط سریال بخشپذیره.
- 14.7456 مگاهرتز تقسیم بر 9600 = 1536.0
- 14.7456 مگاهرتز تقسیم بر 19200 = 768.0
- 14.7456 مگاهرتز تقسیم بر 38400 = 384.0
- 14.7456 مگاهرتز تقسیم بر 115200 = 128.0
ترفند ایجاد مسیرهای قلعی روی برد سوراخدار
خیلیها برای کشیدن مسیر روی بردهای سوراخدار، از پایههای قطعات یا سیمهای اضافه استفاده میکنن. اما یه روش خیلی شیکتر و حرفهایتر وجود داره که فقط با خود قلع انجام میشه.
اول تمام سوراخهایی که تو مسیرت هستن رو با قلع پر کن. بعد سوراخها رو یکی در میون به هم متصل کن. حالا این قطعات دوتایی رو با یه حرارت کوچیک و یه ذره لحیم به هم بچسبون تا یه مسیر یکپارچه و تمیز ساخته بشه.
نتیجه کار یه خط قلعی فوقالعاده زیبا میشه که جریانهای بالا رو هم به راحتی از خودش عبور میده. این تکنیک برای کشیدن خطوط اصلی تغذیه خیلی به کارت میاد.
مونتاژ ترمینال تغذیه و خازنهای نویزگیر
حالا که مکعب فیزیکی آمادهست، وقتشه بریم سراغ مغز متفکرش. بهتره از راحتترین قسمت یعنی ترمینالهای تغذیه شروع کنیم. این بخش شامل یه ترمینال پیچی برای اتصال 5 ولت و زمین، چند تا خازن فیلتر، یه کلید قطع و وصل و یه الایدی نشانگر روشنه.
همونطور که تو مراحل قبلی گفتم، ما رگولاتور روی برد رو کلا حذف کردیم چون داغ میکرد و جوابگوی جریان مدار نبود، پس ولتاژ ৫ ولت تنظیمشده رو مستقیم به مدار میدیم. شاید بپرسی این همه خازن برای چیه؟
مکعب نوری ما تو هر ثانیه صدها بار جریانی در حدود 500 میلیآمپر رو قطع و وصل میکنه. این قطع و وصلهای سریع میتونه باعث افت ولتاژ لحظهای رو کل برد بشه. عواملی مثل مقاومت سیمهای تغذیه هم به این افت ولتاژ دامن میزنن.
با قرار دادن خازنها، ما یه مخزن انرژی میسازیم. وقتی مدار یهو جریان میکشه، خازنها این جریان رو تو همون میلیثانیههای اول تأمین میکنن تا منبع تغذیه به خودش بیاد و افت ولتاژی حس نشه.
خازنهای ظرفیتبالا (مثل 1000 میکروفاراد) انرژی رو برای مدت بیشتری تأمین میکنن و خازنهای کوچیک (مثل 100 نانوفاراد) پیکهای تیز و سریع جریان رو دفع میکنن. ما یه خازن 1000 میکروفاراد دقیقا بعد از کلید اصلی گذاشتیم. در ادامه هم یه خازن 100 میکروفاراد برای اطمینان بیشتر اضافه کردیم. راستش اون خازن دومیه خیلی هم واجب نیست، اما خازنهای زیاد روی برد ظاهرش رو صنعتیتر و خفنتر میکنه!
در نهایت الایدی نشانگر هم با یه مقاومت به خط 5 ولت وصل میشه تا روشن بودن برد رو بهمون نشون بده.
نصب سوکتهای آیسی، مقاومتها و کانکتورها
تو این مرحله باید قطعات اصلی مدار مالتیپلکسر (لچها) رو روی برد بچینیم و لحیم کنیم. هدفمون اینه که قطعات رو طوری قرار بدیم که کمترین نیاز به سیمکشی و پرش بین مسیرها رو داشته باشیم.
بهترین کار اینه که کانکتورهای خروجی دقیقا کنار آیسیها و مقاومتها باشن. اینطوری برای هر ستون مکعب فقط دو تا اتصال لحیم داریم: از آیسی به مقاومت، از مقاومت به کانکتور.
آیسی لچ 74HC574 پایههای ورودی و خروجیش روبروی هم هستن، که کار مسیریابی رو خیلی راحت میکنه. حواست باشه یه مدل دیگه تو بازار هست که پایههاش پخش و پلاست؛ حتما همون مدلی که گفتیم رو تهیه کن.
همونطور که تو عکس اول میبینی، ما تمام سوکتها، مقاومتها و پینهدرها رو تا جای ممکن به هم نزدیک چیدیم تا فضای خالی برای اضافه کردن دکمهها و نشانگرها باقی بمونه.
تو عکس دوم هم میتونی اتصالات بین مقاومتها با آیسی و پینهدر رو ببینی. پایههای ورودی لچها فعلا لحیم نشدن و تو مراحل بعدی بهشون میرسیم.
مسیرکشی تغذیه لچها با خطوط قلعی
اینجاست که همون ترفند مسیرکشی با قلع حسابی به کارت میاد. بردهای شلوغی مثل این اگه با سیمهای معمولی برای تغذیه و زمین کشیده بشن، خیلی زود تبدیل به یه کلاف سردرگم میشن.
ما همیشه سعی میکنیم خطوط اصلی VCC و GND رو بهصورت یکپارچه و ضخیم با خود قلع روی برد بکشیم. این کار باعث میشه تو یه نگاه بتونی مسیرهای تغذیه رو از مسیرهای دیتا تشخیص بدی.
اگه جایی مجبور شدی خط مثبت و منفی رو از روی هم رد کنی، کافیه یکیشون رو با یه تیکه سیم روکشدار از روی برد جامپر بزنی. تو عکس اول میبینی که ما دو تا مسیر کلفت قلعی بهعنوان خطوط اصلی تغذیه کشیدیم (یکی VCC و یکی GND).
از این خطوط اصلی، برای هر ردیف آیسی انشعاب گرفتیم. خط زمین از زیر آیسیها رد میشه و خط 5 ولت از زیر مقاومتها. برای خط 5 ولت که زیر مقاومتهاست، از همون مفتولهای صافشدهی باقیمونده از مکعب استفاده کردیم. تو عکس دوم اگه دقت کنی، میبینی که برای هر آیسی لچ یه خازن 100 نانوفاراد عدسی قرار دادیم.
وجود این خازنها دقیقا کنار پایههای تغذیه هر آیسی واجبه. وقتی آیسیها با سرعت بالا خروجیها رو سوئیچ میکنن، یه افت ولتاژ میکروسکوپی رخ میده که میتونه آیسی رو هنگ کنه.
این خازنهای کوچیک مثل یه باتری شارژشده عمل میکنن و تو همون لحظه جریان مورد نیاز آیسی رو بهش میدن. قانون کلی تو طراحی مدار اینه که کنار هر آیسی باید یدونه از این خازنهای 100 نانوفاراد بذاری؛ مثل نقل و نبات پخششون کن! ما حتی یه خازن اضافه هم ته خط تغذیه گذاشتیم تا خیالمون از بابت نویزهای فرکانس بالا کاملا راحت باشه.
سیمکشی گذرگاه داده (دیتاباس) بین لچها
حالا وقتشه که ورودی همه 8 تا لچ رو به هم وصل کنیم. تو عکس میبینی که کلی سیم ظریف آبیرنگ کار شده تا پایههای همنام ورودی رو به هم متصل کنن (پایه ورودی 1 لچ اول به پایه ورودی 1 لچ دوم و الی آخر). به این مجموعه خطوط میگیم دیتاباس 8 بیتی. بالای برد یه کانکتور 16 پین قرار دادیم که قراره ارتباط این برد با برد میکروکنترلر رو برقرار کنه.
برای سیمکشی این دیتاباس از سیملختکن و سیمهای استخوانی معمولی استفاده نکردیم، بلکه از سیمهای خیلی نازک روکشدار به اسم Kynar (سیم لاکی یا وایررپ) استفاده کردیم.
کار کردن با این سیمها فوقالعاده لذتبخش و دقیقه. چون خیلی نازکن، روی برد برجستگی ایجاد نمیکنن و میتونی صدها مسیر رو بدون اینکه برد شلوغ بشه بکشی. مزیت دیگهشون اینه که نیازی به لخت کردن ندارن؛ حرارت هویه روکش عایقشون رو ذوب میکنه و مستقیم به پایه قطعه لحیم میشن.
برای اینکه مسیرها خواناتر باشن، از سیمهای رنگی استفاده کردیم. 8 تا سیم سبزرنگ از دیتاباس کشیدیم و بردیم به کانکتور اصلی. سیم نارنجیرنگ هم مربوط به پایه فعالساز خروجی لچها (OE) هست که اون رو هم به کانکتور رسوندیم. پایه اول کانکتور هم مستقیم به زمین وصل شده.
اتصال دیکودر به لچها
وظیفه آیسی 74HC138 (دیکودر) اینه که تعیین کنه در هر لحظه، کدوم یکی از 8 تا لچ، دیتا رو از روی باس برداره و ذخیره کنه. در واقع این آیسی پالس کلاک رو به لچ هدف میفرسته. 3 تا سیم آبیرنگی که از کانکتور اصلی به ورودی دیکودر اومدن، همون پایههای آدرسدهی هستن که از میکروکنترلر فرمان میگیرن.
از هر کدوم از 8 تا خروجی این دیکودر، یه سیم سفید کشیدیم و به پایه کلاک لچ مربوطه وصل کردیم. البته قبل از کشیدن این سیمها، حتما پایههای تغذیه (VCC و GND) دیکودر رو وصل کن و یه خازن 100 نانوفاراد هم نزدیک پایههاش قرار بده. تو عکس میبینی که روی کانکتور اصلی، دو تا پین خالی موندن. اینا رو بعدا برای دکمهها و الایدیهای خطایابی استفاده میکنیم.
مونتاژ برد اصلی کنترلر (میکروکنترلر)
رسیدیم به مغز متفکر کل پروژه! قطعه اصلی این برد، میکروکنترلر هشت بیتی ATmega32 هست که 32 کیلوبایت حافظه برنامه و 2 کیلوبایت رم داره.
این میکروکنترلر 32 تا پایه ورودی/خروجی همهمنظوره (GPIO) داره. دو تا از این پایهها برای ارتباط سریال (TX و RX) استفاده میشن و سه تا هم برای پروگرم کردن مستقیم رو برد (ISP). با این حساب، 27 تا پایه آزاد برامون میمونه تا مکعب، دکمهها و چراغها رو کنترل کنیم. هر 8 تا پایه تو این میکروکنترلر یه پورت رو تشکیل میدن. ATmega32 چهار تا پورت داره (PORTA تا PORTD).
ما پورت A رو کامل اختصاص میدیم به دیتاباس 8 بیتی که میره برای لچها. پورت C هم وظیفهاش روشن و خاموش کردن اون 8 تا لایهی کاتد هست (وصل میشه به مدار ترانزیستورها). برای انتخاب آدرس دیکودر هم از سه تا پایه اول پورت B استفاده میکنیم و پایه فعالساز (OE) لچها رو هم به پین 3 پورت B وصل میکنیم.
تو عکس اول روی برد رو میبینی. آیسی 40 پین وسط همون میکروکنترلر ماست. سمت چپش، کریستال نوسانساز و دو تا خازن 22 پیکوفارادش قرار دارن. برای پایههای تغذیه و پایههای آنالوگ میکرو هم دو تا خازن فیلتر 100 نانوفاراد گذاشتیم تا نویز نگیره.
بالای سمت چپ هم کانکتور تغذیه و خازنهای اصلی مربوط به ورودیش دیده میشه. کانکتور 16 پینی که بالای میکرو قرار داره، از طریق یه کابل فلت به برد لچها (که تو مراحل قبل ساختیم) وصل میشه.
کانکتور 10 پین کوچیکی هم که سمت چپه، برای پروگرم کردن میکرو روی برد (ISP) تعبیه شده. یه پین جامپر هم کنارشه که اگه وصل باشه، تغذیه برد از طریق دستگاه پروگرمر تأمین میشه.
نکته خیلی مهم: وقتی مکعب به برد وصله، بههیچوجه جامپر رو نذار تا تغذیه از پروگرمر کشیده نشه! چون مکعب جریان بالایی میکشه و میتونه هم پروگرمر و هم پورت USB کامپیوترت رو بسوزونه.
تو عکس دوم، سیمکشیهای زیر برد رو میبینی. سیمهای سبز، اطلاعات پورت A رو به کانکتور میرسونن. سیمهای آبی برای آدرسدهی و پایهی OE هستن.
سیمهای نارنجی هم خطوط پروگرمر رو به پایههای مربوطه تو میکرو وصل کردن. روال مونتاژ به این صورته: 1. سوکت 40 پین، کانکتور ISP و کانکتور 16 پین رو جا بزن. 2.
کانکتور تغذیه و خازنهاش رو لحیم کن. 3. مسیرهای قلعی تغذیه (VCC و GND) رو بکش و خازنهای 100 نانوفاراد رو کنار پایههای تغذیه آیسی بذار. 4. کریستال رو به همراه خازنهاش (هر خازن بین یه پایه کریستال و زمین) لحیم کن. 5.
سیمکشیهای مربوط به دیتاباس، دیکودر و پروگرمر رو انجام بده. (ترانزیستورها و پورت سریال تو مراحل بعدی اضافه میشن). همین الان میتونی پروگرمر رو به برد وصل کنی؛ اگه همهچیز درست باشه، نرمافزار باید میکروکنترلر رو شناسایی کنه.
ساخت مدار درایور لایهها با ترانزیستور
وظیفه ترانزیستورها تو این پروژه، صفر کردن (زمین کردن) تکتک لایههای مکعبه تا مسیر جریان کامل بشه. ما اولش یه سری ترانزیستور با تحمل حدود 500 میلیآمپر گرفتیم و فکر میکردیم کافیه.
وقتی مکعب رو روشن کردیم دیدیم نورش کمه و هرچی الایدی بیشتری تو یه لایه روشن میشه، نور بقیه کمرنگتر میشه. بدتر از اون، هالههای نوری مزاحم هم به وجود اومده بود، چون ترانزیستورها نمیتونستن لایه رو کاملا قطع کنن.
اول سعی کردیم با گذاشتن مقاومتهای پولآپ (Pull-up) مشکل هالهها رو حل کنیم که تا حدودی جواب داد، اما مشکل کمنوری سر جاش بود. چون ترانزیستور قویتر دم دست نداشتیم، تصمیم گرفتیم یه کار غیرمتعارف انجام بدیم: موازی کردن دو تا ترانزیستور معمولی!
از ترانزیستورهای PN2222A استفاده کردیم. اصولیش اینه که از ماسفتها یا ترانزیستورهای سوئیچینگ قدرت استفاده کنی، اما این ترانزیستورها هر کدوم تا 1000 میلیآمپر تحمل میکردن و برای ما مناسب بودن.
برای هر لایه، دو تا ترانزیستور رو موازی کردیم. پایههای کلکتور به هم وصل شدن و رفتن به زمین. پایههای امیتر به هم وصل شدن و رفتن سمت مکعب.
برای پایههای بیس هم هر کدوم یه مقاومت مجزا گذاشتیم و اون سمت مقاومتها رو یکی کردیم و به پایههای خروجی میکروکنترلر وصلشون کردیم.
وقتی روشنش کردیم، فوقالعاده جواب داد! نور مکعب عالی شد. اگه قطعات بهتری دم دست داری میتونی مدار رو ارتقا بدی، اما همین روش ما کاملا تست شده و عالی کار میکنه. برای مونتاژ: 1. 16 تا ترانزیستور رو روی برد بچین. 2.
تمام پایههای کلکتور رو با یه خط قلعی ضخیم به هم وصل کن و ببرشون به زمین مدار. 3. مقاومتهای بیس رو بذار و دو به دو به هم وصلشون کن. 4.
از خروجیهای میکرو (پورت C) سیم بکش به این 8 جفت مقاومت. 5. پایههای امیتر رو هم جفتجفت به هم وصل کن و ازشون سیم بکش برای یه کانکتور 8 پین که قراره بره سمت مکعب.
اضافه کردن دکمهها و الایدیهای وضعیت
میشه مکعب رو بدون هیچ دکمهای ساخت تا فقط روشن بشه و کارش رو بکنه، اما داشتن چند تا دکمه برای تغییر افکتها و الایدیهایی برای دیدن وضعیت مدار، خیلی کار رو حرفهایتر میکنه. ما یه دکمه اصلی روی برد لچها گذاشتیم (چون این برد روی برد میکرو سوار میشه و دسترسی بهش راحتتره) و سیمش رو از طریق همون کابل فلت رد کردیم.
یه دکمه دیگه هم روی خود برد میکروکنترلر برای خطایابی تعبیه کردیم. نحوه اتصال دکمهها خیلی سادهست: یه سر دکمه به زمین و یه سر دیگهاش به پایه میکرو وصل میشه.
تو کدهای میکرو، مقاومت پولآپ داخلی رو برای اون پایه فعال میکنیم. وقتی دکمه فشرده نمیشه، پایه مقدار 1 (ولتاژ بالا) رو میخونه و وقتی دکمه رو میزنی، وصل میشه به زمین و مقدار 0 رو میخونه.
الایدیهای وضعیت رو هم با یه مقاومت سری به پایههای دلخواه میکرو وصل میکنیم. یادت باشه هیچوقت الایدی رو مستقیم به میکرو وصل نکنی، چون جریان زیادی میکشه و پایه رو میسوزونه.
مقاومت مناسب برای الایدیها بستگی به رنگشون داره (رنگهای مختلف ولتاژ متفاوتی نیاز دارن)، پس بهتره با یه تغذیه 5 ولت روی برد بورد تستشون کنی تا همنور بشن. ما جای دکمهها و نشانگرها رو تو گوشههای خلوت برد انتخاب کردیم که میتونی تو عکسها ببینیشون.
مدار ارتباطی پورت سریال RS-232
برای اینکه بتونیم خفنترین انیمیشنها رو روی مکعب اجرا کنیم، نیاز به پردازشهای سنگین ریاضی (مثل محاسبات اعشاری) داریم که میکروکنترلر از پسشون برنمیاد. برای همین میخوایم مکعب رو به کامپیوتر وصل کنیم تا محاسبات اونجا انجام بشه و فقط اطلاعات نمایش روی مکعب فرستاده بشه.
میکروکنترلر ATmega32 خودش یه واحد ارتباط سریال (USART) داره که با ولتاژهای صفر و 5 ولت کار میکنه. اما پورت سریال کامپیوترها ولتاژهایی بین منفی 15 تا مثبت 15 ولت دارن.
برای اینکه این دو تا زبون همدیگه رو بفهمن و ولتاژها همسان بشن، باید از آیسی واسط MAX232 استفاده کنیم. این آیسی با کمک 4 تا خازن 100 نانوفاراد، ولتاژ 5 ولت میکرو رو به ولتاژ مورد نیاز پورت سریال تبدیل میکنه.
یه کانکتور 4 پین زاویهدار هم گوشه برد گذاشتیم تا وقتی بردها روی هم مونتاژ شدن، راحت بتونیم کابل سریال رو بهش وصل کنیم. برای اینکه کابل رو برعکس نزنیم، یکی از پینهای وسط کانکتور رو کشیدیم بیرون. تو عکس دوم، اون دو تا سیم زرد رنگی که از میکرو اومدن سمت آیسی، همون پایههای ارسال (TX) و دریافت (RX) هستن.
مونتاژش هم کاری نداره: 1. آیسی رو بذار، مسیرهای تغذیهاش رو بکش و یه خازن نویزگیر کنارش قرار بده. 2. بقیه خازنهای 100 نانوفارادی که دور و بر آیسی هستن (مدار پمپ شارژ) رو وصل کن. 3. کانکتور 4 پین رو نصب کن و پین کنده شده رو از مدار حذف کن. 4. سیمهای دیتای میکرو رو به آیسی وصل کن و خروجیهای آیسی رو ببر سمت کانکتور.
ساخت کابل اتصال سریال RS-232 به کامپیوتر
برای اتصال مکعب به کامپیوتر، به یه کابل سریال که یک سرش سوکت مادگی D-Sub (9 پین) باشه نیاز داری. ما از یه کابل اضافی که تو تجهیزات شبکهمون افتاده بود استفاده کردیم و سر دیگهاش رو بریدیم تا به برد خودمون بخوره.
از اونجایی که رو برد کنترلر یه پینهدر 4 تایی گذاشته بودیم، سر این کابل رو هم باید به یه سوکت مخابراتی مادگی 4 پین مجهز کنیم تا راحت وصل بشه. ترتیب پایههای کانکتور سریال (از سمت کامپیوتر) اینطوریه:
برای اینکه بفهمی تو کابل بریده شدهات کدوم رنگ مربوط به کدوم پین از سوکت D-Sub هست، مولتیمتر رو بذار رو حالت تست بوق (Continuity).
یه پروب رو بزن به پین 5 سوکت و با پروب دیگه رنگهای سیمهای لختشده رو تست کن تا بوق بزنه. وقتی پیداش کردی، رنگش رو بنویس. همین کار رو برای پینهای 2 و 3 هم بکن و بقیه سیمهای اضافی رو قطع کن. حالا سر این سه تا سیم رو لخت کن، وارنیش (شیرینک) بنداز و به پینهای فلزی سوکت مخابراتی لحیم کن.
در نهایت وارنیشها رو با حرارت جمع کن تا اتصالی به وجود نیاد. هیچوقت به رنگ سیمهایی که ما تو عکسمون استفاده کردیم اعتماد نکن، چون تو هر کابلی رنگبندی فرق میکنه؛ حتما خودت با مولتیمتر تستشون کن.
اتصال دو برد کنترلر به یکدیگر
حالا که هر دو برد (میکروکنترلر و لچها) کامل شدن، باید اونها رو به هم وصل کنی. ارتباط بینشون از طریق این دو تا کابل برقرار میشه:
- یه کابل فلت 16 پین برای انتقال گذرگاه داده و آدرس.
- یه کابل دورشتهای ساده برای انتقال ولتاژ 5 ولت و زمین.
نصب کابلهای مکعب به کنترلر
کابلهای فلتی که زیر کفه مکعب کشیده بودی رو حالا به کانکتورهای متناظرشون روی برد لچها وصل کن. فلت 8 رشتهای مربوط به زمین لایههاست و باید به هدر روی برد پایینی (نزدیک ترانزیستورها) وصل بشه. اگه بعد از روشن کردن دیدی تصویر مکعب برعکسه، فقط کافیه کانکتورها رو برعکس جا بزنی.
تنظیم فیوزبیتهای میکروکنترلر
میکروکنترلرهای AVR بخشی به نام فیوزبیت دارن که تنظیمات سختافزاری پایهای (مثل منبع تأمین کلاک) رو مشخص میکنه و قبل از شروع به کار برنامهی اصلی خونده میشن. ما باید میکرو رو طوری تنظیم کنیم که از کریستال خارجی که براش گذاشتیم استفاده کنه و همچنین رابط JTAG رو غیرفعال کنیم تا پایههاش آزاد بشن.
مقدار فیوزبیت پایین (lfuse) رو روی 0b11101111 و فیوزبیت بالا (hfuse) رو روی 0b11001001 تنظیم میکنیم. (پیشوند 0b نشون میده که عدد تو مبنای دو یا باینری نوشته شده).
ما برای پروگرم کردن از ابزارهای خطفرمان استفاده کردیم، ولی تو میتونی با هر نرمافزاری که پروگرمرت پشتیبانی میکنه (مثل ProgISP یا ابزارهای دیگه) این مقادیر رو تنظیم و روی میکرو رایت کنی.
- کد avrdude: avrdude -c usbtiny -p m32 -U lfuse:w:0b11101111:m
- کد avrdude: avrdude -c usbtiny -p m32 -U hfuse:w:0b11001001:m
پروگرم کردن کدهای خطایابی و تست مکعب
وقتشه ببینی این همه زحمتی که کشیدی بالاخره جواب میده یا نه! ما یه برنامه ساده تست آماده کردیم که تمام الایدیها و ترتیب سیمکشیشون رو بررسی میکنه. بهتره اول این کد (فایل test.hex) رو روی میکرو بریزی تا از صحت اتصالات مطمئن بشی. اگه از پروگرمرهای استاندارد استفاده میکنی، این فایل رو مستقیما تو بخش فلش (Flash) میکرو رایت کن.
- کد avrdude: avrdude -c usbtiny -p m32 -B 1 -U flash:w:test.hex
روشن کردن مکعب و تماشای تست اولیه
کد تست یه صفحه نورانی میسازه و تو هر سه محور مکعب اون رو حرکت میده. بعد از اون، الایدیهای هر لایه رو دونهدونه از پایین به بالا روشن میکنه.
اگه دیدی تو این پروسه، لایهها یا ستونها بههمریخته و با ترتیب اشتباه روشن میشن، یعنی یکی از سیمهای کابل فلت رو اشتباه وصل کردی. هیچ جای نگرانی نیست! خود ما هم یه اشتباه سیمکشی داشتیم. به جای اینکه بخوای با کدنویسی این بههمریختگی رو اصلاح کنی، کافیه جای سیمهای اشتباه رو روی کانکتور عوض کنی.
تغییر دادن کد برای جبران سیمکشی اشتباه، باعث میشه میکرو پردازش اضافی انجام بده و راندمان سیستم تو انیمیشنهای سنگین پایین بیاد.
آپلود کردن نرمافزار نهایی و فونتها
وقتی همهچیز تو تست اولیه درست کار کرد، وقتشه که سیستمعامل واقعی مکعب رو روش آپلود کنی! پروسه دقیقا مثل مرحله قبله، با این تفاوت که اینبار علاوه بر حافظه اصلی (فلش)، باید فایل مربوط به حافظه EEPROM رو هم رایت کنی. ما یه سری کاراکتر متنی و فونتهای پیکسلی رو داخل حافظه EEPROM ذخیره کردیم تا مکعب بتونه نوشتهها رو هم سهبعدی نشون بده.
کافیه فایل main.hex رو تو بخش فلش و فایل main.eep رو تو بخش ایپرام پروگرمرت لود و رایت کنی تا مکعبت جون بگیره.
- کد avrdude: avrdude -c usbtiny -p m32 -B 1 -U flash:w:main.hex
- کد avrdude: avrdude -c usbtiny -p m32 -B 1 -U eeprom:w:main.eep
نگاهی به منطق برنامهنویسی مکعب و افکتها
تمام نرمافزار این مکعب به زبان شیرین C نوشته شده. تو دل این نرمافزار دو تا بخش اصلی داریم: بخش اول، روتین وقفههاست که دائم صفحه مکعب رو رفرش میکنه و بخش دوم، توابعی هستن که انیمیشنهای جذاب رو تولید میکنن.
وقتی ساخت مکعب تموم شد، فکر میکردیم سختترین بخش کار تموم شده، اما ساختن افکتهای نرم و سهبعدی با رزولوشن پایین و اون هم فقط بهصورت خاموش/روشن (تکرنگ) خیلی چالشیتر از چیزی بود که فکرش رو میکردیم.
اگه مکعب رنگی و پرپیکسل بود، با چند تا فرمول ریاضی مثل سینوس و کسینوس میشد هزاران افکت خفن ساخت، اما اینجا مجبوریم با کلی حلقههای پیچیده و دستورات شرطی افکتها رو خلق کنیم.
تو مراحل بعدی، منطق چند تا از این افکتها رو خیلی ساده برات باز میکنیم تا ایده بگیری و خودت هم بتونی افکتهای شخصیسازیشدهت رو براش کد بزنی. If you do, please post a video in the comments!
نحوه کارکرد کدهای وقفه و تخصیص حافظه
ارتباط بین بخش انیمیشنساز و بخش نمایشدهنده از طریق یه متغیر آرایهای به اسم "بافر مکعب" انجام میشه. این بافر 64 بایت از حافظه رم میکرو رو میگیره (یه ماتریس 8 در 8 از بایتها).
کدهای وقفه با سرعت خیلی بالا میان این بافر رو میخونن و روی مکعب نشون میدن. از اون طرف، توابع افکتساز، تغییرات رو روی همین بافر مینویسن تا شکلها حرکت کنن.
برای اینکه حجم کدها بالا نره، ما یه کتابخونه از توابع پایهای کشیدن شکل (مثل نقطه زدن، خط کشیدن، کشیدن مربع سهبعدی و...) ایجاد کردیم تا موقع نوشتن افکتهای جدید، فقط با صدا زدن این توابع کارمون راه بیفته.
راهاندازی اولیهی پایهها و تایمر در کد
وقتی میکرو روشن میشه، اولین کاری که میکنه اجرای تابع ioinit هست تا پورتها، تایمرها و ارتباط سریال رو کانفیگ کنه. تمام پایهها غیر از پایههای مربوط به دکمهها بهعنوان خروجی تعریف میشن و مقدارشون صفر میشه تا قبل از لود شدن کامل نرمافزار، لامپی الکی روشن نشه. برای پایههای ورودی دکمهها هم، مقاومتهای پولآپ داخلی میکرو رو فعال میکنیم تا به مدار خارجی نیازی نباشه.
در نهایت هم تایمر شماره 2 و رابط سریال (USART) رو فعال میکنیم که قلب تپندهی مکعب ما هستن.
ترفند تولید اعداد واقعاً تصادفی در میکروکنترلر
اوایل که افکتها رو تست میکردیم، متوجه شدیم افکتهایی که توشون از اعداد تصادفی استفاده کردیم (مثل افکت بارش بارون)، هر بار دقیقا یه الگوی تکراری رو نشون میدن! دلیلش اینه که تولیدکننده اعداد رندوم تو میکرو نیاز به یه "عدد بذر" یا Seed داره تا از اونجا شروع به تولید اعداد غیرتکراری کنه.
برای حل این مشکل، یه ترفند جالب زدیم: یه حلقه بینهایت نوشتیم که با سرعت فوقالعاده بالایی یه شمارنده رو بالا میبره و منتظر میمونه تا کاربر دکمه روی برد رو فشار بده.
چون زمان فشرده شدن دکمه توسط انسان تو هر بار روشن شدن دستگاه کاملا تصادفی و تو حد میکروثانیه متفاوته، همون عددی که شمارنده روش متوقف میشه رو بهعنوان بذر به خورد تابع تصادفیساز میدیم. اینطوری مکعبت همیشه انیمیشنهای کاملا جدید و غیرقابلپیشبینی خلق میکنه. 3) Increment counter x by one.
مدیریت رفرشریت مکعب با تایمر
مهمترین بخش کدنویسی، همون کدیه که قراره لایهها رو یکییکی روشن و خاموش کنه. برای اینکه این چرخه دقیق و منظم کار کنه، از تایمر شماره 2 میکرو کمک میگیریم.
تایمرها طوری تنظیم میشن که مستقل از کدهای اصلی، دائما بشمرن و وقتی به یه عدد خاص رسیدن، کدهای اصلی رو متوقف کنن و کدهای وقفه رو اجرا کنن.
ما تایمر رو جوری تنظیم کردیم که تو هر ثانیه بیش از 10 هزار بار این وقفه اجرا بشه! از اونجایی که مکعب 8 تا لایه داره، تو هر ثانیه، کل مکعب بیشتر از 1300 بار از نو رسم و روشن میشه (نرخ نوسازی 1300 فریم بر ثانیه). شاید بگی این عدد خیلی بالاست، اما باعث میشه مکعبت کاملا و بدون هیچگونه لرزشی چشمک بزنه و به اصطلاح Flicker-free بشه.
جالبه بدونی با وجود این سرعت بالا، این روتین فقط حدود 21 درصد از توان پردازنده رو درگیر میکنه و بقیهاش برای محاسبه افکتها آزاد میمونه. پروسه اجراش تو هر وقفه به این ترتیبه: 1. همه ترانزیستورها خاموش میشن. 2. خروجی لچها غیرفعال میشه. 3. دیتای لایه جدید روی دیتاباس قرار میگیره و پالس به لچ مربوطه زده میشه. 4. خروجی لچها فعال میشه. 5. ترانزیستور لایهی جدید روشن میشه تا نور دیده بشه.
توابع گرافیکی پایه و بهینهسازی حافظه
تو برنامهنویسی برای میکروکنترلرها، مدیریت حافظه رم بهشدت حیاتیه. راحتترین راه برای تعریف فضای سهبعدی مکعب این بود که یه متغیر آرایهای سهبعدی بسازیم، اما این کار کلی از حافظه رو هدر میداد، چون هر واحد حافظه حداقل یه بایت (8 بیت) جا میگیره، درحالیکه الایدیهای ما فقط یه وضعیت صفر یا یک نیاز دارن.
به جای این کار، ما اومدیم از همون ساختار دو بعدی هشتتایی استفاده کردیم و بعد سوم (محور X) رو با استفاده از عملگرهای بیتی داخل تکتک بیتهای اون بایتها جا دادیم.
برای اینکه برنامهنویس موقع افکتنویسی گیج نشه و نخواد دائم با عملگرهای بیتی کار کنه، توابع سادهای مثل setvoxel(x,y,z) رو نوشتیم که کارش فقط گرفتن مختصات سهبعدی و روشن کردن همون نقطه خاص تو فضاست. این توابع، حجم کدهای اصلی رو بهشدت کاهش میدن و خوندنشون رو هم مثل آب خوردن راحت میکنن.
جهتیابی و مختصات سهبعدی در فضای مکعب
حالا که توابع رسم رو داریم، باید بدونیم کجای مکعب هستیم. فرض کن مکعب رو طوری گذاشتی رو میز که کابلهای فلتش از سمت چپ زده بیرون. در این حالت، محور Y میشه از چپ به راست. محور X میشه از جلو به عقب. و محور Z میشه از پایین به بالا. مختصات همیشه به صورت (x,y,z) نوشته میشه. نقطه (0,0,0) میشه گوشهی پایین-چپ-جلو. و نقطه (7,7,7) میشه گوشهی بالا-راست-عقب.
تمام افکتهایی که نوشتیم بر اساس این زاویه دید طراحی شدن. پس اگه مکعبت رو برعکس گذاشتی، ممکنه انیمیشنها یه مقدار عجیبوغریب به نظر برسن!
مدیریت اجرای افکتها با تابع لانچر
برای اینکه اجرای افکتها منظم باشه یا بتونیم بهصورت رندوم پخششون کنیم، یه تابع راهانداز (Launcher) ساختیم. این تابع یه عدد میگیره و بر اساس اون عدد، با دستور Switch تعیین میکنه کدوم افکت پخش بشه. حالا اگه بخوایم افکتها یکییکی اجرا بشن، کافیه این تابع رو تو یه حلقه از 0 تا تعداد کل افکتها قرار بدیم.
اگه هم بخوایم کاملا رندوم باشه، تابع رو با یه عدد تصادفی صدا میزنیم. به همین سادگی! for (i=0; i < EFFECTS_TOTAL; i++) { launch_effect(i); } launch_effect(rand()%EFFECTS_TOTAL);
بررسی کد افکت اول: بارش باران
بیا یکی از سادهترین افکتها یعنی بارش بارون رو بررسی کنیم. این تابع چند تا نقطه نورانی (قطره) رو تو بالاترین لایه (لایه 7) روشن میکنه و بعد کمکم میارتشون به سمت پایین.
روند کارش تو کد اینطوریه: اول یه تعداد تصادفی نقطه روی محورهای X و Y تو لایه بالا ایجاد میکنه. بعد یه مکث کوتاه میکنه و در نهایت تمام محتویات فضای مکعب رو یکی شیفت میده سمت پایین (یعنی محور Z رو یکی کم میکنه).
چون این کار تو حلقه تکرار میشه، قطرهها دائم از بالا تولید میشن و انگار دارن به سمت زمین سقوط میکنن. سادهست اما حسابی سهبعدی و قشنگه! This shifts everything down one level.
بررسی کد افکت دوم: حرکت صفحهی نورانی (Plane Boing)
این افکت هم در عین سادگی، عمق سهبعدی مکعب رو حسابی به رخ میکشه. تو این افکت یه صفحه تخت نورانی روی یکی از محورها رسم میشه و مثل یه فنر از مختصات 0 میره به 7 و دوباره برمیگرده سر جاش.
کدش هیچ چیز پیچیدهای نداره؛ با دستور setplane یه صفحه میکشه، یه کوچولو صبر میکنه، کل مکعب رو پاک میکنه و صفحهی بعدی رو تو یه قدم جلوتر میکشه. با دو تا حلقه فور (For) رفت و برگشت این انیمیشن کامل میشه. If you specify AXIS_Z, a plane is drawn on axis X and Y.
بررسی کدهای ترکیبی و رسم شکلهای سهبعدی
علاوه بر اینا، افکتهای جالب دیگهای هم تو سورس کد قرار دادیم. مثلا تو یه افکت، نقطههای نورانی بین سقف و کف مکعب با سرعتهای مختلف جابجا میشن و حس تعلیق جذابی بهت میدن. یا تو یه افکت دیگه، یه مربع توخالی بزرگ دور تا دور مکعب رسم میشه و به صورت انیمیشنی کوچیک میشه تا برسه به مرکز مکعب.
ما برای همه اینا از همون توابع پایهای که تو Draw.c نوشتیم استفاده کردیم تا کدهای اصلی شلوغ نشن. با خوندن این سورسکدها، خودت هم میتونی سریع دست به کار بشی و شکلهای هندسی سهبعدی جدیدی خلق کنی.
چالشهای محاسبات ریاضی سنگین در میکروکنترلر
برای افکتهای ساده مثل مربع و نقطه، همون عملگرهای منطقی (مثل شیفت بیت و جمع و تفریق) کارسازن. اما اگه بخوایم افکتهای نرم و مواج مثل امواج آب یا الگوهای ریاضی پیچیده بسازیم، به محاسبات اعشاری (سینوس، کسینوس، تانژانت و...) نیاز داریم. میکروکنترلری که ما استفاده کردیم برای این نوع محاسبات سنگین ساخته نشده و اگه بخوایم این کدها رو روی میکرو اجرا کنیم، انیمیشن کاملا تیکدار و کند میشه.
اینجاست که ایده کنترل مکعب با کامپیوتر به دردمون میخوره. تو این روش، میکروکنترلر فقط نقش نمایشدهنده رو داره و تمام پردازشهای سنگین ریاضی روی کامپیوتر انجام میشن.
افکت معلق شدن تصادفی پیکسلها (حالت تعلیق)
یکی از جذابترین افکتهای این مجموعه اینه که پیکسلها تو فضای سهبعدی معلق میمونن و وقتی سرت رو تکون میدی، عمق تصویر رو کاملا حس میکنی.
تو این کد، تمام 64 پیکسل از یه دیواره شروع میکنن، بعد یه مقصد تصادفی براشون تعیین میشه و قدمبهقدم به سمت اون مقصد حرکت میکنن و بین زمین و هوا متوقف میشن. بعد از یه مکث کوتاه، دوباره راهشون رو به سمت دیواره روبرویی ادامه میدن. شدیدا پیشنهاد میکنم سورسکد رو دانلود کنی و بخشهای مختلفش رو تغییر بدی تا ببینی چه شکلهای دیوانهواری میتونی باهاش بسازی!
نمایش متن و کاراکتر سهبعدی روی مکعب
ازونجایی که مکعب 8 در 8 کمترین رزولوشنیه که باهاش میشه فونتها رو خوند، ما هم تصمیم گرفتیم ازش استفاده کنیم! ما یه فونت 8 در 5 پیکسلی که قبلا تو السیدیهای گرافیکی داشتیم رو مستقیما ریختیم تو حافظه EEPROM میکرو.
حالا با یه تابع ساده میتونیم هر نوشته انگلیسی رو بدیم بهش تا حرف به حرف تو اعماق مکعب نوشته بشه و بعدش مثل فیلمای علمیتخیلی به سمت جلو حرکت کنه (انگار حروف دارن سمتت پرواز میکنن).
برقراری ارتباط سریال برای کنترل از طریق کامپیوتر
همونطور که گفتیم، کامپیوتر قدرت پردازش خیلی بالایی داره. ما پورت سریال میکرو رو روی سرعت 38400 باود (Baud) تنظیم کردیم. با این سرعت، ما میتونیم تو هر ثانیه حدود 58 فریم کامل مکعب رو از کامپیوتر بفرستیم روی برد میکروکنترلر.
این یعنی بدون هیچ افت کیفیتی میتونیم انیمیشنهای سنگین رو بهصورت کاملا روان پخش کنیم. میکرو فقط وظیفه داره دیتای دریافتی رو بخونه و مستقیما بفرستهاش روی الایدیها. برای همگامسازی، یه بایت نشانگر طراحی کردیم تا میکرو بفهمه کی یه فریم کامل تموم شده و فریم جدید شروع شده.
نرمافزار سمت کامپیوتر برای خلق افکتهای پیچیده
از اونجایی که مکعب فقط دیتای خام باینری رو از طریق پورت سریال میگیره، تو میتونی با هر زبونی (پایتون، پرل، پیاچپی و...) براش کد بنویسی. اما ما ترجیح دادیم با همون C برنامهمون رو بنویسیم تا بشه کدهای سمت میکرو رو راحت کپیپیست کرد. نرمافزار کامپیوترمون یه ترد (Thread) مستقل داره که دائم فریمهای ساختهشده رو از طریق پورت COM میفرسته سمت دستگاه.
همگامسازی فریمها برای جلوگیری از لرزش (Flicker)
یکی از مشکلاتی که تو ارسال سریال دیتای زنده داشتیم، لرزش تصویر بود. متوجه شدیم چون تابع ارسال سریال با سرعت بالایی کار میکنه، گاهی اوقات فریم در حال ساخت، قبل از اینکه کامل بشه ارسال میشه و یه صفحهی نصفهنیمه یا خالی روی مکعب چشمک میزنه. تو محیط میکروکنترلر چون نرخ فریم بالای 1000 بود این مشکل دیده نمیشد، اما تو ارتباط سریال 60 فریمی کاملا محسوس بود.
برای حل این مشکل از تکنیک دابلبافرینگ (Double Buffering) استفاده کردیم. فریم جدید تو یه بافر مخفی ساخته میشه و فقط زمانی که کاملا آماده شد، یکجا کپی میشه تو بافر ارسال سریال. با این ترفند مکعبمون مثل ساعت دقیق و روون کار کرد!
اجرای افکت امواج آب (Ripples) با کامپیوتر
این اولین افکتی بود که با نرمافزار کامپیوتر تست کردیم و خروجیش واقعا مسحورکننده شد. شاید فکر کنی کدش خیلی پیچیدهست، ولی اینطور نیست. کافیه فاصله هر نقطه تو محورهای X و Y رو تا مرکز مکعب حساب کنی و این فاصله رو بذاری تو یه تابع سینوسی به اضافه متغیر زمان. نتیجهاش یه موج سهبعدی نرم میشه که از مرکز مکعب میجوشه و به سمت دیوارهها میره؛ دقیقا مثل سنگی که تو آب میندازی.
افکت امواج جانبی (Sidewaves)
این افکت هم دقیقا همون منطق امواج آب رو داره، با این تفاوت که مرکز تولید موج ثابت نیست. ما به جای اینکه مرکز رو نقطه ثابت وسط مکعب بذاریم، مختصات مرکز رو با توابع سینوس و کسینوس به صورت دایرهوار دور مکعب میچرخونیم.
اینطوری به نظر میرسه که موجها از بیرون و به صورت چرخشی دارن به مکعب برخورد میکنن. میبینی ریاضیات چقدر میتونه تو ساخت جلوههای بصری قوی باشه؟
ساخت افکت شگفتانگیز آتشبازی (Fireworks)
این افکت یکی از جذابترین کارایی بود که کردیم. برای اینکه آتشبازی طبیعی به نظر برسه، واقعا رفتیم و فیزیک پرتابه رو پیادهسازی کردیم! سناریو اینه: یه موشک نورانی پرتاب میشه بالا، بعد تو یه ارتفاع تصادفی منفجر میشه و ذراتش به صورت تصادفی تو محیط پخش میشن. برای طبیعیتر شدن ماجرا، جاذبه زمین و مقاومت هوا رو هم شبیهسازی کردیم.
ذرات موقع انفجار سرعت زیادی دارن، اما تابع مقاومت هوا (با کمک تابع تانژانت) سرعتشون رو کم میکنه و تابع جاذبه هم یواشیواش مسیرشون رو به سمت پایین کج میکنه. نتیجهاش یه انفجار بینهایت زیبا و واقعگرایانه تو دل مکعبه.
شبیهسازی بازی زندگی کانوی (Game of Life) در فضای 3D
اگه به علوم کامپیوتر علاقه داشته باشی حتما اسم "بازی زندگی" جان کانوی به گوشت خورده. تو این بازی پیکسلها به صورت سلولهای زنده با هم تعامل میکنن. ما تصمیم گرفتیم این منطق دوبعدی رو تو فضای سهبعدی مکعب پیادهسازی کنیم. قوانینش رو هم برای سهبعدی اینطوری شخصیسازی کردیم:
- اگه یه سلول خاموش دقیقا 4 تا همسایه روشن داشته باشه، روشن میشه.
- اگه یه سلول روشن 4 تا همسایه روشن داشته باشه، روشن میمونه.
- اگه سلول روشن 3 تا یا کمتر همسایه داشته باشه، از تنهایی میمیره (خاموش میشه).
- اگه 5 تا یا بیشتر همسایه داشته باشه، از ازدحام جمعیت میمیره.
استفاده از بردهای آردوینو برای کنترل مکعب
اگه برد آردوینو (مثل Uno یا Nano) تو خونه داری و حوصله لحیمکاری میکروکنترلر خام رو نداری، خوشبختانه این خبر خوب رو بهت بدم که میتونی کل مکعب رو با همون آردوینوی خودت راهاندازی کنی!
- توضیح: Layer select: 8
آردوینو 13 تا پایه دیجیتال و 8 تا پایه آنالوگ داره که جمعا میشه 21 پایه! یعنی فیکس برای این پروژه کافیه. اما یه نکته خیلی مهم وجود داره: تو نمیتونی از دستور کند digitalWrite آردوینو استفاده کنی.
چون تغییر دادن پایههای آدرس دیکودر باید در کسری از ثانیه و کاملا همزمان اتفاق بیفته. اگه با دستورات معمولی آردوینو این پایهها رو یکییکی عوض کنی، خروجی لچها به هم میریزه. پس تو محیط آردوینو هم مجبوری از همون دستورات مقداردهی مستقیم پورتها (مثل PORTD و PORTB) استفاده کنی تا سرعت لازم تأمین بشه.
همچنین رجیسترهای تایمر مدلهای مختلف AVR با هم فرق میکنن، پس موقع پورت کردن کدها حتما دیتاشیت پردازنده آردوینوت رو چک کن. If the address pins are not set at the exact same time, the output of the 74HC138 would trigger the wrong latches. Output Enable: Digital pin 11.
عیبیابی: تعویض الایدی سوخته در لایههای داخلی
همونطور که قبلا هشدار دادم، سوختن الایدی وسط مکعب یکی از بدترین اتفاقات ممکنه. اما اگه این اتفاق افتاد، دنیا به آخر نرسیده! برای درآوردنش، یه دمباریک ظریف بردار و یکم پایهی الایدی سوخته رو تحت فشار بذار.
بعد خیلی سریع نوک هویه رو بزن به اتصالش؛ پایه راحت آزاد میشه. این کار رو برای هر دو تا پینش انجام بده تا الایدی سوخته دربیاد.
سختترین قسمتش جا زدن الایدی جدیده تا دقیقا مثل بقیه تراز بشه. میتونی از گیرههای کمکی سوسماری استفاده کنی تا موقع لحیمکاری ثابت نگهش داره. ما خودمون یکی رو عوض کردیم و انقدر تمیز دراومد که الان خودمون هم یادمون نیست کدومش تعویضیه!
سخن پایانی و اشتراکگذاری تجربیات
ساخت این مکعب نوری یکی از اون پروژههاییه که وقتی تموم میشه و برای اولین بار تو اتاق تاریک روشنش میکنی، تمام خستگی اون صدها نقطه لحیمکاری از تنت بیرون میره و از دیدن نورپردازیهای سهبعدیش شگفتزده میشی.
امیدوارم این آموزش که تیم آیسیمدار برات آماده کرده، تو رو به دنیای ساختنیها علاقهمندتر کرده باشه. اگه تو هم دست به هویه شدی و این پروژه (یا حتی نسخه کوچیکترش) رو ساختی، خیلی خوشحال میشیم تجربهت رو باهامون به اشتراک بذاری. اگه ایدهای برای افکتهای جدید داری یا جایی به مشکل خوردی، حتما تو بخش نظرات برامون بنویس تا با هم در موردش گپ بزنیم. موفق باشی!
فایلهای پیوست
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.












































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