תוכן עניינים:
- שלב 1: שכבה קדמית
- שלב 2: עיצוב שכבת המדריכים
- שלב 3: בניית שכבת המדריכים
- שלב 4: חיווט הלדים
- שלב 5: עיצוב האלקטרוניקה
- שלב 6: חיווט האלקטרוניקה
- שלב 7: תכנות
- שלב 8: הדיור
- שלב 9: הערות סגירה
וִידֵאוֹ: שעון מפה תת קרקעי בלונדון: 9 שלבים (עם תמונות)
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:11
בשנת 2014, מאחורי ההתמחות בייעוץ להדפסה תלת -ממדית בלונדון וניסוי עם ליטופנים צבעוניים באמצעות מכונת Stratasys שלהם, אני מעצב מתנה משלי מתרחקת, הדפסה תלת -ממדית צבעונית של קווי צינור מקומיים למשרדיהם. הייתי נחושה לעשות מזה משהו. כעבור שנתיים קצרות בשנת 2016 הייתה לי מדפסת תלת מימד משלי, והתחלתי לעבוד כדי להפוך אותה לשעון.
כילד, למרות שהשעונים הדיגיטליים של טוקיו פלאש היו הדברים הגדולים ביותר אי פעם, וסיכמתי שזו תהיה נקודת ההשראה לעיצוב.
ועכשיו זו הייתה רק הפסקה קלה של 4 שנים עד שהגעתי לכתוב את זה!
אמנם יהיה קשה לשחזר את ההוראות המדויקות, והוזלת העלות בייצור PCB חובבני בשנים האחרונות עשויה להפוך את השיטה המדויקת שלי למיקום LED למיושנת. אני מקווה שהרעיונות המשותפים עשויים להוביל לכך שאחרים יעשו שעונים מוזרים מחפצים דקים!
שלב 1: שכבה קדמית
כפי שהוזכר במבוא, זו הייתה הדפסה תלת -ממדית צבעונית, אני מאמין שמכונת Stratasys השתמשה במיטת אבקה ובמחסנית דיו שונה לקלסר ולפיגמנט.
הקובץ אבד להיסטוריה, אך שכבה זו יכולה להיות כל דבר, צילום או ליטופן בצבע אחד יעשו פלאים.
חלק זה נוצר ב- 3DS max בשנת 2014, אך כיום ישנם כלים מקוונים להפוך תמונה ל- SLT המבוסס על בהירות.
שלב 2: עיצוב שכבת המדריכים
כאן אנו קובעים את מורכבות הפרויקט ואת השיטה לקריאת הזמן. התמונות מציגות את 2 הרעיונות ששיחקתי איתם.
אלה נעשו על ידי סריקה בעיצוב וציור קווים על פניו ב- inkscape.
זה לא שעון קריא במיוחד, אבל העדפתי את הרעיון של מילוי קווים לאורך כל היום כך שהפך למטרה העיצובית.
ספירה בינארית היא שיטה משתלמת להפחתת ספירת ה- LED, והיא תשפר את הקריאות אם בינארית היא הריבה שלך, אבל זה ערער את הרעיון שלי 'קווי מילוי', כך שלא הייתה אופציה לפרויקט הזה
זה נפוץ בשעוני הפלאש של טוקיו כדי למזער את ספירת הלדים, אך עם קטע אחד שמספר 3 או 5 ולאחר מכן מילוי נוסף עבור כל פעם שהקטע מתמלא, השתמשתי בטכניקה זו במשך הדקות, כדי לצמצם אותם מ -60 ל -20 פלוס 2. I לא כל כך דאגתי מהדיוק הזה לשניות.
שלב 3: בניית שכבת המדריכים
לשכבת מנחה זו עבור נוריות הלד יש 2 מטרות, היא מחזיקה את הנורות במקומן ומונעת זליגה ביניהן
הוא צוייר כשכבה ב- Inkscape ישירות על גבי הסריקה שבה השתמשתי לפריסת העיצוב. עובי 1 מ מ נוסף בבלנדר לפני שליחתו למדפסת שלי.
זה היה אחד ההדפסים הקשים ביותר שעלי לעשות על ה- Makibox A6 הדלה שלי, החלק הודפס ב שרירי בטן ולכן השתמשו בטון של תערובת אצטון בכדי לשמור אותו מחובר לפלטפורמת הבנייה עם עיקום מינימלי. למרבה המזל חלק זה אינו נראה על המוצר הסופי
התמונה הסופית מראה שהיא החזיקה מנורה כדי לבדוק את המרווח.
במבט לאחור, שפיכה בין אורות לאורך קו עשויה להיות עדיפה על החזותית, לא קשה יותר לקריאה, ניתן להשיג זאת על ידי הוספת שיפוע למדריך בצדדים הקצרים של כל אור
שלב 4: חיווט הלדים
תמונת האגרוף מציגה את הדפס הבדיקה שעשיתי לבדיקת גודל החורים, כיוונתי שה- LED יתאים היטב לתחרה עם מעט כוח, ואז הצורה הנכונה הונחה ביד בעת פריסת שכבת המדריך.
בשל הסובלנות הנמוכה של מדפסת התלת -ממד שלי, חלקם היו רופפים ודרשו טיפה של דבק -על כדי להישאר במקומם בעוד שאחרים היו הדוקים מדי, אך עודדו אותם למקומם על -ידי לחיצה כלפי מטה על הנורית בזמן הלחמה, זו למעשה הייתה התאמה טובה יותר מאשר החור בגודל הנכון, שהיה בעל שכירות לשלוף לאחר חיבור הכבל.
כדי לצמצם את ספירת החוטים הלדים נלחמו במטריצה של 7 על 8, כלומר ניתן לשלוט בכל 55 הלדים על ידי 13 סיכות בלבד, הייתה לי מפה מצוירת ביד של כל אחד מהחיבורים האלה שלצערנו אבדה.
נעשה שימוש בחוט אמייל כדי שניתן יהיה לחשוף מקטעים במקומם על ידי חימום קטע עם המגהץ והפחחות לפני ביצוע החיבור.
תהליך זה היה זמן רב מאוד, אני ממליץ בחום לעצב PCB
שלב 5: עיצוב האלקטרוניקה
התכנון הראשוני שלי היה להשתמש במיקרו -בקר Arduino עם RTC, אך בחר ב- ESP8266 בלוח ה- Node MCU D1 מכיוון שהוא מאפשר חיסכון בשעות היום האוטומטיות ופוטנציאל השליטה ב- WIFI.
כדי להפחית עוד יותר את מספר הפינים, היה לי המספר המושלם של נוריות LED בכדי להשתמש ב- MAX7219 (שיכול להתמודד עם עד 64 נוריות).
IC זה משמש בדרך כלל להנעת תצוגות LED 7 פלחים, אך היה לו מקרה שימוש דומה לשלי, המאיר מספר שרירותי של נוריות עם הבהוב מינימלי, יש לו אפילו בהירות ניתנת לשליטה.
החלטתי להשתמש בפרוטובארד לחיווט, אך נשר עזר למיקום חלק והבנת החיווט
צירפתי את קבצי הלוח שלי, אך זו הייתה הפעם הראשונה שאני משתמשת בנשר (ובגירסה מיושנת עד כה) ולכן הם לעיון בלבד
שלב 6: חיווט האלקטרוניקה
זה היה צעד פשוט וחוזר על עצמו, בעקבות סכמטי הנשר, שימוש בכותרות ל- ESP ומטריצת ה- LED עזר מאוד בהרכבה.
סיכה 1 בכותרות ה- LED של האנודה והקתודה סומנה בחריפה כסופה, ניתן היה להבדיל ביניהן, כפי שהיה ב- 7 ו -8 האחרות.
שלב 7: תכנות
מכיוון שהתצוגה שלנו אינה מטריצה מסורתית, הייתי צריך למצוא שיטה להמחיש אילו סיביות להפעיל אותה היא שלחה ל- MAX IC ב- HEX. למרבה המזל אני יודע מספיק אקסל כדי להסתבך ועשיתי 'אשף משושה' שידריך אותי למרות שהתבנית שרציתי להציג, ממוקמת ביד תיבות סימן.
זה בא עם הערכת הערך שאפשר לשלב את ה- hex עבור השעה, הדקה והשניות שלי בעזרת OR קצת כדי לייצר את פקודת ה- hex הסופית לשלוח ל- max7219, כולל אנימציה קטנה שהוספתי לשניות כדי שאוכל לוודא שהלוח לא היה קפוא.
אז, כמעט בסוף. והגיע הזמן להחלטה נוספת שלא הזדקנה טוב מדי.
הקוד ל- ESP נמצא ב- LUA, היום הייתי ממליץ להשתמש ב- arduino IDE בגלל התיעוד הטוב יותר שלו וספריית החבילות החזקה, בזמן שקהילת ה- ESP עדיין התבגרה ובחרתי ב- LUA כשפה לפרויקט זה.
קיבלתי את ההחלטה המפוקפקת לבצע פינג קבוע בשרתי Google כדי לקרוא את השעה. זה הסתדר עם צורך ב- RTC כדי למזער את הסחף, זה עובד, אבל יהיה לך טוב יותר להשתמש ב- API בזמן אמת.
halfSec = 0hour = 0 minute = 0 second = 0
רגישות נמוכה = 0
אינטנסיביות גבוהה = 9
SSID מקומי = "Wifi"
SSID_PASSWORD מקומי = "סיסמה"
function function () -התחבר לאינטרנט כדי לקבל את השעה והתאריך הנוכחיים
אם 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".. " סוכן משתמש: מוזילה/4.0 (תואם; esp8266 Lua;) ".." / r / n / r / n ") סוף)
conn: on ("קבל", function (conn, payload) -הדפסה (מטען) conn: close () מקומי p = string.find (מטען, "GMT") -מצא את מחרוזת הזמן והתאריך במטען מהאינטרנט, שנה עבור אזור זמן אם p ~ = אפס אז-חלץ מספרים המתאימים לשעה, דקה, שנייה, יום, שעה לחודש = טון מספר (string.sub (מטען, p-9, p-8)) דקה = טון מספר (string.sub (מטען, p- 6, p-5)) second = tonumber (string.sub (מטען, p-3, p-2)) addHour ()-BST מקודד BST (שעון קיץ בריטי) שמירת הדפסה (שעות, דקות, שנייה) חצי שניות = (שני%6)*2 -הדפסה (halfSec) אחר הדפסה ("עדכון האינטרנט נכשל!") סוף סוף -פונקציה) -סוף של מטפל אירועים "קבל"
conn: on ("ניתוק", פונקציה (חיבור, מטען) conn = מטען אפסי = סוף אפס) סוף הדפסה ("אין עדיין wifi") סוף
פונקציה borTable (a, b,…) -דו כיוונית או שולחנות יחד
אם arg [1] אז b = borTable (b, פרק (arg)) סוף מקומי z = {} עבור i, v ב- ipairs (a) do table.insert (z, bit.bor (v, b )) סיום החזרה z סוף
פונקציה bxorTable (a, b,…) -דו כיוונית או שולחנות יחד
אם arg [1] אז b = bxorTable (b, פרק (arg)) סוף מקומי z = {} עבור i, v ב- ipairs (a) do table.insert (z, bit.bxor (v, b )) סיום החזרה z סוף
function addSecond ()
second = second+1 if second> = 60 then second = 0 minute = minute+1 if minute> = 60 then minute = 0 addHour () end end end end
פונקציה addHour ()
שעה = שעה+1 אם שעה> = 24 אז שעה = 0 סוף אם שעה == 2 או שעה == 16 ואז max7219.setIntensity (lowIntensity) מסתיים אם שעה == 8 או שעה == 18 אז max7219.setIntensity (highIntensity) עדכון פונקציית סוף סוף () מקומי secGap = 6 מקומי minGap = 3 מקומי horGap = שנייה מקומית אחת = {{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, 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, 0x0, }, {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}, {0x0, 0x2, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x0, 0x0, 0x2, 0x02, 0x02, 0x02, 0x02, 0x00, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x02, 0x12, 0x12 }, {0x02, 0x02, 0x02, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x02, 0x02, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, {0x02, 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 מקומי = {{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,, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x0, 0x4, 0x0,, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x08}, {0x04, 0x04, 0x0, 0x0, 0x0, 0x4 }, {0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x04, 0x, 0x, 0x, 0x, 0x,, 0x0C, 0x08}, {0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x, 0x, 0x, 0x, 0x, 0x0C, 0x0C, 0x0C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4, 0x, 0x, 0x, 0x, 0x,, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x0C, 0x0C, 0x4C, 0x4C, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}}; -הדפסה (שעה, דקה, שנייה)
-הטבלה מתחילה ב -0, כך שבשעה 1 כרגע שניות [0] = אפס)
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, intensity = 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 if halfSec> = 12 then halfSec = 0 end -print (halfSec) return bxorTable (frames [halfSec+1], still) end
שלב 8: הדיור
עכשיו הזמן שלך להתהדר באומנות המדהימה שלך ולשכן את הפרויקט.
או זה או שתוציא חבילת אמזון מהמיחזור ותעשה דיור זמני שעדיין נמצא בשימוש כיום.
היתרון בשימוש בגישה זו היה שכל שכבה של הפרויקט התאימה כמעט באופן מושלם לעובי הקרטון, כך שניתן לערום כריך ולהדביק אותו. גרסת פרימיום דומה יכולה להשתמש באקריליק
שלב 9: הערות סגירה
תודה שקראתם, כפי שרבים מכם יודעים שתיעוד פרויקט יכול להיות קשה כמו ביצועו. יש קטעי וידיאו איתי מדברים שאולי בסופו של דבר יראו אור יום.
בשנים שבין יצירת הפרויקט הזה לכתיבתו ציפיתי לראות דוגמאות נוספות להצגות LED שרירותיות בהדפסה תלת -ממדית, אך ההפחתה ברצועות RGB הסירה בעיקר את הצורך באלטרנטיבה.
אני מקווה שזה היה אינפורמטיבי, ושאל שאלות כיוון שאנסה לתת פרטים נוספים על חלקים שאינם מספקים באופן מלא.
לחיים
מוּמלָץ:
מפה חכמה של איידהו עם נתוני LED + אמנות: 8 שלבים (עם תמונות)
מפה חכמה של איידהו עם נתוני LED + אמנות: תמיד רציתי דרך להציג באופן אמנותי ודינאמי נתונים גיאוגרפיים על ידי " ציור " מפה עם אור. אני גר באיידהו ואוהב את המדינה שלי אז חשבתי שזה יהיה מקום נהדר להתחיל בו! בנוסף להיותו יצירת אומנות
פריצת כפתור לדלת קו יובל מתחת לרכבת התחתית בלונדון: 12 שלבים (עם תמונות)
פריצת כפתור לדלת קו היובל המחתרת של לונדון: חנות מוזיאון התחבורה בלונדון מוכרת כפתורי דלת שהופסקו מקו היובל (ניתן להשיג גם שמאל וימין). אם אתה חושב לבצע פרויקט הדורש כפתור ונורית חיווי כלשהי, היית
שעון רשת ESP8266 ללא כל RTC - Nodemcu NTP שעון אין RTC - פרויקט שעון אינטרנט: 4 שלבים
שעון רשת ESP8266 ללא כל RTC | Nodemcu NTP שעון אין RTC | פרויקט שעון אינטרנט: בפרויקט תעשה פרויקט שעון ללא RTC, ייקח זמן מהאינטרנט באמצעות wifi והוא יציג אותו בתצוגה st7735
ניווט ברובוט עם חיישני נעליים, ללא GPS, ללא מפה: 13 שלבים (עם תמונות)
ניווט ברובוט עם חיישני נעליים, ללא GPS, ללא מפה: הרובוט נע בנתיב מתוכנן מראש ומשדר (באמצעות בלוטות ') את פרטי התנועה בפועל שלו לטלפון למעקב בזמן אמת. ארדואינו מתוכנת מראש עם נתיב ו- oblu משמש לחישת תנועת הרובוט. אובלו מעביר מידע לתנועה
מדידה וזיהום רעש מפה באמצעות הטלפון הנייד שלך: 4 שלבים (עם תמונות)
מדידה וזיהום רעש מפה באמצעות הטלפון הנייד שלך: ניקולאס מייסוןנוב (Sony CSL Paris) מתיאס סטיבנס (Vrije Universiteit Brussel / Sony CSL Paris) Luc Steels (Vrije Universiteit Brussel / Sony CSL Paris) ב " ניתן להנחיה " תלמד כיצד תוכל להשתמש בטלפון הנייד המצויד ב- GPS שלך