Turinys:
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-13 06:57
Šis projektas parodys, kaip galite sukurti begalybės veidrodį. Pagrindinė koncepcija yra ta, kad ant veidrodžio esantys šviesos diodai sukuria šviesą, kuri atšoka nuo galinio veidrodžio iki priekinio veidrodžio, kur dalis šviesos išeina, kad galėtume pamatyti vidų, o kai kurie atsispindėtų atgal, ir sukuria begalinį efektą. Tai pagrįsta „Infinity Mirror“su „Ultra Sonic“jutikliais, kuriuos nurodo „Hack Sioux Falls“, ir kaip „JunezRiyaz“prijungti „I2C LCD“ekraną prie „Arduino Uno“.
Prekės
1. Šešėlių dėžutė (50 USD)
2. Vienpusis veidrodinis filmas (17 USD)
3. RGB LED šviesos juosta (30 USD)
4. „Arduino“(35 USD)
5. Veidrodis (10 USD)
Neprivaloma:
1. IR jutiklis ir nuotolinio valdymo pultas (20 USD)
2. LCD (20 USD)
3. 7 Moterų ir vyrų jungtys
4. 3 „Male to Male“jungtys
Įrankiai
1. Lituoklis
2. Vielos pjoviklis ir nuėmiklis
3. Kažkas, su kuo nupjauti veidrodį
*Atkreipkite dėmesį, kad visos CAD kainos ir dydžiai priklausys nuo naudojamos dėžutės.
1 žingsnis: veidrodžio ir veidrodinės plėvelės montavimas
Pirmas dalykas, kurį reikia padaryti, yra įdiegti veidrodį, kuris bus šešėlių dėžutės gale. Jūs norite gauti vieną, kuris yra tinkamo dydžio, arba didesnį ir tada jį supjaustyti. Tačiau tam reikia naudoti veidrodį, o ne plėvelę, nes norime, kad visa šviesa atsispindėtų atgal, veidrodinė plėvelė taip pat gali įgauti medžiagos, ant kurios ji yra, modelį, jei tai nėra stiklas.
Montuodami veidrodį būtinai pritvirtinkite jį šešėlių dėžutėje, kad veidrodis nejudėtų, rekomenduočiau naudoti mažus medžio gabalus ir vinis. Tuo metu, kai turėjau užbaigti šį projektą, neturėjau veidrodžio, todėl panaudojau filmą (galite pamatyti nuotraukose). Koncepcija veikia, bet ne labai gerai ir suteikia kampuotą ir chaotišką išvaizdą, kuri, mano nuomone, neatrodo gerai.
Kiekviena veidrodinė plėvelė bus šiek tiek kitokia, tačiau ta, kurią aš pasakiau, kad nuvalyčiau stiklą, ant kurio uždėjome plėvelę, kad panaudotumėte juostą, kad nuimtumėte apsauginę plėvelę, esančią vienoje pusėje, ir muiluotą vandenį purškiant butelis uždėjo plėvelę ant stiklo. Tada naudokite kredito kortelę arba valytuvą, kad pašalintumėte oro burbuliukus ir vandens perteklių. Dar kartą neturėjau stiklo, bet jis vis tiek veikia taip pat. Tada palikite stiklą išdžiūti per naktį ir tai turėtų būti padaryta.
2 žingsnis: LED juostelės nustatymas
Šviesos diodams aš tiesiog naudoju pridedamą dvipusę juostą, kad priklijuočiau prie rėmo, ir padariau skylę vielai išeiti. Kiekviename kampe lituodavau laidus, kad galėčiau prisijungti prie kitos juostos, kad dėžutės forma išliktų be užapvalintų kraštų. Įsitikinkite, kad juosteles nukirpkite tik tose vietose, kur yra kontaktai, kurie tai leistų, ir nekeiskite šviesos diodų jungimosi viena į kitą krypties, vadinamos poliškumo keitimu. Mano gautoje juostelėje buvo rodyklės, kad taip neatsitiktų, todėl būtinai patikrinkite, ar jos visos nukreiptos ta pačia kryptimi.
Aš padariau nedidelę skylę, kad galėčiau prijungti kabelį prie dėžutės išorės, mano turimi šviesos diodai buvo 3 kontaktų šviesos diodai, todėl turėjau maitinimo, įžeminimo ir duomenų jungtis. Duomenų jungčiai naudoju „Digital Pin 3“, prieš priklijuodami juos prie rėmo būtinai patikrinkite, ar jos veikia, ir įsitikinkite, kad naudojate tik rekomenduojamą įtampą, kuri yra 5–6 V.
3 žingsnis: IR jutiklio ir LCD montavimas (pasirinktinai)
Aš nusprendžiau naudoti IR jutiklį ir nuotolinio valdymo pultą, kad pakeisčiau apšvietimo efektus, ir naudoti LCD ekraną, kad parodytų vartotojui jų efektų parinktis.
Norėdami pritvirtinti skystųjų kristalų ir IR jutiklį, naudoju karšto klijų pistoletą ir priklijuokite juos prie rėmo viršaus ir prijunkite viską prie galo, bet nenorėjau, kad jie būtų pataisyti, nes gali tekti juos nuimti po projekto yra padaryta.
Norėdami prijungti skystųjų kristalų ir IR imtuvą, aš naudoju „Male to Female“jungtis, kurios prijungiamos prie „Arduino“, kad gautumėte duomenis, taip pat įžeminimą ir maitinimą. Norėdami viską prijungti, aš naudoju 12 kaištį su 2 kΩ rezistoriumi ant IR jutiklio duomenų kaiščio, analoginį kaištį A4 - LCD SDA ir analoginį kaištį 5 - LCD SCL.
4 žingsnis: kodas
Šiam projektui naudoju keletą bibliotekų, kurias turėsite atsisiųsti, kad galėtumėte jas naudoti. Aš ketinu juos čia įdėti, atminkite, kad aš naudoju „Windows“, todėl tai gali turėti įtakos, jei naudojate „Mac“ar „Linux“.
Turėsite pakeisti pikselių skaičių, atsižvelgdami į turimų šviesos diodų skaičių. Aš taip pat sukūriau serijinio monitoriaus sąsają, kad galėtumėte taip sąveikauti su ja, jei nenaudojate IR jutiklio.
// Bibliotekos
#include Adafruit_NeoPixel.h> #include #include #include // Smeigtukai ir pastoviosios reikšmės // Smeigtukai ir pastovios vertėskonst int RECV_PIN = 12; IRrecv irrecv (RECV_PIN); decode_results rezultatai; nepasirašytas ilgas key_value = 0; const int NUMPIXELS = 27;
Adafruit_NeoPixel pikseliai = Adafruit_NeoPixel (NUMPIXELS, 3);
LiquidCrystal_I2C LCD (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Kintamieji int IRNumb; int IRNumb2; int vaivorykštė = 0; uint32_t rainbowColor = pikseliai. Spalva (0, 0, 0); char įvestis = 0; char įvestis2 = 0; int r; int g; int b; int breakCondition = 0; void setup () {// Formalizuoja elementus, kurių nereikia kartoti. lcd.begin (16, 2); // 16 stulpelių ir 2 LCD ekrano eilučių apibrėžimas lcd.backlight (); // Norėdami įjungti foninį apšvietimą Serial.begin (9600); pixels.begin (); irrecv.enableIRIn (); Serial.println ("Įveskite 0, kad išjungtumėte šviesas"); // Pradžios instrukcijos Serial.println ("Įveskite 1, kad šviesos diodai taptų balti"); Serial.println ("Įveskite 2, kad šviesos diodai veiktų skirtingomis spalvomis"); Serial.println ("Norėdami rankiniu būdu pritaikyti LED spalvas, įveskite 3"); } void loop () {IRNumb = 10; „IRScan“(); mainOptions (); if (Serial.available ()> 0) {// Tikrina, ar yra simbolis? input = (char) Serial.read (); } // Renkasi įvairias parinktis, jei (input == '1' || IRNumb == 1) {rainbowColor = colourChange (255, 255, 255); // Baltas setAll (rainbowColor); // Atnaujina šviesos diodus} else if (input == '0' || IRNumb == 0) {rainbowColor = colourChange (0, 0, 0); // Off setAll (rainbowColor); // Atnaujina šviesos diodus} else if (input == '2' || IRNumb == 2) {breakCondition = 0; r = 0; g = 0; b = 0;
Serial.println ("Norėdami išeiti iš šio efekto, įveskite viską, kas nėra 2, tada bet kurią iš ankstesnių naujo efekto parinkčių.");
lcd.clear (); // Valyti ekraną lcd.setCursor (0, 0); lcd.print ("Išeiti naudojant bet kurį"); lcd.setCursor (0, 1); lcd.print ("nutirpęs! = 2"); (int i = 0; i = 48 && įvestis <= 57) || breakCondition == 1 || IRNumb! = 2) {// Tikrina, ar reikia išeiti iš efekto vaivorykštėColor = colourChange (0, 0, 0); setAll (vaivorykštės spalva); breakCondition = 1; pertrauka; } vaivorykštėSpalva = spalvaKeisti (i, 0, 0); setAll (vaivorykštės spalva); showStrip (); vėlavimas (100); } (int i = 0; i = 48 && įvestis <= 57) || breakCondition == 1 || IRNumb! = 2) {// Tikrina, ar reikia išeiti iš efekto vaivorykštėColor = colourChange (0, 0, 0); setAll (vaivorykštės spalva); breakCondition = 1; pertrauka; } g ++; vaivorykštėSpalva = spalvaKeisti (i, g, 0); setAll (vaivorykštės spalva); showStrip (); vėlavimas (100); } (int g = 0; g = 48 && įvestis <= 57) || breakCondition == 1 || IRNumb! = 2) {// Tikrina, ar reikia išeiti iš efekto vaivorykštėColor = colourChange (0, 0, 0); setAll (vaivorykštės spalva); breakCondition = 1; pertrauka; } r+= 2; vaivorykštėSpalva = spalvaKeisti (r, g, 0); setAll (vaivorykštės spalva); showStrip (); vėlavimas (100); } (int b = 0; b = 48 && įvestis <= 57) || breakCondition == 1 || IRNumb! = 2) {// Tikrina, ar reikia išeiti iš efekto vaivorykštėColor = colourChange (0, 0, 0); setAll (vaivorykštės spalva); breakCondition = 1; pertrauka; } r+= 2; g+= 5; vaivorykštėSpalva = spalvaKeisti (r, g, b); setAll (vaivorykštės spalva); showStrip (); vėlavimas (100); } mainOptions (); } else if (įvestis == '3' || IRNumb == 3) {r = 0; g = 0; b = 0;
Serial.println („Įveskite n, kad išeitumėte“);
Serial.println ("Naudokite w ir s, kad padidintumėte arba sumažintumėte raudoną spalvą"); Serial.println („Norėdami padidinti arba sumažinti žalią spalvą, naudokite r ir f“); Serial.println („Norėdami padidinti arba sumažinti mėlyną spalvą, naudokite y ir h“); lcd.clear (); // Išvalykite ekraną lcd.setCursor (0, 0); lcd.print ("išeiti: 0, 4/7: +/- raudona"); lcd.setCursor (0, 1); lcd.print ("5/8: žalia, 6/9: mėlyna");
while (įvestis2! = 'n' || IRNumb2! = 0) {
if (Serial.available ()> 0) {// ar yra simbolis? input2 = (char) Serial.read (); } // Serija.println (IRNumb2); IRNumb2 = 10; „IRScan2“();
jei (IRNumb2 == 0) {
pertrauka; } if (input2 == 'w' || IRNumb2 == 4) {r+= 2; vaivorykštėSpalva = spalvaKeisti (r, g, b); setAll (vaivorykštės spalva); showStrip (); } else if (input2 == 's' || IRNumb2 == 7) {r- = 2; vaivorykštėSpalva = spalvaKeisti (r, g, b); setAll (vaivorykštės spalva); showStrip (); } else if (input2 == 'r' || IRNumb2 == 5) {g+= 2; vaivorykštėSpalva = spalvaKeisti (r, g, b); setAll (vaivorykštės spalva); showStrip (); } else if (input2 == 'f' || IRNumb2 == 8) {g- = 2; vaivorykštėSpalva = spalvaKeisti (r, g, b); setAll (vaivorykštės spalva); showStrip (); }
kitaip jei (įvestis2 == 'y' || IRNumb2 == 6) {
b+= 2; vaivorykštėSpalva = spalvaKeisti (r, g, b); setAll (vaivorykštės spalva); showStrip (); }
kitaip jei (įvestis2 == 'h' || IRNumb2 == 9) {
b- = 2; vaivorykštėSpalva = spalvaKeisti (r, g, b); setAll (vaivorykštės spalva); showStrip (); }} mainOptions (); } setAll (rainbowColor); showStrip (); } void showStrip () {pixels.show (); } void setAll (uint32_t spalva) {for (int i = 0; i <NUMPIXELS; i ++) {pixels.setPixelColor (i, spalva); }} // Įveskite reikšmę nuo 0 iki 255, kad gautumėte spalvos vertę. uint32_t colourChange (int r, int g, int b) {return pixels. Color (r, g, b); } void mainOptions () {// Peržiūri pagrindines efekto parinktis lcd.clear (); // Išvalykite ekraną lcd.setCursor (0, 0); lcd.print ("0 Išjungus šviesą"); lcd.setCursor (0, 1); lcd.print ("1: balta šviesa"); vėlavimas (1000); lcd.clear (); // Išvalykite ekraną lcd.setCursor (0, 0); lcd.print ("2: spalvos efektas"); lcd.setCursor (0, 1); lcd.print ("3: rankinis"); vėlavimas (1000); } void IRScan () {if (irrecv.decode (ir rezultatai)) {
if (results.value == 0XFFFFFFFF)
results.value = key_value; else {//Serial.println(results.value, HEX); if (results.value == 0xFF6897 || results.value == 0xC101E57B) {IRNumb = 0; //Serial.println("0 "); } else if (results.value == 0x9716BE3F || results.value == 0xFF30CF) {IRNumb = 1; //Serial.println("1 "); } else if (results.value == 0x3D9AE3F7 || results.value == 0xFF18E7) {IRNumb = 2; //Serial.println("2 "); } else if (results.value == 0xFF7A85 || results.value == 0x6182021B) {IRNumb = 3; // Serial.println ("3"); } else if (results.value == 0x8C22657B || results.value == 0xFF10EF) {IRNumb = 4; //Serial.println("4 "); } else if (results.value == 0xFF38C7 || results.value == 0x488F3CBB) {IRNumb = 5; // Serial.println ("5"); } else if (results.value == 0x449E79F || results.value == 0xFF5AA5) {IRNumb = 6; // Serial.println ("6"); } else if (results.value == 0xFF42BD || results.value == 0x32C6FDF7) {IRNumb = 7; //Serial.println("7 "); } else if (results.value == 0x1BC0157B || results.value == 0xFF4AB5) {IRNumb = 8; //Serial.println("8 "); } else if (results.value == 0xFF52AD || results.value == 0x3EC3FC1B) {IRNumb = 9; // Serial.println ("9"); }} key_value = results.value; irrecv.resume (); }} void IRScan2 () {if (irrecv.decode (ir rezultatai)) {
if (results.value == 0XFFFFFFFF)
results.value = key_value; else {// Serial.println (results.value, HEX); if (results.value == 0xFF6897 || results.value == 0xC101E57B) {IRNumb2 = 0; //Serial.println("0 "); } else if (results.value == 0x9716BE3F || results.value == 0xFF30CF) {IRNumb2 = 1; //Serial.println("1 "); } else if (results.value == 0x3D9AE3F7 || results.value == 0xFF18E7) {IRNumb2 = 2; //Serial.println("2 "); } else if (results.value == 0xFF7A85 || results.value == 0x6182021B) {IRNumb2 = 3; // Serial.println ("3"); } else if (results.value == 0x8C22657B || results.value == 0xFF10EF) {IRNumb2 = 4; //Serial.println("4 "); } else if (results.value == 0xFF38C7 || results.value == 0x488F3CBB) {IRNumb2 = 5; // Serial.println ("5"); } else if (results.value == 0x449E79F || results.value == 0xFF5AA5) {IRNumb2 = 6; // Serial.println ("6"); } else if (results.value == 0xFF42BD || results.value == 0x32C6FDF7) {IRNumb2 = 7; //Serial.println("7 "); } else if (results.value == 0x1BC0157B || results.value == 0xFF4AB5) {IRNumb2 = 8; //Serial.println("8 "); } else if (results.value == 0xFF52AD || results.value == 0x3EC3FC1B) {IRNumb2 = 9; // Serial.println ("9"); }} key_value = results.value; irrecv.resume (); }}
5 žingsnis: montavimas
Norėdami pritvirtinti „Arduino“prie rėmo, aš tiesiog priklijuosiu jį ir duonos lentą, kurią naudoju prie rėmo galo, ir bandysiu uždengti/paslėpti kabelius, kad jis atrodytų gerai.