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

Arduinoflake!

Komponen dan persediaan

Arduino Nano R3
× 1

Tentang proyek ini

Snowflake terdiri dari 30 LED yang dikelompokkan menjadi 17 segmen independen yang dapat dikontrol secara terpisah oleh mikrokontroler Arduino Nano. Setiap grup LED dapat diredupkan dengan PWM untuk membuat beberapa animasi yang indah.

Alat

Yang Anda perlukan hanyalah besi solder, solder, dan tang.

Konstruksi

Pertama-tama pilih beberapa pola. Saya memilih kristal kepingan salju yang bagus dan sederhana dan mencetaknya ke ukuran yang sesuai dengan Arduino Nano di dalam segi enam - inti kristal.

Struktur pendukung yang juga berfungsi sebagai kabel dibuat dari batang kuningan 0,8 mm yang disolder bersama dengan timah. Saya telah menggunakan 2m batang secara total. Mengapa bentuk bebas? Karena saya selalu ingin mencobanya dan ini menguji kesabaran dan keterampilan Anda.

Pertama saya membuat segi enam inti dengan menekuk satu batang dan menyolder ujungnya menjadi satu. Dengan menambahkan 6 batang lagi ke bagian atas segi enam, kabel ground selesai, semua kabel katoda LED sekarang perlu disolder untuk membuat pola kepingan salju. Bagian yang sulit adalah menambahkan LED SMD tetapi saya membantu diri saya sendiri dengan jig yang dibuat dari karton dan selotip dua sisi.

Selanjutnya adalah waktu untuk menambahkan mikrokontroler Arduino Nano di bawah struktur inti yang menyisakan ruang yang cukup di antaranya untuk memuat 3 lapis kabel batang kuningan yang akan menghubungkan pin mikrokontroler ke semua anoda LED. Ini membutuhkan kesabaran yang luar biasa. Anda tidak hanya perlu menghindari korsleting di antara kabel, tetapi juga menambahkan resistor pembatas arus dan membuatnya terlihat bagus.

Daun LED terhubung secara terpisah masing-masing ke pin output Arduino terdekat. Cabang LED dikelompokkan menjadi dua dan dihubungkan ke pin PWM. Core LED juga dikelompokkan menjadi dua dan terhubung ke pin lainnya. Arduino NANO hanya memiliki 18 pin output (A6 dan A7 adalah input saja) dan saya membutuhkan satu pin untuk sensor sentuh, yang membuat saya hanya memiliki 17 pin sehingga dua pasang LED inti dihubungkan bersama untuk membuat grup 4. I saya menggunakan resistor 220Ω untuk membatasi arus yang mengalir melalui setiap pin sekitar 8mA. Itu berarti total 240mA yang sedikit tinggi untuk chip ATmega328 tetapi berfungsi - maksimum yang aman dikatakan 200mA.

Sensor sentuh

Untuk dapat berinteraksi dengan kepingan salju, saya menambahkan batang kuningan lain untuk membuat sensor sentuh kapasitif. Saya menemukan perpustakaan dan tutorial yang bagus oleh Paul Stoffregen. Sensor sentuh digunakan untuk berinteraksi dengan arduinoflake - mengubah animasi, menghidupkan/mematikan, berkilau saat disentuh, sebut saja...

Catatan terakhir

Jangan lupa untuk memeriksa semua dioda sebelum menyolder, akan sangat sulit untuk menukarnya jika rusak atau terhubung dalam polaritas terbalik.

Kode

Awalnya saya pikir saya hanya dapat meredupkan LED cabang yang terhubung ke pin PWM perangkat keras. Tapi untungnya ada perpustakaan PWM perangkat lunak yang luar biasa yang memungkinkan saya menggunakan semua pin seolah-olah itu adalah PWM perangkat keras. Pengaturan ini menciptakan kemungkinan tak terbatas untuk animasi! Lihat kode terlampir di bawah ini dengan beberapa animasi pertama.

Kode

  • kepingan salju.ino
kepingan salju.inoArduino
Kode sumber
#include "SoftPWM.h"#include byte edgeLedPins[] ={13, A4, A5, 2, 8, 12};byte middleLedPins[] ={10, 6, 3, 5, 9, 11};byte innerLedPins[] ={A2, A3, A1, 4, 7, A1};ADCTouchSensor touchSensor =ADCTouchSensor(A0, 1); void setup() { Serial.begin(115200); SoftPWMBegin();}byte animation =0;long touchAt =0;void loop() { switch (animasi) { case 0:_fill(100); merusak; kasus 1:ShinyAnimation(); //fadinganimation(); merusak; kasus 2:lingkaranAnimation(); merusak; kasus 3:loopAnimation(); merusak; kasus 4:animasi kembang api(); kembang apiAnimasi(); kembang apiAnimasi(); kembang apiAnimasi(); kembang apiAnimasi(); kembang apiAnimasi(); animasi ++; merusak; kasus 5:smileAnimation(); merusak; default:animasi =0; merusak; } int touchValue =touchSensor.read(); if (touchAt + 2000  1000) { touchAt =millis(); // touch down, cold down timeout adalah animasi 2 detik ++; _isi(0); }}void fireworkAnimation() { for (int i =0; i <4; i++) { SoftPWMSet(innerLedPins[i], 100); penundaan(100); } SoftPWMSet(InnerLedPins[4], 100); for (int i =0; i <6; i++) { SoftPWMSet(middleLedPins[i], 255); } penundaan(50); for (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], 0); SoftPWMSet(edgeLedPins[i], 255); } penundaan(50); for (int i =0; i <6; i++) { SoftPWMSet(middleLedPins[i], 0); } penundaan(50); _fill(0);}void smileAnimation() { SoftPWMSet(innerLedPins[1], 100); SoftPWMSet(InnerLedPins[3], 100); SoftPWMSet(tengahLedPins[0], 255); SoftPWMSet(LedPin tengah[5], 255); SoftPWMSet(edgeLedPins [2], 255); SoftPWMSet(edgeLedPins[3], 255); penundaan(2000); SoftPWMSet(InnerLedPins[1], 0); SoftPWMSet(InnerLedPins[3], 0); penundaan(100); SoftPWMSet(InnerLedPins[1], 100); SoftPWMSet(InnerLedPins[3], 100); penundaan(100); SoftPWMSet(InnerLedPins[1], 0); SoftPWMSet(InnerLedPins[3], 0); delay(100);}byte circleState[] ={100, 55, 10};byte circleStateAnimation[] ={1, 1, 1};void circleAnimation() { for (int i =0; i <3; i++) { if (circleState[i]>=100) { circleStateAnimation[i] =-1; // redup } else if (circleState[i] <=10) { circleStateAnimation[i] =1; // bright } circleState[i] +=circleStateAnimation[i]; } for (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], circleState[0]); SoftPWMSet(middleLedPins[i], circleState[1]); SoftPWMSet(edgeLedPins[i], circleState[2]); } delay(5);}byte waveState[] ={100, 55, 10, 10, 55, 100};byte waveStateAnimation[] ={1, 1, 1, -1, -1, -1};void waveAnimation () { for (int i =0; i <6; i++) { if (waveState[i]>=100) { waveStateAnimation[i] =-1; // redup } else if (waveState[i] <=10) { waveStateAnimation[i] =1; // terang } waveState[i] +=waveStateAnimation[i]; } for (int i =0; i <6; i+=2) { SoftPWMSet(InnerLedPins[i], waveState[0]); SoftPWMSet(middleLedPins[i], waveState[1]); SoftPWMSet(edgeLedPins[i], waveState[2]); SoftPWMSet(InnerLedPins[i + 1], waveState[3]); SoftPWMSet(middleLedPins[i + 1], waveState[4]); SoftPWMSet(edgeLedPins[i + 1], waveState[5]); } delay(10);}byte loopCounter =0;byte loopState =150;void loopAnimation() { SoftPWMSet(innerLedPins[loopCounter], loopState); SoftPWMSet(middleLedPins[loopCounter], loopState); SoftPWMSet(edgeLedPins[loopCounter], loopState); loopCounter =_nextIndex(loopCounter, 1); if (loopCounter ==0) { loopState =(loopState ==150 ? 0 :150); } delay(100);}byte slowOnCounter =0;byte slowOnState =150;void slowOnAnimation() { byte randomLed =random(0, 18); if (RandomLed <6) { SoftPWMSet(innerLedPins[randomLed], slowOnState); } else if (randomLed <12) { SoftPWMSet(middleLedPins[randomLed - 6], slowOnState); } else { SoftPWMSet(edgeLedPins[randomLed - 12], slowOnState); } slowOnCounter++; if (slowOnCounter>=50) { slowOnCounter =0; slowOnState =(slowOnState ==150 ? 0 :150); } delay(50);}byte shinyState[] ={0, 100, 0, 100, 0, 100};byteshinyStateAnimation[] ={1, 1, 1, 1, 1, 1};byte shinyCounter =0; void glossyAnimation() { for (int i =0; i <6; i++) { if (shinyState[i]>=100) { shinyStateAnimation[i] =-1; // redup } else if (shinyState[i] <=0) { shinyStateAnimation[i] =1; // terang } keadaan mengkilap[i] +=animasi keadaan mengkilap[i]; SoftPWMSet(edgeLedPins[i], mengkilapState[i]); } penghitung mengkilap ++; if (penghitung pengkilap>
 10) { penghitung pengkilap =0; for (byte r =random(1, 3); r> 0; r--) { byte randomLed =random(0, 12); if (RandomLed <6) { SoftPWMSet(innerLedPins[random(0, 6)], 255); } else { SoftPWMSet(middleLedPins[random(0, 6)], 255); } } } else { for (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], 20); SoftPWMSet(Pin Led tengah[i], 20); } } delay(30);}byte fadingState[] ={0, 100, 0, 100, 0, 100};byte fadingStateAnimation[] ={1, 1, 1, 1, 1, 1};void fadingAnimation() { for (int i =0; i <6; i++) { if (fadingState[i]>=100) { fadingStateAnimation[i] =-1; // redup } else if (fadingState[i] <=0) { fadingStateAnimation[i] =1; // bright } fadingState[i] +=fadingStateAnimation[i]; SoftPWMSet(edgeLedPins[i], fadingState[i]); SoftPWMSet(middleLedPins[_nextIndex(i, 1)], fadingState[i]); SoftPWMSet(PinLed dalam[i], 50); } delay(20);}void _fill(nilai byte) { for (int i =0; i <6; i++) { SoftPWMSet(edgeLedPins[i], nilai); SoftPWMSet(middleLedPins[i], nilai); SoftPWMSet(innerLedPins[i], nilai); }}byte _prevIndex(indeks pendek, langkah byte) { indeks -=langkah; while (indeks <0) { indeks +=6; } mengembalikan indeks;}byte _nextIndex(indeks pendek, langkah byte) { indeks +=langkah; while (indeks> 5) { indeks -=6; } mengembalikan indeks;}

Skema


Proses manufaktur

  1. Untuk Apa Pin Dowel Digunakan?
  2. Terbuat dari Apa Pin Dowel?
  3. 5 Hal yang Perlu Dipertimbangkan Saat Memilih Pin Dowel
  4. Rolling Pin
  5. Pin Bowling
  6. Pin Pengaman
  7. Pin sistem berdaya sangat rendah yang diharapkan AI pada TinyML
  8. Kabel pemutus I/O Raspberry PI dan adaptor plugboard
  9. Segitiga Dinamis
  10. BGA – Apa Itu?