8.2 KiB
Läs GPS-data - Raspberry Pi
I den här delen av lektionen kommer du att lägga till en GPS-sensor till din Raspberry Pi och läsa värden från den.
Hårdvara
Raspberry Pi behöver en GPS-sensor.
Sensorn du kommer att använda är en Grove GPS Air530-sensor. Den här sensorn kan ansluta till flera GPS-system för en snabb och exakt positionering. Sensorn består av två delar - kärnelektroniken i sensorn och en extern antenn som är ansluten med en tunn kabel för att ta emot radiosignaler från satelliterna.
Detta är en UART-sensor, så den skickar GPS-data via UART.
Anslut GPS-sensorn
Grove GPS-sensorn kan anslutas till Raspberry Pi.
Uppgift - anslut GPS-sensorn
Anslut GPS-sensorn.
-
Sätt i ena änden av en Grove-kabel i uttaget på GPS-sensorn. Den går bara att sätta i på ett sätt.
-
Med Raspberry Pi avstängd, anslut den andra änden av Grove-kabeln till UART-uttaget märkt UART på Grove Base-hatten som är ansluten till Pi. Detta uttag finns på den mellersta raden, på sidan närmast SD-kortplatsen, motsatt sida från USB-portarna och ethernet-uttaget.
-
Placera GPS-sensorn så att den anslutna antennen har fri sikt mot himlen - helst nära ett öppet fönster eller utomhus. Det är lättare att få en tydligare signal utan hinder för antennen.
Programmera GPS-sensorn
Raspberry Pi kan nu programmeras för att använda den anslutna GPS-sensorn.
Uppgift - programmera GPS-sensorn
Programmera enheten.
-
Starta Pi och vänta tills den har startat upp.
-
GPS-sensorn har två lysdioder - en blå lysdiod som blinkar när data överförs och en grön lysdiod som blinkar varje sekund när den tar emot data från satelliter. Se till att den blå lysdioden blinkar när du startar Pi. Efter några minuter kommer den gröna lysdioden att blinka - om inte, kan du behöva justera antennens position.
-
Starta VS Code, antingen direkt på Pi eller anslut via Remote SSH-tillägget.
⚠️ Du kan hänvisa till instruktionerna för att ställa in och starta VS Code i lektion 1 om det behövs.
-
Med nyare versioner av Raspberry Pi som stöder Bluetooth finns det en konflikt mellan den seriella porten som används för Bluetooth och den som används av Grove UART-porten. För att lösa detta, gör följande:
-
Från VS Code-terminalen, redigera filen
/boot/config.txtmed hjälp avnano, en inbyggd terminaltextredigerare, med följande kommando:sudo nano /boot/config.txtDen här filen kan inte redigeras av VS Code eftersom du behöver redigera den med
sudo-behörighet, en förhöjd behörighet. VS Code körs inte med denna behörighet. -
Använd piltangenterna för att navigera till slutet av filen. Kopiera sedan koden nedan och klistra in den i slutet av filen:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1Du kan klistra in med de vanliga tangentbordsgenvägarna för din enhet (
Ctrl+vpå Windows, Linux eller Raspberry Pi OS,Cmd+vpå macOS). -
Spara filen och avsluta nano genom att trycka på
Ctrl+x. Tryck påynär du blir tillfrågad om du vill spara den ändrade bufferten och tryck sedan påenterför att bekräfta att du vill skriva över/boot/config.txt.Om du gör ett misstag kan du avsluta utan att spara och sedan upprepa dessa steg.
-
Redigera filen
/boot/cmdline.txti nano med följande kommando:sudo nano /boot/cmdline.txt -
Den här filen innehåller ett antal nyckel/värde-par separerade med mellanslag. Ta bort alla nyckel/värde-par för nyckeln
console. De ser förmodligen ut så här:console=serial0,115200 console=tty1Du kan navigera till dessa poster med piltangenterna och sedan ta bort dem med de vanliga
del- ellerbackspace-tangenterna.Till exempel, om din ursprungliga fil ser ut så här:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwaitDen nya versionen kommer att se ut så här:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait -
Följ stegen ovan för att spara filen och avsluta nano.
-
Starta om din Pi och anslut sedan igen i VS Code när Pi har startat om.
-
-
Från terminalen, skapa en ny mapp i hemmakatalogen för användaren
pisom hetergps-sensor. Skapa en fil i den här mappen som heterapp.py. -
Öppna den här mappen i VS Code.
-
GPS-modulen skickar UART-data via en seriell port. Installera Pip-paketet
pyserialför att kommunicera med den seriella porten från din Python-kod:pip3 install pyserial -
Lägg till följande kod i din
app.py-fil:import time import serial serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) serial.reset_input_buffer() serial.flush() def print_gps_data(line): print(line.rstrip()) while True: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data(line) line = serial.readline().decode('utf-8') time.sleep(1)Den här koden importerar modulen
serialfrån Pip-paketetpyserial. Den ansluter sedan till den seriella porten/dev/ttyAMA0- detta är adressen till den seriella port som Grove Pi Base Hat använder för sin UART-port. Den rensar sedan all befintlig data från denna seriella anslutning.Därefter definieras en funktion som heter
print_gps_datasom skriver ut raden som skickas till den i konsolen.Sedan loopar koden för alltid och läser så många rader text som möjligt från den seriella porten i varje loop. Den anropar funktionen
print_gps_dataför varje rad.När all data har lästs sover loopen i 1 sekund och försöker sedan igen.
-
Kör den här koden. Du kommer att se råutdata från GPS-sensorn, något i stil med följande:
$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $BDGSA,A,1,,,,,,,,,,,,,,,*0F $GPGSV,1,1,00*79 $BDGSV,1,1,00*68Om du får något av följande fel när du stoppar och startar om din kod, lägg till ett
try - except-block i din while-loop.UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation bytewhile True: try: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data() line = serial.readline().decode('utf-8') # There's a random chance the first byte being read is part way through a character. # Read another full line and continue. except UnicodeDecodeError: line = serial.readline().decode('utf-8') time.sleep(1)
💁 Du kan hitta den här koden i mappen code-gps/pi.
😀 Ditt GPS-sensorprogram lyckades!
Ansvarsfriskrivning:
Detta dokument har översatts med hjälp av AI-översättningstjänsten Co-op Translator. Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.

