İçindekiler:

Londra Yeraltı Harita Saati: 9 Adım (Resimli)
Londra Yeraltı Harita Saati: 9 Adım (Resimli)

Video: Londra Yeraltı Harita Saati: 9 Adım (Resimli)

Video: Londra Yeraltı Harita Saati: 9 Adım (Resimli)
Video: 🌎Coğrafya Dünya ÜLKELER -BAŞKENTLER Harita Bilgisi Çalışması 🚀KODLAMALARLA 📌KAMP-8 2024, Kasım
Anonim
Londra Yeraltı Haritası Saati
Londra Yeraltı Haritası Saati
Londra Yeraltı Haritası Saati
Londra Yeraltı Haritası Saati

2014 yılında, Londra'daki bir 3D baskı danışmanlığında stajyerlik ve Stratasys makinelerini kullanarak renkli litofanlarla yaptığım bir deneyden sonra, ofislerine özgü renkli bir tüp hatlarının renkli 3D baskısını tasarlıyorum. Ondan bir şeyler yapmaya kararlıydım. Kısa bir 2 yıl sonra 2016'da kendi 3D yazıcım vardı ve onu bir saate dönüştürmek için işe koyuldum.

Çocukken Tokyo Flash dijital saatlerinin şimdiye kadarki en harika şeyler olduğunu düşünürdüm ve bunun tasarım için ilham noktası olacağına karar verdim.

Ve şimdi onu yazmaya başlayana kadar 4 yıllık küçük bir ara oldu!

Kesin talimatların kopyalanması zor olsa da ve son birkaç yılda hobi PCB üretimindeki maliyetin azalması, LED yerleştirme için kesin yöntemimi geçersiz kılabilir. Umarım paylaşılan fikirler, başkalarının ince nesnelerden tuhaf saatler yapmasına yol açabilir!

Adım 1: Ön Katman

Ön Katman
Ön Katman
Ön Katman
Ön Katman
Ön Katman
Ön Katman

Girişte belirtildiği gibi, bu renkli bir 3D baskıydı, sanırım bir toz yatağı ve bağlayıcı ve pigment için modifiye edilmiş bir mürekkep kartuşu kullanan bir Stratasys makinesi.

Dosya tarihe karıştı, ancak bu katman herhangi bir şey olabilir, bir fotoğraf veya tek renkli bir litofan harikalar yaratabilir.

Bu parça 2014'te 3DS max'ta yapıldı, ancak bugün bir görüntüyü parlaklığa dayalı bir SLT'ye dönüştürmek için çevrimiçi araçlar var.

2. Adım: Kılavuz Katmanını Tasarlama

Kılavuz Katmanını Tasarlama
Kılavuz Katmanını Tasarlama
Kılavuz Katmanını Tasarlama
Kılavuz Katmanını Tasarlama
Kılavuz Katmanını Tasarlama
Kılavuz Katmanını Tasarlama
Kılavuz Katmanını Tasarlama
Kılavuz Katmanını Tasarlama

Bu, projenin karmaşıklığına ve zamanı okuma yöntemine karar verdiğimiz yerdir. Görüntüler, oynadığım 2 fikri gösteriyor.

Bunlar, tasarımda taranarak ve inkscape'de çizgiler çizilerek yapılmıştır.

Bu çok okunabilir bir saat değil, ancak gün boyunca satırları doldurma fikrini tercih ettim, böylece tasarım hedefi haline geldi.

İkili sayım, LED sayısını azaltmak için uygun bir yöntemdir ve eğer sizin sıkışmanız ikili ise okunabilirliği artırır, ancak bu benim 'satırları doldurma' fikrimi baltaladı, bu yüzden bu proje için bir seçenek değildi.

Tokyo Flaş Saatlerinde LED sayısını en aza indirmek yaygındır, ancak bir bölümün 3'lü veya 5'li olarak sayılması ve ardından o bölüm her dolduğunda başka bir dolum yapılması, dakikaları 60'tan 20 artı 2'ye düşürmek için bu tekniği dakikalar için kullandım. saniyeler için kesinlik konusunda çok endişeli değildi.

3. Adım: Kılavuz Katmanını Oluşturma

Kılavuz Katmanını Oluşturma
Kılavuz Katmanını Oluşturma
Kılavuz Katmanını Oluşturma
Kılavuz Katmanını Oluşturma
Kılavuz Katmanını Oluşturma
Kılavuz Katmanını Oluşturma

LED'ler için bu kılavuz katmanın 2 amacı vardır, LED'leri yerinde tutar ve aralarında dökülmeyi önler.

Tasarım düzeni için kullandığım taramanın üzerine doğrudan Inkscape'de bir katman olarak çizildi. Yazıcıma göndermeden önce blendera 1mm kalınlık eklendi.

Bu, yetersiz Makibox A6'mda yapmak zorunda olduğum en zor baskılardan biriydi, parça abs olarak basıldı, böylece minimum bükülme ile yapı platformuna bağlı tutmak için bir ton aseton bulamacı kullanıldı. Neyse ki bu kısım nihai üründe görünmüyor

Son görüntü, boşluk olup olmadığını kontrol etmek için bir lambaya tutulduğunu gösteriyor.

Geriye dönüp bakıldığında, bir çizgi boyunca ışıkların arasına dökülme, görseller için aslında tercih edilebilir, okunması zor değil, bu, her ışığın kısa kenarlarına kılavuza bir pah eklenerek sağlanabilir.

Adım 4: LED'lerin Kablolanması

LED'lerin kablolanması
LED'lerin kablolanması
LED'lerin kablolanması
LED'lerin kablolanması
LED'lerin kablolanması
LED'lerin kablolanması

İlk resim, delik boyutlandırmasını kontrol etmek için yaptığım test baskısını gösteriyor, LED'in küçük bir kuvvetle dantele tam oturmasını hedefliyordum, daha sonra kılavuz katmanı yerleştirirken doğru şekil elle yerleştirildi.

3D yazıcımın düşük toleransı nedeniyle, bazıları gevşekti ve yerinde kalması için bir miktar süper yapıştırıcı gerekiyordu, diğerleri ise çok sıkıydı, ancak lehimleme sırasında LED'e bastırılarak yerine oturması teşvik edildi, bu aslında daha uygundu. doğru boyuttaki delik, bir kez kablolandıktan sonra çekilecek bir kiracılığa sahipti.

Kablo sayısını azaltmak için LED'ler 7'ye 8'lik bir matriste lehimlendi, yani 55 LED'in tümü yalnızca 13 pim ile kontrol edilebilir, bu bağlantıların her birinin ne yazık ki kaybolmuş olan elle çizilmiş bir haritasını aldım.

Emaye tel kullanıldı, böylece bağlantı yapılmadan önce bir bölümü ütüyle ısıtarak ve kalaylayarak bölümlerin yerinde açığa çıkması sağlandı.

Bu süreç çok zaman alıcıydı, bir PCB tasarlamanızı şiddetle tavsiye ederim.

Adım 5: Elektroniği Tasarlamak

Elektronik Tasarım
Elektronik Tasarım
Elektronik Tasarım
Elektronik Tasarım
Elektronik Tasarım
Elektronik Tasarım
Elektronik Tasarım
Elektronik Tasarım

İlk planım, RTC'li bir Arduino mikro denetleyici kullanmaktı, ancak otomatik gün ışığından tasarruf ve WIFI üzerinden kontrol potansiyeline izin verdiği için Düğüm MCU D1 kartında bir ESP8266'yı seçti.

Pin sayısını daha da azaltmak için, bir MAX7219 (64 LED'e kadar işleyebilir) kullanabilmek için mükemmel sayıda LED'im vardı.

Bu IC yaygın olarak LED 7 Segment ekranları çalıştırmak için kullanılır, ancak benimkine çok benzer bir kullanım durumu vardı, minimum titreme ile rastgele sayıda LED'i aydınlattı, hatta kontrol edilebilir parlaklığa sahip.

Kablolama için protokol kullanmaya karar verdim, ancak kartal parça yerleştirme ve kablolamayı anlama konusunda yardımcı oldu

Pano dosyalarımı ekledim, ancak bu, Eagle'ı (ve şimdiye kadar güncel olmayan bir sürümü) ilk kez kullandığım için yalnızca referans amaçlıdır.

Adım 6: Elektroniği Kablolama

Elektroniği Kablolama
Elektroniği Kablolama
Elektroniği Kablolama
Elektroniği Kablolama
Elektronik Kablolama
Elektronik Kablolama
Elektroniği Kablolama
Elektroniği Kablolama

Bu, Eagle şemasını izleyerek, ESP ve LED matrisi için başlıkların kullanılması, montajda büyük ölçüde yardımcı olan, tekrar eden basit bir adımdı.

Anot ve Katot LED başlıklarındaki Pin 1 gümüş bir keskinlikle işaretlenmiştir, 7 ve diğer 8 olduğu gibi ayırt edilebilirler.

Adım 7: Programlama

Programlama
Programlama

Ekranımız geleneksel bir matris olmadığı için, HEX'te MAX IC'ye hangi bitlerin açılacağını görselleştirmek için bir yöntem bulmam gerekiyordu. Neyse ki, başımı belaya sokacak kadar excel biliyorum ve görüntülenmesini istediğim desene rağmen bana rehberlik edecek bir 'Hex sihirbazı' yaptım, elle yerleştirilmiş onay kutuları.

Bu, saatim, dakikam ve saniyem için hex'in bitsel OR kullanılarak birleştirilebileceğinin yeniden değerlendirilmesiyle geldi, max7219'a göndermek için son hex komutunu üretmek için saniyelere eklediğim küçük bir animasyon da dahil olmak üzere tahtadan emin olabilirim. donmamıştı.

Yani, neredeyse sonunda. ve çok iyi yaşlanmamış başka bir karar için zaman.

ESP'nin kodu LUA'da, Bugün, ESP topluluğu hala olgunlaşmaktayken, daha iyi dokümantasyon ve sağlam paket kitaplığı için arduino IDE'yi kullanmanızı tavsiye ederim ve bu proje için dil olarak LUA'yı seçtim.

Saati okumak için google sunucularına düzenli olarak ping atmak konusunda şüpheli bir karar verdim. Bu, kaymayı en aza indirmek için bir RTC'ye ihtiyaç duymayı ortadan kaldırdı, bu işe yarıyor, ancak gerçek zamanlı bir API kullanmanız daha iyi olur.

yarımSn = 0saat=0 dakika=0 saniye=0

düşükYoğunluk = 0

yüksek Yoğunluk = 9

yerel SSID = "Wifi"

yerel SSID_PASSWORD ="Parola"

function time() -- geçerli saati ve tarihi almak için internete bağlanın

wifi.sta.getip() ise local conn=net.createConnection(net. TCP, 0) conn:connect(80, "google.com")

conn:on("bağlantı", function(bağ, payload) conn:send("HEAD / HTTP/1.1\r\n".. "Host: time.is\r\n".. "Kabul et: */*\r\n".. " Kullanıcı Aracısı: Mozilla/4.0 (uyumlu; esp8266 Lua;)".. "\r\n\r\n") sonu)

conn:on("al", function(conn, payload) --print(payload) conn:close() local p=string.find(payload, "GMT") -- internetten yükteki saat ve tarih dizesini bulun, p~ ise saat dilimini değiştirin =nil o zaman -- saat, dakika, saniye, gün, aya karşılık gelen sayıları çıkar saat=tonumber(string.sub(payload, p-9, p-8)) dakika=tonumber(string.sub(payload, p-) 6, p-5) saniye=tonumber(string.sub(payload, p-3, p-2))) addHour() --hard kodlu BST (İngiliz yaz saati) yaz saati uygulaması (saat, dakika, saniye) yarımSaniye = (second%6)*2 --print(halfSec) else print("web güncellemesi başarısız!") end end --function) --end of "receive" olay işleyicisi

conn:on("bağlantıyı kesme", function(bağ, yük) conn=nil yük=nil end) end print("henüz wifi yok") end

function borTable(a, b, …) --bitsel VEYA tabloları birlikte

arg[1] ise, o zaman b = borTable(b, unpack(arg)) end local z = {} for i, v in ipairs(a) do table.insert(z, bit.bor(v, b)) son dönüş z son

function bxorTable(a, b, …) --bitsel VEYA tabloları birlikte

arg[1] ise, o zaman b = bxorTable(b, unpack(arg)) end local z = {} for i, v ipairs(a)'de do table.insert(z, bit.bxor(v, b)) son dönüş z son

işlev addSecond()

saniye=saniye+1 saniye>=60 ise saniye=0 dakika=dakika+1 dakika>=60 ise dakika=0 addHour() end end end

işlev eklemeSaati()

saat=saat+1 ise saat>=24 ise saat=0 biter saat == 2 veya saat == 16 ise max7219.setIntensity(lowIntensity) biter saat == 8 veya saat == 18 ise max7219.setIntensity(highIntensity) end end function update() yerel secGap = 6 yerel minGap = 3 yerel horGap = 1 yerel 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, 0x00, 0x01, 0x01, 0x03, 0x01, 0x03}, { 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}, { 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x }, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03} }; yerel 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, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, { 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, { 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x10}, { 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x12, 0x10}, { 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x12, 0x10}, { 0x02, 0x02, 0x02, 0x02, 0x12, 0x10, 0x12, 0x10 }, { 0x02, 0x02, 0x02, 0x12, 0x12, 0x10, 0x12, 0x10}, { 0x02, 0x02, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, { 0x02, 0x12, 0x12, 0x12, 0x12, 0x10, 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} }; yerel 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, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, { 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08}, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x08}, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, }, { 0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, { 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, { 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C,, 0x0C, 0x08}, { 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, { 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08C, 0x0C, 0x08}, 0x0C,0x0C, 0x0C, 0x0C, 0x0C, 0x48}, { 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, { 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48C, {0x4C, 0x48}, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, { 0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, { 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x0C, 0x4C, 0x0,4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48} }; --print(saat, dakika, saniye)

--tablo 0'da başlar, yani şu anda 1'de sec[0] = nil)

max7219.write({animate(borTable(sec[1+(saniye/snGap)], min[1+(dakika/minGap)], hor[1+(saat/horGap)]))})

bitiş --fonksiyon

wifi.setmode(wifi. İSTASYON)

wifi.sta.config(SSID, SSID_PASSWORD) wifi.sta.autoconnect(1)

-- max7219'u yapılandır

max7219 = require("max7219") max7219.setup({numberOfModules = 1, slaveSelectPin = 8, yoğunluk = yüksekYoğunluk })

--Ana program

checkOnline = tmr.create()

tmr.alarm(0, 180000, 1, zaman)

tmr.alarm(1, 1000, 1, addSecond)

tmr.alarm(2, 500, 1, güncelleme)

işlev canlandır (hareketsiz)

yerel çerçeveler={ { 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, eğer halfSec >=12 ise, halfSec = 0 end --print(halfSec) return bxorTable(frames[halfSec+1], still) end

Adım 8: Muhafaza

Konut
Konut
Konut
Konut
Konut
Konut

Şimdi inanılmaz işçiliğinizi sergileme ve projeye ev sahipliği yapma zamanı.

Ya öyle ya da geri dönüşümden bir amazon paketi alın ve bugün hala kullanımda olan geçici bir konut yapın.

Bu yaklaşımı kullanmanın yararı, projenin her katmanının kartonun kalınlığına neredeyse mükemmel şekilde uymasıydı, böylece bir sandviç istiflenip birbirine bantlanabilirdi. Benzer bir premium sürüm akrilik kullanabilir

9. Adım: Kapanış Açıklamaları

Okuduğunuz için teşekkürler, Çoğunuzun bildiği gibi bir projeyi belgelemek, onu yapmak kadar zor olabilir. Sonunda gün ışığını görebilecek konuştuğum video parçaları var.

Bu projeyi yapmak ve yazmak arasındaki yıllarda, 3D baskı kullanan daha fazla rastgele LED ekran örneği görmeyi bekliyordum, ancak RGB şeritlerindeki azalma, alternatif ihtiyacını çoğunlukla ortadan kaldırdı.

Umarım bu bilgilendirici olmuştur ve tam olarak tatmin etmeyen bölümler hakkında daha fazla ayrıntı vermeye çalışacağım için lütfen sorular sorun.

Şerefe

Önerilen: