Sisällysluettelo:
- Vaihe 1: Etukerros
- Vaihe 2: Ohjauskerroksen suunnittelu
- Vaihe 3: Ohjauskerroksen rakentaminen
- Vaihe 4: Kytke LED -valot
- Vaihe 5: Elektroniikan suunnittelu
- Vaihe 6: Elektroniikan kytkentä
- Vaihe 7: Ohjelmointi
- Vaihe 8: Kotelo
- Vaihe 9: Loppuhuomautukset
Video: Lontoon maanalainen karttakello: 9 vaihetta (kuvilla)
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 08:59
Vuonna 2014 suunnittelen omaa lähdölahjaani, värillistä 3D -tulosta heidän toimistojensa paikallisista putkilinjoista, Lontoon 3D -tulostuskonsultoinnin harjoittelun jälkeen ja kokeilin värillitofaaneja heidän Stratasys -koneellaan. Olin päättänyt tehdä siitä jotain. Lyhyet kaksi vuotta myöhemmin vuonna 2016 minulla oli oma 3D -tulostin ja ryhdyin tekemään siitä kelloa.
Lapsena pidin Tokyo Flash -digitaalikelloista kaikkien aikojen suurimpia asioita, ja tämä oli suunnittelun inspiraatiopiste.
Ja nyt on ollut vain pieni 4 vuoden tauko, kunnes olen päässyt kirjoittamaan sen!
Vaikka tarkkoja ohjeita on vaikea toistaa, ja harrastajien piirilevyjen valmistuskustannusten aleneminen parin viime vuoden aikana saattaa tehdä tarkan menetelmäni LED -sijoittelusta vanhentuneeksi. Toivottavasti jaetut ideat voivat johtaa siihen, että muut tekevät oudoista kelloista ohuista esineistä!
Vaihe 1: Etukerros
Kuten esittelyssä mainittiin, tämä oli värillinen 3D -tulostus, uskon Stratasys -koneen, joka käytti jauhepohjaa ja muokattua mustepatruunaa sideaineeseen ja pigmenttiin.
Tiedosto on kadonnut historiaan, mutta tämä kerros voi olla mikä tahansa, valokuva tai yksivärinen litofaani tekisi ihmeitä.
Tämä osa tehtiin 3DS max -muodossa vuonna 2014, mutta nykyään on olemassa online -työkaluja kuvan muuttamiseksi SLT: ksi kirkkauden perusteella
Vaihe 2: Ohjauskerroksen suunnittelu
Tässä päätämme projektin monimutkaisuuden ja ajan lukemisen menetelmän. Kuvat osoittavat 2 ideaa, joilla leikin.
Nämä tehtiin skannaamalla suunnitteluun ja piirtämällä viivoja sen yli inkScapessa.
Tämä ei ole kovin luettava kello, mutta mieluummin ajatus siitä, että rivit täyttyvät koko päivän, niin siitä tuli suunnittelutavoite.
Binäärilukeminen on toteuttamiskelpoinen menetelmä LED -lukumäärän vähentämiseksi, ja se parantaisi luettavuutta, jos binääri on tukoksesi, mutta se heikensi `` täyttölinjojen '' ajatusta, joten se ei ollut vaihtoehto tälle projektille
Tokion flash -kelloissa on tavallista minimoida LED -lukumäärä, mutta kun yksi osa lasketaan 3: ssa tai 5: ssä ja sitten toinen täyttö joka kerta, kun osa täyttyy, käytin tätä tekniikkaa minuutteina vähentääkseni ne 60: stä 20: een. I ei ollut niin huolissani tarkkuudesta sekunneissa.
Vaihe 3: Ohjauskerroksen rakentaminen
Tällä LED -ohjainkerroksella on kaksi tarkoitusta, se pitää LEDit paikallaan ja estää niiden vuotamisen
Se piirrettiin kerrokseksi Inkscapessa suoraan skannauksen päälle, jota käytin suunnittelussa. 1 mm paksuus lisättiin tehosekoittimeen ennen lähettämistä tulostimelle.
Tämä oli yksi vaikeimmista tulosteista, jotka minun on tehtävä niukalle Makibox A6 -laitteelleni, osa painettiin abs -painikkeella, joten tonnia asetonilietettä käytettiin pitämään se kiinni alustaan minimaalisen vääntymisen vuoksi. Onneksi tätä osaa ei näy lopputuotteessa
Lopullinen kuva osoittaa, että se pidettiin lamppua vasten etäisyyden tarkistamiseksi.
Jälkeenpäin ajatellen valojen välinen vuoto viivaa pitkin voisi olla mieluummin visuaalille, ei ole vaikeampaa lukea, tämä voitaisiin saavuttaa lisäämällä viiste jokaisen valon lyhyillä sivuilla olevaan ohjaimeen
Vaihe 4: Kytke LED -valot
Nyrkkikuvassa näkyy testikuvio, jonka tein reiän koon tarkistamiseksi. Tavoittelin, että LED mahtuu tiukasti pitsiin pienellä voimalla, oikea muoto asetettiin sitten käsin asetettaessa ohjauskerrosta.
3D -tulostimeni heikon toleranssin vuoksi jotkut olivat löysiä ja vaativat superliimaa, jotta ne pysyivät paikallaan, kun taas toiset olivat liian tiukkoja, mutta niitä kannustettiin paikalleen painamalla LED -valoa alas juottamisen aikana, tämä oli itse asiassa parempi istuvuus kuin oikean kokoinen reikä, jonka vuokrasopimus oli vedettävä ulos johdotuksen jälkeen.
Johtimien määrän vähentämiseksi LEDit juotettiin 7 x 8 matriisiin, mikä tarkoittaa, että kaikkia 55 LEDiä voitaisiin ohjata vain 13 nastalla, minulla oli käsin piirretty kartta jokaisesta näistä yhteyksistä, joka on valitettavasti kadonnut.
Käytettiin emalilankaa, joten osat voidaan paljastaa paikalleen lämmittämällä osaa raudalla ja tinaamalla ennen liitoksen tekemistä.
Tämä prosessi oli hyvin aikaa vievä, suosittelen lämpimästi piirilevyn suunnittelua
Vaihe 5: Elektroniikan suunnittelu
Alkuperäinen suunnitelmani oli käyttää Arduino -mikrokontrolleria RTC: n kanssa, mutta valitsin ESP8266: n Node MCU D1 -kortille, koska se mahdollisti automaattisen kesäajan säästämisen ja WIFI -yhteyden hallinnan.
Pistemäärän vähentämiseksi edelleen minulla oli täydellinen määrä LED -valoja voidakseni käyttää MAX7219: tä (joka pystyy käsittelemään jopa 64 LEDiä).
Tätä IC: tä käytetään yleisesti LED -segmenttinäyttöjen ohjaamiseen, mutta sen käyttötapa oli hyvin samanlainen kuin minun, se sytytti mielivaltaisen määrän LED -valoja vähäisellä välkkymisellä, ja siinä on jopa säädettävä kirkkaus.
Päätin käyttää protoboardia johdotukseen, mutta kotka auttoi osien sijoittamisessa ja johtimien ymmärtämisessä
Olen liittänyt levytiedostoni, mutta tämä oli ensimmäinen kerta, kun käytin kotkaa (ja vanhentunutta versiota tähän mennessä), joten ne ovat vain viitteellisiä
Vaihe 6: Elektroniikan kytkentä
Tämä oli toistuva yksinkertainen vaihe, joka seurasi Eaglen kaaviota, ESP: n otsikoiden ja LED -matriisin käyttäminen auttoi valtavasti kokoonpanossa.
Anodin ja katodin LED -otsikoiden nasta 1 oli merkitty hopeisella terävällä terällä, ne voidaan erottaa toisistaan, kuten 7 ja muut 8.
Vaihe 7: Ohjelmointi
Koska näyttömme ei ole perinteinen matriisi, minun piti löytää menetelmä visualisoida, mitkä bitit kytketään päälle ja jotka se lähetti MAX IC: lle HEX: ssä. Onneksi tiedän juuri sen verran exceliä, että joudun vaikeuksiin, ja tein "Hex Wizard" -oppaan, joka opastaa minua halutun kuvion näyttämisessä, käsin asetetuissa valintaruuduissa.
Tähän liittyi uudelleenarviointi siitä, että tunnin, minuutin ja sekuntien heksadesimaali voitaisiin yhdistää bitti -TAI käyttämällä lopullisen heksakomennon lähettämiseksi max7219: lle, mukaan lukien pieni animaatio, jonka lisäsin sekunteihin, jotta voin varmistaa, että levy ei ollut jäätynyt
Eli melkein lopussa. ja aika toiselle päätökselle, joka ei ole vanhentunut liian hyvin.
ESP: n koodi on LUA: ssa, tänään suosittelen käyttämään arduino IDE: tä paremman dokumentoinnin ja vankan pakettikirjaston tarjoamiseksi, sillä ESP -yhteisö oli vielä kypsymässä ja valitsin LUA: n tämän projektin kieleksi.
Tein kyseenalaisen päätöksen pingottaa Googlen palvelimet säännöllisesti ajan lukemiseksi. Tämä johti RTC: n tarpeeseen minimoidakseen ajautumisen, tämä toimii, mutta sinun olisi parempi käyttää tosiaikaista sovellusliittymää.
halfSec = 0 tunti = 0 minuutti = 0 sekunti = 0
lowIntensity = 0
highIntensity = 9
local SSID = "Wifi"
local SSID_PASSWORD = "Salasana"
toiminto aika () -muodosta Internet -yhteys saadaksesi kellonajan ja päivämäärän
jos wifi.sta.getip (), niin paikallinen conn = net.createConnection (net. TCP, 0) conn: connect (80, "google.com")
conn: on ("yhteys", function (conn, payload) conn: send ("HEAD/HTTP/1.1 / r / n".. "Isäntä: time.is / r / n".. "Hyväksy: */ *\ r / n".. " User-Agent: Mozilla/4.0 (yhteensopiva; esp8266 Lua;) ".." / r / n / r / n ") end)
conn: on ("vastaanottaa", function (conn, payload) --print (payload) conn: close () local p = string.find (hyötykuorma, "GMT") -etsi aika- ja päivämääräjono hyötykuormasta Internetistä, muuta aikavyöhyke, jos p ~ = nolla sitten-poimi numerot, jotka vastaavat tunti, minuutti, sekunti, päivä, kuukausi tunti = tonumber (string.sub (hyötykuorma, p-9, p-8)) minuutti = tonumber (string.sub (hyötykuorma, p- 6, p-5)) toinen = tonumber (string.sub (hyötykuorma, p-3, p-2)) addHour ()-kovakoodattu BST (brittiläinen kesäaika) kesäaikaa säästävä tuloste (tunti, minuutti, sekunti) = (toinen%6)*2 --print (halfSec) else print ("web -päivitys epäonnistui!") end end -function) -"vastaanottamisen" tapahtumakäsittelijän loppu
conn: on ("katkaisu", toiminto (jatko, hyötykuorma)
funktio borTable (a, b,…) -välissä TAI taulukot yhdessä
jos arg [1] niin b = borTable (b, purkaa (arg)) end local z = {} i, v in ipairs (a) do table.insert (z, bit.bor (v, b )) end return z end
funktio bxorTable (a, b,…) -bittisesti TAI taulukot yhdessä
jos arg [1] niin b = bxorTable (b, purkaa (arg)) end local z = {} i, v ipairs (a) do table.insert (z, bit.bxor (v, b )) end return z end
toiminto addSecond ()
sekunti = sekunti+1, jos sekunti> = 60, sitten toinen = 0 minuutti = minuutti+1, jos minuutti> = 60 sitten minuutti = 0 lisäysTunti () loppu loppu
toiminto addHour ()
tunti = tunti+1 jos tunti> = 24 sitten tunti = 0 loppu, jos tunti == 2 tai tunti == 16 sitten max7219.setIntensity (lowIntensity) loppu jos tunti == 8 tai tunti == 18 sitten max7219.setIntensity (highIntensity) end end function update () local secGap = 6 local minGap = 3 local horGap = 1 local sec = {{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, 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}}; paikallinen 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}, {0x0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x102 }, {0x02, 0x02, 0x02, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x02, 0x12, 0x12, 0x12, 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}}; paikallinen 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}, {0x04, 0x004, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x08}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 }, {0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x0x, 0x04, 0x0C, 0x08}, {0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x080, 0x0C, 0x0C, 0x0C, 0x0C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48C, 0xC 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}}; -tulosta (tunti, minuutti, sekunti)
--taulukko alkaa nollasta, joten kello 1 kuten tällä hetkellä sekunti [0] = nolla)
max7219.write ({animate (borTable (sec [1+ (second/secGap))], min [1+ (minute/minGap)], hor [1+ (hour/horGap)]))})
loppu -toiminta
wifi.setmode (wifi. STATION)
wifi.sta.config (SSID, SSID_PASSWORD) wifi.sta.autoconnect (1)
--konfiguroi max7219
max7219 = vaatia ("max7219") max7219.setup ({numberOfModules = 1, slaveSelectPin = 8, intensiteetti = highIntensity})
-pääohjelma
checkOnline = tmr.create ()
tmr.hälytys (0, 180000, 1, aika)
tmr.hälytys (1, 1000, 1, addSecond)
tmr.alarm (2, 500, 1, päivitys)
toiminto animoi (still)
paikalliset kehykset = {{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, jos halfSec> = 12 sitten halfSec = 0 end --print (halfSec) return bxorTable (kehykset [halfSec+1], still) end
Vaihe 8: Kotelo
Nyt on aika näyttää uskomaton ammattitaitosi ja toteuttaa projekti.
Joko se tai nappaa amazon -paketti kierrätyksestä ja tee tilapäinen asunto, joka on edelleen käytössä.
Tämän lähestymistavan hyödyksi oli se, että jokainen projektin kerros vastasi lähes täydellisesti pahvin paksuutta, joten voileipä voidaan pinota ja teipata yhteen. Samanlainen premium -versio voisi käyttää akryylia
Vaihe 9: Loppuhuomautukset
Kiitos, että luit, Kuten monet teistä tietävät, projektin dokumentointi voi olla yhtä vaikeaa kuin sen tekeminen. puheluissani on videopätkiä, jotka saattavat lopulta nähdä päivänvalon.
Projektin ja sen kirjoittamisen välisten vuosien aikana odotin näkeväni enemmän esimerkkejä mielivaltaisista LED -näytöistä, jotka käyttävät 3D -tulostusta, mutta RGB -nauhojen vähentäminen on useimmiten poistanut vaihtoehdon tarpeen.
Toivon, että tämä on ollut informatiivista, ja kysy kysymyksiä, kun yritän kertoa tarkemmin osioista, jotka eivät ole täysin tyydyttäviä.
Kippis
Suositeltava:
DIY 37 Leds Arduino -rulettipeli: 3 vaihetta (kuvilla)
DIY 37 Leds Arduino Roulette Peli: Ruletti on kasinopeli, joka on nimetty ranskalaisen sanan mukaan, joka tarkoittaa pientä pyörää
Covid -suojakypärä, osa 1: johdanto Tinkercad -piireihin!: 20 vaihetta (kuvilla)
Covid -suojakypärä, osa 1: johdanto Tinkercad -piireihin!: Hei, ystävä! Tässä kaksiosaisessa sarjassa opimme käyttämään Tinkercadin piirejä - hauskaa, tehokasta ja opettavaista työkalua piirien toiminnasta! Yksi parhaista tavoista oppia on tehdä. Joten suunnittelemme ensin oman projektimme: th
Weasleyn sijaintikello neljällä kädellä: 11 vaihetta (kuvilla)
Weasleyn sijaintikello neljällä kädellä: Joten Raspberry Pi: n kanssa, joka oli pyörinyt jonkin aikaa, halusin löytää mukavan projektin, jonka avulla voisin hyödyntää sitä parhaalla mahdollisella tavalla. Löysin ppeters0502 tämän upean Instructable Build Your Own Weasley Location Clockin ja ajattelin, että
Hakkerointi Lontoon maanalaisen Jubilee -linjan ovipainikkeeseen: 12 vaihetta (kuvilla)
Hakkerointi Lontoon maanalaiseen Jubilee Line -ovipainikkeeseen: Lontoon liikennemuseon kauppa myy Jubilee Linen käytöstä poistettuja ovipainikkeita (sekä vasen että oikea). Jos aiot toteuttaa hankkeen, joka tarvitsee jonkinlaisen painikkeen ja merkkivalon, olet
Pultti - DIY -langaton latauskello (6 vaihetta): 6 vaihetta (kuvilla)
Pultti - DIY -langaton latausyökello (6 vaihetta): Induktiiviset lataukset (tunnetaan myös nimellä langaton lataus tai langaton lataus) on langattoman voimansiirron tyyppi. Se käyttää sähkömagneettista induktiota sähkön tuottamiseen kannettaville laitteille. Yleisin sovellus on langaton Qi -latauslaite