תוכן עניינים:

מפת תלת -ממד מעקב GPS: 9 שלבים
מפת תלת -ממד מעקב GPS: 9 שלבים

וִידֵאוֹ: מפת תלת -ממד מעקב GPS: 9 שלבים

וִידֵאוֹ: מפת תלת -ממד מעקב GPS: 9 שלבים
וִידֵאוֹ: סקירת Garmin Tactix 7 עבור מי ה-Tactix שווה את זה? 2024, נוֹבֶמבֶּר
Anonim
מפת תלת מימד מעקב GPS
מפת תלת מימד מעקב GPS
מפת תלת מימד מעקב GPS
מפת תלת מימד מעקב GPS

פרויקט זה הוא מפת תלת מימד המודפסת בתלת מימד, עם כבישים, נהרות ועיירות, עם משואות LED המציגות את מיקומם של בני המשפחה. זה יכול להראות אם ילד נמצא בבית הספר או לא, או רק את המיקום של שני ההורים. אנחנו יכולים גם להשתמש בו כדי לנבא באיזו שעה ההורים מגיעים הביתה, כך שאפשר להכין ארוחת ערב בזמן הנכון. זה גם רק פרויקט מגניב בדרך כלל להתהדר ולהציג למשפחה ולחברים.

אני מקווה שתיהנו מההנחיה הזו, או שתיהנו לגלות על פרויקט שעשיתי

שלב 1: קבלת מפה תלת -ממדית

כדי לקבל מפה תלת מימדית של האזור שלך, כתבתי הוראה נפרדת שתסייע לך להדריך אותך בתהליך הכנת אחת. הקישור למדריך נמצא כאן:

www.instructables.com/id/Making-a-3D-Print…

שלב 2: הכנת המפה לתוספות LED

כעת, כשיש לך מפה תלת -ממדית, עם כבישים, עיירות ונהרות, אנו צריכים דרך לציין היכן האדם נמצא על המפה. השתמשתי בנורות 3 מ מ RG דו-צבעיות, כי המטרה העיקרית של המפה היא להראות היכן נמצאים שני ההורים. במקומות מסוימים השתמשתי ב- RGB LED, כדי לאפשר לי להראות היכן נמצא הילד הבכור. יש הגבלה של 28 סיכות לפלט ב- Raspberry Pi, אז בחר את המיקומים של נוריות ה- LED בתבונה. בסופו של דבר השתמשתי בכ -24 מהם, אז אתה אמור להיות בסדר.

כדי לקדוח PLA, מצאתי מקדח עץ רגיל עובד היטב, וטיפלתי הוא כפי שהייתי מתייחס לעץ.

במקומות שבהם המפה הייתה עבה מדי, הייתי מקדח את שכבת הבסיס בעזרת מקדח גדול, ולאחר מכן את השכבה הנראית לעיל עם מקדח 3 מ מ הנכון.

שלב 3: הכנס את נוריות הלדים

הכנס את הנורות
הכנס את הנורות

עכשיו, כשיש לנו חורים לנורות LED לשבת בהם, אנחנו יכולים להדביק אותם פנימה. PVA או Superglue עובדים טוב בשביל זה, גיליתי ש- PVA התרוצץ סביבו ואטם אותו במקום, וגם דבק -על עבד טוב מאוד. וודא שבכל נורית LED הם בולטים רק בצד הנראה בכמה מ מ, כיוון שהנורות הלבות יבלטו לאורך כל הדרך נראה קצת מבולגן. אל תדאג לגבי הרגליים על הגב, נוכל לקפל אותן ברגע שהן מולחמות.

שלב 4: חבר את נוריות ה- LED ל- Raspberry Pi

הלחמתי ישירות את נוריות ה- LED ל- Raspberry Pi, עם זאת, אם יש לך כותרת עם כותרת מולחמת מראש, או שאתה רוצה להיות מסוגל להשתמש ב- pi למשהו אחר, אז הייתי מציע להשתמש בחוטי מגשר עבור כל LED, כלומר הפי נשלף. אתה יכול לראות שברגע שהלחמתי את הנורית, קיפלתי את הרגליים למטה כדי שלא יידבקו על הגב.

שלב 5: בדוק את נוריות הלדים

בדוק את נוריות הלדים
בדוק את נוריות הלדים

כדי לוודא שכל הלדים פועלים, הפעלתי סקריפט שעובר כל סיכה אפשרית, ומדליק אותם, אחד בכל פעם, אשר עולה על הבא כאשר אני לוחץ על enter. זה איפשר לי לרשום איזה מספר סיכה עשה איזה מיקום, שהגיע שימושי מאוד.

ייבא RPi. GPIO כ- GPIO

זמן ייבוא GPIO.setmode (GPIO. BCM) עבור i בטווח (0, 28): GPIO.setup (i, GPIO. OUT) עבור i בטווח (0, 28): GPIO.output (i, GPIO. HIGH) time.sleep (0.3) GPIO.output (i, GPIO. LOW) print ("זה היה:" + str (i)) z = raw_input ("הבא?")

בזמן שזה קרה, הייתי מציין קובץ טקסט איזה סיכה עשה איזה מיקום ואיזה צבע. עליך לעשות זאת, מכיוון שהוא שימושי מאוד בשלב הבא.

שלב 6: קוד להפעלת הנורית כאשר תתבקש

הדרך שבה ביצעתי את הפרויקט הזה כרוכה ב- Raspberry Pi Zero W אחד, עם אתר בסיסי המאפשר לך להפעיל סיכה. המשמעות היא שה- Pi 4 הראשי, שהוא בדרך כלל פועל, ופועל, יכול לבצע את העיבוד, ואז ה- Pi 0 הקטן רק צריך להפעיל סיכה, מה שהופך את הדברים למעט יותר מסובכים. עשיתי את זה כי זה מתאים להתקנה שלי, וגם הרגשתי שה- Pi 0 יכול להיות קצת איטי למה שאנחנו נעשה מאוחר יותר.

ייבא RPi. GPIO כ- GPIO

זמן ייבוא מבקבוק ייבוא בקבוק, render_template, request, jsonify import os app = Flask (_ name_) p = GPIO.setmode (GPIO. BCM) עבור i בטווח (0, 28): GPIO.setup (i, GPIO. OUT) @app.route ('/') def index (): return request.remote_addr @app.route ("/off/") def turn_off (pin): GPIO.output (int (pin), GPIO. LOW) החזר "כבוי" @app.route ("/כבוי/הכל") def alloff (): עבור i בטווח (0, 28): GPIO.output (i, GPIO. LOW) החזר "כבוי" @app.route ("/on/") def turn_on (pin): GPIO.output (int (pin), GPIO. HIGH) החזר "On" אם _name_ == '_main_': app.run (debug = True, host = '0.0. 0.0 ')

הדרך שבה זה עובד היא מחכה לכתובת ה- IP של ה- pi ולאחר מכן הפעלה או כיבוי ואז מספר הסיכה.

שמור את הקוד הזה בספריית הבית של ה- Raspberry Pi, וקרא לו "pin_website.py"

יהיה עליך להגדיר זאת לפעול אוטומטית, כדי לעשות זאת, בסוג הטרמינל: sudo nano /etc /profile

בתחתית קובץ זה, הוסף "python3 pin_website.py &"

ה- "&" הוא חיוני, מכיוון שהוא גורם לו לפעול ברקע, ולכן מאפשר להמשיך אתחול

שלב 7: כיצד לקבל מיקום

כיצד לקבל מיקום
כיצד לקבל מיקום

באמצעות IFTTT, אתה יכול להגדיר שירות כך שכאשר הטלפון נכנס למיקום מסוים, הוא יכול לשלוח לך דוא ל, או לדפדף כתובת אינטרנט, או לשלוח לך הודעה בטלגרם.

שלב 8: איך כל זה עובד

ההתקנה שיש לי היא Server Pi, המארחת את האתר שלי, עם העברת יציאות ו- DNS סטטי באמצעות השירות המסופק על ידי https://freedns.afraid.org/. הרבה מזה די מורכב, ואתה צריך להבין את העברת הנמל, אולי אכין הוראה כיצד לבצע את החלק הזה בפעם אחרת.

דרך נוספת שבה אתה יכול לעשות זאת היא להשתמש במברק כדי לקבל הודעות ל- pi, או אולי הקלה ביותר, היא להגדיר קורא דוא"ל שקורא את הודעות הדוא"ל ומקבל עדכוני מיקום באמצעות זה.

לא ניסיתי את בוט הטלגרם או קורא דוא ל, אבל יש הרבה הדרכות שיסבירו לך כיצד לעשות זאת.

להלן קוד הבקבוק / פייתון שלי המתבקש לאחר מכן על ידי webhooks באמצעות IFTTT:

מבקבוק ייבוא בקבוק, render_template, request, jsonify

ייבוא מערכת ההפעלה מ- datetime יבוא תאריך הזמן מהמפה יבוא * אפליקציה = בקבוק (_ שם_) l = 0 הגדרות () @app.route ('/') def index (): return request.remote_addr @app.route ('/אמא/enter /') def mu (מיקום): mum.current_loc (מיקום) החזר "תודה על העדכון, אמא!" @app.route ("/dad/enter/") def da (l): dad.current_loc (l) החזר "תודה על העדכון, אבא!" @app.route ("/child/enter/") def child_enter (l): me.current_loc (l) החזר "היי, אני" @app.route ('/אמא/יציאה/') def mume (מיקום): אמא.אופליין (מיקום) החזרה "תודה על העדכון, אמא!" @app.route ("/אבא/יציאה/") def dade (l): dad.offline (l) החזר "תודה על העדכון, אבא!" @app.route ("/child/exit/") def child_exit (l): me.offline (l) החזר "היי, אני" @app.route ("/reset") def redo (): setup () return "אִתחוּל!" אם _name_ == '_main_': app.run (debug = True, host = '0.0.0.0')

ו- map.py:

ייבא http.client, urllib.request, urllib.parse, urllib.error, base64

import ast, json time import time threading import os params = urllib.parse.urlencode ({}) last_loc = 0 dlast_loc = 0 mlast_loc = 0 def setup (): conn = http.client. HTTPSConnection ('freedns.afraid.org') conn.request ("GET", str ("/dynamic/update.php? ZmFpOWlJQ29QczhiOW1iYWJoNVdVcG9HOjE5MTM2ODU2")) response = conn.getresponse () conn = http.client. HTTPConnection ('192.168.1.251:5000') conn. "GET", str ("/off/all")) response = conn.getresponse () f = open ("pin", "w") f.write (str (-1)) f.close () f = open ("pind", "w") f.write (str (-1)) f.close () f = open ("pinm", "w") f.write (str (-1)) f.close () אמא בכיתה: def current_loc (l): global last_loc locs = {"llansantffraid": 4, "oswestry": 5, "lynclys": 8, "home": 9, "shrewsbury": 11, "llanymynech": 13, "ארבעה צלבים": 18, "llandrinio": 25, "welshpool": 27} f = open ("pin", "w") f.write (str (-1)) f.close () time. sleep (1) conn = http.client. HTTPConnection ('192.168.1.251:5000') conn.request ("GET", str ("/off/") + str (last_loc)) response = conn.getrespons e () conn = http.client. HTTPConnection ('192.168.1.251:5000') conn.request ("GET", str ("/on/") + str (locs [l])) response = conn.getresponse () last_loc = locs [l] def offline (l): global last_loc locs = {"llansantffraid": 4, "oswestry": 5, "lynclys": 8, "home": 9, "shrewsbury": 11, "llanymynech ": 13," ארבעה צלבים ": 18," llandrinio ": 25," welshpool ": 27} conn = http.client. HTTPConnection ('192.168.1.251:5000') conn.request (" GET ", str (" /off/") + str (last_loc)) response = conn.getresponse () f = open (" pin "," w ") f.write (str (locs [l])) f.close () os.system ("python3 flash.py &") אבא בכיתה: locs = {"welshpool": 3, "lynclys": 1, "home": 23, "shrewsbury": 0, "llanymynech": 6, "four crosses": 15, "llandrinio": 10, "welshpool": 24} def current_loc (l): global dlast_loc locs = {"welshpool": 3, "lynclys": 1, "home": 23, "shrewsbury": 0, " llanymynech ": 6," four crosses ": 15} f = open (" pind "," w ") f.write (str (-1)) f.close () time.sleep (1) conn = http.client חיבור HTTP ('192.168.1.251:5000') חיבורים t ("GET", str ("/off/") + str (dlast_loc)) response = conn.getresponse () conn = http.client. HTTPConnection ('192.168.1.251:5000') conn.request ("GET", str ("/on/") + str (locs [l])) response = conn.getresponse () dlast_loc = locs [l] def offline (l): global dlast_loc locs = {"welshpool": 3, "lynclys ": 1," home ": 23," shrewsbury ": 0," llanymynech ": 6," four crosses ": 15," llandrinio ": 10} conn = http.client. HTTPConnection ('192.168.1.251:5000') conn.request ("GET", str ("/off/") + str (dlast_loc)) response = conn.getresponse () f = open ("pind", "w") f.write (str (locs [l])) f.close () os.system ("python3 flashd.py &") class me: def current_loc (l): mlast_loc locs העולמי = {"home": 22, "school": 2, "oswestry": 14} f = open ("pinm", "w") f.write (str (-1)) f.close () time.sleep (1) conn = http.client. HTTPConnection ('192.168.1.251:5000 ') conn.request ("GET", str ("/off/") + str (mlast_loc)) response = conn.getresponse () conn = http.client. HTTPConnection (' 192.168.1.251:5000 ') conn.request ("GET", str ("/on/") + str (להלן cs [l])) response = conn.getresponse () mlast_loc = locs [l] def offline (l): global dlast_loc locs = {"home": 22, "school": 2, "oswestry": 14} conn = http.client. HTTPConnection ('192.168.1.251:5000') conn.request ("GET", str ("/off/") + str (mlast_loc)) response = conn.getresponse () f = open ("pinm", "w") f.write (str (locs [l])) f.close () os.system ("python3 flashm.py &")

שלב 9: בנה משלך מתוך השראה מהפרויקט שלי

אז אני יודע שהשלב הקודם יהיה מאוד קשה להבנה, אז אני אשאיר אותו כמראה לך איך לעשות את המפה, ואוכל לקבל פאי פטל שמדליק ומכבה את הלדים. כעת עליך ליצור סקריפט פייתון שבעזרת IFTTT שולח לך מייל. אז אתה צריך למצוא פיסת קוד של אימייל שהיא די קלה (חפש אותה בגוגל). לאחר שתקרא הודעת אימייל ותמצא את מיקומו של הורה, השתמש בהצהרות 'אם' כדי למצוא איזה סיכה להפעיל.

על המפה, אור מהבהב פירושו שזה עתה עזבו את האזור

הדרך להדליק את נוריות ה- pi בפאי אחר מפיתון היא כדלקמן:

ייבא http.client, urllib.request, urllib.parse, urllib.error, base64

params = urllib.parse.urlencode ({}) conn = http.client. HTTPConnection ('192.168.1.251:5000') #שנה זאת עם כתובת ה- IP של מפת הפטל conn.request ("GET", str ("/off) /2 ")) # זה מכבה תג מספר מספר 2 = conn.getresponse () # זה מבקש את כתובת האתר, ואז מפת ה- pi קוראת את זה ומכבה את מספר הסיכה 2

בעיקרון, אני מקווה שתוכל להשתמש במה שעשיתי עם המפה התלת -ממדית שלי כהשראה כדי ליצור מפת מעקב GPS משלך.

מוּמלָץ: