8.5 KiB
Læs GPS-data - Raspberry Pi
I denne del af lektionen vil du tilføje en GPS-sensor til din Raspberry Pi og læse værdier fra den.
Hardware
Raspberry Pi'en har brug for en GPS-sensor.
Den sensor, du skal bruge, er en Grove GPS Air530 sensor. Denne sensor kan forbinde til flere GPS-systemer for en hurtig og præcis positionering. Sensoren består af to dele - sensorens kerneelektronik og en ekstern antenne, der er forbundet med en tynd ledning for at opfange radiosignaler fra satellitterne.
Dette er en UART-sensor, så den sender GPS-data via UART.
Tilslut GPS-sensoren
Grove GPS-sensoren kan tilsluttes Raspberry Pi'en.
Opgave - tilslut GPS-sensoren
Tilslut GPS-sensoren.
-
Sæt den ene ende af et Grove-kabel i stikket på GPS-sensoren. Det kan kun sættes i på én måde.
-
Med Raspberry Pi'en slukket, tilslut den anden ende af Grove-kablet til UART-stikket markeret UART på Grove Base-hatten, der er tilsluttet Pi'en. Dette stik er placeret på den midterste række, på siden tættest på SD-kortslottet, i den modsatte ende af USB-portene og ethernet-stikket.
-
Placer GPS-sensoren, så den tilkoblede antenne har udsyn til himlen - ideelt set ved et åbent vindue eller udenfor. Det er lettere at få et klart signal uden forhindringer foran antennen.
Programmer GPS-sensoren
Raspberry Pi'en kan nu programmeres til at bruge den tilsluttede GPS-sensor.
Opgave - programmer GPS-sensoren
Programmer enheden.
-
Tænd for Pi'en og vent, indtil den er startet op.
-
GPS-sensoren har 2 LED'er - en blå LED, der blinker, når data overføres, og en grøn LED, der blinker hvert sekund, når den modtager data fra satellitter. Sørg for, at den blå LED blinker, når du tænder Pi'en. Efter et par minutter vil den grønne LED begynde at blinke - hvis ikke, kan det være nødvendigt at flytte antennen.
-
Start VS Code, enten direkte på Pi'en eller ved at forbinde via Remote SSH-udvidelsen.
⚠️ Du kan finde instruktionerne til opsætning og start af VS Code i lektion 1, hvis det er nødvendigt.
-
Med nyere versioner af Raspberry Pi, der understøtter Bluetooth, er der en konflikt mellem den serielle port, der bruges til Bluetooth, og den, der bruges af Grove UART-porten. For at løse dette skal du gøre følgende:
-
Fra VS Code-terminalen skal du redigere filen
/boot/config.txt
ved hjælp afnano
, en indbygget terminalteksteditor, med følgende kommando:sudo nano /boot/config.txt
Denne fil kan ikke redigeres i VS Code, da du skal bruge
sudo
-rettigheder, en forhøjet tilladelse. VS Code kører ikke med denne tilladelse. -
Brug piletasterne til at navigere til slutningen af filen, og kopier derefter koden nedenfor og indsæt den i slutningen af filen:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1
Du kan indsætte ved at bruge de normale tastaturgenveje for din enhed (
Ctrl+v
på Windows, Linux eller Raspberry Pi OS,Cmd+v
på macOS). -
Gem filen og afslut nano ved at trykke på
Ctrl+x
. Tryk påy
, når du bliver spurgt, om du vil gemme den ændrede buffer, og tryk derefter påenter
for at bekræfte, at du vil overskrive/boot/config.txt
.Hvis du laver en fejl, kan du afslutte uden at gemme og derefter gentage disse trin.
-
Rediger filen
/boot/cmdline.txt
i nano med følgende kommando:sudo nano /boot/cmdline.txt
-
Denne fil indeholder en række nøgle/værdi-par adskilt af mellemrum. Fjern eventuelle nøgle/værdi-par for nøglen
console
. De vil sandsynligvis se sådan ud:console=serial0,115200 console=tty1
Du kan navigere til disse poster ved hjælp af piletasterne og derefter slette dem ved hjælp af de normale
del
- ellerbackspace
-taster.For eksempel, hvis din oprindelige fil ser sådan ud:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
Den nye version vil være:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
-
Følg ovenstående trin for at gemme denne fil og afslutte nano.
-
Genstart din Pi, og forbind derefter igen i VS Code, når Pi'en er genstartet.
-
-
Fra terminalen skal du oprette en ny mappe i
pi
-brugerens hjemmemappe kaldetgps-sensor
. Opret en fil i denne mappe kaldetapp.py
. -
Åbn denne mappe i VS Code.
-
GPS-modulet sender UART-data via en seriel port. Installer
pyserial
Pip-pakken for at kommunikere med den serielle port fra din Python-kode:pip3 install pyserial
-
Tilføj følgende kode til 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)
Denne kode importerer
serial
-modulet frapyserial
Pip-pakken. Den opretter derefter forbindelse til den serielle port/dev/ttyAMA0
- dette er adressen på den serielle port, som Grove Pi Base Hat bruger til sin UART-port. Den rydder derefter eventuelle eksisterende data fra denne serielle forbindelse.Derefter defineres en funktion kaldet
print_gps_data
, der udskriver den linje, der sendes til den, til konsollen.Dernæst kører koden i en uendelig løkke, hvor den læser så mange tekstlinjer som muligt fra den serielle port i hver iteration. Den kalder funktionen
print_gps_data
for hver linje.Når alle data er læst, sover løkken i 1 sekund og prøver derefter igen.
-
Kør denne kode. Du vil se rå output fra GPS-sensoren, noget i stil med følgende:
$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*68
Hvis du får en af følgende fejl, når du stopper og genstarter din kode, skal du tilføje en
try - except
-blok til din while-løkke.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 byte
while 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 finde denne kode i code-gps/pi-mappen.
😀 Dit GPS-sensorprogram var en succes!
Ansvarsfraskrivelse:
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten Co-op Translator. Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.