Taula de continguts:

Rellotge del mapa del metro de Londres: 9 passos (amb imatges)
Rellotge del mapa del metro de Londres: 9 passos (amb imatges)

Vídeo: Rellotge del mapa del metro de Londres: 9 passos (amb imatges)

Vídeo: Rellotge del mapa del metro de Londres: 9 passos (amb imatges)
Vídeo: ¿Qué puede pasar? #shorts 2024, De novembre
Anonim
Rellotge del mapa del metro de Londres
Rellotge del mapa del metro de Londres
Rellotge del mapa del metro de Londres
Rellotge del mapa del metro de Londres

El 2014, després de fer pràctiques en una consultoria d’impressió 3D a Londres i un experiment amb els litòfans en color amb la seva màquina Stratasys, vaig dissenyar el meu propi regal de desaparició, una impressió 3D en color de línies de tubs locals a les seves oficines. Estava decidit a fer-ne alguna cosa. Al cap de 2 anys més tard, el 2016, tenia la meva pròpia impressora 3D i em vaig posar a treballar per convertir-la en un rellotge.

De petit, tot i que els rellotges digitals de Tokyo Flash eren les millors coses de la història, i vaig pensar que aquest seria el punt d'inspiració per al disseny.

I ara ha estat un petit descans de quatre anys fins que he arribat a redactar-lo.

Tot i que les instruccions exactes seran difícils de replicar, i la reducció de costos en la fabricació de PCB aficionats en els darrers dos anys pot fer que el meu mètode exacte per a la col·locació de LED sigui obsolet. Espero que les idees compartides puguin fer que altres facin rellotges estranys amb objectes prims.

Pas 1: capa frontal

Capa frontal
Capa frontal
Capa frontal
Capa frontal
Capa frontal
Capa frontal

Com es va esmentar a la introducció, es tractava d’una impressió 3D en color, crec que una màquina Stratasys que utilitzava un llit de pols i un cartutx de tinta modificat per a aglutinants i pigments.

El fitxer s’ha perdut a la història, però aquesta capa podria ser qualsevol cosa, una foto o un litofà d’un sol color seria meravellós.

Aquesta part es va fer en 3DS max el 2014, però avui hi ha eines en línia per convertir una imatge en un SLT basat en la brillantor

Pas 2: dissenyar la capa de guia

Disseny de la capa de guia
Disseny de la capa de guia
Disseny de la capa de guia
Disseny de la capa de guia
Disseny de la capa de guia
Disseny de la capa de guia
Disseny de la capa de guia
Disseny de la capa de guia

Aquí és on decidim la complexitat del projecte i el mètode per llegir l’hora. Les imatges mostren les 2 idees amb què jugava.

Aquests es van fer escanejant el disseny i dibuixant línies a través d’ell en un paisatge inks.

Aquest no és un rellotge molt llegible, però vaig preferir la idea que s’omplissin línies durant tot el dia de manera que es convertís en l’objectiu del disseny.

El recompte binari és un mètode viable per reduir el recompte de LEDs i milloraria la llegibilitat si binari és el vostre embús, però això va minar la meva idea de "línies d'ompliment", de manera que no era una opció per a aquest projecte

És freqüent que als rellotges Flash de Tokyo es minimitzi el recompte de LED, però tenint una secció comptant en 3 o 5 i després un altre farciment per cada vegada que s’omple aquesta secció, he utilitzat aquesta tècnica durant els minuts, per reduir-los de 60 a 20 més 2. I no va estar tan preocupat per la precisió això durant els segons.

Pas 3: crear la capa de guia

Construint la capa de guia
Construint la capa de guia
Construint la capa de guia
Construint la capa de guia
Construint la capa de guia
Construint la capa de guia

Aquesta capa de guia per als LED té 2 propòsits, manté els LEDs al seu lloc i evita que es vessin entre ells

Es va dibuixar com una capa a Inkscape directament a sobre de l'escaneig que utilitzava per al disseny del disseny. Es va afegir 1 mm de gruix a la batedora abans d’enviar-lo a la impressora.

Aquesta va ser una de les impressions més difícils que he de fer al meu magre Makibox A6, la peça es va imprimir en abs, de manera que es va utilitzar una tona de purí d'acetona per mantenir-la fixada a la plataforma de construcció amb un mínim deformació. Afortunadament, aquesta part no es veu al producte final

La imatge final la mostra sostinguda fins a una làmpada per comprovar si hi ha espaiats.

En retrospectiva, el vessament entre llums al llarg d’una línia pot ser realment preferible per a la imatge, no és més difícil de llegir, això es podria aconseguir afegint un xamfrà a la guia dels costats curts de cada llum.

Pas 4: Cablatge dels LED

Cablatge dels LED
Cablatge dels LED
Cablatge dels LED
Cablatge dels LED
Cablatge dels LED
Cablatge dels LED

La primera imatge mostra la impressió de prova que vaig fer per comprovar la mida dels forats, volia que el LED s’ajustés perfectament a l’encaix amb una mica de força, la forma correcta es va col·locar a mà quan es va col·locar la capa de guia.

A causa de la baixa tolerància de la meva impressora 3D, algunes estaven soltes i necessitaven una mica de superglue per mantenir-se al seu lloc mentre que altres estaven massa ajustades, però es van animar al seu lloc prement el LED mentre es soldava, en realitat s’ajustava millor que el forat de mida correcta, que tenia un arrendament per treure-lo un cop connectat.

Per reduir el recompte de cables, els LED es van soldar en una matriu de 7 per 8, és a dir, que tots els 55 LED es podien controlar només amb 13 pins, tenia un mapa dibuixat a mà de cadascuna d’aquestes connexions que malauradament s’ha perdut.

S'utilitzava filferro d'esmalt perquè les seccions es poguessin exposar al lloc escalfant una secció amb la planxa i l'estany abans de fer la connexió.

Aquest procés va costar molt de temps, recomanaria molt dissenyar un PCB

Pas 5: Disseny de l'electrònica

Disseny de l'electrònica
Disseny de l'electrònica
Disseny de l'electrònica
Disseny de l'electrònica
Disseny de l'electrònica
Disseny de l'electrònica
Disseny de l'electrònica
Disseny de l'electrònica

El meu pla inicial era utilitzar un microcontrolador Arduino amb un RTC, però vaig optar per un ESP8266 a la placa Node MCU D1, ja que permetia l’estalvi automàtic de la llum del dia i el potencial de control sobre WIFI.

Per reduir encara més el nombre de pins, tenia el nombre perfecte de LEDs per poder utilitzar un MAX7219 (que pot gestionar fins a 64 LED).

Aquest CI s'utilitza habitualment per conduir pantalles de segment de LED 7, però tenia un cas d'ús molt similar al meu, il·luminant un nombre arbitrari de LEDs amb un parpelleig mínim, fins i tot té una brillantor controlable.

Vaig decidir utilitzar protoboard per al cablejat, però l'àguila va ser útil per a la col·locació de peces i per entendre el cablejat

He adjuntat els meus fitxers de tauler, però aquesta era la meva primera vegada que utilitzava Eagle (i una versió obsoleta fins ara), de manera que només són de referència.

Pas 6: Cablatge de l'electrònica

Cablatge de l'electrònica
Cablatge de l'electrònica
Cablatge de l'electrònica
Cablatge de l'electrònica
Cablatge de l'electrònica
Cablatge de l'electrònica
Cablatge de l'electrònica
Cablatge de l'electrònica

Aquest va ser un pas senzill i repetitiu, seguint l'esquema Eagle, utilitzant capçaleres per a l'ESP i la matriu LED va ajudar enormement al muntatge.

El pin 1 de les capçaleres LED de l'ànode i el càtode es va marcar amb una puntera platejada, es podrien diferenciar entre les 7 i les altres 8.

Pas 7: Programació

Programació
Programació

Com que la nostra pantalla no és una matriu tradicional, he hagut de trobar un mètode per visualitzar quins bits s'haurien d'activar i que ha enviat al MAX IC a HEX. Afortunadament, sé prou excel·lents per entrar en problemes i he creat un "assistent hexadecimal" per guiar-me tot i que es mostri el patró que volia, les caselles de selecció col·locades a mà.

Això va venir amb la revalorització que l'hex de la meva hora, minut i segon es podia combinar amb un OR a bit per produir l'ordre hexadecimal final per enviar al max7219, inclosa una mica d'animació que vaig afegir als segons per poder assegurar-me que el tauler no s'havia congelat.

Per tant, gairebé al final. i temps per a una altra decisió que no ha envellit massa bé.

El codi de l’ESP es troba en LUA, avui recomanaria utilitzar l’IDE arduino per obtenir una millor documentació i una biblioteca de paquets sòlida, en el moment en què la comunitat ESP encara estava madurant i vaig escollir LUA com a idioma per a aquest projecte.

Vaig prendre la qüestionable decisió de fer ping regularment als servidors de Google per llegir l'hora. Això necessitava un RTC per minimitzar la deriva, això funciona, però és millor que feu servir una API de temps real.

halfSec = 0 hora = 0 minut = 0 segon = 0

Intensitat baixa = 0

alta intensitat = 9

SSID local = "Wifi"

local SSID_PASSWORD = "Contrasenya"

function time (): connecteu-vos a Internet per obtenir l’hora i la data actuals

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

conn: on ("connexió", funció (conn, càrrega útil) conn: send ("HEAD / HTTP / 1.1 / r / n".. "Amfitrió: time.is / r / n".. "Accepta: * / * / r / n".. " Agent d'usuari: Mozilla / 4.0 (compatible; esp8266 Lua;) ".." / r / n / r / n ") final)

conn: on ("rebre", function (conn, càrrega útil) --print (càrrega útil) conn: close () local p = string.find (càrrega útil, "GMT"): cerqueu la cadena de data i hora a la càrrega útil des d'Internet, canvieu per zona horària si p ~ = nul llavors: extreu nombres corresponents a l'hora, minut, segon, dia, mes hora = quantitat (cadena.sub (càrrega útil, p-9, p-8)) minut = quantitat (cadena.sub (càrrega útil, p- 6, p-5)) second = tonumber (string.sub (payload, p-3, p-2)) addHour () - Codi dur BST (hora estiu britànica) impressió d'estiu (hora, minut, segon) mitja seg = (segon% 6) * 2 --print (halfSec) else print ("fallada en l'actualització web!") end end --function) --end del gestor d'esdeveniments "rebre"

conn: on ("desconnexió", funció (conn, càrrega útil) conn = zero càrrega útil = zero final) final imprimir ("encara no hi ha wifi") final

funció borTable (a, b, …) - taules OR de forma conjunta

si arg [1] llavors b = borTable (b, desempaqueta (arg)) finalitza z local {=} per a i, v a ipairs (a) fes table.insert (z, bit.bor (v, b )) final tornar z acabar

funció bxorTable (a, b, …) - taules OR en sentit binari juntes

si arg [1] llavors b = bxorTable (b, desempaqueta (arg)) finalitza z = {} per a i, v en ipairs (a) fes table.insert (z, bit.bxor (v, b )) final tornar z acabar

funció addSecond ()

segon = segon + 1 si segon> = 60 llavors segon = 0 minut = minut + 1 si minut> = 60 llavors minut = 0 addHour () final extrem final

funció addHour ()

hora = hora + 1 si hora> = 24 llavors hora = 0 finalitza si hora == 2 o hora == 16 llavors max7219.setIntensity (baixa intensitat) finalitza si hora == 8 o hora == 18 llavors max7219.setIntensity (alta intensitat) update end function function () 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, 0x0, 0x00, 0x00, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}, {0x00, 0x01, 0x01, 0x0x01, 0x0x01 }, {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}, {0x00, 0x0, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x0, 0x02, 0x02, 0x02, 0x02, 0x00, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x, 10x, 10x }, {0x02, 0x02, 0x02, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x02, 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}}; hor local = {{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, 0x00}, {0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, {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, 0x0x, 0, 0, 0, 0, 0, 0, 0 }, {0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x0x 0x0x, 0x0C, 0x08}, {0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0x,, 0x0C, 0x0C, 0x0C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x0x,, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4x, 0x4x, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}}; --print (hora, minut, segon)

--la taula comença a 0, de manera que a 1 segons el moment actual [0] = nul)

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

funció final

wifi.setmode (wifi. STATION)

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

--configure max7219

max7219 = require ("max7219") max7219.setup ({numberOfModules = 1, slaveSelectPin = 8, intensity = highIntensity})

--Programa principal

checkOnline = tmr.create ()

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

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

tmr.alarm (2, 500, 1, actualització)

funció animar (encara)

marcs locals = {{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}, {0x, 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 si halfSec> = 12 llavors halfSec = 0 end --print (halfSec) return bxorTable (frames [halfSec + 1], still) end

Pas 8: L'habitatge

L'habitatge
L'habitatge
L'habitatge
L'habitatge
L'habitatge
L'habitatge

Ara és el vostre moment per mostrar la vostra increïble artesania i acollir el projecte.

O bé, o bé treieu un paquet d’amazones del reciclatge i feu un habitatge temporal que encara s’utilitza avui en dia.

L’avantatge d’utilitzar aquest enfocament era que cada capa del projecte coincidia gairebé perfectament amb el gruix del cartró, de manera que un sandvitx es podia apilar i enganxar. Una versió premium similar podria utilitzar acrílic

Pas 9: Observacions de cloenda

Gràcies per llegir. Com molts de vostès saben documentar un projecte pot ser tan difícil com fer-lo. hi ha retalls de vídeo amb mi parlant que poden acabar veient la llum del dia.

En els anys transcorreguts entre la realització i redacció d’aquest projecte, esperava veure més exemples de pantalles LED arbitràries que utilitzen la impressió 3D, però la reducció de les tires RGB ha eliminat sobretot la necessitat d’una alternativa.

Espero que això hagi estat informatiu i, si us plau, feu preguntes, ja que intentaré donar més detalls sobre les seccions que no satisfan del tot.

Ànims

Recomanat: