8.8 KiB
Lees GPS-gegevens - Raspberry Pi
In dit deel van de les voeg je een GPS-sensor toe aan je Raspberry Pi en lees je waarden ervan uit.
Hardware
De Raspberry Pi heeft een GPS-sensor nodig.
De sensor die je zult gebruiken is een Grove GPS Air530 sensor. Deze sensor kan verbinding maken met meerdere GPS-systemen voor een snelle en nauwkeurige locatiebepaling. De sensor bestaat uit twee onderdelen: de kern elektronica van de sensor en een externe antenne die via een dunne draad is verbonden om radiogolven van satellieten op te vangen.
Dit is een UART-sensor, dus hij verzendt GPS-gegevens via UART.
Verbind de GPS-sensor
De Grove GPS-sensor kan worden aangesloten op de Raspberry Pi.
Taak - verbind de GPS-sensor
Verbind de GPS-sensor.
-
Steek één uiteinde van een Grove-kabel in de aansluiting op de GPS-sensor. De kabel past maar op één manier.
-
Met de Raspberry Pi uitgeschakeld, verbind je het andere uiteinde van de Grove-kabel met de UART-aansluiting gemarkeerd als UART op de Grove Base Hat die op de Pi is bevestigd. Deze aansluiting bevindt zich op de middelste rij, aan de kant die het dichtst bij de SD-kaartsleuf ligt, tegenover de USB-poorten en ethernet-aansluiting.
-
Plaats de GPS-sensor zo dat de aangesloten antenne zicht heeft op de lucht - bij voorkeur naast een open raam of buiten. Het is gemakkelijker om een duidelijker signaal te krijgen zonder obstakels voor de antenne.
Programmeer de GPS-sensor
De Raspberry Pi kan nu worden geprogrammeerd om de aangesloten GPS-sensor te gebruiken.
Taak - programmeer de GPS-sensor
Programmeer het apparaat.
-
Zet de Pi aan en wacht tot deze is opgestart.
-
De GPS-sensor heeft twee LED's: een blauwe LED die knippert wanneer gegevens worden verzonden, en een groene LED die elke seconde knippert wanneer gegevens van satellieten worden ontvangen. Zorg ervoor dat de blauwe LED knippert wanneer je de Pi aanzet. Na een paar minuten zal de groene LED knipperen - als dat niet gebeurt, moet je mogelijk de antenne opnieuw positioneren.
-
Start VS Code, direct op de Pi of via de Remote SSH-extensie.
⚠️ Je kunt de instructies voor het instellen en starten van VS Code in les 1 indien nodig raadplegen.
-
Bij nieuwere versies van de Raspberry Pi die Bluetooth ondersteunen, is er een conflict tussen de seriële poort die wordt gebruikt voor Bluetooth en die wordt gebruikt door de Grove UART-poort. Om dit op te lossen, doe je het volgende:
-
Open vanuit de VS Code-terminal het bestand
/boot/config.txt
metnano
, een ingebouwde terminalteksteditor, met het volgende commando:sudo nano /boot/config.txt
Dit bestand kan niet worden bewerkt met VS Code omdat je
sudo
-rechten nodig hebt, verhoogde rechten. VS Code werkt niet met deze rechten. -
Gebruik de pijltjestoetsen om naar het einde van het bestand te navigeren. Kopieer vervolgens de onderstaande code en plak deze aan het einde van het bestand:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1
Je kunt plakken met de normale sneltoetsen voor je apparaat (
Ctrl+v
op Windows, Linux of Raspberry Pi OS,Cmd+v
op macOS). -
Sla dit bestand op en sluit nano door op
Ctrl+x
te drukken. Druk opy
wanneer je wordt gevraagd of je de gewijzigde buffer wilt opslaan, en druk vervolgens openter
om te bevestigen dat je/boot/config.txt
wilt overschrijven.Als je een fout maakt, kun je afsluiten zonder op te slaan en de stappen opnieuw uitvoeren.
-
Bewerk het bestand
/boot/cmdline.txt
in nano met het volgende commando:sudo nano /boot/cmdline.txt
-
Dit bestand bevat een aantal sleutel/waarde-paren gescheiden door spaties. Verwijder eventuele sleutel/waarde-paren voor de sleutel
console
. Ze zien er waarschijnlijk ongeveer zo uit:console=serial0,115200 console=tty1
Je kunt naar deze items navigeren met de pijltjestoetsen en vervolgens verwijderen met de normale
del
- ofbackspace
-toetsen.Als je oorspronkelijke bestand er bijvoorbeeld zo uitziet:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
Ziet de nieuwe versie er zo uit:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
-
Volg de bovenstaande stappen om dit bestand op te slaan en nano te sluiten.
-
Start je Pi opnieuw op en maak opnieuw verbinding in VS Code zodra de Pi opnieuw is opgestart.
-
-
Maak vanuit de terminal een nieuwe map in de home-directory van de gebruiker
pi
genaamdgps-sensor
. Maak een bestand in deze map genaamdapp.py
. -
Open deze map in VS Code.
-
De GPS-module verzendt UART-gegevens via een seriële poort. Installeer het
pyserial
Pip-pakket om via je Python-code met de seriële poort te communiceren:pip3 install pyserial
-
Voeg de volgende code toe aan je
app.py
-bestand: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)
Deze code importeert de
serial
-module van hetpyserial
Pip-pakket. Vervolgens maakt het verbinding met de seriële poort/dev/ttyAMA0
- dit is het adres van de seriële poort die de Grove Pi Base Hat gebruikt voor zijn UART-poort. Daarna worden eventuele bestaande gegevens van deze seriële verbinding gewist.Vervolgens wordt een functie genaamd
print_gps_data
gedefinieerd die de lijn die eraan wordt doorgegeven naar de console print.Daarna loopt de code oneindig door, waarbij zoveel mogelijk tekstregels van de seriële poort worden gelezen in elke lus. Voor elke regel wordt de functie
print_gps_data
aangeroepen.Nadat alle gegevens zijn gelezen, slaapt de lus 1 seconde en probeert het opnieuw.
-
Voer deze code uit. Je zult de ruwe uitvoer van de GPS-sensor zien, iets zoals het volgende:
$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
Als je een van de volgende fouten krijgt bij het stoppen en opnieuw starten van je code, voeg dan een
try - except
-blok toe aan je while-lus.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)
💁 Je kunt deze code vinden in de map code-gps/pi.
😀 Je GPS-sensorprogramma is een succes!
Disclaimer:
Dit document is vertaald met behulp van de AI-vertalingsservice Co-op Translator. Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.