Innehållsförteckning:
- Steg 1: Framskikt
- Steg 2: Designa guideskiktet
- Steg 3: Bygg vägledarskiktet
- Steg 4: Anslut LED -lamporna
- Steg 5: Designa elektroniken
- Steg 6: Anslutning av elektroniken
- Steg 7: Programmering
- Steg 8: Huset
- Steg 9: Avslutande anmärkningar
Video: London Underground Map Clock: 9 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:36
År 2014, på baksidan av praktiken vid ett 3D -utskriftskonsultföretag i London och ett experiment med färglitofaner med deras Stratasys -maskin, designar jag min egen gåva -present, ett färg -3D -tryck av rörledningar lokalt till deras kontor. Jag var fast besluten att göra något av det. Korta två år senare 2016 hade jag min egen 3D -skrivare och började arbeta med att göra den till en klocka.
Som barn trodde jag att de digitala klockorna i Tokyo Flash var de bästa sakerna någonsin, och det var en inspirationskälla för designen.
Och nu har det bara varit en mindre 4 -års paus tills jag har börjat skriva det!
Även om de exakta instruktionerna kommer att vara svåra att replikera, och minskningen av kostnaderna för hobby -PCB -tillverkning under de senaste åren kan göra min exakta metod för LED -placering föråldrad. Jag hoppas att de idéer som delas kan leda till att andra gör konstiga klockor av tunna föremål!
Steg 1: Framskikt
Som nämnts i introt var detta ett 3D -tryck i färg, jag tror att en Stratasys -maskin som använde en pulverbädd och en modifierad bläckpatron för bindemedel och pigment.
Filen går förlorad i historien, men det här lagret kan vara vad som helst, ett foto eller enfärgad litofan skulle göra underverk.
Denna del gjordes i 3DS max 2014, men idag finns onlineverktyg för att göra en bild till en SLT baserad på ljusstyrka
Steg 2: Designa guideskiktet
Det är här vi bestämmer komplexiteten i projektet och metoden för att läsa tiden. Bilderna visar de två idéerna jag lekte med.
Dessa gjordes genom att skanna in designen och dra linjer över den i inkscape.
Det här är inte en mycket läsbar klocka, men jag föredrog tanken på att linjer skulle fyllas hela dagen så det blev designmålet.
Binärräkning är en livskraftig metod för att minska LED -räkningen, och det skulle förbättra läsbarheten om binär är din sylt, men det undergrävde min "fyllningslinjer" -idé, så det var inte ett alternativ för detta projekt
Det är vanligt på Tokyo Flash -klockor för att minimera LED -antalet, men med en sektion som räknas i 3: or eller 5: or och sedan en annan fyllning för varje gång den sektionen fylls, använde jag denna teknik för minuter, för att minska dem från 60 till 20 plus 2. I var inte så orolig för precision detta i sekunderna.
Steg 3: Bygg vägledarskiktet
Detta styrskikt för lysdioderna har två syften, det håller lysdioderna på plats och det förhindrar spill mellan dem
Det ritades som ett lager på Inkscape direkt ovanpå skanningen som jag använde för designlayouten. 1 mm tjocklek tillsattes i mixer innan den skickades till min skrivare.
Detta var ett av de svåraste utskrifterna jag måste göra på min magra Makibox A6, delen trycktes i abs så ett ton acetonuppslamning användes för att hålla den fäst vid byggplattformen med minimal vridning. Lyckligtvis syns inte denna del på slutprodukten
Den sista bilden visar att den hölls upp till en lampa för att kontrollera avståndet.
I efterhand kan spill mellan ljus längs en linje faktiskt vara att föredra för det visuella, det är inte svårare att läsa, detta kan uppnås genom att lägga till en fasning på guiden på kortsidorna av varje ljus
Steg 4: Anslut LED -lamporna
Knytnävsbilden visar provtrycket jag gjorde för att kontrollera hålstorlek, jag siktade på att lysdioden skulle sitta tätt i spets med lite kraft, rätt form placerades sedan för hand när man lade ut styrskiktet.
På grund av min 3D -skrivares låga tolerans var vissa lösa och krävde en klick superlim för att hålla sig på plats medan andra var för täta, men uppmuntrades på plats genom att trycka ner lysdioden under lödning, detta passade faktiskt bättre än rätt storlek hål, som hade en hyresrätt att dra ut när den är inkopplad.
För att minska antalet trådar löddes lysdioderna i en matris av 7 med 8, vilket innebär att alla 55 lysdioder kunde styras av endast 13 stift, jag hade en handritad karta över var och en av dessa anslutningar som tyvärr har gått förlorad.
Emaljtråd användes så att sektioner kunde exponeras på plats genom att värma upp en sektion med strykjärnet och tinna innan anslutningen gjordes.
Denna process var mycket tidskrävande, jag rekommenderar starkt att designa ett kretskort
Steg 5: Designa elektroniken
Min första plan var att använda en Arduino -mikrokontroller med en RTC, men valde en ESP8266 på Node MCU D1 -kortet eftersom det möjliggjorde automatiska sommartid och potential för kontroll över WIFI.
För att minska antalet stift ytterligare hade jag det perfekta antalet lysdioder för att kunna använda en MAX7219 (som klarar upp till 64 lysdioder).
Denna IC används vanligtvis för att driva LED 7 -segmentdisplayer, men den hade ett mycket liknande användningsfall som mitt, vilket tänder ett godtyckligt antal lysdioder med minimal flimmer, den har till och med kontrollerbar ljusstyrka.
Jag bestämde mig för att använda protoboard för kablarna, men örn var till hjälp för delplacering och förståelse av kabeldragning
Jag har bifogat mina kortfiler, men det här var första gången jag använde eagle (och en inaktuell version nu) så de är endast för referens
Steg 6: Anslutning av elektroniken
Detta var ett repetitivt enkelt steg, efter Eagle -schemat, med hjälp av rubriker för ESP och LED -matrisen hjälpte enormt vid montering.
Pin 1 på Anode & Cathode LED -rubrikerna var markerade med en silverskarp, de kunde skiljas mellan på 7 var de andra 8.
Steg 7: Programmering
Eftersom vår display inte är en traditionell matris, var jag tvungen att hitta en metod för att visualisera vilka bitar som ska slås på som den skickade till MAX IC i HEX. Lyckligtvis vet jag precis tillräckligt med excel för att få problem och gjorde en "Hex -guide" för att vägleda mig om det mönster jag ville visa, handplacerade kryssrutor och allt.
Detta kom med omvärderingen att hex för min timme, minut och sekunder kunde kombineras med bitvis ELLER för att producera det sista hex -kommandot för att skicka till max7219, inklusive en liten animation som jag lade till i sekunderna så att jag kunde se till att tavlan hade inte frusit.
Så nästan på slutet. och dags för ett annat beslut som inte har åldrats för bra.
Koden för ESP finns i LUA, Idag skulle jag rekommendera att använda arduino IDE för dess bättre dokumentation och robusta paketbibliotek, då ESP -gruppen fortfarande mognade och jag valde LUA som språk för detta projekt.
Jag tog det tveksamma beslutet att regelbundet pinga Googles servrar för att läsa tiden. Detta kom runt med att behöva en RTC för att minimera drift, det här fungerar, men du skulle vara bättre att använda ett real time API.
halfSec = 0hour = 0 minute = 0 second = 0
lågintensitet = 0
högintensitet = 9
lokal SSID = "Wifi"
local SSID_PASSWORD = "Lösenord"
funktionstid () -anslut till internet för att få aktuell tid och datum
om wifi.sta.getip () då lokal conn = net.createConnection (net. TCP, 0) conn: connect (80, "google.com")
conn: on ("anslutning", function (conn, nyttolast) conn: send ("HEAD/HTTP/1.1 / r / n".. "Host: time.is / r / n".. "Acceptera: */ *\ r / n".. " User-Agent: Mozilla/4.0 (kompatibel; esp8266 Lua;) ".." / r / n / r / n ") slut)
conn: on ("ta emot", function (conn, nyttolast) -print (nyttolast) conn: close () lokal p = string.find (nyttolast, "GMT") -hitta tid och datumsträng i nyttolasten från internet, ändra för tidszon om p ~ = noll då-extrahera siffror som motsvarar timme, minut, sekund, dag, månadstid = tonantal (string.sub (nyttolast, p-9, p-8)) minut = tonumber (string.sub (nyttolast, p- 6, p-5)) andra = tonantal (string.sub (nyttolast, p-3, p-2)) addHour ()-hårdkodad BST (brittisk sommartid) sommartid sparar utskrift (timme, minut, andra) halvsek = (andra%6)*2 -print (halfSec) annars skriv ut ("webbuppdatering misslyckades!") slutet slut -funktion) -slut på "mottag" händelsehanterare
conn: on ("koppling", funktion (anslutning, nyttolast) conn = noll nyttolast = noll slut) slututskrift ("inget wifi ännu") slut
funktion borTable (a, b, …) -bitvis ELLER tabeller tillsammans
om arg [1] då b = borTable (b, packa upp (arg)) slut lokal z = {} för i, v i ipairs (a) gör table.insert (z, bit.bor (v, b )) slut retur z slut
funktion bxorTable (a, b, …) -bitvis ELLER tabeller tillsammans
om arg [1] sedan b = bxorTable (b, packa upp (arg)) slut lokalt z = {} för i, v i ipairs (a) gör table.insert (z, bit.bxor (v, b )) slut retur z slut
funktion addSecond ()
second = second+1 if second> = 60 then second = 0 minute = minute+1 if minute> = 60 then minute = 0 addHour () end end end
funktion addHour ()
timme = timme+1 om timme> = 24 då timme = 0 slut om timme == 2 eller timme == 16 sedan max7219.setIntensity (lågIntensitet) slut om timme == 8 eller timme == 18 då max7219.setIntensity (högintensitet) uppdatera slutfunktionen () lokal secGap = 6 lokal minGap = 3 lokal horGap = 1 lokal sek = {{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, 0x02, 0x01, 0x03}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x03}, {0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03}, {, 0x00, 0x00, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01 }, {0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}}; lokal 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}, {0x0, 0x2, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x0, 0x2, 0x02, 0x02, 0x02, 0x02, 0x00, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x12, 0x12 }, {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}}; lokal hor = {{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, 0x0,, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x04, 0x04, 0x04, 0x04, 0x0, 0x4, 0x4, 0x0,, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x08}, {0x04, 0x04, 0x0, 0x0, 0x0, 0x0, }, {0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x0, 0x0, 0x0,, 0x0C, 0x08}, {0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0, 0x0, 0x0,, 0x0C, 0x0C, 0x0C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0, 0x, 0x, 0x,, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}}; -tryck (timme, minut, sekund)
-bordet börjar på 0, så vid 1 som för närvarande sek [0] = noll)
max7219.write ({animate (borTable (sec [1+ (second/secGap)], min [1+ (minute/minGap)], hor [1+ (hour/horGap)]))))
slut -funktion
wifi.setmode (wifi. STATION)
wifi.sta.config (SSID, SSID_PASSWORD) wifi.sta.autoconnect (1)
--konfigurera max7219
max7219 = kräver ("max7219") max7219.setup ({numberOfModules = 1, slaveSelectPin = 8, intensitet = highIntensity})
-Huvudprogram
checkOnline = tmr.create ()
tmr.alarm (0, 180000, 1, tid)
tmr.alarm (1, 1000, 1, addSecond)
tmr.alarm (2, 500, 1, uppdatering)
funktion animera (fortfarande)
lokala ramar = {{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, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}, {0x00, 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
Steg 8: Huset
Nu är det dags att visa upp ditt otroliga hantverk och hysa projektet.
Antingen det eller ta ett Amazon -paket ur återvinningen och gör ett tillfälligt hus som fortfarande används idag.
Fördelen med att använda detta tillvägagångssätt var att varje lager av projektet nästan perfekt matchade kartongens tjocklek, så att en smörgås kunde staplas upp och tejpas ihop. En liknande premiumversion kan använda akryl
Steg 9: Avslutande anmärkningar
Tack för att du läser. Som många av er vet kan det vara lika svårt att dokumentera ett projekt som att göra det. det finns videorester med mig som pratar som så småningom kan se dagens ljus.
Under åren mellan att göra detta projekt och skriva det förväntade jag mig att se fler exempel på godtyckliga LED -skärmar som använder 3D -utskrift, men minskningen av RGB -remsor har mestadels tagit bort behovet av ett alternativ.
Jag hoppas att detta har varit informativt och ställ gärna frågor eftersom jag ska försöka ge mer detaljer om avsnitt som inte helt tillfredsställer.
Skål
Rekommenderad:
Secrete Map Earrings : 7 Steg
Secrete Map Earrings …: Kartor är avgörande för forskning inom Human Geography eftersom de ger sammanhang till demografisk information. Kartor gör det också möjligt för mänskliga geografer att ge visuella bevis för påståenden som kan manipuleras till presentationstekniker som choroplet
University Campus Student Parking Map: 7 steg (med bilder)
University Campus Student Parking Map: Många studenter undrar var de kan parkera på ett universitetscampus. För att lösa detta problem skapade jag en upplyst parkeringskarta över huvudområdet på Utah State Universitys campus. Kartan är för studenter att snabbt ta en titt på vilka parkeringsalternativ som är
Hacka en London Underground Jubilee Line Door Button: 12 steg (med bilder)
Hacka en London Underground Jubilee Line Door Button: London Transport Museum -butiken säljer avvecklade dörrknappar från Jubilee Line (både vänster och höger finns tillgängliga). Om du funderar på att genomföra ett projekt som behöver en knapp och en indikator av något slag, skulle du vara "
Transportdatavisualisering med Google Map: 6 steg
Transportdatavisualisering med Google Map: Vi vill vanligtvis spela in olika data under cykling, den här gången använde vi nya Wio LTE för att spåra dem
Game of Thrones Light Up Map: 4 steg (med bilder)
Game of Thrones Light Up Map: Spoiler! Vintern kommer definitivt. Men låt den här coola Game of Thrones lysa upp kartan för ett vårprojekt. Kartan tänds med en flammaffekt som avslöjar sigil för det kvarvarande huset vid makten. Vad vet jag, gör det med din favos sigil