สารบัญ:
- ขั้นตอนที่ 1: เริ่มต้น
- ขั้นตอนที่ 2: เชื่อมต่อโมดูล GPS กับ Raspberry Pi
- ขั้นตอนที่ 3: รับข้อมูลจากโมดูลตัวรับ GPS
- ขั้นตอนที่ 4: เชื่อมต่อจอแสดงผลกับ Raspberry Pi
- ขั้นตอนที่ 5: ตั้งค่าจอแสดงผลให้ทำงานกับ Raspberry Pi
- ขั้นตอนที่ 6: ตั้งค่าเครื่องสถานะเพื่อแสดงข้อมูล GPS บนจอแสดงผล
- ขั้นตอนที่ 7: มาติดตั้งระบบ GPS ของเรากันเถอะ
วีดีโอ: ระบบ GPS: 7 ขั้นตอน
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-10 13:49
ผู้สร้างโครงการ: Carlos Gomez
การมีระบบนำทางที่เชื่อถือได้เป็นสิ่งสำคัญยิ่งสำหรับทุกคนที่พยายามจะเดินทางและสำรวจโลก
สิ่งสำคัญที่สุดที่ช่วยให้ระบบนำทางทำงานได้คือความสามารถ GPS ที่ฝังอยู่ภายในระบบ ระบบ GPS ช่วยให้ทุกคนสามารถติดตามตำแหน่งและความเร็วของตนได้ เพื่อแสดงข้อมูลที่ถูกต้องเกี่ยวกับผู้ใช้ และให้ผู้ใช้ได้ทราบว่าตนอยู่ที่ไหนและอยู่ห่างจากตำแหน่งของตนเพียงใด
Global Positioning System (GPS) เป็นเครือข่ายของดาวเทียมที่โคจรรอบโลกที่ระดับความสูงประมาณ 20,000 กม. ใครก็ตามที่มีอุปกรณ์ GPS สามารถรับสัญญาณวิทยุที่ดาวเทียมออกอากาศและสามารถใช้งานได้ตามความจำเป็น ไม่ว่าตำแหน่งของคุณบนโลกใบนี้จะมี GPS อย่างน้อยสี่ตัวให้คุณใช้งานได้ทุกเมื่อ อุปกรณ์ GPS สามารถใช้ดาวเทียมสามดวงเพื่อระบุตำแหน่งของอุปกรณ์ที่พื้นโลกโดยใช้วิธีการที่เรียกว่าการแยกส่วนสามมิติ ดาวเทียมแต่ละดวงจะส่งสัญญาณไปยังอุปกรณ์และอุปกรณ์จะกำหนดระยะห่างจากดาวเทียม การใช้การคำนวณระยะทางทั้งสามแต่ละครั้งทำให้อุปกรณ์สามารถระบุตำแหน่งบนพื้นโลกได้ และจะส่งกลับไปยังผู้ใช้
ระบบ GPS ที่เราจะสร้างขึ้นจะสามารถติดตามตำแหน่งของผู้ใช้โดยรับพิกัดของผู้ใช้บนโลกและทำการคำนวณบางอย่างเพื่อส่งคืนความเร็ว ตำแหน่ง และระยะทางของผู้ใช้
ขั้นตอนที่ 1: เริ่มต้น
เพื่อเริ่มต้นโครงการนี้ เราต้องรวบรวมวัสดุที่ถูกต้องทั้งหมดก่อน
1: Raspberry Pi Zero W
2: เครื่องรับ GPS
3: 1.8 TFT 128 x 160 LCD SPI หน้าจอ
4: ~ 11 สาย
5: 2 ปุ่ม
ตัวต้านทาน 6: 2x 1k และ 2x 10k สำหรับปุ่มแบบดึงลง
7: กระดานขนมปัง
โปรเจ็กต์นี้จะใช้พิน GPIO ของ Raspberry Pi ดังนั้นเราจึงจำเป็นต้องเชื่อมต่อทุกอย่างกับบอร์ดขนมปังเพื่อพัฒนาโครงการของเรา นอกจากนี้ยังถือว่าการบัดกรีบนหมุดทั้งหมดเสร็จสิ้นและเสร็จสิ้นก่อนที่จะดำเนินการต่อไปและเชื่อมต่อชิ้นส่วนทั้งหมดของเรา
ขั้นตอนที่ 2: เชื่อมต่อโมดูล GPS กับ Raspberry Pi
สำหรับการใช้งานระบบ GPS ของเรา คุณจะต้องเชื่อมต่อพิน Tx และ Rx จากโมดูล GPS กับ GPIO pin 14 และ 15 บน Raspberry Pi ขา Tx ของตัวรับสัญญาณ GPS ไปที่พิน Rx ของ Pi และพิน Rx ของตัวรับสัญญาณ GPS ไปที่พิน Tx ของ Raspberry pi
เครื่องรับ GPS ที่แสดงในภาพต้องใช้ 3.3V และคุณสามารถเชื่อมต่อพิน 3.3V กับแรงดันไฟฟ้าที่ถูกต้อง ในขณะที่เชื่อมต่อพินกราวด์กับกราวด์
ขั้นตอนที่ 3: รับข้อมูลจากโมดูลตัวรับ GPS
ในการรับข้อมูลจากเครื่องรับ GPS ไปยัง Raspberry Pi เราจำเป็นต้องอนุญาตให้ซ็อกเก็ตที่ถูกต้องอ่านจากพอร์ต UART การอ่านข้อมูลดิบจะทำให้เราต้องสร้างไลบรารีการแยกวิเคราะห์ของเราเอง แต่ในสถานการณ์นี้ เราสามารถใช้ประโยชน์จาก GPS daemon ที่ทำงานในเบื้องหลังเพื่อช่วยแยกวิเคราะห์ข้อมูลและส่งไปยัง Raspberry Pi
เพื่อให้บรรลุสิ่งนี้ เราสามารถเปิดเทอร์มินัลบน Raspberry Pi และรันโค้ด:
sudo apt-get update
sudo apt-get ติดตั้ง gpsd gpsd-clients python-gps
สิ่งนี้ควรดูแลการดาวน์โหลดสำหรับเรา
เมื่อเสร็จแล้ว เราต้องปิดการใช้งานบริการระบบ gpsd โดยเรียกใช้คำสั่งต่อไปนี้:
sudo systemctl หยุด gpsd.socket
sudo systemctl ปิดการใช้งาน gpsd.socket
หากคุณต้องการเปิดใช้งานบริการระบบ gpsd เริ่มต้น คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อกู้คืน:
sudo systemctl เปิดใช้งาน gpsd.socket
sudo systemctl start gpsd.socket
ตอนนี้เราต้องเริ่ม gpsd daemon และชี้ไปที่พอร์ต UART โดยป้อน
sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock
ตอนนี้เราสามารถเรียกใช้คำสั่งด้านล่างและดูข้อมูลทั้งหมดที่ลอยอยู่ได้!
cgps -s
ขั้นตอนที่ 4: เชื่อมต่อจอแสดงผลกับ Raspberry Pi
เมื่อเรามีตัวรับสัญญาณ GPS และทำงานกับ Raspberry Pi แล้ว เราก็สามารถเชื่อมต่อจอแสดงผลกับ Raspberry Pi เราจะใช้สายไฟ 5 เส้นเชื่อมต่อจอแสดงผล LCD ของเรากับ Raspberry Pi และอีก 4 พินเพื่อเชื่อมต่อไฟหลักและ LED บนหน้าจอ.
ฉันได้รวมภาพถ่ายของหน้าจอ TFT ที่ฉันใช้อยู่ แต่สิ่งนี้ควรใช้งานได้กับหน้าจอที่มีขนาดและโครงสร้างใกล้เคียงกัน
เชื่อมต่อ LED- และ GND กับกราวด์ และเชื่อมต่อ LED+ และ VCC กับ 3.3V
เชื่อมต่อพิน RESET บนหน้าจอเพื่อปักหมุด 25 บนบอร์ด Pi
เชื่อมต่อ A0 กับพิน 24 บนบอร์ด Pi
เชื่อมต่อพิน SDA กับพิน MOSI บนบอร์ด Pi
เชื่อมต่อหมุด SCK บนหน้าจอ LCD กับบอร์ด Pi
เชื่อมต่อพิน CS กับพิน 8 บนบอร์ด Pi
ขั้นตอนที่ 5: ตั้งค่าจอแสดงผลให้ทำงานกับ Raspberry Pi
ในการตั้งค่าการแสดงผล เราจำเป็นต้องใช้ไลบรารี ST7735 ที่พบใน repo นี้:
ไลบรารีหน้าจอ Python ST7735
เมื่อเราติดตั้งไลบรารีแสดงผลนี้ลงในระบบ Raspberry Pi แล้ว เราสามารถดำเนินการตั้งค่าไฟล์ตัวอย่างเพื่อยืนยันว่าการเดินสายก่อนหน้าของเราทำงานอย่างถูกต้อง
สร้างไฟล์ชื่อ example.py และแทรกข้อความต่อไปนี้ลงไปพร้อมกับภาพตัวอย่างที่คุณเลือกในโฟลเดอร์เดียวกัน
นำเข้า ST7735 เป็น TFTimport Adafruit_GPIO เป็น GPIO นำเข้า Adafruit_GPIO. SPI เป็น SPI
ความกว้าง = 128
ความสูง = 160 SPEED_HZ = 4000000
# การกำหนดค่า Raspberry Pi
# นี่คือพินที่จำเป็นในการเชื่อมต่อ LCD กับ Raspberry Pi
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# สร้างคลาสจอแสดงผล TFT LCD
disp = TFT. ST7735(DC, rst=RST, spi=SPI. SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=SPEED_HZ))
# เริ่มต้นการแสดงผล
disp.begin() disp.reset()
#โหลดภาพ.
newData = 0x42 disp.command (newData) พิมพ์ ('กำลังโหลดรูปภาพ…') รูปภาพ = Image.open ('cat.jpg')
# ปรับขนาดภาพและหมุนเพื่อให้ตรงกับการแสดงผล
รูปภาพ = image.rotate(270).resize((WIDTH,HEIGHT))
# จะพิมพ์ไปที่เทอร์มินัลว่าโปรแกรมของเรากำลังวาดภาพของเราบนหน้าจอ
พิมพ์('วาดภาพ')
# ฟังก์ชั่นนี้จะแสดงภาพของเราบนหน้าจอ
disp.display (ภาพ)
ไฟล์นี้จะตั้งค่าการกำหนดค่า Raspberry Pi สำหรับหน้าจอ LCD และไลบรารีจะแปลงภาพของเราในโฟลเดอร์และแสดงบนหน้าจอ
ขั้นตอนที่ 6: ตั้งค่าเครื่องสถานะเพื่อแสดงข้อมูล GPS บนจอแสดงผล
เราจะใช้เครื่องสถานะที่แตกต่างกัน 5 เครื่องในขณะที่ใช้ไดอะแกรมงานของเราเพื่อตั้งค่าระบบ gps ของเรา
แสดงเครื่องเปลี่ยนสถานะ:
เครื่องสถานะนี้จะควบคุมว่าจะแสดงใดขึ้นอยู่กับการป้อนข้อมูลปุ่มของเรา ทำได้โดยเปลี่ยนตัวแปรที่อนุญาตให้ python ใช้ประโยชน์จากการพิมพ์แบบเป็ดและเรียกใช้ฟังก์ชันที่ถูกต้องเพื่อแสดงขึ้นอยู่กับฟังก์ชันที่เรียก
เครื่องสถานะความเร็ว:
เครื่องสถานะนี้จะดำเนินการความเร็วปัจจุบันขึ้นอยู่กับตำแหน่งของแต่ละบุคคล การดำเนินการนี้จะดำเนินการทุกรอบนาฬิกาสำหรับระบบ GPS
เครื่องสถานะเอาต์พุต:
เครื่องสถานะนี้จะกำหนดเอาท์พุตตามตัวแปรที่เครื่องสถานะเปลี่ยนการแสดงผลกำหนดว่าเป็นจอแสดงผลปัจจุบัน
เครื่องบอกระยะทาง
เครื่องสถานะนี้ดำเนินการทุกรอบนาฬิกาและกำหนดระยะทางทั้งหมดที่ผู้ใช้เดินทาง และเมื่อกดปุ่มรีเซ็ต จะรีเซ็ตระยะทางปัจจุบันที่เดินทาง
เครื่องสถานะตำแหน่ง:
เครื่องสถานะนี้จะส่งคืนตำแหน่งปัจจุบันของผู้ใช้ โดยใช้พิกัดที่โมดูล GPS ส่งกลับเกี่ยวกับผู้ใช้ เครื่องสถานะนี้ขึ้นอยู่กับการเชื่อมต่ออินเทอร์เน็ตของผู้ใช้
ขั้นตอนที่ 7: มาติดตั้งระบบ GPS ของเรากันเถอะ
เมื่อเรามีโมดูล GPS ที่ส่งข้อมูลไปยัง Raspberry Pi และหน้าจอ LCD ที่แสดงข้อมูลแล้ว เราก็สามารถเริ่มโปรแกรมระบบ GPS ของเราได้ ฉันจะใช้เครื่องสถานะ จำกัด ของขั้นตอนก่อนหน้าเพื่อเข้ารหัสระบบ GPS ของเรา
## ไฟล์หลักสำหรับระบบนำทาง # # # #
# ห้องสมุดสำหรับวาดภาพ
จากการนำเข้า PIL ภาพจาก PIL นำเข้า ImageDraw จากการนำเข้า PIL ImageFont
# ห้องสมุดสำหรับตัวควบคุม ST7737
นำเข้า ST7735 เป็นTFT
# ห้องสมุดสำหรับ GPIO สำหรับ Raspberry Pi
นำเข้า Adafruit_GPIO เป็น GPIO นำเข้า Adafruit_GPIO. SPI เป็น SPI
#ห้องสมุดสำหรับ GPS
#นำเข้า gpsd จาก gps3 นำเข้า gps3
#ห้องสมุดเพื่อกาลเวลา
เวลานำเข้า
#ห้องสมุดสำหรับหาระยะห่างระหว่างจุดสองจุด
จากบาปนำเข้าคณิตศาสตร์, cos, sqrt, atan2, เรเดียน
# นำเข้าไลบรารี Rpi เพื่อใช้ปุ่มเพื่อสลับเมนูและรีเซ็ต
# นำเข้า RPi. GPIO เป็น bGPIO
# ตั้งค่าหมุดสำหรับปุ่ม
bGPIO.setmode(bGPIO. BCM)
bGPIO.setup(18, bGPIO. IN, pull_up_down=bGPIO. PUD_DOWN)
bGPIO.setup (23, bGPIO. IN, pull_up_down=bGPIO. PUD_DOWN)
# นำเข้าห้องสมุด geopy สำหรับ Geocoding
# # อินเทอร์เน็ตเป็นสิ่งจำเป็นสำหรับการทำงาน
จาก geopy.geocoders นำเข้า Nominatim
geolocator = เสนอชื่อ ()
# ค่าคงที่สำหรับระบบ
#################################
ความกว้าง = 128
ความสูง = 160 SPEED_HZ = 4000000
# หมุดกำหนดค่า Raspberry Pi
DC = 24 # A0 บนหน้าจอ TFT RST = 25 # รีเซ็ตพินบนหน้าจอ TFT SPI_PORT = 0 # พอร์ต SPI บนราสเบอร์รี่ pi, SPI0 SPI_DEVICE = 0 # เลือกทาสบน rapsberry pi, CE0
# สร้างวัตถุแสดงผล TFT LCD
disp = TFT. ST7735(DC, rst=RST, spi=SPI. SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=SPEED_HZ))
# เริ่มต้นการแสดงผล
disp.begin()
# พื้นหลังจะถูกตั้งค่าเป็นสีเขียว
#disp.clear((0, 255, 0))
# ล้างหน้าจอเป็นสีขาวและแสดงผล
#disp.clear((255, 255, 255)) วาด = disp.draw() #draw.rectangle((0, 10, 127, 150), outline=(255, 0, 0), เติม=(0, 0, 255)) #disp.display()
# ความเร็ว, ละติจูด, ตัวแปรตำแหน่งลองจิจูด
#currentS = "ความเร็วปัจจุบัน:" # สตริงความเร็ว #totalDis = "ระยะทางทั้งหมด:" # สตริงระยะทาง #currentLoc = "ตำแหน่งปัจจุบัน: " # สตริงตำแหน่ง
# ระยะทาง x และ y พิกัด
distX = 10 distY = 20
รายการคะแนน =
# พิกัดความเร็ว x และ y
ความเร็วX = 10 ความเร็วY = 20
# พิกัด x และ y
locX = 10 locY = 20
# แปลงจาก m/s เป็น mph
ConversionVal = 2.24
# ฟังก์ชั่นอัปเดตความเร็วส่งคืนสตริง
SpeedVar = 0
def speedFunc (): Global SpeedVar SpeedText = data_stream. TPV['speed'] if (SpeedText != "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = รอบ (SpeedText, 1) # return (SpeedText)
def locationFunc():
latLoc = str(latFunc()) lonLoc = str(lonFunc())
reverseString = latLoc + "," + lonLoc
ตำแหน่ง = geolocator.reverse (reverseString)
กลับ (location.address)
# ฟังก์ชั่นอัปเดต Latitude ส่งคืนค่าทศนิยม
def latFunc(): Latitude = data_stream. TPV['lat'] if(Latitude == "n/a"): return 0 else: return float(รอบ(ละติจูด, 4))
# ฟังก์ชั่นอัปเดตลองจิจูดส่งคืนสตริง
def lonFunc(): ลองจิจูด = data_stream. TPV['lon'] if (Longitude == "n/a"): return 0 else: return float(round(Longitude, 4))
# ฟังก์ชั่น Distance ส่งกลับระยะทาง TOTAL ที่เดินทาง
TotalDistance = 0
def distFunc():
global totalDistance newLat = latFunc() newLon = lonFunc() if(newLat == 0 or newLon == 0): totalDistance = totalDistance # return (totalDistance) อื่น: pointsList.append((newLat, newLon)) last = len (pointsList)-1 if(last == 0): return else: totalDistance += coorDistance(pointsList[last-1], pointsList[last]) # ส่งคืน totalDistance
# รีเซ็ตระยะทางทั้งหมด
def resDistance():
TotalDistance ทั่วโลก TotalDistance = 0
# ฟังก์ชันที่ใช้ค้นหาระยะทางระหว่างสองพิกัด
# ใช้สูตรของ Haversine ในการหา # จุดอินพุตคือ tuple
def coorDistance(จุดที่1,จุดที่2):
# รัศมีโดยประมาณของโลกในหน่วยกิโลเมตร earthRadius = 6373.0
lat1 = จุด 1[0]
lon1 = จุด 1 [1]
lat2 = point2[0]
lon2 = จุดที่ 2 [1]
ระยะทางLon = lon2 - lon1
DistanceLat = lat2 - lat1
# Haversine
a = sin(distanceLat/2)**2 + cos(lat1) * cos(lat2) * sin(distanceLon/2)**2
# Haversine c
c = 2 * atan2(sqrt(a), sqrt(1-a))
# แปลงกมเป็นไมล์
ระยะทาง = (earthRadius * c) * 0.62137
if(distance <= 0.01): return 0.00 else: return round(ระยะทาง 3)
# ฟังก์ชั่นแสดงความเร็วบนหน้าจอ
def dispSpeed():
Global SpeedVar # วางระยะห่างบนตัวแปรบนหน้าจอ draw.text ((speedX, speedY), str (SpeedVar), font=ImageFont.truetype("Lato-Medium.ttf", 72))
# ฟังก์ชั่นแสดงระยะทางบนหน้าจอ
def dispDistance():
draw.text((distX, distY), str(totalDistance), font=ImageFont.truetype("Lato-Medium.ttf", 60))
# ฟังก์ชั่น ti แสดงตำแหน่งบนหน้าจอต้องใช้อินเทอร์เน็ตในการทำงาน
def dispLocation():
draw.text((locX, locY), locationFunc(), font=ImageFont.truetype("Lato-Medium.ttf", 8))
# การใช้พจนานุกรมเพื่อเลียนแบบคำสั่งสลับ
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation }
# ฟังก์ชั่นเอาท์พุตหน้าจอ
เอาต์พุต def ():
# การใช้ตัวแปรทั่วโลกสำหรับ displayIndex global displayIndex # การล้างหน้าจอและการใช้พื้นหลัง disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), เติม=(255, 0, 0))
# ฟังก์ชั่นการโทรขึ้นอยู่กับค่า displayIndex
dispOptions[displayIndex]()
#จะลบถ้าวิธีอื่นได้ผล
# วางตัวแปรระยะทางบนหน้าจอ
#draw.text((distX, distY), str(distFunc()), font=ImageFont.load_default()) # วางตัวแปรความเร็วบนหน้าจอ #draw.text((speedX, speedY), speedFunc(), font=ImageFont.load_default()) # แสดงการอัปเดตหน้าจอ disp.display()
displayButton = 18 # BCM Pin on ราสเบอร์รี่ pi
resetButton = 23 # BCM Pin on ราสเบอร์รี่ pi
buttonPress = เท็จ
def checkDisplay():
global buttonPress global displayIndex if(bGPIO.input(displayButton) and not buttonPress): displayIndex += 1 buttonPress = True if(displayIndex == 2): displayIndex = 0 elif(bGPIO.input(displayButton) and buttonPress): พิมพ์ (" ยังกดอยู่") else: buttonPress = False
# ตั้งค่า gps
gps_socket=gps3. GPSDSocket() data_stream=gps3. DataStream() gps_socket.connect() gps_socket.watch()
timerPeriod =.5
# ค่าดัชนีสำหรับ displayIndex = 0 ลอง: สำหรับ new_data ใน gps_socket: if new_data: data_stream.unpack(new_data) if data_stream. TPV['lat'] != 'n/a': print(data_stream. TPV['speed'], data_stream. TPV['lat'], data_stream. TPV['lon']) distFunc() speedFunc() output() checkDisplay() if(bGPIO.input(resetButton)): resDistance() else: output() checkDisplay() if(bGPIO.input(resetButton)): resDistance() print('GPS ยังไม่ได้เชื่อมต่อ') time.sleep(.1) time.sleep(.8) ยกเว้น KeyboardInterrupt: gps_socket.close() print(' \nยุติโดยผู้ใช้ ctrl+c')
โค้ดด้านบนเป็นเพียงตัวอย่างหนึ่งเกี่ยวกับวิธีการเขียนโค้ดระบบของเรา และฉันได้ฝังวิดีโอเกี่ยวกับวิธีการทำงานของระบบนี้