Съдържание:

Лондонски подземен часовник с карта: 9 стъпки (със снимки)
Лондонски подземен часовник с карта: 9 стъпки (със снимки)

Видео: Лондонски подземен часовник с карта: 9 стъпки (със снимки)

Видео: Лондонски подземен часовник с карта: 9 стъпки (със снимки)
Видео: Детето ми се храни само със зеленчуци 2024, Ноември
Anonim
Лондонски подземен часовник с карти
Лондонски подземен часовник с карти
Лондонски подземен часовник с карти
Лондонски подземен часовник с карти

През 2014 г., след като бях на стаж в консултантска фирма за 3D печат в Лондон и експеримент с цветни литофани с помощта на тяхната машина Stratasys, аз проектирам свой собствен подарък за изчезване, цветен 3D печат на тръбни линии, локални до техните офиси. Бях решен да направя нещо от това. Кратко 2 години по -късно през 2016 г. имах собствен 3D принтер и започнах работа, превръщайки го в часовник.

Като дете си мислех, че дигиталните часовници на Tokyo Flash са най -великите неща на всички времена и избягвах това, което би било вдъхновението за дизайна.

И сега е просто малка 4 -годишна пауза, докато се оправя да я напиша!

Докато точните инструкции ще бъдат трудни за възпроизвеждане, а намаляването на разходите при производството на печатни платки за любители през последните няколко години може да направи моя точен метод за поставяне на светодиоди остарял. Надявам се, че споделените идеи биха могли да накарат другите да правят странни часовници от тънки предмети!

Стъпка 1: Преден слой

Преден слой
Преден слой
Преден слой
Преден слой
Преден слой
Преден слой

Както бе споменато във въведението, това беше цветен 3D печат, смятам, че машина Stratasys, която използва прахово легло и модифицирана касета с мастило за свързващо вещество и пигмент.

Файлът е загубен в историята, но този слой може да бъде всичко, снимка или едноцветен литофан би направил чудеса.

Тази част е направена в 3DS max през 2014 г., но днес има онлайн инструменти за превръщане на изображение в SLT въз основа на яркостта

Стъпка 2: Проектиране на ръководния слой

Проектиране на ръководния слой
Проектиране на ръководния слой
Проектиране на ръководния слой
Проектиране на ръководния слой
Проектиране на ръководния слой
Проектиране на ръководния слой
Проектиране на ръководния слой
Проектиране на ръководния слой

Тук решаваме сложността на проекта и метода за отчитане на времето. Изображенията показват 2 -те идеи, с които си играех.

Те бяха направени чрез сканиране в дизайна и изчертаване на линии в него в inkscape.

Това не е много четлив часовник, но предпочетох идеята линиите да се запълват през целия ден, така че това се превърна в целта на дизайна.

Двоичното броене е жизнеспособен метод за намаляване на броя на светодиодите и би подобрило четимостта, ако двоичното е вашето задръстване, но това подкопа идеята ми за „запълване на линии“, така че не беше опция за този проект

Често срещано е в часовниците на Токио, за да се сведе до минимум броя на светодиодите, но имайки една секция, която брои 3 или 5, а след това още едно попълване за всеки път, когато тази секция запълва, използвах тази техника за минутите, за да ги намаля от 60 на 20 плюс 2. I не се притеснявах толкова точно за секундите.

Стъпка 3: Изграждане на ръководния слой

Изграждане на ръководния слой
Изграждане на ръководния слой
Изграждане на ръководния слой
Изграждане на ръководния слой
Изграждане на ръководния слой
Изграждане на ръководния слой

Този направляващ слой за светодиодите има 2 цели, той държи светодиодите на място и предотвратява разливането между тях

Той беше нарисуван като слой върху Inkscape директно върху сканирането, което използвах за оформлението на дизайна. Дебелина 1 мм беше добавена в блендер преди изпращане към моя принтер.

Това беше един от най -трудните отпечатъци, които трябва да направя на моя оскъден Makibox A6, частта беше отпечатана в абс, така че един тон суспензия от ацетон беше използван, за да я държи прикрепена към платформата за изграждане с минимално изкривяване. За щастие тази част не се вижда на крайния продукт

Крайното изображение показва, че е държано до лампа, за да провери за разстояние.

Като се обърне назад, разливането между светлините по една линия може действително да е за предпочитане за визуалните изображения, не е по -трудно за четене, това може да се постигне чрез добавяне на фаска към водача на късите страни на всяка светлина

Стъпка 4: Окабеляване на светодиодите

Окабеляване на светодиодите
Окабеляване на светодиодите
Окабеляване на светодиодите
Окабеляване на светодиодите
Окабеляване на светодиодите
Окабеляване на светодиодите

Изображението на юмрука показва тестовия отпечатък, който направих за проверка на размера на отворите, имах за цел светодиодът да приляга плътно в дантела с малка сила, след това правилната форма беше поставена на ръка при полагане на водещия слой.

Поради ниската толерантност на моя 3D принтер, някои бяха хлабави и се нуждаеха от парче суперлепило, за да останат на мястото си, докато други бяха твърде стегнати, но бяха насърчени на място чрез натискане на светодиода по време на запояване, това всъщност беше по -подходящо от отворите с правилни размери, които трябваше да бъдат извадени, след като са свързани.

За да се намали броя на проводниците, светодиодите бяха запоени в матрица 7 на 8, което означава, че всичките 55 светодиода могат да се контролират само от 13 пина, имах ръчно нарисувана карта на всяка от тези връзки, която за съжаление беше загубена.

Използвана е емайлирана тел, така че участъците да могат да бъдат изложени на място чрез нагряване на участък с желязото и калайдисване преди свързването.

Този процес отне много време, силно препоръчвам проектирането на печатна платка

Стъпка 5: Проектиране на електрониката

Проектиране на електроника
Проектиране на електроника
Проектиране на електроника
Проектиране на електроника
Проектиране на електроника
Проектиране на електроника
Проектиране на електроника
Проектиране на електроника

Първоначалният ми план беше да използвам микроконтролер Arduino с RTC, но избрах ESP8266 на платката Node MCU D1, тъй като позволяваше автоматично лятно спестяване и потенциал за контрол над WIFI.

За да намаля допълнително броя на пиновете, имах идеалния брой светодиоди, за да мога да използвам MAX7219 (който може да обработва до 64 светодиода).

Тази интегрална схема обикновено се използва за задвижване на LED 7 -сегментни дисплеи, но имаше много подобен случай на използване при мен, осветявайки произволен брой светодиоди с минимално трептене, дори има контролируема яркост.

Реших да използвам протоборд за окабеляване, но орелът беше полезен за разположението на части и разбирането на окабеляването

Прикачих файловете на борда си, но за първи път използвах eagle (и остаряла версия досега), така че те са само за справка

Стъпка 6: Окабеляване на електрониката

Окабеляване на електрониката
Окабеляване на електрониката
Окабеляване на електрониката
Окабеляване на електрониката
Окабеляване на електрониката
Окабеляване на електрониката
Окабеляване на електрониката
Окабеляване на електрониката

Това беше повтаряща се проста стъпка, следвайки схемата на Eagle, използването на заглавки за ESP и LED матрицата помогнаха значително при сглобяването.

ПИН 1 на LED заглавките с анод и катод беше маркиран със сребърна острие, те можеха да бъдат разграничени, като на 7 бяха останалите 8.

Стъпка 7: Програмиране

Програмиране
Програмиране

Тъй като нашият дисплей не е традиционна матрица, трябваше да намеря метод за визуализиране на кои битове да се включат, които той изпраща към MAX IC в HEX. За щастие знам, че Excel е достатъчно, за да изпадна в беда и направих „шестнадесетичен магьосник“, който да ме ръководи, въпреки че моделът, който исках да се показва, постави ръчно отметки и всичко.

Това дойде с преоценката, че шестнадесетичната стойност за моя час, минута и секунди може да се комбинира с помощта на побитово ИЛИ за да се произведе последната шестнадесетична команда за изпращане до max7219, включително малко анимация, която добавих към секундите, за да мога да се уверя, че дъската не беше замръзнал

И така, почти на финала. и време за друго решение, което не е остаряло прекалено добре.

Кодът за ESP е в LUA. Днес бих препоръчал използването на arduino IDE за по -добра документация и стабилна библиотека с пакети, по времето, когато общността на ESP все още узряваше и аз избрах LUA като език за този проект.

Взех съмнителното решение редовно да пингвам сървърите на Google, за да чета времето. Това заобиколи нуждата от RTC, за да се сведе до минимум отклонението, това работи, но вие; би било по -добре да използвате API за истинско време.

halfSec = 0 час = 0 минута = 0 секунда = 0

lowIntensity = 0

highIntensity = 9

локален SSID = "Wifi"

local SSID_PASSWORD = "Парола"

function time () -свържете се с интернет, за да получите текущия час и дата

ако wifi.sta.getip () тогава локален conn = net.createConnection (net. TCP, 0) conn: connect (80, "google.com")

conn: on ("връзка", функция (conn, полезен товар) conn: send ("HEAD/HTTP/1.1 / r / n".. "Хост: time.is / r / n".. "Приемам: */ *\ r / n".. " Потребителски агент: Mozilla/4.0 (съвместим; esp8266 Lua;) ".." / r / n / r / n ") край)

conn: on ("получаване", function (conn, payload) --print (payload) conn: close () local p = string.find (payload, "GMT") -намерете низа за час и дата в полезния товар от интернет, променете за часова зона, ако p ~ = нула след това-извличане на числа, съответстващи на час, минута, секунда, ден, месец час = брой (string.sub (полезен товар, p-9, p-8)) минута = tonumber (string.sub (полезен товар, p- 6, p-5)) second = tonumber (string.sub (полезен товар, p-3, p-2)) addHour ()-твърдо кодирано BST (британско лятно време) лятно пестене на печат (час, минута, втора) halfSec = (second%6)*2 --print (halfSec) else print ("web update failed!") end end -function) --end of on "receive" манипулатор на събития

conn: on ("прекъсване на връзката", функция (conn, полезен товар) conn = нулев полезен товар = нулев край) край печат ("все още няма wifi") край

функция borTable (a, b,…) -побитови ИЛИ таблици заедно

ако arg [1], тогава b = borTable (b, разопаковайте (arg)) край локален z = {} за i, v в ipairs (a) направете table.insert (z, bit.bor (v, b )) end return z end

функция bxorTable (a, b, …) -побитови ИЛИ таблици заедно

ако arg [1], тогава b = bxorTable (b, разопаковайте (arg)) край локален z = {} за i, v в ipairs (a) направете table.insert (z, bit.bxor (v, b )) end return z end

функция addSecond ()

second = second+1 if second> = 60 then second = 0 minute = minute+1 if minute> = 60 then minute = 0 addHour () end end end

функция addHour ()

час = час+1, ако час> = 24 тогава час = 0 край, ако час == 2 или час == 16, тогава max7219.setIntensity (lowIntensity) край, ако час == 8 или час == 18 тогава max7219.setIntensity (highIntensity) end end функция 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, 0x00, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03 }, {0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}}; локална мин. = {{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}}; локален хор = {{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, 0x0C, 0x0С, }, {0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x04, 0x0C, 0x0C, 0x04, 0x04, 0x0C, 0C0C0, 0x0C, 0x08}, {0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, 0x0C, 0x0C, 0x0C, 0x08}, 0x0C, 0x0C, 0x0C, 0x0C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x4, 0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4x, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}}; -печат (час, минута, секунда)

-таблицата започва на 0, така че в 1, както в момента sec [0] = нула)

max7219.write ({animate (borTable (sec [1+ (second/secGap)]), min [1+ (minute/minGap)], hor [1+ (час/horGap)])}})

end --функция

wifi.setmode (wifi. STATION)

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

--конфигурирайте max7219

max7219 = изисква ("max7219") max7219.setup ({numberOfModules = 1, slaveSelectPin = 8, интензивност = висока интензивност})

-Основна програма

checkOnline = tmr.create ()

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

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

tmr.alarm (2, 500, 1, актуализация)

функция анимация (неподвижна)

локални рамки = {{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 (кадри [halfSec+1], неподвижно) end

Стъпка 8: Жилището

Жилището
Жилището
Жилището
Жилището
Жилището
Жилището

Сега е моментът да покажете невероятната си изработка и да поместите проекта.

Или това, или вземете пакет от Amazon от рециклирането и направете временно жилище, което все още се използва днес.

Ползата от използването на този подход беше, че всеки слой от проекта почти перфектно съвпада с дебелината на картона, така че един сандвич може да бъде подреден и залепен заедно. Подобна премиум версия може да използва акрил

Стъпка 9: Затваряне на забележките

Благодарим ви, че прочетохте, тъй като много от вас знаят, че документирането на проект може да бъде толкова трудно, колкото и създаването му. има откъси от видео с мен, които говорят, които в крайна сметка може да видят бял свят.

През годините между създаването на този проект и неговото писане очаквах да видя още примери за произволни LED дисплеи, използващи 3D печат, но намаляването на RGB лентите най -вече премахна необходимостта от алтернатива.

Надявам се, че това е било информативно и моля задайте въпроси, тъй като ще се опитам да дам повече подробности за раздели, които не отговарят напълно.

Наздраве

Препоръчано: