# Ανάγνωση δεδομένων GPS - Raspberry Pi Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα GPS στο Raspberry Pi σας και θα διαβάσετε τιμές από αυτόν. ## Υλικό Το Raspberry Pi χρειάζεται έναν αισθητήρα GPS. Ο αισθητήρας που θα χρησιμοποιήσετε είναι ο [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Αυτός ο αισθητήρας μπορεί να συνδεθεί σε πολλαπλά συστήματα GPS για γρήγορη και ακριβή εντοπισμό. Ο αισθητήρας αποτελείται από 2 μέρη - τα βασικά ηλεκτρονικά του αισθητήρα και μια εξωτερική κεραία που συνδέεται με ένα λεπτό καλώδιο για να λαμβάνει τα ραδιοκύματα από τους δορυφόρους. Πρόκειται για έναν αισθητήρα UART, οπότε στέλνει δεδομένα GPS μέσω UART. ## Σύνδεση του αισθητήρα GPS Ο αισθητήρας Grove GPS μπορεί να συνδεθεί στο Raspberry Pi. ### Εργασία - σύνδεση του αισθητήρα GPS Συνδέστε τον αισθητήρα GPS. ![Αισθητήρας Grove GPS](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.el.png) 1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα GPS. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. 1. Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην υποδοχή UART που είναι σημειωμένη ως **UART** στο Grove Base hat που είναι συνδεδεμένο στο Pi. Αυτή η υποδοχή βρίσκεται στη μεσαία σειρά, στην πλευρά κοντά στην υποδοχή της κάρτας SD, στο αντίθετο άκρο από τις θύρες USB και την υποδοχή ethernet. ![Ο αισθητήρας Grove GPS συνδεδεμένος στην υποδοχή UART](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.el.png) 1. Τοποθετήστε τον αισθητήρα GPS έτσι ώστε η συνδεδεμένη κεραία να έχει ορατότητα προς τον ουρανό - ιδανικά δίπλα σε ένα ανοιχτό παράθυρο ή έξω. Είναι πιο εύκολο να λάβετε καθαρότερο σήμα χωρίς εμπόδια μπροστά από την κεραία. ## Προγραμματισμός του αισθητήρα GPS Το Raspberry Pi μπορεί τώρα να προγραμματιστεί για να χρησιμοποιήσει τον συνδεδεμένο αισθητήρα GPS. ### Εργασία - προγραμματισμός του αισθητήρα GPS Προγραμματίστε τη συσκευή. 1. Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει. 1. Ο αισθητήρας GPS έχει 2 LED - ένα μπλε LED που αναβοσβήνει όταν μεταδίδονται δεδομένα και ένα πράσινο LED που αναβοσβήνει κάθε δευτερόλεπτο όταν λαμβάνονται δεδομένα από δορυφόρους. Βεβαιωθείτε ότι το μπλε LED αναβοσβήνει όταν ενεργοποιείτε το Pi. Μετά από λίγα λεπτά, το πράσινο LED θα αρχίσει να αναβοσβήνει - αν όχι, ίσως χρειαστεί να επανατοποθετήσετε την κεραία. 1. Εκκινήστε το VS Code, είτε απευθείας στο Pi είτε συνδεθείτε μέσω της επέκτασης Remote SSH. > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη ρύθμιση και την εκκίνηση του VS Code στο μάθημα 1 αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). 1. Με τις νεότερες εκδόσεις του Raspberry Pi που υποστηρίζουν Bluetooth, υπάρχει μια σύγκρουση μεταξύ της σειριακής θύρας που χρησιμοποιείται για το Bluetooth και αυτής που χρησιμοποιείται από την υποδοχή Grove UART. Για να διορθώσετε αυτό, κάντε τα εξής: 1. Από το τερματικό του VS Code, επεξεργαστείτε το αρχείο `/boot/config.txt` χρησιμοποιώντας το `nano`, έναν ενσωματωμένο επεξεργαστή κειμένου τερματικού, με την ακόλουθη εντολή: ```sh sudo nano /boot/config.txt ``` > Αυτό το αρχείο δεν μπορεί να επεξεργαστεί από το VS Code καθώς χρειάζεται να το επεξεργαστείτε με δικαιώματα `sudo`, δηλαδή αυξημένα δικαιώματα. Το VS Code δεν εκτελείται με αυτά τα δικαιώματα. 1. Χρησιμοποιήστε τα πλήκτρα του κέρσορα για να μετακινηθείτε στο τέλος του αρχείου και αντιγράψτε τον παρακάτω κώδικα, επικολλώντας τον στο τέλος του αρχείου: ```ini dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1 ``` Μπορείτε να επικολλήσετε χρησιμοποιώντας τις κανονικές συντομεύσεις πληκτρολογίου για τη συσκευή σας (`Ctrl+v` στα Windows, Linux ή Raspberry Pi OS, `Cmd+v` στο macOS). 1. Αποθηκεύστε αυτό το αρχείο και βγείτε από το nano πατώντας `Ctrl+x`. Πατήστε `y` όταν σας ζητηθεί να αποθηκεύσετε τον τροποποιημένο buffer και στη συνέχεια πατήστε `enter` για να επιβεβαιώσετε ότι θέλετε να αντικαταστήσετε το `/boot/config.txt`. > Αν κάνετε κάποιο λάθος, μπορείτε να βγείτε χωρίς να αποθηκεύσετε και να επαναλάβετε αυτά τα βήματα. 1. Επεξεργαστείτε το αρχείο `/boot/cmdline.txt` στο nano με την ακόλουθη εντολή: ```sh sudo nano /boot/cmdline.txt ``` 1. Αυτό το αρχείο περιέχει έναν αριθμό ζευγών κλειδιού/τιμής χωρισμένων με κενά. Αφαιρέστε οποιαδήποτε ζεύγη κλειδιού/τιμής για το κλειδί `console`. Πιθανότατα θα μοιάζουν κάπως έτσι: ```output console=serial0,115200 console=tty1 ``` Μπορείτε να μετακινηθείτε σε αυτές τις εγγραφές χρησιμοποιώντας τα πλήκτρα του κέρσορα και στη συνέχεια να τις διαγράψετε χρησιμοποιώντας τα κανονικά πλήκτρα `del` ή `backspace`. Για παράδειγμα, αν το αρχικό σας αρχείο μοιάζει με αυτό: ```output console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ``` Η νέα έκδοση θα είναι: ```output root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ``` 1. Ακολουθήστε τα παραπάνω βήματα για να αποθηκεύσετε αυτό το αρχείο και να βγείτε από το nano. 1. Επανεκκινήστε το Pi σας και στη συνέχεια συνδεθείτε ξανά στο VS Code μόλις το Pi επανεκκινήσει. 1. Από το τερματικό, δημιουργήστε έναν νέο φάκελο στον αρχικό κατάλογο του χρήστη `pi` με όνομα `gps-sensor`. Δημιουργήστε ένα αρχείο σε αυτόν τον φάκελο με όνομα `app.py`. 1. Ανοίξτε αυτόν τον φάκελο στο VS Code. 1. Το μοντέλο GPS στέλνει δεδομένα UART μέσω μιας σειριακής θύρας. Εγκαταστήστε το πακέτο Pip `pyserial` για να επικοινωνήσετε με τη σειριακή θύρα από τον κώδικα Python σας: ```sh pip3 install pyserial ``` 1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py`: ```python 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` από το πακέτο Pip `pyserial`. Στη συνέχεια, συνδέεται στη σειριακή θύρα `/dev/ttyAMA0` - αυτή είναι η διεύθυνση της σειριακής θύρας που χρησιμοποιεί το Grove Pi Base Hat για την υποδοχή UART. Στη συνέχεια, καθαρίζει οποιαδήποτε υπάρχοντα δεδομένα από αυτή τη σειριακή σύνδεση. Στη συνέχεια, ορίζεται μια συνάρτηση με όνομα `print_gps_data` που εκτυπώνει τη γραμμή που της δίνεται στην κονσόλα. Στη συνέχεια, ο κώδικας επαναλαμβάνεται για πάντα, διαβάζοντας όσες γραμμές κειμένου μπορεί από τη σειριακή θύρα σε κάθε επανάληψη. Καλεί τη συνάρτηση `print_gps_data` για κάθε γραμμή. Αφού διαβαστούν όλα τα δεδομένα, η επανάληψη κοιμάται για 1 δευτερόλεπτο και στη συνέχεια προσπαθεί ξανά. 1. Εκτελέστε αυτόν τον κώδικα. Θα δείτε την ακατέργαστη έξοδο από τον αισθητήρα GPS, κάτι σαν το παρακάτω: ```output $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 σας. ```output 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 ``` ```python 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) ``` > 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi). 😀 Το πρόγραμμα του αισθητήρα GPS σας ήταν επιτυχές! --- **Αποποίηση ευθύνης**: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.