13 KiB
Ανάγνωση δεδομένων GPS - Raspberry Pi
Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα GPS στο Raspberry Pi σας και θα διαβάσετε τιμές από αυτόν.
Υλικό
Το Raspberry Pi χρειάζεται έναν αισθητήρα GPS.
Ο αισθητήρας που θα χρησιμοποιήσετε είναι ο Grove GPS Air530 sensor. Αυτός ο αισθητήρας μπορεί να συνδεθεί σε πολλαπλά συστήματα GPS για γρήγορη και ακριβή εντοπισμό. Ο αισθητήρας αποτελείται από 2 μέρη - τα βασικά ηλεκτρονικά του αισθητήρα και μια εξωτερική κεραία που συνδέεται με ένα λεπτό καλώδιο για να λαμβάνει τα ραδιοκύματα από τους δορυφόρους.
Πρόκειται για έναν αισθητήρα UART, οπότε στέλνει δεδομένα GPS μέσω UART.
Σύνδεση του αισθητήρα GPS
Ο αισθητήρας Grove GPS μπορεί να συνδεθεί στο Raspberry Pi.
Εργασία - σύνδεση του αισθητήρα GPS
Συνδέστε τον αισθητήρα GPS.
-
Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα GPS. Θα μπει μόνο με έναν συγκεκριμένο τρόπο.
-
Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην υποδοχή UART που είναι σημειωμένη ως UART στο Grove Base hat που είναι συνδεδεμένο στο Pi. Αυτή η υποδοχή βρίσκεται στη μεσαία σειρά, στην πλευρά κοντά στην υποδοχή της κάρτας SD, στο αντίθετο άκρο από τις θύρες USB και την υποδοχή ethernet.
-
Τοποθετήστε τον αισθητήρα GPS έτσι ώστε η συνδεδεμένη κεραία να έχει ορατότητα προς τον ουρανό - ιδανικά δίπλα σε ένα ανοιχτό παράθυρο ή έξω. Είναι πιο εύκολο να λάβετε καθαρότερο σήμα χωρίς εμπόδια μπροστά από την κεραία.
Προγραμματισμός του αισθητήρα GPS
Το Raspberry Pi μπορεί τώρα να προγραμματιστεί για να χρησιμοποιήσει τον συνδεδεμένο αισθητήρα GPS.
Εργασία - προγραμματισμός του αισθητήρα GPS
Προγραμματίστε τη συσκευή.
-
Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει.
-
Ο αισθητήρας GPS έχει 2 LED - ένα μπλε LED που αναβοσβήνει όταν μεταδίδονται δεδομένα και ένα πράσινο LED που αναβοσβήνει κάθε δευτερόλεπτο όταν λαμβάνονται δεδομένα από δορυφόρους. Βεβαιωθείτε ότι το μπλε LED αναβοσβήνει όταν ενεργοποιείτε το Pi. Μετά από λίγα λεπτά, το πράσινο LED θα αρχίσει να αναβοσβήνει - αν όχι, ίσως χρειαστεί να επανατοποθετήσετε την κεραία.
-
Εκκινήστε το VS Code, είτε απευθείας στο Pi είτε συνδεθείτε μέσω της επέκτασης Remote SSH.
⚠️ Μπορείτε να ανατρέξετε στις οδηγίες για τη ρύθμιση και την εκκίνηση του VS Code στο μάθημα 1 αν χρειαστεί.
-
Με τις νεότερες εκδόσεις του Raspberry Pi που υποστηρίζουν Bluetooth, υπάρχει μια σύγκρουση μεταξύ της σειριακής θύρας που χρησιμοποιείται για το Bluetooth και αυτής που χρησιμοποιείται από την υποδοχή Grove UART. Για να διορθώσετε αυτό, κάντε τα εξής:
-
Από το τερματικό του VS Code, επεξεργαστείτε το αρχείο
/boot/config.txtχρησιμοποιώντας τοnano, έναν ενσωματωμένο επεξεργαστή κειμένου τερματικού, με την ακόλουθη εντολή:sudo nano /boot/config.txtΑυτό το αρχείο δεν μπορεί να επεξεργαστεί από το VS Code καθώς χρειάζεται να το επεξεργαστείτε με δικαιώματα
sudo, δηλαδή αυξημένα δικαιώματα. Το VS Code δεν εκτελείται με αυτά τα δικαιώματα. -
Χρησιμοποιήστε τα πλήκτρα του κέρσορα για να μετακινηθείτε στο τέλος του αρχείου και αντιγράψτε τον παρακάτω κώδικα, επικολλώντας τον στο τέλος του αρχείου:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1Μπορείτε να επικολλήσετε χρησιμοποιώντας τις κανονικές συντομεύσεις πληκτρολογίου για τη συσκευή σας (
Ctrl+vστα Windows, Linux ή Raspberry Pi OS,Cmd+vστο macOS). -
Αποθηκεύστε αυτό το αρχείο και βγείτε από το nano πατώντας
Ctrl+x. Πατήστεyόταν σας ζητηθεί να αποθηκεύσετε τον τροποποιημένο buffer και στη συνέχεια πατήστεenterγια να επιβεβαιώσετε ότι θέλετε να αντικαταστήσετε το/boot/config.txt.Αν κάνετε κάποιο λάθος, μπορείτε να βγείτε χωρίς να αποθηκεύσετε και να επαναλάβετε αυτά τα βήματα.
-
Επεξεργαστείτε το αρχείο
/boot/cmdline.txtστο nano με την ακόλουθη εντολή:sudo nano /boot/cmdline.txt -
Αυτό το αρχείο περιέχει έναν αριθμό ζευγών κλειδιού/τιμής χωρισμένων με κενά. Αφαιρέστε οποιαδήποτε ζεύγη κλειδιού/τιμής για το κλειδί
console. Πιθανότατα θα μοιάζουν κάπως έτσι:console=serial0,115200 console=tty1Μπορείτε να μετακινηθείτε σε αυτές τις εγγραφές χρησιμοποιώντας τα πλήκτρα του κέρσορα και στη συνέχεια να τις διαγράψετε χρησιμοποιώντας τα κανονικά πλήκτρα
delήbackspace.Για παράδειγμα, αν το αρχικό σας αρχείο μοιάζει με αυτό:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwaitΗ νέα έκδοση θα είναι:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait -
Ακολουθήστε τα παραπάνω βήματα για να αποθηκεύσετε αυτό το αρχείο και να βγείτε από το nano.
-
Επανεκκινήστε το Pi σας και στη συνέχεια συνδεθείτε ξανά στο VS Code μόλις το Pi επανεκκινήσει.
-
-
Από το τερματικό, δημιουργήστε έναν νέο φάκελο στον αρχικό κατάλογο του χρήστη
piμε όνομαgps-sensor. Δημιουργήστε ένα αρχείο σε αυτόν τον φάκελο με όνομαapp.py. -
Ανοίξτε αυτόν τον φάκελο στο VS Code.
-
Το μοντέλο GPS στέλνει δεδομένα UART μέσω μιας σειριακής θύρας. Εγκαταστήστε το πακέτο Pip
pyserialγια να επικοινωνήσετε με τη σειριακή θύρα από τον κώδικα Python σας:pip3 install pyserial -
Προσθέστε τον παρακάτω κώδικα στο αρχείο
app.py: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)Αυτός ο κώδικας εισάγει τη μονάδα
serialαπό το πακέτο Pippyserial. Στη συνέχεια, συνδέεται στη σειριακή θύρα/dev/ttyAMA0- αυτή είναι η διεύθυνση της σειριακής θύρας που χρησιμοποιεί το Grove Pi Base Hat για την υποδοχή UART. Στη συνέχεια, καθαρίζει οποιαδήποτε υπάρχοντα δεδομένα από αυτή τη σειριακή σύνδεση.Στη συνέχεια, ορίζεται μια συνάρτηση με όνομα
print_gps_dataπου εκτυπώνει τη γραμμή που της δίνεται στην κονσόλα.Στη συνέχεια, ο κώδικας επαναλαμβάνεται για πάντα, διαβάζοντας όσες γραμμές κειμένου μπορεί από τη σειριακή θύρα σε κάθε επανάληψη. Καλεί τη συνάρτηση
print_gps_dataγια κάθε γραμμή.Αφού διαβαστούν όλα τα δεδομένα, η επανάληψη κοιμάται για 1 δευτερόλεπτο και στη συνέχεια προσπαθεί ξανά.
-
Εκτελέστε αυτόν τον κώδικα. Θα δείτε την ακατέργαστη έξοδο από τον αισθητήρα GPS, κάτι σαν το παρακάτω:
$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Αν λάβετε κάποιο από τα παρακάτω σφάλματα όταν σταματάτε και επανεκκινείτε τον κώδικα, προσθέστε ένα μπλοκ
try - exceptστη 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)
💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο code-gps/pi.
😀 Το πρόγραμμα του αισθητήρα GPS σας ήταν επιτυχές!
Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.

