Cuprins:
- Pasul 1: Strat frontal
- Pasul 2: Proiectarea stratului de ghidare
- Pasul 3: Construirea stratului de ghidare
- Pasul 4: Cablarea LED-urilor
- Pasul 5: Proiectarea electronice
- Pasul 6: Cablarea electronice
- Pasul 7: Programare
- Pasul 8: Locuința
- Pasul 9: Observații de închidere
Video: Ceasul hartă a metroului din Londra: 9 pași (cu imagini)
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:41
În 2014, în spatele unui stagiu la o consultanță de imprimare 3D din Londra și un experiment cu litofani color folosind mașina lor Stratasys, îmi proiectez propriul meu cadou de plecare, o imprimare 3D color a liniilor de tuburi locale la birourile lor. Eram hotărât să fac ceva din asta. La scurt timp, 2 ani mai târziu, în 2016, am avut propria mea imprimantă 3D și m-am apucat să lucrez transformând-o într-un ceas.
În copilărie, deși ceasurile digitale Tokyo Flash au fost cele mai mari lucruri vreodată și am reușit să spun că acesta ar fi punctul de inspirație pentru design.
Și acum a fost doar o pauză minoră de 4 ani până când am ajuns să scriu!
În timp ce instrucțiunile exacte vor fi dificil de reprodus, iar reducerea costurilor în fabricarea PCB-urilor hobbyist în ultimii câțiva ani ar putea face ca metoda mea exactă pentru plasarea LED-urilor să fie învechită. Sper că ideile împărtășite ar putea duce la realizarea altor ceasuri ciudate din obiecte subțiri!
Pasul 1: Strat frontal
După cum sa menționat în introducere, aceasta a fost o imprimare 3D color, cred că o mașină Stratasys care a folosit un pat de pulbere și un cartuș de cerneală modificat pentru liant și pigment.
Fișierul este pierdut în istorie, dar acest strat ar putea fi orice, o fotografie sau un litofan cu o singură culoare ar face minuni.
Această parte a fost realizată în 3DS max în 2014, dar astăzi există instrumente online pentru a transforma o imagine într-un SLT bazat pe luminozitate
Pasul 2: Proiectarea stratului de ghidare
Aici decidem complexitatea proiectului și metoda de citire a timpului. Imaginile prezintă cele 2 idei cu care mă jucam.
Acestea au fost realizate prin scanarea designului și trasarea liniilor pe acesta în interiorul peisajului.
Acesta nu este un ceas foarte lizibil, dar am preferat ideea umplerii liniilor pe tot parcursul zilei, astfel încât să devină obiectivul de proiectare.
Numărarea binară este o metodă viabilă pentru reducerea numărului de LED-uri și ar îmbunătăți lizibilitatea dacă binarul este blocajul dvs., dar asta a subminat ideea mea de „linii de umplere”, deci nu a fost o opțiune pentru acest proiect
Este obișnuit la Tokyo Flash Watches să minimizeze numărul de LED-uri, dar având o secțiune de numărare în 3 sau 5 și apoi o altă umplere pentru fiecare dată când secțiunea se umple, am folosit această tehnică pentru minute, pentru a le reduce de la 60 la 20 plus 2. I Nu a fost atât de îngrijorat de precizie asta pentru câteva secunde.
Pasul 3: Construirea stratului de ghidare
Acest strat de ghidare pentru LED-uri are 2 scopuri, menține LED-urile în poziție și previne scurgerea între ele
A fost desenat ca un strat pe Inkscape direct deasupra scanării pe care o foloseam pentru aspectul de proiectare. Grosimea de 1 mm a fost adăugată în blender înainte de trimiterea la imprimanta mea.
Aceasta a fost una dintre cele mai grele amprente pe care trebuie să le fac pe magra mea Makibox A6, piesa a fost tipărită în abs, așa că s-a folosit o tonă de suspensie de acetonă pentru ao menține atașată la platforma de construcție cu o deformare minimă. Din fericire, această parte nu este văzută pe produsul final
Imaginea finală arată că se ține până la o lampă pentru a verifica distanța.
În retrospectivă, deversarea dintre lumini de-a lungul unei linii ar putea fi de fapt preferabilă pentru imagini, nu este mai greu de citit, acest lucru ar putea fi realizat prin adăugarea unui șanț la ghidajul de pe părțile scurte ale fiecărei lumini.
Pasul 4: Cablarea LED-urilor
Imaginea de la început arată imaginea de test pe care am făcut-o pentru verificarea dimensionării găurilor, îmi propuneam ca LED-ul să se potrivească perfect în dantelă cu puțină forță, forma corectă a fost apoi plasată manual când așezat stratul de ghidare.
Datorită toleranței scăzute a imprimantei mele 3D, unele au fost libere și au necesitat un pic de super-adeziv pentru a rămâne pe loc, în timp ce altele erau prea strânse, dar au fost încurajate la locul lor prin apăsarea LED-ului în timpul lipirii, aceasta a fost de fapt o potrivire mai bună decât gaura de dimensiuni corecte, care avea o chirie de tras după ce a fost conectată.
Pentru a reduce numărul de fire, LED-urile au fost lipite într-o matrice de 7 cu 8, ceea ce înseamnă că toate cele 55 de LED-uri puteau fi controlate de doar 13 pini, am avut o hartă desenată manual cu fiecare dintre aceste conexiuni care, din păcate, a fost pierdută.
S-a folosit sârmă de email, astfel încât secțiunile să poată fi expuse la locul lor prin încălzirea unei secțiuni cu fierul și cosirea înainte de a face conexiunea.
Acest proces a consumat mult timp, aș recomanda să proiectați un PCB
Pasul 5: Proiectarea electronice
Planul meu inițial era să folosesc un microcontroler Arduino cu un RTC, dar am optat pentru un ESP8266 pe placa Node MCU D1, deoarece permitea economia de vară automată și potențialul de control asupra WIFI.
Pentru a reduce numărul de pini în continuare, am avut numărul perfect de LED-uri pentru a putea folosi un MAX7219 (care poate gestiona până la 64 de LED-uri).
Acest IC este utilizat în mod obișnuit pentru a conduce afișaje cu LED-uri cu 7 segmente, dar avea un caz de utilizare foarte similar cu al meu, iluminând un număr arbitrar de LED-uri cu pâlpâire minimă, are chiar și o luminozitate controlabilă.
Am decis să folosesc protoboard pentru cablare, dar Eagle a fost de ajutor pentru plasarea pieselor și înțelegerea cablajului
Am atașat fișierele mele de bord, dar aceasta a fost prima dată când foloseam Eagle (și o versiune învechită până acum), așa că sunt doar pentru referință
Pasul 6: Cablarea electronice
Acesta a fost un pas simplu și repetitiv, urmând schema Eagle, folosind anteturi pentru ESP și matricea LED a ajutat enorm la asamblare.
Pinul 1 de pe antetele cu LED-uri Anode & Cathode a fost marcat cu un sharpie argintiu, acestea putând fi diferențiate între acestea fiind pe 7 celelalte 8.
Pasul 7: Programare
Deoarece afișajul nostru nu este o matrice tradițională, a trebuit să găsesc o metodă pentru a vizualiza ce biți să pornească pe care i-a trimis la MAX IC în HEX. Din fericire, știu suficient de excelent pentru a intra în probleme și am făcut un „expert hexagonal” care să mă ghideze, deși modelul pe care l-am dorit este afișat, casetele de selectare plasate manual.
Acest lucru a venit odată cu reevaluarea că hex-ul pentru ora, minutul și secundele mele ar putea fi combinat folosind un bit bit SAU pentru a produce comanda hexagonală finală pentru a trimite la max7219, inclusiv o mică animație pe care am adăugat-o în secunde, astfel încât să mă pot asigura că placa nu a fost; congelat.
Deci, aproape la sfârșit. și timp pentru o altă decizie care nu a îmbătrânit prea bine.
Codul pentru ESP este în LUA, astăzi aș recomanda utilizarea IDE-ului arduino pentru o documentare mai bună și o bibliotecă robustă de pachete, în momentul în care comunitatea ESP era încă în curs de maturare și am ales LUA ca limbă pentru acest proiect.
Am luat decizia discutabilă de a face ping regulat pe serverele Google pentru a citi ora. Acest lucru a avut nevoie de un RTC pentru a minimiza deriva, acest lucru funcționează, dar ar fi mai bine să folosiți un API de timp adevărat.
halfSec = 0hour = 0 minute = 0 second = 0
Intensitate scăzută = 0
highIntensity = 9
SSID local = "Wifi"
local SSID_PASSWORD = "Parolă"
function time () - conectați-vă la internet pentru a obține data și ora curentă
dacă wifi.sta.getip () atunci local conn = net.createConnection (net. TCP, 0) conn: connect (80, "google.com")
conn: on ("conexiune", function (conn, load) conn: send ("HEAD / HTTP / 1.1 / r / n".. "Gazdă: time.is / r / n".. "Accept: * / * / r / n".. " User-Agent: Mozilla / 4.0 (compatibil; esp8266 Lua;) ".." / r / n / r / n ") sfârșit)
conn: on („primi”, function (conn, load) --print (load) conn: close () local p = string.find (payload, "GMT") - găsiți ora și data șirului în sarcina utilă de pe internet, schimbați pentru fusul orar dacă p ~ = zero apoi - extrageți numerele corespunzătoare orei, minutelor, secundelor, zilei, lunii ore = tonumber (string.sub (sarcină utilă, p-9, p-8)) minute = tonumber (string.sub (sarcină utilă, p- 6, p-5)) second = tonumber (string.sub (payload, p-3, p-2)) addHour () - cod cod dur BST (ora de vară britanică) tipărire de vară (oră, minut, secundă) jumătate Sec = (al doilea% 6) * 2 --print (halfSec) else print ("actualizare web eșuată!") end end --funcție) - sfârșit de la gestionarea evenimentului "primiți"
conn: on ("deconectare", funcție (conn, sarcină utilă) conn = zero sarcină utilă = zero sfârșit) sfârșit imprimare („încă nu există wifi”) sfârșit
funcția borTable (a, b, …) - în tabele OR în sens orizontal
dacă arg [1] atunci b = borTable (b, despachetați (arg)) terminați local z = {} pentru i, v în ipairs (a) faceți table.insert (z, bit.bor (v, b )) end return z end
funcția bxorTable (a, b, …) - în tabel OR în sens orizontal
dacă arg [1] atunci b = bxorTable (b, despachetați (arg)) terminați local z = {} pentru i, v în ipairs (a) faceți table.insert (z, bit.bxor (v, b )) end return z end
funcție addSecond ()
second = second + 1 if second> = 60 then second = 0 minute = minute + 1 if minute> = 60 then minute = 0 addHour () end end end
funcție addHour ()
hour = hour + 1 if hour> = 24 then hour = 0 end if hour == 2 or hour == 16 then max7219.setIntensity (lowIntensity) end if hour == 8 or hour == 18 then max7219.setIntensity (highIntensity) actualizare funcție finală finală) secGap local = 6 minGap local = 3 horGap local = 1 sec local = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x03}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x03}, {0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x0, 0x00, 0x00, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x01, 0x01, 0x0x01, 0x0x01 }, {0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}}; local min = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00}, {0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x00, 0x0, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x0, 0x02, 0x02, 0x02, 0x02, 0x00, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x, 10x, 10x }, {0x02, 0x02, 0x02, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x02, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10}, {0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x12, 0x12, 0x12, 0x12, 0x12, 0x30, 0x12, 0x10}, {0x12, 0x12, 0x12, 0x12, 0x32, 0x30, 0x12, 0x10}, {0x12, 0x12, 0x12, 0x32, 0x32, 0x30, 0x12, 0x10}, {0x12, 0x12, 0x32, 0x32, 0x32, 0x30, 0x12, 0x10}, {0x12, 0x32, 0x32, 0x32, 0x32, 0x30, 0x12, 0x10}, {0x32, 0x32, 0x32, 0x32, 0x32, 0x30, 0x12, 0x10}}; hor local = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00}, {0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x0x, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x08}, {0x04, 0x04, 0x0x, 0x0x, 0x0x }, {0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x0x, 0x0x, 0x0x, 0x0x;, 0x0C, 0x0C, 0x0C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x0x, 0x4x, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4c, 0x4x 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}}; --print (oră, minut, secundă)
--tabelul începe pe 0, deci la 1 ca sec. curent [0] = zero)
max7219.write ({animate (borTable (sec [1+ (second / secGap)], min [1+ (minute / minGap)], hor [1+ (hour / horGap)]))})
final - funcție
wifi.setmode (wifi. STATION)
wifi.sta.config (SSID, SSID_PASSWORD) wifi.sta.autoconnect (1)
--configure max7219
max7219 = require ("max7219") max7219.setup ({numberOfModules = 1, slaveSelectPin = 8, intensitate = highIntensity})
--Program principal
checkOnline = tmr.create ()
tmr.alarm (0, 180000, 1, ora)
tmr.alarm (1, 1000, 1, addSecond)
tmr.alarm (2, 500, 1, actualizare)
funcție animate (încă)
cadre locale = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}, {0x00, 0x00, 0x, 0x00, 0x00, 0x01, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}, {0x, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; halfSec = halfSec + 1 if halfSec> = 12 then halfSec = 0 end --print (halfSec) return bxorTable (frames [halfSec + 1], still) end
Pasul 8: Locuința
Acum este timpul să vă arătați măiestria incredibilă și să găzduiți proiectul.
Fie asta, fie scoateți un pachet Amazon din reciclare și faceți o locuință temporară care este încă în uz astăzi.
Avantajul utilizării acestei abordări a fost că fiecare strat al proiectului se potrivea aproape perfect cu grosimea cartonului, astfel încât un sandwich putea fi stivuit și lipit împreună. O versiune premium similară ar putea folosi acril
Pasul 9: Observații de închidere
Vă mulțumim că ați citit, așa cum mulți dintre voi știți că documentarea unui proiect poate fi la fel de dificilă ca realizarea acestuia. sunt resturi de videoclipuri cu mine vorbind, care în cele din urmă pot vedea lumina zilei.
În anii care au trecut între realizarea acestui proiect și redactarea acestuia, m-am așteptat să văd mai multe exemple de afișaje LED arbitrare folosind imprimarea 3D, dar reducerea benzilor RGB a eliminat în mare parte necesitatea unei alternative.
Sper că acest lucru a fost informativ și vă rugăm să puneți întrebări, deoarece voi încerca să ofer mai multe detalii cu privire la secțiunile care nu sunt pe deplin satisfăcute.
Noroc
Recomandat:
Ceasul binar final: 12 pași (cu imagini)
Ultimate Binary Watch: recent am fost introdus în conceptul de ceasuri binare și am început să fac câteva cercetări pentru a vedea dacă aș putea să-mi construiesc unul. Cu toate acestea, nu am reușit să găsesc un design existent, care să fie în același timp funcțional și elegant. Deci am decis
Ceasul folosind ATMEGA 8: 7 pași (cu imagini)
Ceasul folosind ATMEGA 8: ATMEGA 8 este unul dintre cele mai ieftine microcontrolere, așa că am decis să fac ceasul folosindu-l. Primul lucru pe care l-am întâlnit este afișarea timpului, prin urmare cel mai general este afișajul pe 7 segmente, dar nu pot afișa tot textul așteaptă puțini, așa că am decis să merg cu
Faceți ceasul Nixie cu Arduino în cutie din lemn MDF: 11 pași (cu imagini)
Realizați ceasul Nixie cu Arduino în carcasa din MDF: În această instrucțiune, voi arăta cum să creați ceasul Nixie cu Arduino prin circuit, care este cât mai simplu posibil. Toate acestea sunt puse în cutie din lemn MDF. După finalizare, ceasul arată ca un produs: frumos și compact ferm. Să fim
Harta parcării studenților din campusul universitar: 7 pași (cu imagini)
Harta parcării studenților din campusul universitar: Mulți studenți se întreabă unde pot parca pe un campus universitar. Pentru a rezolva această problemă, am creat o hartă de parcare iluminată a zonei principale a campusului Universității de Stat din Utah. Harta este pentru studenți să arunce o privire rapidă asupra opțiunilor de parcare
Spargerea unui buton al ușii liniei jubileului subteran din Londra: 12 pași (cu imagini)
Spargerea unui buton al ușii liniei de jubileu subteran din Londra: magazinul Muzeului Transporturilor din Londra vinde butoane de ușă scoase din funcțiune de la linia jubileului (sunt disponibile atât stânga, cât și dreapta). Dacă vă gândiți să derulați un proiect care are nevoie de un buton și de un indicator luminos de un fel, ați fi „