LED Cube 8x8x8 Arduinoda mo'jiza

Dunyoda turli xil kasblar ko'p. Barchasining ham qiziqarli va jozibador taraflari bor. Bularning ichida eng qiziqarlisi dasturchilikdir. Bu albatta shaxsiy fikrim. Lekin, eng qiyinlaridan biri desam "Yo'q unday emas" deydiganlar topilmasa kerak. Oddiy misol buxgalteriya uchun dastur yaratayotgan dasturchi buxgalterga aylanadi yoki bank ishini avtomatlashtirish davomida bankirga aylanadi. Qisqasi, sifatli mahsulot chiqarish uchun har ko'yga tushishga to'g'ri keladi. Shunday bo'lsada, bu kasbning bitta katta kamchiligidir. Mehnat natijasi abstrakt-jismsiz narsa bo'ladi. Qo'lizga ushlab ko'rolmaysiz. Hidlab ham bo'lmaydi, shakli ham yo'q. Masalan, binokor mehnati natijasida yangi bino dunyoga keladi. O'qituvchining esa shogirdlari bor. Shu sabab bizda ko'pchilik hali tushunib yetmaydi kim u dasturchi, ayniqsa yoshi kattaroq inson bo'lsa, har qancha tushuntirsangiz ham, yakuniy taasurot "Haaa, kompyuter ustamisan?" bo'ladi.

Maktabda fizika eng sevimli fanim bo'lgan. Hozirgacha dasturlashdagi muammolarni fizika muammolaridek qabul qilaman. Fizikada masalani yechishda eng birinchi katta qadam bu uni to'g'ri va to'liq tushunib olish, dasturlashdayam shunaqa. Ayniqsa, fizikaning Elektrodinamika bo'limi man uchun har doim qiziqarli bo'lgan. Demak, bugungi maqola, oxirgi bir necha oy bo'sh vaqtlarimni bandga aylantirgan "LED cube 8x8x8" haqida bo'ladi. Qurilmani o'zimiz yasashga va unga dastur yozishga urinib ko'ramiz. Natija esa shaklga va jismga ega bo'ladi. Maqolani to'rtta tarkibiy qismga bo'lib oldim. Keling maqolani yakuniy natijaning namoyishidan boshlaylik.

Maqolaning bevosita asosiy qismiga o'tishdan oldin qurilmani yaratishda ishlatiladigan zaruriy qismlarni sanab o'tsam. Demak, quyida qaysi tarkibiy qismdan nechta kerakligi berilgan. (Ehtimoliy xatoliklar uchun sal ortig'i bilan bo'lgani ma'qul.)

100 Om qarshilik 100 ta
240 Om qarshilik 10 ta
Prototip tayyorlash uchun yarim tayyor plata 1 ta
20 pinlik IC soket 10 ta
16 pinlik IC soket 5 ta
74HC574 IC 8 ta
74HC138 IC 1 ta
8-pin male header(Nima deb tarjima qilishni bilolmadim, qilgan tarjimalarim ko'zimga hunuk bo'lib ko'rindi) 9 ta
PN2222A NPN turidagi tranzistor 20 ta
1000µF kondensator 1 ta
100µF kondensator 5 ta
10µF kondensator 5 ta
0.1µF kondensator 10 ta
16 o'tkazuvchilik Ribbon turidagi sim 1 ta
16 talik Ribbon uchun konnektor 1 ta
3mm lik LED 600 ta
Arduino Nano yoki Arduino Uno 1 ta

1. LED cube konstruksiyasi.

Avvalo, "LED cube 8x8x8"ning o'zi nima? Bo'yi, eni va balandligi 8 tadan LED(svetodiod)dan iborat bo'lgan kub shaklidagi konstruksiya. Kubni o'zini yasab olish uchun jami 512 ta LED kerak bo'ladi. Masalan 10x10x10 o'lchamdagi kub uchun 1000 ta LED kerak bo'ladi. Arduino Nanodan foydalanganim va undagi pinlar eng ko'pi bilan 8x8x8 kub uchungina yetarli bo'lgani sabab 8x8x8 o'lchamdagi kubni yasashga qaror qildim. Loyiha davomida bir necha xatoliklarga yo'l qo'yildi. Shularning ichida eng kattasi ushbu loyihani amalga oshirish qarori bo'lsa kerak. Maslahatim, agar man kabi avvallari qo'lingizda payvandlagich ushlamagan bo'lsangiz, bu loyihaga kirishishdan oldin kichikroq boshqa ishlarni qilib ko'ring. Sababi, payvandlagich bilan juda ham ko'p va uzluksiz ishlashga to'g'ri keladi.

LED(Light-emitting diode,Светодиод) - ikki oyog'li o'zidan nur taratuvchi yarimo'tkazgichdir. Uzunrog' oyog'i anod(+), kaltarog'i esa katod hisoblanadi. Ushbu LEDlarning 512 tasini bir biriga ulagan holda kub yasab olamiz.

Kub yasash ham mayda ham murakkab ish, shuning uchun ishni shablondan boshlab olamiz. Shablon yaratish uchun yog'och yoki plastmas bo'lagi kerak bo'ladi. Va yog'ochga rasmda berilganidek kvadrat to'r chizib olib, chiziqlar kesishish nuqtalarini teshib olamiz. Hosil bo'lgan kvadratlar o'lchami LEDning katod uzunligiga teng bo'lishi lozim, taxminan 2.5 sm. Teshiklarni hosil qilayotganimizda imkon boricha teshiklarni to'g'ri perpendekulyar bo'lishiga harakat qilishimiz kerak. Shunda kubning qavatlari chiroyli va bir tekis chiqadi. Shu qadamda qilingan xato tufayli shablonni qaytadan yasashimga to'g'ri keldi. Drel ishlatish davomida LEDning diametr o'lchamlarini hisobga olish lozim, biz ishlatayotgan LED 3mm diametrga ega, teshiklar esa 3mm dan sal kattaroq bo'lgani ma'qul.

Keyingi qadamda shablonning teshiklariga quyidagi rasmda berilgani kabi LEDlarni joylaymiz va shu orqali teshiklarning juda keng/tor emasligini tekshirib olamiz.

So'ngra LEDlarning katodlarini bir tarafga qayirib olib payvandlash jarayonini boshlaymiz. Payvandlash borasida maslaxatlar: payvandlagichni uchini ingichkarog'ini ishlatilgani ma'qul ekan, ishingiz tezroq va osonroq bo'ladi. Undan tashqari doimo toza tutishga harakat qiling. Bir elementni payvandlash 2-3 sekundan oshmasligi lozim, aks holda LED ga zarar yetqazishingiz mumkin. Kubni yasab bo'lgandan keyin zarar yetgan LEDni almashtirish uchun qaysidur ma'noda jarrohlik amaliyotini o'tqazishga to'g'ri keladi. Ishontirib aytamanki, bu oson ish emas :).

Demak, har bir LEDning katodini qo'shni LEDning katodiga ulab chiqqanimizdan so'ng, LEDning qatorlarini tekis sim bilan bir biriga ulanadi. Aytgancha, yana bir narsa, har bir qavat tayyor bo'lgandan so'ng albatta har bir LED ni zararlanganmi yo'qmi tekshirib chiqing.

Ko'rib turganingizdek, yasalgan shablon mukammal emas o'z-o'zidan, LED qavat ham kamchiliklarga ega, lekin hechqisi yo'q, ko'z tegmaydi :) . Shu tarzda shunday qavatlardan 8tasini yasab olamiz. E'tibor bergan bo'lsangiz, har bir qavatta 1 dona katod va 64 ta anod mavjud buni yodda saqlang keyinroq nega bunday ekanligini tushuntirib o'tamiz.

8 ta qavatning barchasi tayyor bo'lgandan so'ng, qavatlarni o'zaro biriktirib chiqamiz. Aynan shu qadamdan boshlab loyihani eng qiyin va ko'p vaqt talab qiladigan qismi boshlanadi, bahonada sabr-toqatimizni sifat sertifikatidan o'tqazib olamiz :). Qavatlardagi har bir LEDning anodi o'zidan bitta yuqoridagi qavatda, aynan o'sha o'rinda joylashgan LEDning anodiga ulanadi. Qavatlarning orasi bir xil 2.5sm bo'lishi uchun, oddiy qog'ozdan balandligi 2.5sm ga teng bo'lgan uchburchak yasab olamiz.

Qavatlarni kubga qo'shib borish bilan birgalikda yana bir bor LEDlarni tekshirib olamiz, agar kuygan LED aniqlansa darrov boshqasiga almashtirish uchun.

Shu tarzda qavatlarni birlashtirish orqali kubni hosil qilib olamiz. Juda mayda ish shu sabab, tez tugatishga harakat qilmang, belingizga rahmiz kelsin :).

Shablondagi kamchiliklar oxir-oqibat kubimizning nomutanosib va bir tarafga og'ishgan bo'lib chiqishiga olib keldi. Yana bir bor hechqisi yo'q, xalqimizda maqol bor: "Beayb parvardigor". Diqqat qilayotgan bo'lsangiz, qavatlarning bir biriga anodlar orqali ulanishi natijasida yakunda 64 ta anod va 8 ta katod uchlar hosil bo'ldi.

2. Qurilmaning tuzilishi.

Tabriklar! Loyihamizning skeleti tayyor bo'ldi. Deyarli 1 oy vaqt olgan ushbu jarayonda bir necha katta xatoliklarga yo'l qo'ydim, bir necha LED qavatlari rasvo bo'ldi. Eng katta yutuq esa payvandlagichni qanday ishlatishni o'rgandim, youtubedan bir necha darsliklar ko'rdim. Nazarimda natija ham chakki emas.

Endigi navbat skeletimizni harakatga keltirib unga jon beruvchi miya - qurilma qismiga keldi.

Quyida berilgan sxemani tushunish va unga amal qilishda maktabda va TATUda olingan bilimlar qo'l keldi.(Rasmni kattaroq o'lcham ko'rish uchun uning ustiga bosing.)

Qurilma uchun qo'llanilgan zaruriy qismlar:

Har safar shu rasmni ko'rganimda qorbobodan sovg'a olgan yosh boladek xursand bo'laman. Darvoqe, kirib kelayotgan yangi yillaring bilan azizlar! :)

Shu yerdan shaxmat o'ynashni boshlaymiz. Bilasizmi kuchli shaxmatchilar keyingi yurishlarini oldindan ko'ra bilibgina tosh surar ekan. Biz ham shunday qilamiz, sxema mavjud - endi shu sxemaga amal qilib, zaruriy qurilmalarni plataga biriktira boshlaymiz. Buning uchun esa, nimani qachon va qayerga ulashimizni oldindan bilishimiz shart. Shart so'zini ishlatishimning boisi, shunday qilmaganim sabab platani qaytadan qurishga to'g'ri kelganidir. Ishni esa 74HC574 dan boshlaymiz. Shu o'rinda maslahat, har bir ehtiyot qismni ishlatishdan avval u haqida ozroq izlaning, google dan yordam so'rang, u ko'p narsani biladi. Ularning har biriga hozir to'liq to'xtalib o'tmayman. Qisqacha mantiqiy qurilmalar haqida gapirsam, 74HC138 bu arduinodan kelgan signalni 8 bit ma'lumotga dekod qilib 74HC574ga uzatadi, 74HC574 esa kelgan 1 bayt tarkibidagi qiymati 1 bo'lgan bitlarni kubning kerakli qatorlariga HIGH(aruinodagi signal nomi) ko'rinishida beradi, yakunda LEDlar manbalanadi, qatorlar haqida esa sal keyinroq. 74HC574 va 74HC138 mantiqiy qurilmalar juda nozik. Oz miqdordagi issiqlik ham ularni yaroqsiz holatga keltirishi mumkin. Shu sabab 20-pinlik IC konnektorlardan foydalanamiz. Plata tayyor bo'lgandan so'ng, osongina mantiqiy qurilmalarni IC konnektorlarga joylaymiz. Payvandlash jarayonida ikki qoidaga qattiq amal qilish lozim: 1- payvandlagichning uchi doim toza bo'lishi kerak, 2- payvandlash jarayoni 2-3 sekunddan oshmasligi lozim. Agar bir urinishda qilib bo'lmasa 5-6 sekund sovutib yana urinish zarur.

Demak, sxemada berilganidek 20-pinlik IClarni plataga quyidagi ko'rinishda payvandlaymiz.

Shu tarzda 8ta 74HC574ning barchasini plataga payvandlab chiqamiz. Nega aynan 8ta deysizmi? Eslasangiz, kubni yasash davomida LEDlarning anodi o'zidan yuqorida joylashgan LEDning anodiga ulangan edi. Ya'ni bir ustun. Eng yuroqidagi LEDga signal berish orqali butun ustunga signal beramiz. 74HC574larning bittasi shunday ustunlarning 8tasini boshqara oladi, ya'ni 1ta qatorga 1ta 74HC574.

74HC574lar plataga joylashtirilgach, ularning har birining chiqish nuqtalariga 100 Omlik qarshilik ulaymiz. Undan tashqari, qarshiliklarning ikkinchi uchiga yuqoridagi jadvalda tarjima qilishga qiynalganmiz 8-pin male headerni ulaymiz. Keyinchalik kubdan kelgan qatorlar shu pinlarga ulanadi. Demak, ja'mi 64 ta qarshilik va 8ta 8-pin male header. Shu o'rinda, ba'zi bir qadamlar orasida azbaroyi qiziqib ketganimdan rasm olish yoddan ko'tarilibdi, shu sabab aybga buyurmaysiz.

So'ngra 74HC574larning VCC(kuchlanish kirish nuqtasi) va GRD("zemlya") larini o'zaro ulab chiqamiz. Qizil rangli sim kuchlanish uchun, qora ranglisi "-"lar uchun. Plataning chegara qismida ikki quyma chiziqlarning birinchisi kuchlanish manbaiga ulansa, ikkinchisi GRDga ulanadi.

Shu o'rinda o'zim yo'l qo'ygan xatolik haqida gapirib o'tsam, har bir mantiqiy qurilmaning VCC kirishi oldida DC kondensator qo'yilishi lozim, bundan maqsad mantiqiy qurilmalar juda tez ishlaydi va ularga tezkorlik bilan elektr kuchlanish zarur bo'ladi. DC kondensator esa ushbu vaqtinchalik kuchlanishni saqlab kerakli vaqtda uzatib berish imkoniyatini beradi. Kichik lekin juda muhim element! Buning uchun 0.1µF kondensator kerakli kuchlanish bemalol yetqazib bera oladi. Bu narsani vaqtida qilmaganim keyinchalik ma'lum bir qiyinchiliklar keltirib chiqardi. Rasmda qizil chiziqlar bilan belgilangan.

Keyingi qadamda 74HC574 larning kirish nuqtalarini o'zaro ulab chiqamiz, buning uchun yashil simdan foydalanamiz. Kub konstruksiyasini yasab olish qiyin deb o'ylagan edim, yo'q aslida ushbu qadam eng qiyin bo'lib chiqdi. Yana bir masalahat, simni diametri kichikrog'ini ishlating, payvandlash osonroq bo'ladi.

Shu tarzda barcha 74HC574larni bir-biriga ulab chiqamiz.

Shu bilan elektr qurilmamizni birinchi qismi tayyor, navbat ikkinchi qismiga. Plataga elektr rezerv va qurilmaning holati haqida xabar beruvchi LEDni qo'shamiz. Sxemada berilgani kabi payvandlaymiz. 1000µF, 100µF va 10µF kondensatorlarni parallel, LED va 240Omlik qarshilikni kuchlanishi yo'lakchasiga ketma-ket ulaymiz.

Keyingi qadamda esa 74HC138 mantiqiy qurilmani va Arduino Unoni plataga qo'shamiz, 74HC138ning VCC oldidan 0.1µF kondensatorni ham ulashni yoddan chiqarmang.

74HC574ning kirish(yashil sim) va OE(oq sim) nuqtalaridan kelgan simlarni 20-pinlik IC konnektorga va Arduino Unoga sxemada ko'rsatilgan ulaymiz. Aytgancha, sariq rangli simlar 74HC574larning CP nuqtalarini o'zaro tutashtirgan, aynan shu nuqtadan qaysi LED yoqish haqida 8bit buyruqlar keladi. Yana bir ayyorlik, simlar bir birga juda yaqin turgani sabab, o'zaro tutashib qolish hafvini oldini olish uchun super yelimdan ozroq quyib yuborilsa, olam guliston :)

sxema bizga aytayotgan ketma-ketlik bo'yicha 74HC138 dekoderning A0,A1,A2 nuqtalarini Arduinoning tegishli pinlariga sariq sim yordamida payvandlab chiqamiz, undan tashqari 74HC138 va Arduinoni plataning umumiy kuchlanish chizig'iga rasm(sxema)dagidek ulab chiqamiz.

Plataning chetlariga sxemada ko'rsatilgani kabi 2N222 NPN turidagi tranzistorlarni ulab chiqamiz va transiztorlarnining bazasiga 100 Omlik qarshiliklar bilan birlashtiramiz. Emitter esa GRDga ulanadi. Plataning tepa qismiga boshqa bit 8-pin male header 100 Omlik qarshilik orqali kuchlanish chizig'iga ulaymiz. Bu pinlarga kubning katodlari kelib ulanadi. Qurilma deyarlik tayyor.

So'nggi qadam, katod pinlarini ko'k sim orqali ikkitasi o'zaro kollektor orqali biriktirilgan tranzistorlarning kollektoriga ulanadi, sariq sim yordamida esa ikki transiztorning bazalari o'zaro qarshilik yordamida ulangan qismiga payvandlanadi. Sariq simlarning ikkinchi uchi Arduinoning A0-A7 analog pinlariga ulanadi. Bu ozroq murakkab tranzistorlar to'plami bir vaqtda kubning faqat bir qavatini ishga tushirish imkonini beradi.

Shunday qilib qurilma tayyor bo'ldi, ushbu qismni tayyorlab olish 1 oy atrofida vaqt oldi.

3. Kubni va qurilmani birga ulash.

Yuqoridagi ikki qismga nisbatan osonroq kechgan ushbu qismda kub konstruksiyasini va elektron qurilmani o'zaro ulab olamiz. Buning uchun kub yog'och shablonimizga ehtiyotkorlik bilan joylab olamiz. Kubning 64 anodi shablonning 64ta teshigiga to'g'ri kelishi lozim. Shundan so'ng 16 o'tkazgichli ribbon turidagi kabelarimizning uchiga ribbon konnectorlarni ulaymiz. Umumiy 9ta kabel, 8tasi kubning anodlari uchun 1tasi esa katod uchun.

Kabelning ikkinchi uchini quyidagi rasmda berilgani kabi ochib olamiz.

kabellarimiz tayyor bo'lgach kubning katod qatoridan boshlab birma-bir ulab chiqamiz.

Aytgancha, yakunda kabellarning izolyatsiyasi haqida unutmang, bizga qisqa tutashuv aslo kerak emas! So'nggi natija quyidagidek bo'lishi lozim.

Vanihoyat, kabellarni plataning mos pinlariga ulab chiqamiz. Kelajakda debuggingni osonroq bo'lishi uchun har bir kabelni belgilab olamiz.

4. Dasturiy ta'minot.

So'nggi va eng muhim qism. Shu yerga dasturchi ekanligimiz yodga tushadi :). Arduino Uno kompyuterga ulanadi va o'zimiz yasagan temirga nima qilishni o'rgata boshlaymiz. <sarkazm>Barcha o'zini hurmat qilgan dasturchilar</sarkazm> kabi tayyor kodni olamiz va uni o'z maqsadlarimiz tomon o'zgaritramiz. Kod asosan ikki qismdan iborat.

1.Kubni ma'lum bir vaqt orali'gida doimiy o'zgartirib turish
ISR (TIMER2_COMPA_vect)
{
    int i;
    // all layer selects off
    PORTC = 0x00;
    PORTB &= 0x0f;
    PORTB |= 0x08; // output enable off.
    for (i=0; i<8; i++)
    {
        PORTD = cube[current_layer][i];
        PORTB = (PORTB & 0xF8) | (0x07 & (i+1));
    }
    PORTB &= 0b00110111; // Output enable on.
    if (current_layer < 6)
    {
        PORTC = (0x01 << current_layer);
    } else if (current_layer == 6)
    {
        digitalWrite(12, HIGH);
    } else
    {
        digitalWrite(13, HIGH);
    }
    current_layer++;
    if (current_layer == 8)
        current_layer = 0;
}

Arduino kubni doimiy o'zgartirish sxemasi ishlashni boshlagandan so'ng xohlagan ko'rinishni chizishingiz mumkin. Buni uchun esa ikkinchi Aruduinoning loop() metodi ishlatiladi.

2. Loop metod matni
void loop()
{
    int cnt;
    while (true)
    {
        normatov();
        effect_planboing(AXIS_Z, 400);
        effect_planboing(AXIS_Y, 400);
        effect_planboing(AXIS_X, 400);
        effect_blinky2();
        effect_random_filler(75,1);
        effect_random_filler(75,0);
        effect_rain(100);
        effect_boxside_randsend_parallel (AXIS_X, 0, 150, 1);
        effect_boxside_randsend_parallel (AXIS_X, 1, 150, 1);
        effect_boxside_randsend_parallel (AXIS_Y, 0, 150, 1);
        effect_boxside_randsend_parallel (AXIS_Y, 1, 150, 1);
        effect_boxside_randsend_parallel (AXIS_Z, 0, 150, 1);
        effect_boxside_randsend_parallel (AXIS_Z, 1, 150, 1);
        effect_intro();
        zoom_pyramid();
        zoom_pyramid_clear();
        zoom_pyramid();
        zoom_pyramid_clear();
        firework(0,0,0);
        firework(-2,-2,50);
        firework(1,1,-250);
        firework(0,1,200);
        firework(1,-3,400);
        firework(2,-3,600);
        firework(2,1,500);
        firework(2,-2,200);  
        firework(2,1,0);
        firework(0,0,0);
        firework(2,-2,500);
        space(100);
        space(100);
        for(cnt=0;cnt<501;cnt+=100)
            turning_cross_animation(cnt);
        for(cnt=500;cnt>=0;cnt-=100)
            turning_cross_animation(cnt);
        turning_cross(300);
    }
}

Kodning to'liq matni bilan ushbu link orqali tanishishingiz mumkin.

Qurilmaning yaratilishida www.pyroelectro.com va www.instructables.com resurslaridan foydalanildi.

E'tiboringiz uchun rahmat, fikr va mulohazlar yoki savollar bo'lsa izoh sifatida qoldiring. So'ngi so'z o'rnida: izlanishdan to'xtamang, zero izlanish taraqqiyot omilidir.

Maqola so'ngida yana bir bor demo:

Manba:

diy arduino 3D normatov cube 16-Mart 19:54 592

JONNY

Muallif haqida

JONNY Arduino, Java, C#, Android, Windows, Linux, Debian, Javascript.


Blogdagi so‘nggi maqolalar:


Fikrlar 1

Murodakhmedov99
Murodakhmedov99
Maqolaga gap so'z bo'lishi mumkin emas judayam zo'r yozilgan.Bu proyekt sizga qanchaga tushdi? Narsalarni aliexpressdan olgansizov adashmasam
Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!