Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Kubus LED 8x8x8 RGB

Komponen dan persediaan

RGB Diffused Common Anode
× 512
Driver LED DM13A
× 12
74HC138 3 hingga 8 baris dekode
× 1
MOSFET P-Channel IRF9640
× 8
Arduino UNO
Anda juga dapat membuat versi papan tempat memotong roti hanya dengan ATmega328, kristal 16Mhz, kapasitor 2 x 22pf
× 1
Catu Daya Sakelar 5V 2.5A yang Digilent
× 1
Resistor 10k ohm
× 8
Resistor 1k ohm
× 8
Resistor 100 ohm
× 8

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Video

Bangun

Bangunan ini terinspirasi oleh kubus Kevin Darrah RGB.

Melihat tubuh Kevin, kesabarannya tidak terbatas - sayangnya milikku.

Saya memutuskan untuk mengganti 24 register geser, 192 transistor, dan 640 resistor dengan 12 driver LED DM13a (masing-masing sekitar $1 US di eBay).

Kubus itu sendiri dibangun seperti yang dijelaskan Kevin dalam video berikut:

Setelah kubus dibuat, saya membuat papan sirkuit tercetak menggunakan metode Toner untuk menampung chip driver DM13A dan kubus itu sendiri. Daripada membayar biaya papan yang dibuat secara komersial dengan pelapisan lubang, saya memutuskan untuk menyerahkan setiap koneksi LED ke pin DM13A yang sesuai menggunakan kawat pembungkus kawat. File Eagle yang disertakan berisi versi kabel tangan serta versi rute otomatis (belum diuji).

Mikroprosesor dan papan anoda juga memiliki MSGEQ7 - Equalizer Grafis Seven Band dan pre-amp mikrofon yang saya rencanakan untuk dicoba di masa mendatang. Saat ini, mereka tidak digunakan. Jika Anda ingin menggunakan papan UNO atau Nano komersial, yang Anda butuhkan hanyalah dekoder 74HC138 3 hingga 8 baris dan 8 MOSFET P-Channel dan resistor terkait. Anda bisa memasangnya di beberapa papan proto jika Anda mau.

Catu daya 5V 20W dibeli di eBay. Saya membuat kasing dari kayu pinus berukuran 40mm x 9mm.

Saya menambahkan beberapa animasi ke perangkat lunak kubus Kevin tetapi pada dasarnya tetap tidak berubah.

Kesimpulan

Anda seharusnya dapat membeli 600 x 5mm Common Anode LED RGB difused dari eBay dengan harga sekitar $30 US. Bahkan setelah menyederhanakan elektronik, pembangunan kubus sangat memakan waktu tetapi pada akhirnya, bermanfaat.

Kode

  • Kubus_8x8x8_V1.ino
Cube_8x8x8_V1.inoC/C++
/*The 8x8x8 RGB LED Cube oleh John Bradnam berdasarkan karya Kevin DarrahTerbaruV12 17/04/2013 Catatan Rilis:V11- Memperbaiki bug dengan pengaturan waktu BAM- Memindahkan penyetelan pin Kosong ke ISR sehingga pin mati hingga ditulis ke operasi V12 bitwise untuk disetel pin LOW salah seharusnya PORTx &=~(1<// Perpustakaan SPI digunakan untuk mencatat data ke register geser#menentukan LATCH_PIN 2 //dapat menggunakan pin apa pun yang Anda inginkan untuk mengunci register geser#menentukan BLANK_PIN 4 // sama, dapat menggunakan pin apa pun yang Anda inginkan untuk ini, pastikan Anda menarik melalui a 1k to 5V#define DATA_PIN 11 // digunakan oleh SPI, harus pin 11#define CLOCK_PIN 13 // digunakan oleh SPI, harus 13#define LAYER_A 5 //74138 A Input#define LAYER_B 6 //74138 A Input# define LAYER_C 7 //74138 A Input#define SWITCH_PGM 10 //PB2#define SWITCH_SEQ 9 //PB1#define CUBE_SIZE 8 //Jumlah kolom, baris, atau level dalam kubus#define CUBE_MAX (CUBE_SIZE - 1) //Max cube in dex#define LEDS_PER_LEVEL (CUBE_SIZE * CUBE_SIZE) //Jumlah LED per level//***variabel***variabel***variabel***variabel***variabel***variabel***variabel***variabel //Variabel-variabel ini digunakan oleh multiplexing dan Kode Modulasi Sudut Bit//Inilah bagaimana kecerahan untuk setiap LED disimpan, //Setiap LED hanya perlu 'sedikit' untuk mengetahui apakah harus ON atau OFF, jadi 64 Bytes memberi Anda 512 bit=512 LED//Karena kami memodulasi LED, menggunakan resolusi 4 bit, setiap warna memiliki 4 larik yang berisi 64 bit setiap byte red0[LEDS_PER_LEVEL], red1[LEDS_PER_LEVEL], red2[LEDS_PER_LEVEL], red3[LEDS_PER_LEVEL];byte blue0[LEDS_PER_LEVEL], blue1[LEDS_PER_LEVEL], blue2[LEDS_PER_LEVEL], blue3[LEDS_PER_LEVEL];byte green0[LEDS_PER_LEVEL], green1[LEDS_PER_LEVEL], green2[LEDS_PER_LEVEL];/ resolusi akan memakan banyak lagi_, PER_LEVEL[LEDS_PER_LEVEL] lebih banyak RAMint level=0;//melacak level mana yang kami pindahkan data ke anodeLevel=0;//ini meningkat melalui level anodaint BAM_Bit , BAM_Penghitung=0; // Variabel Bit Angle Modulation untuk melacak hal-hal yang animasi =0; //Melacak animasi di loop utama//****setup****setup****setup****setup****setup****setup****setup**** setup****setup****setup****setup****setup****setupvoid setup(){ SPI.setBitOrder(MSBFIRST);//Bit Paling Signifikan Pertama SPI.setDataMode(SPI_MODE0); // Mode 0 Rising edge data, pertahankan clock rendah SPI.setClockDivider(SPI_CLOCK_DIV2);//Jalankan data pada 16MHz/2 - 8MHz //Serial.begin(115200);// jika Anda membutuhkannya? noInterrupts();// bunuh interupsi sampai semua orang siap //Kami menggunakan Timer 1 untuk menyegarkan kubus TCCR1A =B00000000;//Daftar A semua 0 karena kami tidak mengubah pin apa pun TCCR1B =B00001011;//bit 3 set untuk ditempatkan dalam mode CTC, akan memanggil interupsi pada pertandingan penghitung // bit 0 dan 1 diatur untuk membagi jam dengan 64, jadi 16MHz/64=250kHz TIMSK1 =B00000010;//bit 1 diatur untuk memanggil interupsi pada OCR1A cocok OCR1A=30; // Anda dapat bermain dengan ini, tetapi saya menyetelnya ke 30, yang berarti://jam kami berjalan pada 250kHz, yaitu 1/250kHz =4us //dengan OCR1A disetel ke 30, ini berarti interupsi akan dipanggil setiap ( 30+1)x4us=124us, // yang memberikan frekuensi multipleks sekitar 8kHz //akhirnya mengatur Output pinMode(LATCH_PIN, OUTPUT);//Latch pinMode(DATA_PIN, OUTPUT);//MOSI DATA pinMode(CLOCK_PIN, OUTPUT);//SPI Clock pinMode(LAYER_A, OUTPUT);//74138 A Input pinMode(LAYER_B, OUTPUT);//74138 B Input pinMode(LAYER_C, OUTPUT);//74138 C Input digitalWrite(LAYER_A, LOW); digitalWrite(LAYER_B, RENDAH); digitalWrite(LAYER_C, RENDAH); pinMode(SWITCH_PGM, INPUT);//PGM 1 / PGM 2 Beralih pinMode(SWITCH_SEQ, INPUT);//SEQ/COLOR Switch //pinMode(BLANK_PIN, OUTPUT);//Output Enable penting untuk melakukan ini terakhir, jadi LED melakukannya tidak berkedip saat boot SPI.begin();//start up perpustakaan SPI interupsi();//biarkan pertunjukan dimulai, ini memungkinkan multiplexing start}//***start loop***start loop*** start loop***start loop***start loop***start loop***start loop***start loop***start loopvoid loop(){ //Setiap animasi terletak di sub rutin // Untuk mengontrol LED, Anda cukup:// LED(level yang Anda inginkan 0-CUBE_MAX, baris yang Anda inginkan 0-CUBE_MAX, kolom yang Anda inginkan 0-CUBE_MAX, kecerahan merah 0-15, kecerahan hijau 0-15, kecerahan biru 0-15); if (digitalRead(SWITCH_PGM) ==TINGGI) test_leds(); lain { bersih(); animasi =animasi + 1; switch (animasi) { kasus 1:rainVersionTwo(20); merusak; kasus 2:folder(10); merusak; kasus 3:sinwaveTwo(15); merusak; kasus 4:warna acak(10); merusak; kasus 5:wipe_out(10); merusak; kasus 6:bouncyvTwo(15); merusak; kasus 7:color_wheelTWO(10); merusak; kasus 8:harlem_shake(); merusak; kasus 9:riak (10); merusak; kasus 10:animasi =0; merusak; } }}//**** LED Routine**** LED Routine**** LED Routine**** LED Routinevoid LED(int level, int baris, int kolom, byte merah, byte hijau, byte biru){ // Di sinilah semuanya dimulai // Rutinitas ini adalah bagaimana LED diperbarui, dengan input untuk lokasi LED dan tingkat kecerahan RG dan B-nya // Pertama, periksa dan pastikan tidak ada yang melampaui batas, cukup jepit di baik 0 atau 7 untuk lokasi, dan 0 atau 15 untuk tingkat kecerahan =kendala(tingkat, 0, CUBE_MAX); baris =kendala(baris, 0, CUBE_MAX); kolom =kendala(kolom, 0, CUBE_MAX); merah =kendala(merah, 0, 15); hijau =kendala(hijau, 0, 15); biru =kendala(biru, 0, 15); //Ada LED (CUBE_SIZE * CUBE_SIZE * CUBE_SIZE) di dalam kubus, jadi ketika kita menulis ke level 2, kolom 5, baris 4, itu perlu diterjemahkan ke dalam angka dari 0 hingga (CUBE_SIZE * CUBE_SIZE * CUBE_SIZE) - 1 //Led level pertama berada di urutan pertama, lalu level 2, lalu ketiga, dan seterusnya //Untuk kubus 4 x 4 x 4 (level * (4 * 4)) adalah yang mengindeks tempat awal level, jadi level 0 adalah LED 0 - 15, level 1 adalah LED 16 - 31, dan seterusnya //jika Anda melihat ke bawah pada kubus, dan hanya melihat di level bawah // 00 01 02 03 // 04 05 06 07 / / 08 09 10 11 // 12 13 14 15 //Untuk kubus 8 x 8 x 8, (level * (8 * 8)) adalah yang mengindeks tempat awal level, jadi level 0 adalah LED 0 - 63, level 1 adalah LED 64 - 127, dan seterusnya //jika Anda melihat ke bawah pada kubus, dan hanya melihat ke tingkat bawah // 00 01 02 03 04 05 06 07 // 08 09 10 11 12 13 14 15 // 16 17 18 19 20 21 22 23 // 24 25 26 27 28 29 30 31 // 32 33 34 35 36 37 38 39 // 40 41 42 43 44 45 46 47 // 48 49 50 51 52 53 54 55 // 56 57 5 8 59 60 61 62 63 //Kemudian, jika Anda menambah level, kanan atas grid di atas akan dimulai dari (CUBE_SIZE * CUBE_SIZE) //Alasan melakukan ini, agar Anda tidak perlu menghafal angka untuk setiap LED, memungkinkan Anda untuk menggunakan level, baris, kolom // Sekarang, bagaimana dengan pembagian dengan 8 di sana? //...well, kami memiliki 8 bit per byte, dan kami memiliki 64 byte dalam memori untuk semua 512 bit yang dibutuhkan untuk setiap LED, jadi //kita bagi angka yang baru kita temukan dengan 8, dan ambil bilangan bulatnya, jadi kita tahu byte mana, bit itu berada //confused? tidak apa-apa, mari kita ambil contoh, jika kita ingin menulis ke LED ke LED terakhir dalam kubus, kita akan menulis 7, 7, 7 // memberi (7*64)+(7*8)=7 =511, yang benar, tapi sekarang mari kita bagi dengan 8, 511/8 =63.875, dan ambil intnya sehingga, kita mendapatkan 63, //ini adalah byte terakhir dalam array, yang benar karena ini adalah LED terakhir // Dapatkan nomor LED 0 - 511 int wholebyte =(level * LEDS_PER_LEVEL) + (baris * CUBE_SIZE) + kolom; // Masukkan indeks ke dalam array. Setiap lokasi yang diindeks menampung satu byte atau 8 bit; int byte mana =int(seluruh byte / 8); int whichbit =(wholebyte &7); //Ini semua akan masuk akal dalam beberapa detik //Ini adalah resolusi warna 4 bit, jadi setiap warna berisi array x4 64 byte, penjelasan di bawah ini:bitWrite(red0[whichbyte], whichbit, bitRead(red, 0)); bitWrite(red1[byte mana], bit mana, bitRead(merah, 1)); bitWrite(red2[byte mana], bit mana, bitRead(merah, 2)); bitWrite(red3[byte mana], bit mana, bitRead(merah, 3)); bitWrite(hijau0[byte mana], bit mana, bitRead(hijau, 0)); bitWrite(hijau1[byte mana], bit mana, bitRead(hijau, 1)); bitWrite(green2[byte mana], bit mana, bitRead(hijau, 2)); bitWrite(hijau3[byte mana], bit mana, bitRead(hijau, 3)); bitWrite(blue0[byte mana], bit mana, bitRead(biru, 0)); bitWrite(blue1[byte mana], bit mana, bitRead(biru, 1)); bitWrite(blue2[byte mana], bit mana, bitRead(biru, 2)); bitWrite(blue3[byte mana], bit mana, bitRead(biru, 3)); //Apakah kamu sekarang lebih bingung? Anda tidak harus! Ini mulai masuk akal sekarang. Perhatikan bagaimana setiap baris adalah bitWrite, yaitu, //bitWrite(byte yang ingin Anda tulis, bit byte yang akan ditulis, dan 0 atau 1 yang ingin Anda tulis) //Ini berarti 'byte mana' adalah byte dari 0-63 di mana bit yang sesuai dengan LED dari 0-511 //Apakah masuk akal sekarang mengapa kami melakukan itu? mengambil nilai dari 0-511 dan mengubahnya menjadi nilai dari 0-63, karena setiap LED mewakili bit dalam //sebuah larik 64 byte. //Kemudian baris berikutnya adalah bit mana 'wholebyte-(8*whichbyte)' //Ini hanya mengambil nilai LED dari 0-511 dan mengurangkannya dari BYTE bitnya terletak di kali 8 //Pikirkan tentang itu, byte 63 akan berisi LED dari 504 hingga 511, jadi jika Anda mengambil 505-(8*63), Anda mendapatkan 1, artinya, //LED nomor 505 terletak di bit 1 dari byte 63 dalam array //apakah itu dia? Tidak, Anda masih harus melakukan bitRead kecerahan 0-15 yang Anda coba tulis, //jika Anda menulis 15 hingga MERAH, semua 4 array untuk LED itu akan memiliki 1 untuk bit itu, yang berarti akan menyala 100% //Inilah mengapa keempat larik membaca 0-4 dari nilai yang dimasukkan untuk MERAH, HIJAU, dan BIRU //semoga ini semua masuk akal?}//***MultiPlex BAM***MultiPlex BAM** *MultiPlex BAM***MultiPlex BAM***MultiPlex BAM***MultiPlex BAM***MultiPlex BAMISR(TIMER1_COMPA_vect){ //Rutin ini dipanggil di latar belakang secara otomatis pada frekuensi yang diatur oleh OCR1A //Dalam kode ini, saya mengatur OCR1A ke 30, jadi ini disebut setiap 124us, memberikan setiap level dalam kubus 124us waktu ON //Ada 8 level, jadi kita memiliki kecerahan maksimum 1/8, karena level harus dimatikan sebelum level berikutnya dihidupkan //Frekuensi multiplexing kemudian 124us*8=992us, atau 1/992us=sekitar 1kHz PORTD |=1 <=CUBE_SIZE) { fx =CUBE_MAX; fxm =-1; } merusak; kasus 1:fy =fy + fym; if (fy <0) { fy =0; fym =1; } if (fy>=CUBE_SIZE) { fy =CUBE_MAX; fym =-1; } merusak; kasus 2:fz =fz + fzm; jika (fz <0) { fz =0; fzm =1; } if (fz>=CUBE_SIZE) { fz =CUBE_MAX; fzm =-1; } merusak; } sakelar (acak (3)) { kasus 0:ftx =ftx + ftxm; if (ftx <0) { ftx =0; ftxm =1; } if (ftx>=CUBE_SIZE) { ftx =CUBE_MAX; ftxm =-1; } merusak; kasus 1:fty =fty + ftym; if (fty <0) {fty =0; ftm =1; } if (fty>=CUBE_SIZE) { fty =CUBE_MAX; ftm =-1; } merusak; kasus 2:ftz =ftz + ftzm; if (ftz <0) {ftz =0; ftzm =1; } if (ftz>=CUBE_SIZE) { ftz =CUBE_MAX; ftzm =-1; } merusak; } } //sementara bersih();}//wipeout//****rainVersionTwo****rainVersionTwo****rainVersionTwo****rainVersionTwo****rainVersionTwovoid rainVersionTwo(int runtimeInSeconds){ int x[LEDS_PER_LEVEL ], y[LEDS_PER_LEVEL], z[LEDS_PER_LEVEL], warna led; int xx[LEDS_PER_LEVEL], yy[LEDS_PER_LEVEL], zz[LEDS_PER_LEVEL], xold[LEDS_PER_LEVEL], yold[LEDS_PER_LEVEL], zold[LEDS_PER_LEVEL]; for(int addr =0; addr =200 &&warna led <300) { for(int addr =0; addr =300 &&ledcolor <400) { } if(ledcolor>=500 &&ledcolor <600) { } ledcolor++; if (warna led>=300) warna led=0; for(int addr =0; addr   

Skema

eagle_files_WfqPEUP7Mp.zip

Proses manufaktur

  1. Alarm Tanaman Peringatan Haus
  2. Kubus LED 5x5x5
  3. Jam Kata Italia
  4. Sigfox kWh Meter
  5. Pencampur Warna RGB Arduino
  6. Pemantau Suhu Bluetooth
  7. DMX RGB LED Luar Ruangan
  8. Kunci yang Dikendalikan Gerakan
  9. Input Analog Terisolasi untuk Arduino
  10. Ukur waktu reaksi Anda