Cuprins:

Ceasul hartă a metroului din Londra: 9 pași (cu imagini)
Ceasul hartă a metroului din Londra: 9 pași (cu imagini)

Video: Ceasul hartă a metroului din Londra: 9 pași (cu imagini)

Video: Ceasul hartă a metroului din Londra: 9 pași (cu imagini)
Video: Au Uitat Să Oprească Camera De FILMAT! Momente Incredibile Filmate În LIVE 2024, Decembrie
Anonim
Ceasul de hartă al metroului londonez
Ceasul de hartă al metroului londonez
Ceasul de hartă al metroului londonez
Ceasul de hartă al metroului londonez

Î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

Strat frontal
Strat frontal
Strat frontal
Strat frontal
Strat frontal
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

Proiectarea stratului de ghidare
Proiectarea stratului de ghidare
Proiectarea stratului de ghidare
Proiectarea stratului de ghidare
Proiectarea stratului de ghidare
Proiectarea stratului de ghidare
Proiectarea stratului de ghidare
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

Construirea stratului de ghidare
Construirea stratului de ghidare
Construirea stratului de ghidare
Construirea stratului de ghidare
Construirea stratului de ghidare
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

Cablarea LED-urilor
Cablarea LED-urilor
Cablarea LED-urilor
Cablarea LED-urilor
Cablarea LED-urilor
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

Proiectarea electronice
Proiectarea electronice
Proiectarea electronice
Proiectarea electronice
Proiectarea electronice
Proiectarea electronice
Proiectarea electronice
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

Cablarea electronice
Cablarea electronice
Cablarea electronice
Cablarea electronice
Cablarea electronice
Cablarea electronice
Cablarea electronice
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

Programare
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

Locuinta
Locuinta
Locuinta
Locuinta
Locuinta
Locuinta

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: