Innehållsförteckning:

GPS -spårning 3D -karta: 9 steg
GPS -spårning 3D -karta: 9 steg

Video: GPS -spårning 3D -karta: 9 steg

Video: GPS -spårning 3D -karta: 9 steg
Video: Renault Kadjar Gps installation 2024, Juli
Anonim
GPS -spårning 3D -karta
GPS -spårning 3D -karta
GPS -spårning 3D -karta
GPS -spårning 3D -karta

Detta projekt är en 3D -tryckt 3D -karta, med vägar, floder och städer, med LED -fyrar som visar platsen för familjemedlemmar. Det kan visa om ett barn är i skolan eller inte, eller bara var båda föräldrarna är. Vi kan också använda den för att förutsäga vilken tid föräldrarna kommer hem, så att middagen kan göras till rätt tid. Det är också bara ett allmänt häftigt projekt att visa upp och visa för familj och vänner.

Jag hoppas att du tycker om att göra detta instruerbart, eller att du får veta om ett projekt som jag har gjort

Steg 1: Skaffa en 3D -karta

FÖR att få en 3D -karta över ditt område har jag skrivit en separat instruerbar guide som hjälper dig genom att göra en. Länken till den instruerbara finns här:

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

Steg 2: Förbered kartan för LED -skär

Nu när du har en 3D -karta, med vägar, städer och floder, behöver vi ett sätt att ange var en person är på kartan. Jag använde tvåfärgade 3 mm RG-lysdioder, eftersom kartans huvudsakliga syfte är att visa var de två föräldrarna är. På vissa ställen använde jag en RGB -LED, så att jag kunde visa var det äldsta barnet var. Det finns en gräns på 28 stift att mata ut på Raspberry Pi, så välj platserna för lysdioderna klokt. Jag slutade använda runt 24 av dem, så du borde må bra.

För att borra PLA fann jag att en vanlig träborr fungerade bra, och jag behandlade som jag skulle behandla trä.

På platser där kartan var för tjock borrade jag ut baslagret med en stor borr och sedan det synliga ovanstående lagret med rätt 3 mm borr.

Steg 3: Sätt i lysdioderna

Sätt i lysdioderna
Sätt i lysdioderna

Nu när vi har hål för lysdioderna att sitta i, kan vi limma in dem. PVA eller Superlim fungerar bra för detta, jag fann att PVA sprang runt det och förseglade det på plats, och superlim fungerade också mycket bra. Se till att de för varje LED bara sticker ut på den synliga sidan med några mm, eftersom att lysdioderna sticker ut hela vägen ser lite rörigt ut. Oroa dig inte om benen på baksidan, vi kan vika ihop dem när de är lödda.

Steg 4: Anslut lysdioderna till Raspberry Pi

Jag lödde direkt lysdioderna till Raspberry Pi, men om du har en med ett förlödt huvud eller om du vill kunna använda pi för något annat, skulle jag föreslå att du använder bygelkablar för varje LED, vilket betyder att Pi är avtagbar. Du kan se att när jag hade lödt lysdioden, fällde jag ner benen så att de inte fastnade på ryggen.

Steg 5: Testa lysdioderna

Testa lysdioderna
Testa lysdioderna

För att försäkra mig om att alla lysdioder fungerar, körde jag ett skript som går igenom varje möjlig stift och tänder dem, en i taget, som går över till nästa när jag klickar på enter. Detta gjorde att jag kunde anteckna vilket pin -nummer som gjorde vilken plats, vilket var mycket användbart.

importera RPi. GPIO som GPIO

importtid GPIO.setmode (GPIO. BCM) för i i intervall (0, 28): GPIO.setup (i, GPIO. OUT) för i i intervall (0, 28): GPIO.output (i, GPIO. HIGH) time.sleep (0,3) GPIO.output (i, GPIO. LOW) print ("That Was:" + str (i)) z = raw_input ("Next?")

Medan detta hände skulle jag anteckna en textfil som stift gjorde vilken plats och vilken färg. Du måste göra detta, eftersom det är mycket användbart i nästa steg.

Steg 6: Kod för att slå på lysdioden vid begäran

Sättet som jag har gjort detta projekt innebär en Raspberry Pi Zero W, med en grundläggande webbplats som låter dig slå på en nål. Detta innebar att huvud Pi 4, som vanligtvis är på och körs, kan bearbeta, och då måste den lilla Pi 0 bara slå på en stift, vilket gör saker och ting mer komplicerade. Jag gjorde detta för att det passar min inställning, och jag kände också att Pi 0 kan vara lite långsam för vad vi ska göra senare.

importera RPi. GPIO som GPIO

importtid från kolvimport Flask, render_template, request, jsonify import os app = Flask (_ name_) p = GPIO.setmode (GPIO. BCM) för i i intervall (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) return "Off" @app.route ("/off/all") def alloff (): för i inom intervall (0, 28): GPIO.output (i, GPIO. LOW) return "off" @app.route ("/on/") def turn_on (pin): GPIO.output (int (pin), GPIO. HIGH) returnerar "On" if _name_ == '_main_': app.run (debug = True, host = '0.0. 0,0 ')

Så här fungerar det genom att vänta på webbadressen till Pi: s IP -adress och sedan en på eller av och sedan pin -numret.

spara den här koden i hemkatalogen för Raspberry Pi och ge den namnet "pin_website.py"

Du måste ställa in detta så att det körs automatiskt, så för att göra detta, i terminaltypen: sudo nano /etc /profile

Längst ner i filen lägger du till "python3 pin_website.py &"

"&" Är viktigt, eftersom det gör att det körs i bakgrunden och därför tillåter uppstart att fortsätta

Steg 7: Hur man tar emot plats

Hur man tar emot plats
Hur man tar emot plats

Med IFTTT kan du konfigurera en tjänst så att när telefonen går in på en viss plats kan den skicka e -post till dig, eller pinga en webbadress eller meddela dig i telegram.

Steg 8: Hur allt detta fungerar

Installationen jag har är en Server Pi, som är värd för min webbplats, med portvidarebefordran och en statisk DNS med hjälp av tjänsten som tillhandahålls av https://freedns.afraid.org/. Mycket av detta är ganska komplext, och du måste ha förståelse för portvidarebefordran, jag kan göra en instruktion om hur du gör den här delen en annan gång.

Ett annat sätt du kan göra det är att använda telegram för att få meddelanden till pi, eller möjligen det enklaste, är att skapa en e -postläsare som läser e -postmeddelandena och tar emot platsuppdateringar via det.

Jag har inte provat Telegram -boten eller en e -postläsare, men det finns gott om självstudier där ute som visar hur du gör.

Här är min Flask / Python -kod som sedan begärs av webhooks med IFTTT:

från kolvimport Flask, render_template, request, jsonify

importera os från datetime importera datetime från kartimport * app = kolv (_ namn_) l = 0 setup () @app.route ('/') def index (): return request.remote_addr @app.route ('/mum/enter /') def mu (plats): mum.current_loc (plats) returnerar "Tack för uppdateringen, mamma!" @app.route ("/dad/enter/") def da (l): dad.current_loc (l) returnera "Tack för uppdateringen, pappa!" @app.route ("/child/enter/") def child_enter (l): me.current_loc (l) return "Hey, Me" @app.route ('/mum/exit/') def mume (location): mum.offline (plats) returnerar "Tack för uppdateringen, mamma!" @app.route ("/dad/exit/") def dade (l): dad.offline (l) returnera "Tack för uppdateringen, pappa!" @app.route ("/child/exit/") def child_exit (l): me.offline (l) return "Hey, Me" @app.route ("/reset") def redo (): setup () return "Återställa!" om _name_ == '_main_': app.run (debug = True, host = '0.0.0.0')

och map.py:

importera http.client, urllib.request, urllib.parse, urllib.error, base64

import ast, json importtid import trådning 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 () klass mamma: def current_loc (l): global last_loc locs = {"llansantffraid": 4, "oswestry": 5, "lynclys": 8, "home": 9, "shrewsbury": 11, "llanymynech": 13, "fyra kors": 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," fyra kors ": 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 &") klass pappa: 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. HTTPConnection ('192.168.1.251:5000') anslut.reques 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 &") klass me: def current_loc (l): global 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 (lo 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 &")

Steg 9: Bygg ditt eget från inspiration från mitt projekt

Så jag vet att det föregående steget kommer att vara mycket svårt att förstå, så jag kommer att låta det vara att visa dig hur du gör kartan och kunna ha en hallonpi som tänder och släcker lysdioderna. Du måste nu skapa ett python -skript som, med hjälp av IFTTT, skickar dig ett e -postmeddelande. Då måste du hitta en kod som läser e -post, vilket är ganska enkelt (googla det). När du väl har läst ett e -postmeddelande och hittar platsen för en förälder, använd 'if' -satser för att hitta vilken nål som ska aktiveras.

På kartan betyder ett blinkande ljus att de just har lämnat området

Sättet att slå på lysdioderna på en annan pi från python är enligt nedan:

importera http.client, urllib.request, urllib.parse, urllib.error, base64

params = urllib.parse.urlencode ({}) conn = http.client. HTTPConnection ('192.168.1.251:5000') #ändra detta med hallon pi: s kart -IP -adress conn.request ("GET", str ("/off) /2 ")) # detta stänger av pin nummer 2 svar = conn.getresponse () # detta begär webbadressen, och sedan läser kartan pi detta och stänger av pin nummer 2

I grund och botten hoppas jag att du kan använda det jag har gjort med min 3D -karta som inspiration för att göra din egen GPS -spårningskarta.

Rekommenderad: