Оглавление:
- Шаг 1: передний слой
- Шаг 2: Создание направляющего слоя
- Шаг 3: Создание направляющего слоя
- Шаг 4: Подключение светодиодов
- Шаг 5: проектирование электроники
- Шаг 6: Подключение электроники
- Шаг 7: Программирование
- Шаг 8: Жилье
- Шаг 9: Заключительные замечания
Видео: Часы с картой метро Лондона: 9 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
В 2014 году, пройдя стажировку в консалтинговой компании по 3D-печати в Лондоне и экспериментируя с цветными литофанами на их машине Stratasys, я разработал свой собственный прощальный подарок - цветную 3D-печать линий трубок, расположенных в их офисах. Я был полон решимости сделать что-нибудь из этого. Два года спустя, в 2016 году, у меня появился собственный 3D-принтер, и я принялся за работу по его созданию часов.
В детстве я думал, что цифровые часы Tokyo Flash были величайшими вещами на свете, и решил, что это станет источником вдохновения для дизайна.
И теперь это всего лишь небольшой перерыв на 4 года, пока я не успел все написать!
Хотя точные инструкции будет трудно воспроизвести, а снижение затрат на изготовление печатных плат для любителей за последние пару лет может сделать мой точный метод размещения светодиодов устаревшим. Я надеюсь, что общие идеи могут привести к тому, что другие будут делать странные часы из тонких предметов!
Шаг 1: передний слой
Как упоминалось во вступлении, это была цветная 3D-печать, я полагаю, это была машина Stratasys, в которой использовался слой порошка и модифицированный чернильный картридж для связующего и пигмента.
Файл потерян для истории, но этим слоем может быть что угодно, фотография или одноцветный литофан сотворили бы чудеса.
Эта часть была сделана в 3DS max в 2014 году, но сегодня есть онлайн-инструменты для преобразования изображения в SLT на основе яркости.
Шаг 2: Создание направляющего слоя
Здесь мы определяем сложность проекта и метод считывания времени. На изображениях показаны 2 идеи, с которыми я играл.
Они были сделаны путем сканирования дизайна и рисования линий в inkscape.
Это не очень удобочитаемые часы, но я предпочел идею заполнения линий в течение дня, так что это стало целью дизайна.
Двоичный подсчет - это жизнеспособный метод для уменьшения количества светодиодов, и он улучшит читаемость, если двоичный - это ваш застревание, но это подорвало мою идею о `` линиях заполнения '', поэтому не было вариантом для этого проекта.
На часах Tokyo Flash часто принято минимизировать количество светодиодов, но если одна секция подсчитывается по 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 светодиодов).
Эта микросхема обычно используется для управления 7-сегментными светодиодными дисплеями, но у нее был очень похожий на мой вариант использования: она освещала произвольное количество светодиодов с минимальным мерцанием и даже имела регулируемую яркость.
Я решил использовать макетную плату для разводки, но орел был полезен для размещения деталей и понимания разводки.
Я прикрепил свои файлы доски, но это был мой первый раз, когда я использовал eagle (и к настоящему времени устаревшая версия), поэтому они только для справки
Шаг 6: Подключение электроники
Это был повторяющийся простой шаг по схеме Eagle, использование заголовков для ESP и светодиодной матрицы очень помогло при сборке.
Контакт 1 на разъемах анода и катода светодиодов был помечен серебряным маркером, их можно было различить, как на 7, так и на других 8.
Шаг 7: Программирование
Поскольку наш дисплей не является традиционной матрицей, мне пришлось найти способ визуализировать, какие биты включать, которые он отправляет на микросхему MAX в шестнадцатеричном формате. К счастью, я знаю достаточно Excel, чтобы попасть в беду, и сделал «мастера шестнадцатеричного кода», который направил бы меня, хотя шаблон, который я хотел отобразить, вручную поставил флажки и все.
Это было связано с переоценкой, заключающейся в том, что шестнадцатеричные числа для моего часа, минуты и секунды могут быть объединены с помощью побитового ИЛИ для создания последней шестнадцатеричной команды для отправки на max7219, включая небольшую анимацию, которую я добавил к секундам, чтобы я мог убедиться, что плата не замерз.
Итак, почти конец. и время для другого решения, которое не слишком устарело.
Код для ESP находится в LUA. Сегодня я бы рекомендовал использовать Arduino IDE для лучшей документации и надежной библиотеки пакетов, в то время, когда сообщество ESP все еще развивалось, и я выбрал LUA в качестве языка для этого проекта.
Я принял сомнительное решение регулярно пинговать серверы Google, чтобы узнать время. Это привело к необходимости использования RTC для минимизации дрейфа, это работает, но вам лучше использовать API истинного времени.
halfSec = 0hour = 0 минут = 0 секунд = 0
lowIntensity = 0
highIntensity = 9
local SSID = "Wi-Fi"
local SSID_PASSWORD = "Пароль"
function time () - подключиться к Интернету, чтобы узнать текущее время и дату
если wifi.sta.getip (), то local conn = net.createConnection (net. TCP, 0) conn: connect (80, "google.com")
conn: on ("соединение", function (conn, payload) conn: send ("HEAD / HTTP / 1.1 / r / n".. "Host: time.is / r / n".. "Accept: * / * / 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 ~ = nil then - извлечь числа, соответствующие часу, минуте, секунде, дню, месяцу, час = tonumber (string.sub (payload, p-9, p-8)) minute = tonumber (string.sub (payload, p- 6, p-5)) second = tonumber (string.sub (payload, p-3, p-2)) addHour () - жестко закодированный BST (британское летнее время), дневное время экономит печать (час, минута, секунда) halfSec = (второй% 6) * 2 --print (halfSec) else print («сбой веб-обновления!») end end --function) --end of on «receive» обработчик события
conn: on ("отключение", function (conn, payload) conn = nil payload = nil end) end print ("wifi пока нет") end
функция borTable (a, b,…) - побитовое ИЛИ таблицы вместе
если arg [1], то b = borTable (b, unpack (arg)) end local z = {} для i, v в ipairs (a) do table.insert (z, bit.bor (v, b )) конец возврат z конец
function bxorTable (a, b,…) - побитовое ИЛИ таблицы вместе
если arg [1], то b = bxorTable (b, unpack (arg)) end local z = {} для i, v в ipairs (a) do table.insert (z, bit.bxor (v, b )) конец возврат z конец
функция addSecond ()
секунда = секунда + 1, если секунда> = 60, тогда секунда = 0 минута = минута + 1, если минута> = 60, тогда минута = 0 addHour () конец конец конец
функция addHour ()
hour = hour + 1, если 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) 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, 0x00, 0x02, 0x01, 0x03}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x03}, {0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03}, {0x03}, 0x00, 0x00, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03 }, {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}, {0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, {0x02x10, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x12, 0x10, 0x10, 0x02, 0x12, 0x10, 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}, {0x0x00}, {0x00}, 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, 0x08}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x08}, {0x04, 0x04, 0x0C0, 0x04, 0x0C04, 0x0C04, 0x0C0 }, {0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x0C04, 0x0C04, 0x0C0, 0x04, 0x0C, 0x08}, {0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0x, 0x08}, 0x0C08}, 0x0C08}, 0x0C, 0x0C, 0x0C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C48}, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x0C, {0x48}, {0x48} 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}}; --print (час, минута, секунда)
- таблица начинается с 0, поэтому в настоящее время с 1, как sec [0] = nil)
max7219.write ({animate (borTable (sec [1+ (second / secGap)], min [1+ (minute / minGap)], hor [1+ (hour / horGap)]))})
конец - функция
wifi.setmode (wifi. STATION)
wifi.sta.config (SSID, SSID_PASSWORD) wifi.sta.autoconnect (1)
- настроить max7219
max7219 = require ("max7219") max7219.setup ({numberOfModules = 1, slaveSelectPin = 8, интенсивность = highIntensity})
- Основная программа
checkOnline = tmr.create ()
tmr.alarm (0, 180000, 1, время)
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, если halfSec> = 12, то halfSec = 0 end --print (halfSec) return bxorTable (frames [halfSec + 1], still) end
Шаг 8: Жилье
Пришло время продемонстрировать свое невероятное мастерство и оформить проект.
Либо так, либо возьмите упаковку Amazon из утилизации и сделайте временное жилище, которое все еще используется сегодня.
Преимущество использования этого подхода состояло в том, что каждый слой проекта почти идеально соответствовал толщине картона, поэтому сэндвич можно было сложить в стопку и склеить вместе. В аналогичной версии премиум-класса может использоваться акрил.
Шаг 9: Заключительные замечания
Спасибо за чтение. Как многие из вас знают, документирование проекта может быть столь же трудным, как и его реализация. есть отрывки видео с моим разговором, которые, возможно, в конечном итоге увидят свет.
За годы, прошедшие между созданием этого проекта и его написанием, я ожидал увидеть больше примеров произвольных светодиодных дисплеев с использованием 3D-печати, но сокращение количества полос RGB в основном устранило необходимость в альтернативе.
Я надеюсь, что это было информативным, и, пожалуйста, задавайте вопросы, поскольку я постараюсь дать более подробную информацию о разделах, которые не полностью удовлетворяют.
Ваше здоровье
Рекомендуемые:
Аудиоплеер, использующий Arduino с картой Micro SD: 7 шагов (с изображениями)
Аудиоплеер, использующий Arduino с картой Micro SD: ПОДПИСАТЬСЯ на мой канал, чтобы увидеть больше проектов ……………………. Многие люди хотят связать SD-карту с интерфейсом. с Arduino или хотите получить аудиовыход через Arduino. Итак, вот самый простой и дешевый способ связать SD-карту с Arduino. вы можете нас
Часы Vortex: наручные часы с зеркалом бесконечности: 10 шагов (с изображениями)
Часы Vortex: наручные часы с зеркалом бесконечности: целью этого проекта было создание носимой версии зеркальных часов бесконечности. Он использует свои светодиоды RGB для индикации времени, назначая часы, минуты и секунды красным, зеленым и синим светам соответственно и перекрывая эти оттенки t
Взлом кнопки двери юбилейной линии лондонского метро: 12 шагов (с изображениями)
Взлом кнопки двери Jubilee Line в лондонском метро: магазин Лондонского музея транспорта продает списанные дверные кнопки Jubilee Line (доступны как левая, так и правая). Если вы думаете о реализации проекта, для которого нужна кнопка и какой-либо индикатор, вы бы «
Фотохромные часы и светящиеся в темноте часы: 12 шагов (с изображениями)
Фотохромные часы и часы, светящиеся в темноте: в этих часах используется специально созданный 4-значный 7-сегментный дисплей, сделанный из ультрафиолетовых светодиодов. Перед дисплеем размещается экран, который состоит либо из фосфоресцирующего («светится в темноте»), либо из фотохромного материала. Загорается кнопка вверху
C51 4-битные электронные часы - деревянные часы: 15 шагов (с изображениями)
C51 4-битные электронные часы - деревянные часы: у меня было немного свободного времени на этих выходных, поэтому я собрал эти 4-битные электронные цифровые часы DIY за 2,40 австралийских долларов, которые я недавно купил на AliExpress