ΕΡΓΑΣΤΗΡΙΟ ΑΥΤΟΜΑΤΙΣΜΟΥ INTERNET OF THINGS (I.O.T) Εργαστήριο αυτοματισμού – ΙοΤ με την χρήση του μικροϋπολογιστή RaspberryPi. ΕΛΛΗΝΟΓΑΛΛΙΚΗ ΣΧΟΛΗ ΠΕΙΡΑΙΑ «Ο ΑΓΙΟΣ ΠΑΥΛΟΣ» ΥΠΕΥΘΥΝΟΣ: Μπράιλας Διονύσιος
ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ Πρόλογος ......................................................................................................................................... 3 ΤΙ ΕΙΝΑΙΤΟ RASPBERRYPI ............................................................................................................. 5 Τι μπορούμε να κάνουμε με το RaspberryPi .................................................................................. 7 Ξεκινώντας με το RaspberryPi ....................................................................................................... 9 Αλλάξτε Password ....................................................................................................................... 12 Κλείστε το Raspberry ................................................................................................................... 14 Ασύρματη σύνδεση στο Internet .................................................................................................. 14 ΓΡΑΜΜΗ ΕΝΤΟΛΩΝ ...................................................................................................................... 16 Γιατί υπάρχει η γραμμή εντολών .................................................................................................. 16 Πώς ανοίγουμε την Γραμμή εντολών ........................................................................................... 16 Οι πρώτες εντολές του Raspbian ................................................................................................. 17 Διαχείριση αρχείων στο Raspbian ................................................................................................ 19 DEMO PROGRAMS ....................................................................................................................... 22 ΣΥΖΗΤΩΝΤΑΣ ΜΕ ΕΝΑ Robot ...................................................................................................... 24 Προετοιμασία ............................................................................................................................... 24 Εκτέλεση...................................................................................................................................... 25 PHYSICAL COMPUTING ............................................................................................................... 27 BreadBoard ................................................................................................................................. 29 Ανάψτε το Led ............................................................................................................................. 30 Προγραμματίστε το κύκλωμά σας ................................................................................................ 31 Φάρος .......................................................................................................................................... 32 Προγραμματίστε ένα Button ......................................................................................................... 32 Reaction Game............................................................................................................................ 34 Ανιχνευτής κίνησης υπερύθρων – P.I.R. motion sensor ............................................................... 36 GPIOZERO - ΕΝΤΟΛΕΣ .............................................................................................................. 37 ΓΝΩΡΙΜΙΑ ΜΕ ΤΑ A.P.I. ................................................................................................................. 39 Σηματοδότης αστροναυτών στον Διεθνή Διαστημικό Σταθμό ( I.S.S.) .......................................... 39 Twitter API ................................................................................................................................... 42 Ανάψτε led με μήνυμα στο twitter................................................................................................. 47 Άντληση δεδομένων από σχολικούς μετεωρολογικούς σταθμούς ................................................ 49 Εύρεση των Ελληνικών μετεωρολογικών σταθμών ...................................................................... 53 Συνδυάζοντας δεδομένα ενός μήνα από δύο σταθμούς ............................................................... 55 WEB SERVER ................................................................................................................................ 57 Python powered Web server with Flask ....................................................................................... 57 Σερβίροντας δύο σελίδες ............................................................................................................. 58 Σερβίροντας html templates ......................................................................................................... 60 Χρησιμοποιώντας CSS ................................................................................................................ 61
1
Δυναμικό περιεχόμενο ................................................................................................................. 63 Τοπική σύνδεση στον web server ................................................................................................ 63 ΠΡΟΣΒΑΣΗ ΟΙΚΙΑΚΟΥ SERVER ΑΠΟ ΤΟ Internet ...................................................................... 64 Ngrok tunneling ........................................................................................................................... 64 ΑΝΑΨΤΕ ΕΝΑ LED ΑΠΟ ΤΟ INTERNET ΜΕ ΧΡΗΣΗ SIGNAL ..................................................... 65 ΑΝΑΨΤΕ ΔΥΟ LED ΑΠΟ ΤΟ INTERNET ΜΕ ΧΡΗΣΗ Rpi ............................................................. 71 ΑΙΣΘΗΤΗΡΕΣ ................................................................................................................................. 75 Temperature Log ......................................................................................................................... 75 Εισαγωγή στο Sense Hat............................................................................................................. 78 Αισθητήρας θερμοκρασίας DHT-22 ............................................................................................. 80 ΔΙΚΤΥΩΝΟΝΤΑΣ ΤΑ RaspberryPi ............................................................................................... 85 Απόδοση στατικής ip στο RaspberryPi......................................................................................... 85 Ανταλλάσσοντας μηνύματα μέσω Ethernet .................................................................................. 86 Σύνδεση RaspberryPi με Windows PC/LAPTOP.......................................................................... 87 Διαμοιρασμός αρχείων μεταξύ laptop-RaspberryPi ...................................................................... 89 ΠΗΓΕΣ ............................................................................................................................................ 92
2
ΠΡΟΛΟΓΟΣ Το παρόν εγχειρίδιο γράφτηκε για τις ανάγκες του εργαστηρίου αυτοματισμού της Ελληνογαλλικής σχολής Πειραιά «Ο Άγιος Παύλος». Μπορεί όμως να φανεί χρήσιμο και σε όποιον θέλει να ασχοληθεί με το RaspberryPi και τις τεχνολογίες IoT. Επιλέξαμε το RaspberryPi λόγω της χαμηλής τιμής του, των τεχνικών χαρακτηριστικών του που τον καθιστούν τον μικρότερο υπολογιστή, της ευελιξίας του καθώς μπορεί να λειτουργήσει με πολλά λειτουργικά συστήματα και να διασυνδεθεί με πλήθος συσκευών, του γεγονότος ότι αποτελεί πλατφόρμα ανοικτού λογισμικού και της μεγάλης κοινότητας χρηστών που διαθέτει. Το υλικό του εγχειριδίου (projects, κώδικας) αντλήθηκαν από διάφορες πηγές στο διαδίκτυο, οι οποίες αναφέρονται στο τελευταίο τμήμα του εγχειριδίου. Χρησιμοποιήθηκαν είτε αυτούσιες είτε τροποποιημένες. Ορισμένοι από τους κώδικες γράφτηκαν εξ’ αρχής για τις ανάγκες του εργαστηρίου. Αποτελούν μια καλή εισαγωγή για αρχάριους χρήστες, που θέλουν να ξεκινήσουν την ενασχόλησή τους με τον προγραμματισμό σε Python και τις τεχνολογίες IoT. Παρ’ όλο που στο RaspberryPi μπορούν να τρέξουν projects που έχουν δημιουργηθεί και με άλλες γλώσσες προγραμματισμού όπως javascript, node.js, java, Mathematica κλπ επιλέχθηκε η Python, καθώς είναι η γλώσσα που αυτή την στιγμή προτιμούν τα ακαδημαϊκά ιδρύματα σε όλον τον κόσμο. Η απλότητα του συντακτικού της, και οι δομές δεδομένων της την καθιστούν ιδανική για αρχάριους χρήστες καθώς και για μαθηματικούς υπολογισμούς και γραφικές παραστάσεις. Διακρίνεται λόγω του ότι έχει πολλές βιβλιοθήκες που διευκολύνουν ιδιαίτερα, αρκετές συνηθισμένες εργασίες καθώς και για την ταχύτητα εκμάθησης της. Ως λειτουργικό επιλέξαμε το Raspbian καθώς αυτό προτείνει και το Raspberry Pi Foundation αλλά κυρίως επειδή είναι λογισμικό ανοιχτού κώδικα που βασίζεται στο Linux. Το τελευταίο είναι το πιο διαδεδομένο λειτουργικό των servers του διαδικτύου. Μετά από αυτήν την πρώτη εισαγωγή, θα ήταν χρήσιμο να εξερευνηθούν και οι υπόλοιπες δυνατότητες που δίνει το RaspberryPi με την χρήση windows 10 IOT, java, Node.js, Mathematica κλπ Οι κώδικες του βιβλίου είναι διαθέσιμοι στην παρακάτω διεύθυνση: https://github.com/propagatorgr/IOT_LAB Θα ανοίξει η κεντρική σελίδα του εργαστηρίου. Πάνω δεξιά κάνετε κλικ στο κουμπί: Fork και μετά στο Clone or Download επιλέξτε: Download ZIP.
3
Μόλις ολοκληρωθεί η λήψη της συμπιεσμένης έκδοσης, ακολουθήστε τις οδηγίες για την αποσυμπίεση αρχείων της σελίδας 18. Δείξτε κατανόηση για την χρησιμοποιούμενη «αργκώ» των υπολογιστών που χρησιμοποιεί εκφράσεις όπως: ζιπαρισμένα αρχεία, σερβίρετε τις σελίδες, κάντε download κλπ αλλά αυτή είναι η γλώσσα που χρησιμοποιείται καθημερινά από ερασιτέχνες και επαγγελματίες της πληροφορικής. Ελπίζω το εργαστήριο αυτό να κινητοποιήσει τους μαθητές, αλλά και όσους διαβάσουν το παρόν εγχειρίδιο, ώστε να κατανοήσουν ότι η τεχνολογία, όπως και όλα τα ανθρώπινα δημιουργήματα, «κουβαλάνε» μέρος από τη ψυχή του δημιουργού τους. Δ. Μπράιλας
4
ΤΙ ΕΙΝΑΙ ΤΟ RASPBERRYPI
ΕΡΓΑΣΤΗΡΙΟ ΑΥΤΟΜΑΤΙΣΜΟΥ INTERNET OF THINGS (I.O.T) RaspberryPi To 2006, στο πανεπιστήμιο του Cambridge, μια ομάδα εργαζομένων στο τμήμα Computer Laboratory ανησυχούσε για το μειωμένο ενδιαφέρον των φοιτητών στην πληροφορική, καθώς και τις περιορισμένες γνώσεις τους. Η ομάδα αυτή, που περιλάμβανε μεταξύ άλλων τους Eben Upton, Rob Mullins, Jack Lang, και Alan Mycroft, σκέφτηκε πως η λύση θα ήταν ένας εξαιρετικά μικρός και προσιτός υπολογιστής. Με ένα τέτοιο οικονομικό σύστημα, θα ήταν δυνατόν να διδάσκεται πρακτικά η πληροφορική στα σχολεία, και να έχει μεγαλύτερο ενδιαφέρον για τους μαθητές. Ενώ η ομάδα σχεδίασε αρκετά αρχικά πρωτότυπα του Raspberry Pi, πρέπει να αναλογιστούμε πως το 2006 υπήρχαν σημαντικοί περιορισμοί, λόγω του υψηλού κόστους και χαμηλής ισχύος των επεξεργαστών για mobile συσκευές. Σταδιακά, όμως, με την κυκλοφορία του πρώτου iPhone το 2007 και την μετέπειτα επέλαση των smartphones, το κόστος της τεχνολογίας άρχισε να μειώνεται αρκετά για να γίνει βιώσιμη η υλοποίηση του Raspberry Pi.
5
Το 2008, με τη συνεργασία των Pete Lomas και David Braben δημιουργήθηκε το φιλανθρωπικό ίδρυμα Raspberry Pi Foundation. Τρία χρόνια αργότερα κυκλοφόρησε το πρώτο Raspberry Pi, με τα Model A, Model A+ και Model Β. Τα μοντέλα αυτά διέθεταν επεξεργαστή ΑRMv6k στα 700 MHz, 256MB RAM, κάρτα γραφικών Broadcom VideoCore IV, και κατανάλωση από 1 έως 3.5 watt, ενώ η αποθήκευση των δεδομένων γινόταν σε κάρτες SD, SDHC και MicroSD. Μόνο τo Raspberry Pi Model B, μέσα σε δύο χρόνια από όταν βγήκε στη μαζική παραγωγή, πούλησε πάνω από δύο εκατομμύρια κομμάτια. Στη συνέχεια κυκλοφόρησαν οι εκδόσεις Model B rev 2 και Model B+ με 512MB RAM. Τον Οκτώβριο του 2014, οι συνολικές πωλήσεις προσέγγιζαν τα 4 εκατομμύρια. Tο Φεβρουάριο του 2015 κυκλοφόρησε το Raspberry Pi Generation 2 Model B, ανέβασε τη RAM στο 1GB και εξαπλασίασε την ταχύτητα του επεξεργαστή, με τον τετραπύρηνο Cortex-A7 (ARMv7), ενώ έχει διπύρηνη κάρτα γραφικών Broadcom VideoCoreIV. Το Νοέμβριο του 2015 κυκλοφόρησε το Raspberry Pi Zero, μία έκδοση με το μισό μέγεθος από το Raspberry Pi, 512MB RAM, και επεξεργαστή ARM1176JZF-S στα 1000MHz. Το Raspberry Pi Generation 3 Model B κυκλοφόρησε το Φεβρουάριο του 2016. Έρχεται εξοπλισμένο με ακόμα ταχύτερο επεξεργαστή ARM Cortex-A53 στα 1200MHz, 1GB RAM και κάρτα γραφικών Broadcom VideoCore IV χρονισμένη στα 250MHz, συχνότητα υψηλότερη από κάθε προηγούμενη γενιά.
6
Τι μπορούμε να κάνουμε με το RaspberryPi Ενώ είναι εντυπωσιακό πώς αυτή η υπολογιστική ισχύς συγκεντρώνεται σε τόσο λίγο χώρο και με τόσο χαμηλό κόστος - σημαντικά χαμηλότερο από ενός smartphone - το ερώτημα είναι το τι μπορούμε να κάνουμε με το Raspberry Pi. Όπως αποδεικνύεται, με μεράκι και φαντασία οι εφαρμογές του Raspberry Pi είναι πρακτικά απεριόριστες. Κατ' αρχάς, συνδέοντάς το σε μια οθόνη και προσθέτοντας πληκτρολόγιο και ποντίκι, έχουμε έναν πλήρη υπολογιστή, ο οποίος υποστηρίζει συγκεκριμένες διανομές Linux, αλλά και άλλα λειτουργικά συστήματα. Αυτή τη στιγμή, τα λειτουργικά που υποστηρίζονται απ’ την τελευταία έκδοση του Raspberry Pi είναι τα εξής:
Raspbian
OpenELEC
OSMC
Ubuntu Mate
Snappy Ubuntu Core
Windows 10 IoT
PiNet
RISC OS
Weather Station
Μία από τις πιο πρακτικές εφαρμογές του Raspberry Pi είναι ως ένα Media Center PC για να παίζουμε ταινίες στην τηλεόρασή μας, χάρη στο OSMC που είναι βασισμένο στο Kodi (πρώην XBMC). Αν είμαστε λάτρεις του Minecraft, μπορούμε να χρησιμοποιήσουμε το Raspberry Pi αποκλειστικά για αυτό, με την ειδική έκδοση Minecraft Pi edition. Όσοι ενδιαφερόμαστε για το retro gaming, μπορούμε να φορτώσουμε emulators και να έχουμε ένα μηχάνημα με αμέτρητα παιχνίδια του NES, SNES, Megadrive, ή ακόμα και Arcade... Μπορούμε επίσης, συνδέοντάς το με εξωτερικό δίσκο, να στήσουμε ένα προσωπικό Cloud service, ώστε να μπορούμε να έχουμε πρόσβαση στα αρχεία μας μέσω Internet από οπουδήποτε στον κόσμο, και να μην χρειαζόμαστε υπηρεσίες όπως το Dropbox ή το Google Drive. Είναι επίσης απόλυτα εφικτό να στήσουμε έναν οικιακό Web Server, για να μπορέσουμε να ανεβάσουμε ιστοσελίδες μέσα από το δικό μας Hosting - πιο πολύ σαν πείραμα, βέβαια, όχι για ένα κανονικό site.
7
Τα παραπάνω μπορεί να τα κάνει ο καθένας μας με ένα Raspberry Pi. Με τα κατάλληλα πρόσθετα εξαρτήματα, όμως, το Raspberry Pi μπορεί να είναι η βάση για μια μικρογραφία καμπίνας ηλεκτρονικών παιχνιδιών... για μια κανονική καμπίνα, ενσωματωμένη σε τραπέζι... ...να χρησιμοποιηθεί σαν ο "εγκέφαλος" σε συστήματα οικιακού αυτοματισμού, και μάλιστα με φωνητικές εντολές μέσω ενός κινητού... ...σαν χρονόμετρο για φωτογραφίες time-lapse... ...μέχρι και για τη δημιουργία ρομπότ ή ενός μετεωρολογικού σταθμού.
Το κυριότερο όμως είναι πως μπορεί να αποτελέσει το κίνητρο για την εκμάθηση της πληροφορικής με διασκεδαστικό τρόπο, δείχνοντάς μας και τον τρόπο με τον οποίο λειτουργούν ή θα λειτουργούν τα πράγματα στο άμεσο μέλλον.
8
Ξεκινώντας με το RaspberryPi Για να μπορέσετε να χρησιμοποιήσετε το RaspberryPi θα πρέπει να έχετε μια mini sd card class 10. Καλό θα είναι να έχει χωρητικότητα μεγαλύτερη των 8 Gb. Οι κάρτες αυτές πωλούνται είτε «άδειες» είτε με προεγκατεστημένο το NOOBS. (New Out Of the Box Software).Αυτό είναι το βοηθητικό λογισμικό που θα μας βοηθήσει να εγκαταστήσουμε το λειτουργικό σύστημα του RasspberryPi, το Raspbian. Ας υποθέσουμε ότι έχουμε μια άδεια κάρτα sd. Θα χρειαστείτε ένα laptop με sd adapter. Εισάγετε την κάρτα στον sd adapter έτοιμη για εγγραφή. ( Το κουμπάκι που υπάρχει στ’ αριστερά του adapter να είναι πάνω.)
Ανοίξτε τον browser. Μεταβείτε στην διεύθυνση: www.raspberrypi.org
Κάντε κλικ στο Downloads (το κόκκινο κουτάκι στο πάνω μέρος της σελίδας).
9
.Μετά κάντε κλικ στο αριστερό εικονίδιο που λέει NOOBS:
Κατεβάστε το .Zip αρχείο στην sd card κάνοντας κλικ στο αντίστοιχο εικονίδιο, όπως φαίνεται παρακάτω:
Πηγαίνετε μέσα από τον File Explorer στην sd card και κάνοντας δεξί κλικ στο ζιπαρισμένο αρχείο που μόλις κατεβάσατε, επιλέξτε την επιλογή: Αποσυμπίεση εδώ.
10
Μόλις τα αρχεία αποσυμπιεστούν βγάλτε την sd card από το laptop και βάλτε τη στο Raspberry. Συνδέστε το Raspberry με την οθόνη μέσω του HDMI καλωδίου, συνδέστε και ένα Ethernet καλώδιο στο modem για σύνδεση στο ιντερνετ και κατόπιν συνδέστε με την τροφοδοσία ρεύματος. Θα δείτε μετά από λίγο την παρακάτω οθόνη:
Επιλέξτε την επιλογή Raspbian και περιμένετε να εγκατασταθεί το λειτουργικό. Όπου ζητηθεί συμπληρώστε τα εξής:
Τα παραπάνω στοιχεία τα πληκτρολογούμε την πρώτη φορά και κατόπιν για λόγους ασφαλείας θα τα αλλάξουμε. Είστε πλέον έτοιμοι να χρησιμοποιήσετε το νέο σας RaspberryPi. Η εικόνα που θα δείτε στην οθόνη θα είναι το γραφικό περιβάλλον εργασίας (GUI) του Raspbian. To Raspbian όπως είπαμε είναι μια παραλλαγή του Debian, το οποίο αποτελεί μια διανομή του Linux. Το Linux είναι το δημοφιλέστερο λειτουργικό των υπολογιστών του internet. Είναι λογισμικό ανοικτού κώδικα. Δεν ανήκει δηλαδή σε κάποια συγκεκριμένη εταιρεία, όπως τα Windows της Microsoft, αλλά συντηρείται και αναπτύσσεται από έναν οργανισμό προγραμματιστών απ’ όλον τον κόσμο, το Linux Foundation. Παρομοίως, το Raspbian αναπτύχθηκε και συντηρείται από μια ομάδα προγραμματιστών που αγαπούν το RaspberryPi και το ανέπτυξαν για χρήση σ’ αυτό. Μέχρι τον Ιούνιο του 2017 η πιο σύγχρονη έκδοση του Raspbian ήταν η Raspbian Release 8. Η εικόνα που θα δείτε για πρώτη φορά στην οθόνη σας είναι η παρακάτω:
11
Στο πάνω μέρος της οθόνης διακρίνουμε την γραμμή εργασιών. Η επιλογή Menu περιλαμβάνει ένα πλήθος επιλογών. Θα τις εξετάσουμε αναλυτικά αργότερα. Η δεύτερη επιλογή είναι ο browser με την βοήθεια του οποίου πλοηγούμαστε στο διαδίκτυο. Στην Release 8 ονομάζεται Chromium. Στις παλαιότερες εκδόσεις ονομαζόταν Epiphany. Η τρίτη επιλογή είναι ο File Explorer του Raspbian, με τη βοήθεια του οποίου βλέπουμε τα αρχεία που έχει η sd card. Η τέταρτη επιλογή ( η μαύρη οθονίτσα) λέγεται Terminal και ανοίγει το CLI (Command Line Interface) – την Γραμμή εντολών του Raspbian. Οι δύο τελευταίες επιλογές μας οδηγούν σε μαθηματικές εφαρμογές, με τις οποίες θα ασχοληθούμε πολύ αργότερα.
Αλλάξτε Password Το επόμενο πράγμα που πρέπει να κάνουμε είναι να αλλάξουμε το password του RaspberryPi. Από Menu -> Preferences ή Προτιμήσεις -> RaspberryPi Configuration θα βρεθείτε στην παρακάτω οθόνη:
12
Κάντε τις ρυθμίσεις που βλέπετε στην εικόνα. Boot : To Desktop σημαίνει να ανοίγει πάντα στο γραφικό περιβάλλον. Hostname: raspberrypi. Είναι το όνομα που θέλουμε να δώσουμε στο raspberrypi μας. Μπορείτε να το αλλάξετε σε ο,τι θέλετε με λατινικούς, φυσικά, χαρακτήρες. Το username να είναι pi και για να αλλάξουμε password επιλέξτε την επιλογή: Change Password. Θα δείτε την παρακάτω οθόνη:
Συμπληρώστε τα αντίστοιχα πεδία με λατινικούς πάντα χαρακτήρες και πατήστε Οκ.
13
Έχετε αλλάξει το password. Σημειώστε το κάπου για να μην το ξεχάσετε.
Κλείστε το Raspberry Για να κλείσουμε σωστά το Raspberry επιλέγουμε: Menu -> Shutdown και θα βρεθούμε στην παρακάτω οθόνη:
Η πρώτη επιλογή κλείνει το Raspberry. Η δεύτερη επιλογή το επανεκκινεί. Η Τρίτη επιλογή αποσυνδέει τον συγκεκριμένο χρήστη. Όταν επιλέξετε Shutdown θα σας ζητήσει το password και αφού το δώσετε θα κλείσει. Περιμένετε να πάψει να αναβοσβήνει η πράσινη λυχνία στην πλακέτα του Raspberry και αποσυνδέστε το τροφοδοτικό.
Ασύρματη σύνδεση στο Internet Αφού ξεκινήσετε ξανά το RaspberryPi, χωρίς Ethernet καλώδιο στο Router και εφ’ όσον έχετε στον χώρο σας, ασύρματο Modem/Router ενεργοποιημένο, θα δείτε στην γραμμή εργασιών το εικονίδιο της ασύρματης σύνδεσης. Το RaspberryPi3 έχει ενσωματωμένο Wi-Fi και θα αναγνωρίσει αυτόματα το Router σας. Το RaspberryPi2 για να συνδεθεί με το ασύρματο Router θα πρέπει να του έχετε προσθέσει προηγουμένως ένα Wi-Fi USB Dongle, όπως βλέπετε στην παρακάτω εικόνα:
14
Κάντε κλικ στο εικονίδιο της ασύρματης σύνδεσης στην γραμμή εργασιών:
Τον κωδικό του ασύρματου δικτύου σας θα τον βρείτε στην πίσω πλευρά του ασύρματου Modem/Router σας με την ένδειξη: WPA2-PSK. Πληκτρολογήστε τον στο πεδίο που βλέπετε στην εικόνα και πατήστε ΟΚ. Είστε έτοιμοι να περιηγηθείτε στο διαδίκτυο, ανοίγοντας τον browser.
15
ΓΡΑΜΜΗ ΕΝΤΟΛΩΝ Γιατί υπάρχει η γραμμή εντολών Σήμερα είμαστε συνηθισμένοι να δουλεύουμε σε γραφικό περιβάλλον εργασίας όπως τα Windows. Για όσους δεν θυμούνται, το Λειτουργικό σύστημα είναι το λογισμικό του υπολογιστή που είναι υπεύθυνο για τη διαχείριση και τον συντονισμό των εργασιών, καθώς και την κατανομή των διαθέσιμων πόρων. Το λειτουργικό σύστημα παρέχει ένα θεμέλιο, ένα μεσολαβητικό επίπεδο λογικής διασύνδεσης μεταξύ λογισμικού και υλικού, διαμέσου του οποίου οι εφαρμογές αντιλαμβάνονται εμμέσως τον υπολογιστή. Με τη βοήθεια του γραφικού περιβάλλοντος (GUI), όλες οι εντολές που δίνουμε στον υπολογιστή προκειμένου να εκτελέσει κάποια εργασία, δίνονται μέσω του ποντικιού. Όταν όμως θέλουμε να εκτελέσουμε κάποιες επαναλαμβανόμενες εργασίες, είναι προτιμότερο να δίνουμε γραπτές εντολές στο λειτουργικό, μέσω της Γραμμής εντολών (CLI). Στο RaspberryPi είναι απαραίτητο να γνωρίζουμε μερικές βασικές εντολές της Γραμμής εντολών.
Πώς ανοίγουμε την Γραμμή εντολών Κάνουμε κλικ στο τέταρτο εικονίδιο της γραμμής εργασιών που απεικονίζει μια μαύρη οθόνη. Και ανοίγει το περιβάλλον της γραμμής εντολών, που λέγεται Terminal ή Shell. Αυτό, δεν είναι τίποτε άλλο από μια μαύρη οθόνη. Στην παρακάτω εικόνα βλέπουμε την αρχική οθόνη του Terminal.
16
Οι πρώτες εντολές του Raspbian Ας δούμε τώρα μερικές βασικές εντολές που πρέπει να γνωρίζουμε. Για να έχουμε πάντα το λειτουργικό μας ενημερωμένο και τις διάφορες εφαρμογές να «τρέχουν» σωστά θα πρέπει, σε τακτά χρονικά διαστήματα, (συνήθως κάθε εβδομάδα) να «τρέχουμε» τις παρακάτω δύο εντολές, με τη σειρά που δίνονται: 1) sudo apt-get update 2) sudo apt-get upgrade Η γραμμή εντολών είναι case sensitive. Αυτό σημαίνει πως υπάρχει διαφορά ανάμεσα σε πεζά και κεφαλαία. Άλλο είναι το sudo και άλλο to Sudo. Το πρώτο είναι σωστό. Το δεύτερο λάθος. Προσοχή λοιπόν, να πληκτρολογείτε τις εντολές ακριβώς όπως αναγράφονται. To Raspbian αποτελείται από διάφορα πακέτα (Packages). Για τα πακέτα που έχουμε εγκαταστήσει στον υπολογιστή μας, το Raspbian κρατά μια λίστα. Η λίστα αυτή βρίσκεται στη διαδρομή: /etc/apt/sources.list Για κάποια από αυτά τα πακέτα μπορεί να βγει μια νέα έκδοση. Η πρώτη εντολή, ανανεώνει την λίστα των διαθέσιμων, από το λειτουργικό, πακέτων, που διατίθενται με νέα έκδοση. Η δεύτερη, κατεβάζει αυτές τις νέες διαθέσιμες εκδόσεις των πακέτων στο raspberry μας. Μια άλλη εντολή που θα πρέπει να «τρέχουμε», είναι η: sudo apt-get dist-upgrade Αυτή κατεβάζει και όλα τα συνοδευτικά απαιτούμενα, που χρειάζεται μια νέα έκδοση πακέτου. Μπορούμε να τρέξουμε και δύο εντολές απ’ ευθείας με τη χρήση του: &&. Δηλ.: sudo apt-get update && sudo apt-get dist-upgrade Για να εγκαταστήσεις νέα πακέτα πληκτρολογείς: sudo apt-get install και το όνομα του πακέτου. Π.χ. sudo apt-get install scratch2 Η τελευταία εντολή εγκαθιστά το πακέτο της γραφικής γλώσσας προγραμματισμού Scratch. Για να απεγκαταστήσεις ένα πακέτο πληκτρολογείς: sudo apt-get remove scratch2 Η παραπάνω εντολή απεγκαθιστά την scratch που εγκαταστήσαμε προηγουμένως. Στη θέση της λέξης scratch θα γράφετε το όνομα του πακέτου που θέλετε να εγκαταστήσετε ή να απεγκαταστήσετε. Η εντολή: sudo apt-get purge και το όνομα του πακέτου
17
απεγκαθιστά μαζί με το πακέτο και όλα τα αρχεία ρυθμίσεων του πακέτου.
Για να κατεβάσεις ένα συγκεκριμένο αρχείο από μια διεύθυνση στο διαδίκτυο, πληκτρολογείς: wget https://www.raspberrypi.org/documentation/linux/usage/commands.md Η παραπάνω εντολή κατεβάζει το αρχείο commands.md από την επίσημη σελίδα του raspberrypi στο διαδίκτυο. Αν θέλουμε να ξεζιπάρουμε ένα συμπιεσμένο αρχείο πληκτρολογούμε: tar -xvzf *filename.tar.gz* Στη θέση του *filename.tar.gz* πληκτρολογούμε το όνομα του αρχείου που θέλουμε να αποσυμπιέσουμε. Ας υποθέσουμε πως στη διαδρομή: /usr/local/something έχετε τον φάκελο something. Για να τον συμπιέσετε και στο συμπιεσμένο αρχείο που θα δημιουργηθεί να δώσετε το όνομα: archive.tar.gz, θα πληκτρολογήσετε: tar -czvf archive.tar.gz /usr/local/something Με αυτόν τον τρόπο συμπιέζονται και όλοι οι υπο-φάκελοι που τυχόν βρίσκονται μέσα στον φάκελο something. Για να δεις τον διαθέσιμο αποθηκευτικό χώρο στην sd card πληκτρολογείς: df –h Για να καθαρίσεις αχρείαστα αρχεία και να δημιουργήσεις χώρο, πληκτρολογείς: sudo apt-get clean Επίσης χώρο δημιουργείς και όταν καθαρίζεις αχρείαστα πλέον πακέτα με την εντολή: sudo apt-get autoremove την οποία καλό θα είναι να την «τρέχετε» σε τακτά χρονικά διαστήματα. Για να δεις την τρέχουσα έκδοση του Raspbian που χρησιμοποιείς, πληκτρολογείς: lsb_release –r Φυσικά η λίστα των εντολών του Raspbian είναι πάρα πολύ μεγάλη και δεν θα είχε νόημα να συνεχίσουμε την παράθεση των εντολών. Ανάλογα με τις ανάγκες μας θα χρησιμοποιούμε κατά περίπτωση τις εντολές που μας χρειάζονται. Στη διεύθυνση: http://linuxcommand.org/index.php μπορείτε να βρείτε περισσότερες εντολές για το Linux.
18
Διαχείριση αρχείων στο Raspbian Στο Raspbian τα αρχεία είναι ιεραρχικά δομημένα σε φακέλους (directories) ή καταλόγους. Ο βασικός κατάλογος είναι ο home που συμβολίζεται με το ~. Κάτω απ’ αυτόν αναπτύσσονται όλοι οι άλλοι κατάλογοι και υπο-κατάλογοι σε δενδρική δομή.
Πληκτρολογώντας την εντολή: tree /όνομα φακέλου, παίρνουμε την δενδρική δομή όλων των αρχείων και υπο-φακέλων που έχει ο ζητούμενος φάκελος. Στην διπλανή εικόνα ζητήσαμε την δομή του φακέλου boot. Αυτός περιέχει τον υπο-φάκελο grub και τον υποφάκελο lost+found και διάφορα αρχεία.
Πληκτρολογώντας tree –d και το όνομα του φακέλου, σας επιστρέφει μόνο τα ονόματα των υποφακέλων που περιέχει ο ζητούμενος φάκελος.
Ας δούμε κάποιες βασικές εντολές διαχείρισης αρχείων και φακέλων. Κάθε φορά που πληκτρολογείτε μια εντολή στη γραμμή εντολών, βρίσκεστε μέσα σε κάποιον φάκελο. Για να δείτε σε ποιόν φάκελο βρίσκεστε, πληκτρολογήστε: pwd
19
Με την εντολή: ls βλέπουμε τα περιεχόμενα του φακέλου στον οποίο βρισκόμαστε.
Όταν βρίσκομαι σε κάποιον φάκελο και θέλω να δω τα περιεχόμενα ενός άλλου φακέλου, αρκεί να πληκτρολογήσω την εντολή: ls /usr/something Η παραπάνω εντολή για παράδειγμα, θα μου δείξει τα περιεχόμενα του φακέλου something ο οποίος βρίσκεται μέσα στον φάκελο usr. Ο usr είναι υποφάκελος του home μέσα στον οποίο βρίσκονται όπως είπαμε όλοι οι άλλοι φάκελοι. Για να μετακινηθώ από ένα φάκελο σε έναν άλλο φάκελο χρησιμοποιώ την εντολή: cd Στην διπλανή εικόνα βλέπουμε τα εξής: Στην πρώτη γραμμή, το τμήμα με τα πράσινα γράμματα, μας πληροφορεί για το όνομα του χρήστη, το όνομα του υπολογιστή και τον φάκελο στον οποίο βρισκόμαστε. Δηλ. ο χρήστης me, στον υπολογιστή με όνομα linuxbox, βρίσκεται στον φάκελο me. Πληκτρολογώντας την εντολή cd /usr/bin ζητάμε να μεταφερθούμε στον φάκελο bin, ο οποίος βρίσκεται μέσα στον φάκελο usr. Στο πράσινο τμήμα της δεύτερης γραμμής βλέπουμε πως ο χρήστης me που δουλεύει στον υπολογιστή linuxbox μεταφέρθηκε στον φάκελο bin. Πληκτρολογώντας pwd το επιβεβαιώνουμε. Κατόπιν πληκτρολογώντας ls παίρνουμε μια λίστα με τα περιεχόμενα του φακέλου bin. Όταν θέλουμε να δημιουργήσουμε ένα νέο φάκελο μέσα στον φάκελο στον οποίο βρισκόμαστε πληκτρολογούμε: mkdir newdirectory Η παραπάνω εντολή θα δημιουργήσει τον φάκελο με όνομα newdirectory μέσα στον φάκελο στον οποίο δουλεύαμε. Η εντολή: mkdir /usr/bin/examples/myexamples θα δημιουργήσει το φάκελο myexamples μέσα στον φάκελο examples. /usr/bin/examples/ : Είναι η διαδρομή (path) που πρέπει να ακολουθήσουμε προκειμένου να δημιουργήσουμε τον φάκελο myexamples στη συγκεκριμένη θέση.
20
Για να καθορίσουμε την διαδρομή προς ένα αρχείο ή φάκελο μπορούμε να το κάνουμε με δύο τρόπους: ~/usr/bin/examples/myexamples : Απόλυτη διαδρομή. Γράφουμε όλους τους φακέλους κάτω από τον κατάλογο home ο οποίος δηλώνεται με το ~ ./usr/bin/examples/myexamples : Σχετική διαδρομή. Η τελεία στην αρχή δηλώνει τον φάκελο στον οποίο βρισκόμαστε. (τρέχων φάκελος). Όλα θα δημιουργηθούν κάτω από το φάκελο στον οποίο βρισκόμαστε. Οι δύο τελείες .. σημαίνουν τον γονικό φάκελο του τρέχοντος φακέλου. Η εντολή mv αν χρησιμοποιηθεί όπως φαίνεται στην διπλανή εικόνα, μετονομάζει το αρχείο filename1 σε filename2. Αν το αρχείο filename2 υπάρχει ήδη, τότε μετακινεί τα περιεχόμενα του filename1 στο filename2. Η διπλανή εντολή μετακινεί τα αρχεία με τις ονομασίες: file1, file2 και file3 στο φάκελο dir1. Αν ο φάκελος dir1 δεν υπάρχει, η εντολή θα δώσει μήνυμα λάθους και δεν θα εκτελεστεί.
Η εντολή της διπλανής εικόνας θα μετακινήσει το φάκελο dir1 μέσα στο φάκελο dir2. Αν όμως ο dir2 δεν υπάρχει, τότε θα μετονομάσει το φάκελο από dir1 σε dir2.
Για τη διαγραφή αρχείων ή φακέλων χρησιμοποιούμε την εντολή rm. Η πρώτη εντολή θα διαγράψει τα αρχεία file1 και file2. Η δεύτερη εντολή θα διαγράψει τα αρχεία αφού ζητήσει επιβεβαίωση πρώτα. Η τρίτη εντολή θα διαγράψει τους φακέλους file1 και file2 με όλα τα περιεχόμενά τους. Χρειάζεται πολύ μεγάλη προσοχή στην χρήση αυτής της εντολής διότι αν διαγραφεί ένα αρχείο ή φάκελος με αυτήν, δεν μπορεί να επανακτηθεί.
21
Τελευταία ας δούμε την εντολή cp. Στην πρώτη γραμμή της διπλανής εικόνας γίνεται αντιγραφή των περιεχομένων του file1 στο file2. Τα περιεχόμενα του file2 θα διαγραφούν. Αν το file2 δεν υπάρχει τότε θα δημιουργηθεί και θα περιέχει ο,τι και το file1. Στη δεύτερη γραμμή θα εκτελέσει τα ίδια αφού πρώτα ζητήσει επιβεβαίωση. Η τρίτη εντολή θα αντιγράψει το αρχείο file1 μέσα στο φάκελο dir1. Η τέταρτη εντολή αντιγράφει τα περιεχόμενα του φακέλου dir1 στο φάκελο dir2, τον οποίο και δημιουργεί, αν δεν υπάρχει. Αν ο dir2 υπάρχει ήδη, τότε αντιγράφει μέσα στο φάκελο dir2 το φάκελο dir1.
DEMO PROGRAMS Τώρα που μάθαμε κάποια πράγματα για την γραμμή εντολών, ας δούμε μερικά προγράμματα που συνοδεύουν το λειτουργικό Raspbian. Ανοίξτε το Terminal και πληκτρολογήστε την παρακάτω εντολή: cd /opt/vc/src/hello_pi Θυμηθείτε τι θα συμβεί. Θα μεταβείτε στον φάκελο: hello_pi Πώς θα διαπιστώσετε αν όντως αυτό συνέβη;
Ποια εντολή πρέπει να πληκτρολογήσετε για να δείτε τα περιεχόμενα του φακέλου αυτού; ________ Ο φάκελος hello_pi περιέχει κάποια προγράμματα-εφαρμογές προς επίδειξη. (demo programs). Κάθε ένα από αυτά βρίσκετε στον δικό του υποφάκελο, μέσα στον φάκελο hello_pi. Για να τα εκτελέσετε θα πρέπει πρώτα να εκτελέσετε το αρχείο rebuild.sh προκειμένου να μεταγλωττιστούν οι απαραίτητες βιβλιοθήκες. Για να γίνει αυτό πληκτρολογήστε: ./rebuild.sh Θα δείτε την οθόνη να εμφανίζει κάτι ακαταλαβίστικους χαρακτήρες και μετά από λίγο θα σταματήσει κάθε δραστηριότητα στην οθόνη. Είστε έτοιμοι να τρέξετε τα προγράμματα επίδειξης.
22
Μεταβείτε στο φάκελο hello_world. Δείτε τα περιεχόμενά του. Αρχεία με επέκταση .bin είναι εκτελέσιμα. Για να τα εκτελέσετε, θα πληκτρολογείτε ./ που δηλώνει τον τρέχοντα φάκελο στον οποίο βρίσκεστε και κατόπιν το όνομα του εκτελέσιμου αρχείου με την επέκτασή του. Δηλ.: ./hello_world.bin Κάποια προγράμματα σταματούν μόνα τους και κάποια άλλα παίζουν συνεχώς. Για να σταματήσετε τα τελευταία πληκτρολογήστε ctrl-c . Για να επιστρέψετε στον γονικό φάκελο πληκτρολογήστε: cd .. Μεταβείτε σε όλους τους φακέλους με τη σειρά και τρέξτε τα προγράμματα επίδειξης. Μεταβείτε στο φάκελο hello_video. Δείτε τα περιεχόμενά του. Ανάμεσα σε άλλα αρχεία θα δείτε το hello_video.bin και το test.h264. Το τελευταίο είναι ένα αρχείο βίντεο. Για να παίξει πληκτρολογήστε: ./hello_video.bin test.h264
Ο φάκελος hello_triangle2 περιέχει το αρχείο hello_triangle2.bin. Μόλις το τρέξετε με τον τρόπο που έχουμε πει θα δείτε στην οθόνη ένα fractal. Μετακινώντας το ποντίκι θα δείτε το fractal να αλλάζει μορφή. Ο φάκελος hello_teapot περιέχει το αρχείο hello_teapot.bin. Όταν το τρέξετε, μπορεί να εμφανιστεί ένα μήνυμα λάθους όπως το παρακάτω:
Το συγκεκριμένο αρχείο εκτελείται από την μονάδα επεξεργασίας γραφικών (G.P.U) του RaspberryPi. Το μήνυμα μας λέει ότι η τελευταία δεν έχει την απαραίτητη μνήμη για να «τρέξει» το αρχείο αυτό. Το RaspberryPi διαμοιράζει τη μνήμη (RAM) του, ανάμεσα στην κεντρική μονάδα επεξεργασίας (C.P.U) και την μονάδα επεξεργασίας γραφικών (G.P.U.). Από τις προ-ρυθμίσεις, στη G.P.U. έχουν παραχωρηθεί 64 MB μνήμης RAM. Για να τρέξει το hello_teapot.bin θα πρέπει να αλλάξουμε τις ρυθμίσεις και να διαθέσουμε στη G.P.U., 128 ΜΒ. Για να αλλάξουμε τις ρυθμίσεις μέσα από το Terminal πληκτρολογούμε: sudo raspi-config Στο παράθυρο που θα ανοίξει επιλέγουμε με τα βελάκια προς τα κάτω την επιλογή: Advanced Settings και πατάμε Enter. Κατόπιν επιλέγουμε την επιλογή: Memory split και πατάμε Enter. Αλλάζουμε το νούμερο σε 128.
23
Πατώντας το πλήκτρο TAB επιλέγουμε Finish.
Πατώντας το πλήκτρο TAB επιλέγουμε Reboot. Μόλις επανεκκινήσει το RaspberryPi μεταβαίνουμε ξανά στο φάκελο hello_teapot και ξανατρέχουμε το hello_teapot.bin. Ο φάκελος hello_audio περιέχει ένα αρχείο (hello_audio.bin) που μόλις το εκτελέσετε θα ακούσετε ένα ηχητικό σήμα. Για να το ακούσετε, θα πρέπει να έχετε συνδέσει στην υποδοχή ακουστικών του raspberryPi, ακουστικά. Αν όμως έχετε συνδεθεί σε οθόνη/τηλεόραση μέσω HDMI καλωδίου, μπορείτε να «στείλετε» τον ήχο στο ακουστικό της οθόνης/τηλεόρασης, πληκτρολογώντας: ./hello_audio.bin 1 Συνεχίστε την περιήγησή σας στα προγράμματα επίδειξης του RaspberryPi.
ΣΥΖΗΤΩΝΤΑΣ ΜΕ ΕΝΑ ROBOT Θα φτιάξουμε ένα robot με το οποίο θα μπορούμε να συζητάμε. Η γλώσσα προγραμματισμού που θα χρησιμοποιήσουμε είναι η python. Αυτή είναι ήδη εγκαταστημένη στο RaspberryPi.
Προετοιμασία Πριν ξεκινήσουμε θα χρειαστεί να εγκαταστήσουμε το espeak. Αυτό είναι ένα πρόγραμμα που μετατρέπει ένα γραπτό μήνυμα σε ηχητικό μήνυμα. Ανοίξτε το Terminal και πληκτρολογήστε: sudo apt-get install espeak Μόλις εγκατασταθεί κλείστε το Terminal και κάντε ShutDown. Αφού αποσυνδέσετε το RaspberryPi από την τροφοδοσία, συνδέστε ακουστικά στην κατάλληλη υποδοχή, συνδέστε το με το τροφοδοτικό και επανεκκινήστε. Ανοίξτε το Terminal και πληκτρολογήστε: amixer cset numid=3 1 Με αυτή την εντολή στέλνετε την έξοδο του ήχου στα ακουστικά και όχι στην HDMI θύρα. Κλείστε το Terminal.
24
Εκτέλεση To Thonny είναι το ολοκληρωμένο περιβάλλον ανάπτυξης (I.D.E.) για την γλώσσα προγραμματισμού Python. Εχει προεγκατεστημένη την έκδοση 3.6 της Python και αποτελεί ιδανικό περιβάλλον για αρχάριους χρήστες. Δημιουργήθηκε από το πανεπιστήμιο Tartu της Εσθονίας. Για να ανοίξετε το Thonny ανοίγετε το κεντρικό μενού πατώντας το εικονίδιο του βατόμουρου στο πάνω αριστερό μέρος της οθόνης και στην επιλογή: Προγραμματισμός θα επιλέξετε: Thonny. Θα δείτε την διπλανή εικόνα:
Στο πάνω μέρος είναι το παράθυρο στο οποίο πληκτρολογείτε το πρόγραμμά σας (editor) και στο κάτω μέρος είναι το παράθυρο στο οποίο βλέπετε το αποτέλεσμα. Είναι το Shell της γλώσσας. Εκεί μπορείτε να εισάγετε και δεδομένα που θα σας ζητά το πρόγραμμα. Μέσα στον editor πληκτρολογήστε: # My Python Program by ... import os, time #Εισαγωγή βιβλιοθηκών
def robot(text): #εδώ ορίζουμε τη συνάρτηση os.system("espeak ' " + text + " ' ")
robot("Hello") #εδώ καλούμε τη συνάρτηση Με το σύμβολο # δηλώνουμε τα σχόλια στο πρόγραμμά μας. Τα σχόλια δεν αποτελούν εκτελέσιμο κομμάτι της γλώσσας. Είναι απαραίτητα για να μας επεξηγούν το πρόγραμμα. Με την εντολή import εισάγουμε τις απαραίτητες βιβλιοθήκες του προγράμματος. Εδώ την os και την time. Με την δήλωση def δηλώνουμε μια συνάρτηση στο πρόγραμμα. Οι συναρτήσεις είναι κομμάτια κώδικα που επαναλαμβάνονται πολλές φορές κατά την διάρκεια εκτέλεσης του προγράμματος. Εδώ η συνάρτηση robot, όταν καλείται, κάνει το robot να μιλάει και κάθε φορά λέει το κείμενο που θα βάλουμε μέσα στην παρένθεση, ανάμεσα στα εισαγωγικά.
25
Από την επιλογή: File επιλέξτε: Save με το όνομα robot.py μέσα στο φάκελο robot και μετά Run για να εκτελέσετε το πρόγραμμα. Θα πρέπει να ακούσετε το robot να σας χαιρετά.
Συμπληρώστε το πρόγραμμα ως εξής: # My Python Program by ... import os, time #Εισαγωγή βιβλιοθηκών
def robot(text): #εδώ ορίζουμε τη συνάρτηση os.system("espeak ' " + text + " ' ")
robot("Hello") #εδώ καλούμε τη συνάρτηση time.sleep(1) #παύση 1 δευτερόλεπτο robot('What is your name?') name = input('What is your name: ') # Ζητά την ηλικία μας robot("Nice to meet you " + name) time.sleep(1)
Μόλις δημιουργήσατε το πρώτο σας Python πρόγραμμα. Συμπληρώστε το φτιάχνοντας μια συζήτηση με το robot. Αποθηκεύστε το τελικό πρόγραμμα στο φάκελο robot με την ονομασία: robot_finale.py Εκτός από το Thonny στο Raspbian είναι εγκαταστημένα και άλλα IDE για Python όπως το IDLE το οποίο μπορείτε επίσης να χρησιμοποιείτε.
26
PHYSICAL COMPUTING Ένα από τα σημαντικότερα χαρακτηριστικά του RaspberryPi είναι τα GPIO pins. Αυτά τα βλέπετε στην παρακάτω εικόνα:
Τα αρχικά προέρχονται από την έκφραση: General Purpose Input Outpout (Είσοδος –Έξοδος Γενικής χρήσης). Αποτελούν τον φυσικό ενδιάμεσο ανάμεσα στο RaspberryPi και τον εξωτερικό κόσμο. Φανταστείτε τα σαν διακόπτες τους οποίους μπορεί το RaspberryPi να ανοιγοκλείνει και με αυτόν τον τρόπο να ελέγχει ένα πλήθος συσκευών που μπορούν να συνδεθούν σε αυτούς τους διακόπτες: Led, κινητήρες, ωμικές αντιστάσεις, πυκνωτές, τρανζίστορ, κουμπιά, αισθητήρες θερμοκρασίας, πίεσης, φωτός, υπερύθρων κτλ. Την δυνατότητα να ελέγχουμε μέσω υπολογιστή διάφορα ηλεκτρονικά κυκλώματα την καλούμε physical computing. To RaspberryPi διαθέτει 40 pin. Τα ονόματά τους τα βλέπετε στην παραπάνω εικόνα. Όσοι διαθέτετε PiCobbler τα βλέπετε να αναγράφονται πάνω στο Cobbler. Στην παρακάτω εικόνα βλέπουμε το Cobbler πάνω στο breadboard.
27
Προσέξτε καθώς θα συνδέετε το Cobbler με τα pin του RaspberryPi. Τα pin 3.3V και 5V να είναι απέναντι από τις USB θύρες του RaspberryPi. Στην διπλανή εικόνα βλέπουμε το RaspberryPi συνδεδεμένο με το Cobbler μέσω της ταινίας. Το Cobbler πάνω στο BreadBoard,στο οποίο βρίσκονται συνδεδεμένα και άλλα ηλεκτρονικά στοιχεία. Παρόμοια κυκλώματα θα μάθουμε να φτιάχνουμε και μείς και να τα ελέγχουμε με το RaspberryPi. Πριν προχωρήσουμε όμως ας δούμε τι είναι και πώς χρησιμοποιούμε το BreadBoard.
28
BreadBoard Το breadboard είναι μια μονάδα για την κατασκευή προσωρινών κυκλώματα (πρωτοτύπων) και δεν απαιτούν απολύτως καμία συγκόλληση. (soldering). Πρωτo-τυποποίηση (prototyping) είναι η διαδικασία ελέγχου μιας ιδέας, με τη δημιουργία ενός προκαταρκτικού μοντέλου ενός κυκλώματος. Αυτή είναι μία από τις πιο κοινές χρήσεις για breadboards. Αν δεν είστε σίγουροι για το πώς ένα κύκλωμα θα αντιδράσει κάτω από ένα δεδομένο σύνολο παραμέτρων , είναι καλύτερο να δημιουργήσετε ένα πρωτότυπο και να το δοκιμάστε. Για τα αρχάριους με τα ηλεκτρονικά και τα κυκλώματα , τα breadboards είναι συχνά το καλύτερο μέρος για να ξεκινήσουν . Αυτή είναι η πραγματική ομορφιά των breadboards - μπορούν να στεγάσουν τόσο το απλούστερο κύκλωμα , όσο και πολύ πολύπλοκα κυκλώματα. Ο καλύτερος τρόπος να εξηγήσουμε πώς ένα breadboard λειτουργεί είναι να το αποσυναρμολογήσουμε για να δούμε πως είναι μέσα. Ξεκολλώντας το αυτοκόλλητο στο κάτω μέρος ενός mini breadboard μπορούμε να διακρίνουμε, όπως στην εικόνα, τις τερματικές μεταλλικές λωρίδες που υπάρχουν σε κάθε γραμμή.
Το πάνω μέρος των μεταλλικών λωρίδων έχει μικρά κλιπ που βρίσκονται ακριβώς κάτω από τις πλαστικές τρύπες. Αυτά τα κλιπ επιτρέπουν να συνδέσουμε ένα καλώδιο ή το ποδαράκι από ένα ηλεκτρονικό εξάρτημα στην αντίστοιχη τρύπα του breadboard. Αυτά τα κλιπ είναι που συγκρατούν το καλώδιο ή το εξάρτημα.
Όταν τοποθετηθεί ένα εξάρτημα σε μία τρύπα, τότε είναι ηλεκτρικά συνδεδεμένο με οτιδήποτε άλλο τοποθετηθεί στην ίδια λωρίδα. Αυτό οφείλεται στις μεταλλικές γραμμές που είναι αγώγιμες και επιτρέπουν στο ρεύμα να ρέει σε κάθε σημείο τους. Όπως μπορείτε να παρατηρήσετε σε κάθε μεταλλική λωρίδα υπάρχουν μόνο 5 κλιπς. Αυτό ισχύει σε κάθε breadboard. Αυτό σημαίνει ότι μπορείτε να συνδέσετε μέχρι 5 εξαρτήματα σε κάθε λωρίδα. Κάθε γραμμή όμως έχει 10 τρύπες, αλλά αυτές χωρίζονται από ένα αυλάκι στο μέσο του breadboard. Το αυλάκι αυτό χωρίζει και απομονώνει τις 2 λωρίδες της γραμμής. Το αυλάκι αυτό χρησιμεύει για να συνδέουμε ολοκληρωμένα κυκλώματα στο breadboard με κάθε ποδαράκι του ολοκληρωμένου να είναι σε ξεχωριστή λωρίδα με 5 τρύπες για συνδέσεις.
29
Οι τρύπες ανάμεσα στην κόκκινη και μπλε γραμμή θα παρατηρήσετε ότι αναγράφουν ένα + και ένα – στην αρχή κάθε γραμμής. Οι τρύπες αυτών των γραμμών συνδέονται οριζόντια. Χρησιμεύουν όπως θα δούμε για την γείωση των κυκλωμάτων.
Ανάψτε το Led Ας ανάψουμε τώρα ένα Led. Το βλέπουμε στην διπλανή εικόνα. Έχει ένα μικρό και ένα μεγάλο ποδαράκι. (ακροδέκτες). Το μεγάλο ποδαράκι αντιστοιχεί στον θετικό πόλο και το μικρό ποδαράκι στον αρνητικό πόλο. Το μικρό ποδαράκι θα συνδέεται πάντα με την γείωση. Το μεγάλο ποδαράκι θα συνδεθεί με έναν αντιστάτη. Ο αντιστάτης δεν έχει πόλους. Συνδέστε το Led με την αντίσταση όπως βλέπετε στη φωτογραφία.
Συνδέστε τον αρνητικό ακροδέκτη του Led με την γείωση (GND) στο Cobbler. Δείτε το κίτρινο καλώδιο στην παρακάτω φωτογραφία:
30
Τον άλλο ακροδέκτη της αντίστασης συνδέστε τον με τα 3,3V στο Cobbler. Τροφοδοτήστε το RaspberryPi με ρεύμα και θα δείτε το led να ανάβει.
Αποσυνδέστε το καλώδιο από τα 3,3V και το led θα σβήσει. Έχετε φτιάξει το πρώτο σας ηλεκτρικό κύκλωμα.
Προγραμματίστε το κύκλωμά σας Στη συνέχεια θα δούμε πώς μπορούμε να προγραμματίσουμε το κύκλωμά μας, ώστε το Led να ανάβει και να σβήνει με εντολές που του δίνουμε από το πληκτρολόγιο. Αποσυνδέστε το καλώδιο από τα 3,3 V και συνδέστε το στο pin 17 του Cobbler. Τώρα το Led δεν ανάβει. Ανοίξτε το Thonny και πληκτρολογήστε τα παρακάτω στο παράθυρο του editor : from gpiozero import LED # Εισάγει την βιβλιοθήκη ελέγχου των Led led = LED(17) # Δηλώνει ότι το Led είναι συνδεδεμένο στο pin 17 Αποθηκεύστε το αρχείο με την ονομασία: led17.py μέσα στο φάκελο: physical_computing Όταν το τρέξετε δεν θα παρατηρήσετε να γίνεται κάτι, διότι το μόνο που έχετε κάνει είναι να δηλώσετε σε ποιο pin είναι συνδεδεμένο το Led. Στο παράθυρο Shell του Thonny πληκτρολογήστε: led.on() και πατήστε Enter. Άναψε το Led; Πληκτρολογήστε led.off(). To Led έσβησε. Τώρα λοιπόν ελέγχετε το Led από το πληκτρολόγιο.
31
Φάρος Συμπληρώστε το πρόγραμμά σας όπως βλέπετε παρακάτω: from gpiozero import LED # Εισαγωγή βιβλιοθήκης ελέγχου Led from time import sleep # Εισαγωγή βιβλιοθήκης χρονοδιακόπτη
led = LED(17) # Δηλώνει το Led στο pin 17
while True: # Ξεκινά μια δομή επανάληψης που δεν τελειώνει ποτέ. led.on() # Άναψε sleep(1) # Αναμονή ενός δευτερολέπτου led.off() # Σβήσε sleep(1) # Αναμονή ενός δευτερολέπτου Αποθηκεύστε το πρόγραμμά σας με την ονομασία: Beacon.py στο φάκελο physical_computing. Εκτελώντας το θα δείτε το Led να αναβοσβήνει κάθε ένα δευτερόλεπτο. Για να σταματήσετε την εκτέλεση πληκτρολογήστε στο Shell : ctrl-c.
Προγραμματίστε ένα Button Αυτό είναι ένα Button. Στην πραγματικότητα είναι ένας διακόπτης που ανοιγοκλείνει πιέζοντάς τον. Συνδέστε τον στο BreadBoard. Τον ένα ακροδέκτη του συνδέστε το με την γείωση και το άλλο με το pin2.
Στον editor του Thonny ανοίξτε νέο αρχείο και πληκτρολογήστε τα παρακάτω:
32
from gpiozero import Button button = Button(2) button.wait_for_press() print('Button pressed!!!') Αποθηκεύστε το με την ονομασία: Button_pressed.py Μόλις το τρέξετε και πατήσετε το κουμπί, θα δείτε στην οθόνη το μήνυμα: «Button pressed!!!». Καταφέραμε λοιπόν να αλληλεπιδράσουμε με το button. Ανοίξτε ένα νέο αρχείο στο Thonny και πληκτρολογήστε τα παρακάτω: from gpiozero import LED, Button from time import sleep led = LED(17) button = Button(2) button.wait_for_press() led.on() sleep(3) led.off() Αποθηκεύστε το ως : gpio_control.py και τρέξτε το. Μόλις πατήσετε το κουμπί το Led θα ανάψει για 3 δευτερόλεπτα και θα σβήσει. Η διαδικασία δεν είναι επαναλαμβανόμενη, άρα αυτό θα γίνει μόνο μια φορά. Σε νέο αρχείο πληκτρολογήστε τα εξής: from gpiozero import LED, Button from time import sleep led = LED(17) button = Button(2) while True: button.wait_for_press() led.toggle()
33
Αποθηκεύστε το ως: Button_toggle.py και τρέξτε το. Τώρα κάθε φορά που θα πατάτε το Button, το Led θα αναβοσβήνει. Το πρόγραμμα τερματίζει με ctrl-c.
Σε νέο αρχείο του Thonny πληκτρολογήστε τα παρακάτω: from gpiozero import LED, Button from signal import pause led = LED(17) button = Button(2) button.when_pressed = led.on button.when_released = led.off pause() # Το πρόγραμμα παραμένει ενεργό. Αποθηκεύστε το ως : Button_released.py και τρέξτε το. Κάθε φορά που θα κρατάτε πατημένο το κουμπί, το Led θ’ ανάβει και όταν θα απελευθερώνεται το κουμπί το Led θα σβήνει. Το πρόγραμμα εκτελείται συνεχώς. Τερματίστε το με: ctrl-c.
Reaction Game Ας εφαρμόσουμε τα όσα μάθαμε δημιουργώντας ένα παιχνίδι αντανακλαστικών. Δύο παίκτες έχουν από ένα Button ο καθένας. Ένα led ανάβει σε τυχαία χρονικά διαστήματα. Ο παίκτης που θα έχει την πιο γρήγορη αντίδραση, θα πατήσει το Button του, θα σβήσει το led και θα κερδίσει τον πόντο. Ανοίγοντας το Thonny πληκτρολογούμε: from gpiozero import LED, Button from time import sleep from random import uniform from sys import exit left_name = input('left player name is ') #Εισάγετε από το πληκτρολόγιο το όνομα του ενός παίκτη. right_name = input('right player name is ') #Εισάγετε από το πληκτρολόγιο το όνομα του άλλου #παίκτη.
led = LED(4) #Δηλώνεται το Led στο pin 4 right_button = Button(15) #Δηλώνεται το ένα Button στο pin 15 left_button = Button(14) #Δηλώνεται το άλλο Button στο pin 14 led.on()
34
sleep(uniform(5, 10)) # Επιλέγεται ένας τυχαίος δεκαδικός ανάμεσα στο 5 και στο 10. Τόσα #δευτερόλεπτα θα είναι αναμμένο το led. led.off() #Σβήσε το led def pressed(button): # Ορίζεται η συνάρτηση που θα τυπώνει στην οθόνη το όνομα του παίκτη που πάτησε το Button και θα τερματίζει.
if button.pin.number == 14: #Αρχή δομής ελέγχου print(left_name + ' won the game') else: print(right_name + ' won the game') #Τέλος δομής ελέγχου. exit () # Τερμάτισε το πρόγραμμα. # Τέλος ορισμού συνάρτησης. right_button.when_pressed = pressed #Όταν πατηθεί το ένα Button καλείται η συνάρτηση. left_button.when_pressed = pressed
#Όταν πατηθεί το άλλο Button καλείται η συνάρτηση.
Βελτιώστε το πρόγραμμα κάνοντας τα εξής:
Ρωτήστε πόσους γύρους θέλετε να παίξετε. Μόλις ο παίκτης εισάγει τον αριθμό θα αρχίσει το παιχνίδι. Μόλις πατηθεί κάποιο Button, θα τυπωθεί το όνομα του παίκτη που το πάτησε καθώς και το score που θα έχει. Μόλις ολοκληρωθούν οι γύροι θα τυπώνεται το όνομα του νικητή με το σκορ του, το όνομα του ηττημένου με το σκόρ του και το παιχνίδι θα τελειώνει. Αν είναι ισοπαλία, θα αναγράφεται η ένδειξη ισοπαλία και το σκορ.
35
Ανιχνευτής κίνησης υπερύθρων – P.I.R. motion sensor Όλα τα αντικείμενα και οι οργανισμοί εκπέμπουν υπεριώδη ακτινοβολία σε θερμοκρασίες πάνω από το απόλυτο μηδέν. Ο ανιχνευτής κίνησης υπέρυθρων, μπορεί να ανιχνεύσει τις παραμικρές αλλαγές στην ποσότητα υπέρυθρης ακτινοβολίας που λαμβάνει. Όταν γίνει αυτό, ο ανιχνευτής εκπέμπει έναν ηλεκτρικό παλμό. Έτσι ο ανιχνευτής υπέρυθρων αποτελεί σημαντικό στοιχείο κυκλωμάτων συναγερμού. Ο ανιχνευτής στην κάτω πλευρά του έχει 3 pins. Στην παρακάτω φωτογραφία βλέπετε πως το αριστερό pin αντιστοιχεί στην γείωση, το δεύτερο αποτελεί την έξοδο και το τρίτο συνδέεται στην τάση των 5 V.
Για να τα συνδέσετε στο RaspberryPi θα πρέπει να χρησιμοποιήσετε τρία jumper wires female to male. Η συνδεσμολογία φαίνεται παρακάτω: Το μεσαίο pin που αποτελεί την έξοδο θα το συνδέσουμε στο GP4.
36
Ανοίγουμε το Thonny και πληκτρολογούμε: from gpiozero import MotionSensor # Εισάγουμε την βιβλιοθήκη ελέγχου του ανιχνευτή. pir = MotionSensor(4) # Δηλώνουμε την έξοδο στο GP4 while True: # Αρχή δομής επανάληψης pir.wait_for_motion() # Αναμονή κίνησης print("You moved")
# Τύπωσε το μήνυμα μόλις ανιχνευτεί κίνηση.
pir.wait_for_no_motion() # Τερματισμός αναμονής κίνησης # Τέλος δομής επανάληψης. Τρέξτε το πρόγραμμα, αφού το αποθηκεύσετε ως: pir.py. Όταν περάσετε το χέρι σας μπροστά από τον ανιχνευτή θα τυπωθεί το σχετικό μήνυμα στην οθόνη. Με αυτόν τον τρόπο μπορείτε να ενεργοποιήσετε οποιοδήποτε συμβάν. Συνδυάζοντας όσα μάθατε, τροποποιήστε κατάλληλα το παραπάνω πρόγραμμα, ώστε κάθε φορά που κάποιος περνά μπροστά από τον ανιχνευτή σας να ανάβει ένα προειδοποιητικό led.
GPIOZERO - ΕΝΤΟΛΕΣ
37
38
ΓΝΩΡΙΜΙΑ ΜΕ ΤΑ A.P.I. Σηματοδότης αστροναυτών στον Διεθνή Διαστημικό Σταθμό ( I.S.S.) Ο Διεθνής Διαστημικός Σταθμός (ΔΔΣ) ( International Space Station - ISS) είναι ένας ερευνητικός διαστημικός σταθμός σε τροχιά γύρω από τη Γη. Η συναρμολόγησή του ξεκίνησε τον Νοέμβριο του 1998 ενώ το πρώτο του πλήρωμα εγκαταστάθηκε τον Νοέμβριο του 2000. Ο ΔΔΣ κατοικείται συνεχώς από τότε που το πρώτο πλήρωμα μπήκε στον σταθμό στις 2 Νοεμβρίου 2000, παρέχοντας έτσι συνεχή ανθρώπινη παρουσία στο διάστημα. Θα δημιουργήσουμε μια εφαρμογή η οποία θα μας δείχνει τον αριθμό των αστροναυτών που βρίσκονται στον Σταθμό. Για να αναπτύξουμε αυτήν την εφαρμογή θα χρησιμοποιήσουμε ένα Web API. Τα αρχικά A.P.I. ( Application Programming Interface) ορίζουν την Διεπαφή Προγραμματισμού Εφαρμογών. H Διεπαφή Προγραμματισμού Εφαρμογών (API, από το Application Programming Interface), γνωστή και ως Διασύνδεση Προγραμματισμού Εφαρμογών (για συντομία διεπαφή ή διασύνδεση), είναι η διεπαφή των προγραμματιστικών διαδικασιών που παρέχει ένα λειτουργικό σύστημα, βιβλιοθήκη ή εφαρμογή προκειμένου να επιτρέπει να γίνονται προς αυτά αιτήσεις από άλλα προγράμματα ή/και ανταλλαγή δεδομένων. Στη συγκεκριμένη διεπαφή θα χρησιμοποιήσουμε το PEOPLE IN SPACE API που υποστηρίζεται από τον Nathan Bergey. Ανοίξτε τον φυλλομετρητή και μεταβείτε στην διεύθυνση: http://api.open-notify.org/astros.json Θα δείτε τα δεδομένα που παρέχει το API σε μια μορφή που ονομάζεται Json. Το JSON είναι ένα πρώτυπο ανταλλαγής δεδομένων μεταξύ διαφόρων γλωσσών προγραμματισμού και διαφορετικών εφαρμογών. Το συγκεκριμένο API παρέχει 3 είδη δεδομένων: message, number, people. Το people περιέχει: craft και name. Ας δούμε τώρα με ποιόν τρόπο θα ζητήσουμε τα δεδομένα αυτά. Στο Thonny πληκτρολογήστε: import requests # Εισαγωγή βιβλιοθήκης αιτήσεων url =” http://api.open-notify.org/astros.json “ # Δηλώνουμε την διεύθυνση άντλησης δεδομένων r = requests.get(url) # Γίνεται η αίτηση άντλησης δεδομένων j = r.json() # Δηλώνουμε πως θέλουμε τα δεδομένα σε μορφή JSON n = j['number'] # Καταχωρούμε τον αριθμό των αστροναυτών στη μεταβλητή n. print(n) # Τυπώνουμε το περιεχόμενο της μεταβλητής n Αποθηκεύστε το ως: astro_number.py και τρέξτε το. Θα σας τυπώσει στην οθόνη τον αριθμό των αστροναυτών που διαμένουν στον Σταθμό.
39
Συνδέστε 10 led στο breadboard όπως βλέπετε στην παρακάτω εικόνα:
Τροποποιήστε τον προηγούμενο κώδικα ως εξής: import requests from gpiozero import LED from time import sleep while True: url = "http://api.open-notify.org/astros.json" r = requests.get(url)
40
j = r.json() n = j['number'] # Ο αριθμός των αστροναυτών. astronauts = j['people'] #Λίστα με τα ονόματα των αστροναυτών pins = [2, 3, 4, 14, 15, 17, 18, 27, 22, 23] # Δηλώνουμε τα pins των Led σε μια λίστα. leds = [LED(pin) for pin in pins] # Αντιστοιχούμε σε κάθε pin από ένα led. for i, led in enumerate(leds):#Διαδικασία επανάληψης που ανάβει τόσα led όσοι είναι οι αστροναύτες if n > i: led.on() print(astronauts[i]['name']) sleep(1) else: led.off() # Τέλος διαδικασίας επανάληψης sleep(60) # Περίμενε ένα λεπτό μέχρι να ξαναρχίσεις τη διαδικασία Αποθηκεύστε το πρόγραμμα ως: astronauts.py. Μόλις το τρέξετε θα δείτε να ανάβουν διαδοχικά τόσα led, όσοι είναι και οι αστροναύτες και ταυτόχρονα να τυπώνεται και το όνομα του καθενός στην οθόνη. Το πρόγραμμα ανιχνεύει το API κάθε λεπτό, για να δει αν υπάρχουν μεταβολές στον αριθμό των αστροναυτών. Τερματίζει πληκτρολογώντας: ctrl-c στο shell του Thonny.
41
Twitter API Ένα από τα πιο διαδεδομένα κοινωνικά δίκτυα είναι το twitter. Οι χρήστες του δικτύου αυτού μπορούν να επικοινωνούν μεταξύ τους ανταλλάσσοντας σύντομα μηνύματα μέγιστου μήκους 140 χαρακτήρων. Τα μηνύματα αυτά ονομάζονται tweets. Κάθε χρήστης του δικτύου έχει φίλους (Friends) τους οποίους και ακολουθεί. Επίσης έχει και Ακόλουθους (Followers) που τον ακολουθούν. Τα tweets ενός χρήστη γίνονται ορατά μόνο από τους Followers του. Αντιστοίχως, ο ίδιος ο χρήστης στο timeline του, βλέπει τα δικά του tweets και τα tweet των φίλων του, τους οποίους ο ίδιος ακολουθεί. Κάθε χρήστης μπορεί να κάνει Like σε ένα tweet ενός φίλου του. Επίσης μπορεί να «αναμεταδώσει» ένα tweet κάποιου φίλου του, στους δικούς του ακόλουθους. Η αναμετάδοση αυτή λέγεται Retweet. Το twitter αποτελεί τον πιο δημοφιλή τρόπο σύντομης επικοινωνίας παγκοσμίως. Το χρησιμοποιούν:
Πολιτικοί που θέλουν να είναι σε επαφή με το εκλογικό σώμα. Χαρακτηριστικά παραδείγματα αποτελούν ο Barrack Obama (πρώην πρόεδρος των ΗΠΑ) και ο Donald Trump (νυν πρόεδρος των ΗΠΑ). Διάσημοι από των χώρο του τραγουδιού, του σινεμά, της τηλεόρασης κτλ για να είναι σε επαφή με τους θαυμαστές τους. Ειδησεογραφικά πρακτορεία για να μεταδίδουν τις πληροφορίες και τα γεγονότα τη στιγμή που συμβαίνουν. Ανεξάρτητοι δημοσιογράφοι, φωτορεπόρτερ, τηλεοπτικοί και ραδιοφωνικοί σταθμοί σε όλον τον κόσμο. Κυβερνήσεις, υπουργεία, δημόσιοι οργανισμοί, Νομικά πρόσωπα δημοσίου και ιδιωτικού δικαίου κτλ Διαφημιστικές εταιρείες, Μη κυβερνητικοί οργανισμοί, εκπαιδευτικοί οργανισμοί, Πανεπιστήμια κτλ Ιδιώτες
Ας δούμε τι πληροφορίες μπορούμε να αντλήσουμε από το twitter API και τι μπορούμε να κάνουμε με αυτές. Αρχικά θα πρέπει να κάνουμε εγγραφή στην διεύθυνση: twitter.com προκειμένου να αποκτήσουμε λογαριασμό. Η διαδικασία είναι απλή και φυσικά δωρεάν. Συμπληρώνετε απλά τα στοιχεία που βλέπετε στη φόρμα εγγραφής: Ζητάει ονοματεπώνυμο και μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου. Επίσης θα πρέπει να ορίσετε ένα password το οποίο θα πρέπει να σημειώσετε για να μην το ξεχάσετε. Όλα τα παραπάνω στοιχεία φυσικά με λατινικούς χαρακτήρες. Προκειμένου να μπορέσετε να χρησιμοποιήσετε το API, μεταβείτε στην διεύθυνση: http://aps.twitter.com και πατήστε το κουμπί: Create New App, όπως το βλέπετε παρακάτω:
42
Συμπληρώστε τα στοιχεία με παρόμοιο τρόπο όπως στην εικόνα:
Στο website μπορείτε να βάλετε αυτό που βλέπετε παραπάνω. Το Callback URL αφήστε το κενό.
43
Δώστε Access Read and write, όπως βλέπετε παρακάτω:
Στο αυτάκι: Keys and Access Tokens πατήστε το κουμπί: Create Access Token. Τότε θα δείτε κάτι σαν την παρακάτω εικόνα:
Σημειώστε και κρατήστε τους κωδικούς που δημιουργήθηκαν στα τέσσερα κόκκινα πλαίσια της παραπάνω εικόνας. Ένας εύκολος τρόπος είναι να ανοίξετε το Terminal και να πληκτρολογήσετε: mkdir twitterapi cd twitterapi sudo leafpad auth.py
44
Δημιουργήσατε ένα φάκελο για το project που θα ακολουθήσει. Μεταφερθήκατε σε αυτόν τον φάκελο. Καλέσατε τον επεξεργαστή κειμένου leafpad. Θα ανοίξει ο επεξεργαστής leafpad σε ένα κενό αρχείο με το όνομα: auth.py. Μέσα σ’ αυτό πληκτρολογήστε: consumer_key
= 'ΤΟ ΔΙΚΟ ΣΑΣ ΜΕ COPY-PASTE AΠΟ TO SITE'
consumer_secret access_token
= 'ΤΟ ΔΙΚΟ ΣΑΣ ΜΕ COPY-PASTE AΠΟ TO SITE' = 'ΤΟ ΔΙΚΟ ΣΑΣ ΜΕ COPY-PASTE AΠΟ TO SITE'
access_token_secret = 'ΤΟ ΔΙΚΟ ΣΑΣ ΜΕ COPY-PASTE AΠΟ TO SITE' Κατόπιν Αρχείο -> Αποθήκευση. Μόλις δημιουργήσατε το αρχείο auth.py με τα δικά σας στοιχεία προκειμένου να τρέξει η εφαρμογή. Βεβαιωθείτε πως η ώρα και ημερομηνία του συστήματός σας είναι σωστές. Αυτές θα τις δείτε πατώντας την ένδειξη της ώρας στην πάνω δεξιά γωνία της επιφάνειας εργασίας. Αν δεν είναι σωστές και μόνο τότε, πληκτρολογήστε στο Terminal: sudo date -s "1 MAY 2016 12:00:00" Φυσικά αντί για 1 MAY 2016 12:00:00 θα γράψετε την τρέχουσα ημερομηνία και ώρα σε αυτήν την μορφή που βλέπετε. Ας στείλουμε τώρα το πρώτο μας tweet μέσω Python. Στο Thonny πληκτρολογήστε: from twython import Twython # Εισάγουμε την βιβλιοθήκη για επικοινωνία με το Twitter API from auth import ( # Εισάγουμε τα στοιχεία μας ως μεταβλητές της Python. consumer_key, consumer_secret, access_token, access_token_secret ) twitter = Twython( # Δηλώνουμε τα στοιχεία μας στο twitterAPI consumer_key, consumer_secret, access_token, access_token_secret )
45
message = "Hello world!" # Αποθήκευσε το μήνυμα στη μεταβλητή message twitter.update_status(status=message) # Εκπομπή του μηνύματος στο Twitter print("Tweeted: %s" % message) # Τύπωσε το μήνυμα στην οθόνη. Αποθηκεύστε το αρχείο με το όνομα: send_tweet.py στο φάκελο twitterapi και τρέξτε το. Μεταβείτε στην διεύθυνση: twitter.com/your_username και θα δείτε στο timeline σας το μήνυμα που μόλις εκπέμψατε. Μόλις στείλατε το πρώτο σας tweet με τη βοήθεια του twitter API. Αν επιχειρήσετε να τρέξετε ξανά το πρόγραμμα για να ξαναστείλετε το ίδιο μήνυμα, το twitter δεν θα σας το επιτρέψει, καθώς απαγορεύει την μετάδοση αντιγράφων (duplicates). Γι’ αυτό θα πρέπει να αλλάξετε το μήνυμα. Μπορείτε να τροποποιήσετε το πρόγραμμα, έτσι ώστε να ζητά από το χρήστη να πληκτρολογήσει μήνυμα και αυτό το μήνυμα να δημοσιεύεται στο twitter. Επίσης θα μπορούσατε να δημιουργήσετε μια λίστα μηνυμάτων ως εξής: messages=[“This is the first message”, “this is the second message”, “this is the third message”] Και να αντικαταστήσετε την εντολή message=”Hello world” με την παρακάτω: message=random.choice(messages) Η εντολή αυτή επιλέγει από τη λίστα των μηνυμάτων τυχαία ένα μήνυμα και το αποθηκεύει στη μεταβλητή message. Για να εκτελεστεί η τελευταία εντολή προσθέστε στις εντολές import και την εντολή: import random. Επίσης στο twitter μπορούμε να ανεβάσουμε και φωτογραφίες. Εντοπίστε στο RaspberryPi μια φωτογραφία. Σημειώστε την διαδρομή της. Π.χ. /home/pi/Downloads/image.jpg Τροποποιήστε την εντολή message όπως παρακάτω: message = "Hello world - here's a picture!" with open('/home/pi/Downloads/image.jpg', 'rb') as photo: twitter.update_status_with_media(status=message, media=photo) Τρέχοντας τώρα το πρόγραμμα θα δείτε πως δημοσιεύσατε το κείμενο και την φωτογραφία.
46
Ανάψτε led με μήνυμα στο twitter Η βιβλιοθήκη Twython την οποία χρησιμοποιήσαμε στο προηγούμενο παράδειγμά μας έχει και μια άλλη δυνατότητα. Να εντοπίζει μια λέξη ή φράση μέσα στα tweets. Έτσι θα μπορούσαμε να κάνουμε ένα led να ανάψει μόλις εντοπιστεί σε κάποιο tweet μια συγκεκριμένη λέξη ή φράση. Συνδέστε, με τον γνωστό τρόπο, ένα Led στο pin 17. Στο Thonny πληκτρολογήστε: from gpiozero import LED from time import sleep led = LED(17) from twython import TwythonStreamer from auth import ( consumer_key, consumer_secret, access_token, access_token_secret ) mystring=input(“Insert text to match: “) class MyStreamer(TwythonStreamer): def on_success(self, data): if 'text' in data: username = data['user']['screen_name'] tweet = data['text'] if tweet==mystring: print("@%s: %s" % (username, tweet)) led.on() sleep(3) led.off() self.disconnect()
47
def on_error(self, status_code, data): print (status_code) self.disconnect()
stream = MyStreamer( consumer_key, consumer_secret, access_token, access_token_secret ) userID='420532725' # Το ID του user propagatorgr. Εσείς θα πληκτρολογήσετε το δικό σας. # Για να βρείτε το ID ενός χρήστη στο twitter μεταβείτε στην διεύθυνση: http://gettwitterid.com/ # και πληκτρολογήστε το όνομα του χρήστη όπως το βλέπετε στο timeline. Π.χ. @propagatorgr stream.statuses.filter(follow=userID) Αποθηκεύστε το ως: streamer.py και τρέξτε το. Μόλις το τρέξετε θα σας ρωτήσει ποια φράση θέλετε να ανιχνεύσετε. Πληκτρολογήστε την φράση που θέλετε. Κατόπιν μπείτε στο twitter και στείλτε ένα μήνυμα που να περιέχει τη φράση που θέλετε. Θα δείτε το led να ανάβει για 3 δευτερόλεπτα.
48
Άντληση δεδομένων από σχολικούς μετεωρολογικούς σταθμούς Το 2016 η εταιρεία λογισμικού Oracle σε συνεργασία με το RaspberryPi Foundation μοίρασε 1.000 μετεωρολογικούς σταθμούς σε σχολεία σε όλο τον κόσμο, προκειμένου να δημιουργηθεί μια παγκόσμια βάση δεδομένων με στοιχεία καιρού διαθέσιμα, δωρεάν, σε όλον τον κόσμο. Αυτή η βάση δεδομένων γίνεται προσβάσιμη μέσω ενός RESTful WEB API. Θα μάθουμε λοιπόν να χρησιμοποιούμε αυτό το API, να αντλούμε τα δεδομένα και να τα αναπαριστούμε γραφικά. Ανοίξτε τον browser και πληκτρολογήστε στην γραμμή διευθύνσεων: https://apex.oracle.com/pls/apex/raspberrypi/weatherstation/getallstations Αυτό που θα δείτε είναι δεδομένα σε μια μορφή που λέγεται JSON. Σε ένα JSON αρχείο τα δεδομένα περικλείονται σε { } και μέσα σε αυτές βρίσκονται τα δεδομένα σε ζεύγη της μορφής: {“κλειδί”:τιμή}.Το κλειδί είναι το μοναδικό αναγνωριστικό με το οποίο μπορούμε να προσεγγίσουμε την συγκεκριμένη τιμή. Ας εξηγήσουμε τα δεδομένα που βλέπουμε. Ας πάρουμε για παράδειγμα ένα μέρος απ’ αυτά: {"weather_stn_id":1880895,"weather_stn_name":"Methoni_station","weather_stn_lat":36.823041,"we ather_stn_long":21.705036}, “weather_stn_id":1880895 "weather_stn_name":"Methoni_station" "weather_stn_lat":36.823041 "weather_stn_long":21.705036
Είναι ένας μοναδικός αριθμός που αποδίδεται σε κάθε σταθμό. Είναι το όνομα του σταθμού. Το Γεωγραφικό πλάτος στο οποίο βρίσκεται ο σταθμός Το Γεωγραφικό μήκος στο οποίο βρίσκεται ο σταθμός.
Τι καιρικά δεδομένα δίνει όμως ένας σταθμός; Για να τα δείτε πληκτρολογήστε στην γραμμή διευθύνσεων: https://apex.oracle.com/pls/apex/raspberrypi/weatherstation/getallmeasurements/1880895 Θα πάρετε δεδομένα σε μορφή JSON. Είναι οι πρώτες 500 μετρήσεις (1 σελίδα) του σταθμού της Μεθώνης. Ας δούμε τι περιέχουν: {"id":3253555,"weather_stn_id":1880895,"ambient_temp":28.13,"ground_temp":16.63,"air_quality":5 2.84,"air_pressure":1011.83,"humidity":38.3,"wind_direction":315,"wind_speed":1.4,"wind_gust_spee d":3.36,"rainfall":0,"reading_timestamp":"2017-0406T21:35:01Z","created_by":"Methoni_station","created_on":"2017-0406T21:35:01Z","updated_by":"Methoni_station","updated_on":"2017-04-06T19:00:13.809Z"}, Αυτά τα δεδομένα αποτελούν μια εγγραφή της βάσης δεδομένων. Η βάση έχει πολλές εγγραφές. Τα πεδία της κάθε εγγραφής είναι για παράδειγμα η θερμοκρασία περιβάλλοντος (ambient_temp), η υγρασία (humidity), η ατμοσφαιρική πίεση ( air_pressure), το ύψος βροχής (rainfall) κτλ Εμείς θα ασχοληθούμε με την: “ambient_temp” που είναι η θερμοκρασία περιβάλλοντος και την “reading_timestamp” που είναι η ημερομηνία που πάρθηκαν τα δεδομένα, προκειμένου να δημιουργήσουμε γραφική παράσταση: θερμοκρασίας περιβάλλοντος – ημερομηνίας.
49
Δημιουργήστε ένα φάκελο με το όνομα: weather. Κατόπιν ανοίξτε τον editor του Thonny και πληκτρολογήστε: #Εισάγουμε τις απαραίτητες βιβλιοθήκες from requests import get import matplotlib.pyplot as plt from dateutil import parser
#Συνάρτηση που δημιουργεί dictionary από 2 λίστες def create_dict(a, b): d = dict() if len(a)-len(b) != 0: for i in range(len(a)-len(b)): b.append(None) for j in range(len(a)): d[a[j]] = b[j] return d
#Η διεύθυνση από την οποία θα αναζητήσουμε όλους τους σταθμούς stations="https://apex.oracle.com/pls/apex/raspberrypi/weatherstation/getallstations" #Φέρε τους σταθμούς allstations=get(stations).json() #Λίστα με τα ονόματα των σταθμών names=[record['weather_stn_name'] for record in allstations['items']] #Λίστα με τα ids των σταθμών ids=[record['weather_stn_id'] for record in allstations['items']] #Κλήση της συνάρτησης συνένωσης των δύο λιστών σε ένα dictionary name_id=create_dict(names,ids) #Τύπωσε τα ονόματα και τους σταθμούς
50
print ("Οι σταθμοί από τους οποίους μπορείς να πάρεις δεδομένα είναι: "+str(len(names))) print(name_id) stathmos=input("Δώσε το id του σταθμού που θες: ") #url στο οποίο θα αναζητήσουμε δεδομένα init_url = 'https://apex.oracle.com/pls/apex/raspberrypi/weatherstation/getallmeasurements/' url=init_url+stathmos #Φέρε τα δεδομένα και αποθήκευσέ τα στη μεταβλητή weather σε json μορφή. weather = get(url).json() if len(weather["items"])==0: print("Ο σταθμός είναι εκτός λειτουργίας!!!") quit #Τύπωσε το όνομα του σταθμού print("Δεδομένα από: "+weather["items"][0]["created_by"]) #Αποθήκευσε κάθε θερμοκρασία στη λίστα temperatures temperatures = [record['ambient_temp'] for record in weather['items']] #Αποθήκευσε κάθε ημερομηνία στη λίστα timestamps #αφού πρώτα τη φέρεις σε μορφή που θα μπορεί να διαβάσει η Python timestamps = [parser.parse(record['reading_timestamp']) for record in weather['items']] #Τύπωσε το διάγραμμα plt.plot(timestamps, temperatures) ## Τύπωσε ετικέτα για κάθε άξονα plt.ylabel('Θερμοκρασία') plt.xlabel('Χρόνος') plt.show()
Αποθηκεύστε στον φάκελο:weather με την ονομασία: graph_weather.py Τροποποιήστε το πρόγραμμα έτσι ώστε να μπορείτε να δώσετε από το πληκτρολόγιο το id όσων σταθμών ερωτηθείτε. Θα δίνετε και χρώμα για την κάθε γραφική παράσταση και θα σας εμφανίζει τα αντίστοιχα στοιχεία.
51
Δώσαμε το id του σταθμού της Χαλάστρας και ζητήσαμε κόκκινο χρώμα και του σταθμού του Μούδρου και ζητήσαμε πράσινο χρώμα και πήραμε τα παρακάτω γραφήματα:
Παρακάτω θα μάθουμε πώς μπορούμε να κάνουμε τις γραφικές παραστάσεις σε κοινό διάγραμμα.
52
Εύρεση των Ελληνικών μετεωρολογικών σταθμών Ας βρούμε τώρα μόνο τους Ελληνικούς μετεωρολογικούς σταθμούς και ας τους απεικονίσουμε σε χάρτη, όπου θα εμφανίζονται markers στη θέση των σταθμών. Κάνοντας κλικ σε κάθε marker θα βλέπουμε το όνομα και το id του σταθμού. Στον editor του Thonny πληκτρολογήστε: from requests import get import json import folium import os import webbrowser
url = 'https://apex.oracle.com/pls/apex/raspberrypi/weatherstation/getallstations'
all_stations = get(url).json()['items'] total_stations=len(all_stations) greek_stations=[] #Ανοίγω κενή λίστα για τους Ελληνικούς σταθμούς for station in all_stations: # Τα Ελληνικά γεωγραφικά όρια max_lat=41.739 min_lat=34.800 max_lon=28.247 min_lon=19.128 # Αν είμαι στα Ελληνικά όρια, μόνο τότε αποθηκεύω τα στοιχεία στη λίστα των Ελληνικών σταθμών if (min_lat<station['weather_stn_lat']<max_lat): if (min_lon<station['weather_stn_long']<max_lon): greek_stations.append(station) print ("Οι Ελληνικοί σταθμοί είναι: "+str(len(greek_stations))+" σε σύνολο "+str(total_stations)) # Δημιουργώ τον χάρτη map_ws = folium.Map(location=[37.983, 23.731], zoom_start=6) CWD = os.getcwd() #Βρίσκω τον τρέχοντα κατάλογο
53
for n in range(len(greek_stations)): folium.Marker([greek_stations[n]["weather_stn_lat"], greek_stations[n]["weather_stn_long"]], popup = greek_stations[n]["weather_stn_name"] +" id: "+str(greek_stations[n]["weather_stn_id"])).add_to(map_ws) map_ws.save('wsmap1.html') #Αποθηκεύω το html αρχείο webbrowser.open_new('file://'+CWD+'/'+'wsmap1.html') #Ανοίγω τον browser Αυτό που θα πάρετε μόλις αποθηκεύσετε το αρχείο με την ονομασία: only_greeks.py θα είναι όπως παρακάτω:
54
Συνδυάζοντας δεδομένα ενός μήνα από δύο σταθμούς Όπως είδαμε παραπάνω τα στοιχεία μας έρχονται «σελιδοποιημένα» σε 500-άδες. Κάθε 500-άδα στοιχείων αποτελεί μία σελίδα. Κάθε σταθμός, ανάλογα με τις ώρες λειτουργίας του, έχει διαφορετικό αριθμό σελίδων. Οι αισθητήρες του κάθε σταθμού καταγράφουν δεδομένα κάθε 10 λεπτά. Δηλαδή κάθε 10 λεπτά γίνεται μια εγγραφή στη βάση δεδομένων. Άρα σε 24 ώρες που είναι: 24Χ60=1440 λεπτά γίνονται 144 εγγραφές. Δηλαδή 144 εγγραφές την ημέρα. Άρα σε ένα μήνα έχουμε: 144 Χ 30=4320 εγγραφές τον μήνα. Αυτές χοντρικά ισοδυναμούν με 9 σελίδες δεδομένων διότι 9 Χ 500=4500. Θα πάρουμε λοιπόν τα δεδομένα ενός μήνα από 2 σταθμούς και θα κάνουμε κοινή γραφική παράσταση με τα χρώματα που θέλουμε. Πληκτρολογήστε στο Thonny το παρακάτω πρόγραμμα και αποθηκεύστε το στο φάκελο weather με την ονομασία: many_pages_combine.py from requests import get import matplotlib.pyplot as plt from dateutil import parser
def getData(id): url = 'https://apex.oracle.com/pls/apex/raspberrypi/weatherstation/getallmeasurements/' url_finale=url+id weather = get(url_finale).json() data = weather['items'] pages = 1 print('Fetching {0}'.format(url_finale)) print(len(data)) while 'next' in weather and pages < 9: url_finale = weather['next']['$ref'] print('Fetching {0}'.format(url_finale)) weather = get(url_finale).json() data += weather['items'] print(len(data)) pages += 1
55
temps = [record['ambient_temp'] for record in data] times = [parser.parse(record['reading_timestamp']) for record in data] return times,temps
for n in range(2): stathmos_id = input("Δώσε το id του σταθμού που θες: ") color = input("Δώσε χρώμα για την γραφική παράσταση: ")
timestamps, temperatures= getData(stathmos_id) plt.plot(timestamps, temperatures,color)
plt.ylabel('Temperature') plt.xlabel('date and time') plt.show() Μόλις εκτελέσετε το πρόγραμμα θα πάρετε μια γραφική παράσταση σαν την παρακάτω:
56
WEB SERVER Ο Server ή αλλιώς εξυπηρετητής ή διακομιστής, στην πιο απλή του μορφή είναι ένας ηλεκτρονικός υπολογιστής που τρέχει κατάλληλο λογισμικό ώστε να εξυπηρετεί τους χρήστες που συνδέονται με αυτόν για κάποιο σκοπό. Ανάλογα με τον σκοπό, ο server τρέχει και τις κατάλληλες υπηρεσίες και έχει και κατάλληλη ονομασία. Για παράδειγμα – αν ο server εξυπηρετεί ιστοσελίδες, ονομάζεται web server και τρέχει λογισμικό κατάλληλο για να εξυπηρετεί τα αρχεία με τα οποία είναι κατασκευασμένη μία ιστοσελίδα. – αν ο server εξυπηρετεί e-mail λογαριασμούς ώστε οι χρήστες να έχουν το e-mail τους σε αυτόν, τότε θα είναι e-mail server και θα τρέχει κατάλληλο λογισμικό για αποστολή και λήψη e-mail μηνυμάτων. Όπως είπαμε, στην πιο απλή του μορφή ένας server είναι ένας ηλεκτρονικός υπολογιστής ο οποίος τρέχει κατάλληλο λογισμικό. Στην πράξη βέβαια, δεν είναι απλοί υπολογιστές αλλά είναι ηλεκτρονικοί υπολογιστές αυξημένων δυνατοτήτων και είναι εγκατεστημένοι σε ειδικούς χώρους που λέγονται datacenters. Στη συνέχεια θα εγκαταστήσουμε στο RaspberryPi το απαραίτητο λογισμικό ώστε να το μετατρέψουμε σε έναν Web Server.
Python powered Web server with Flask Ανοίξτε το Terminal και πληκτρολογήστε: sudo apt-get install python3-flask Αυτή η εντολή θα εγκαταστήσει το λογισμικό Flask με τη βοήθεια του οποίου θα εγκαταστήσουμε τον Web server. Δημιουργήστε ένα φάκελο με την ονομασία: web_server Ανοίξτε το Thonny και πληκτρολογήστε: from flask import Flask
app = Flask(__name__)
@app.route('/') #Καθορίζει την δρομολόγηση. Το / σημαίνει πως ο server θα τρέξει στον τρέχοντα φάκελο. def index(): #Είναι η ονομασία που δίνουμε στη συνάρτηση που θα σερβίρει ο server. return 'Hello world' #Το περιεχόμενο της index συνάρτησης που θα σερβίρει ο server
if __name__ == '__main__': app.run(debug=True, host='0.0.0.0')
57
Αποθηκεύστε μέσα στο φάκελο Web_server με την ονομασία: app.py. Στο Terminal πληκτρολογήστε: python3 app.py Με αυτήν την εντολή τρέχει το πρόγραμμα. Αν είναι όλα σωστά θα δείτε στην οθόνη ένα παρόμοιο μήνυμα:
Αυτό σημαίνει πως ο web server ήδη «τρέχει». Δεν έχετε παρά να ανοίξετε τον φυλλομετρητή σας και να πληκτρολογήσετε στη γραμμή διευθύνσεων το παρακάτω:
127.0.0.1 είναι η IP ADDRESS του Web server στο τοπικό δίκτυο. 5000 είναι η θύρα στην οποία «τρέχει» ο server. Όπως βλέπετε ο server έτρεξε και μας επέστρεψε τη φράση: «Hello world».
Σερβίροντας δύο σελίδες Τροποποιήστε τον κώδικά σας ως εξής: from flask import Flask app = Flask(__name__) @app.route('/') #Καθορίζει την δρομολόγηση. Το / σημαίνει πως ο server θα τρέξει στον ριζικό κατάλογο.
58
def index(): #Είναι η ονομασία που δίνουμε στη συνάρτηση. return 'Hello world' #Το περιεχόμενο της index συνάρτησης που θα σερβίρει ο server
@app.route('/cakes')#Δεύτερη δρομολόγηση με άλλο περιεχόμενο def cakes(): # Ορίζουμε τη συνάρτηση cakes return 'Yummy cakes!' # Το κείμενο που θα επιστραφεί. if __name__ == '__main__': app.run(debug=True, host='0.0.0.0') Πληκτρολογώντας στον φυλλομετρητή: 127.0.0.1:5000/ σας σερβίρει τη σελίδα index με περιεχόμενο: Hello world, ενώ αν πληκτρολογήσετε: 127.0.0.1:5000/cakes σας σερβίρει τη σελίδα cakes με περιεχόμενο: Yummy cakes
Με αυτόν τον τρόπο μπορείτε να σερβίρετε όσες σελίδες θέλετε με διαφορετικό περιεχόμενο.
59
Σερβίροντας html templates Μέσα στο φάκελο web_server πληκτρολογήστε: mkdir templates για να δημιουργήσετε τον φάκελο templates. Ανοίξτε τον επεξεργαστή κειμένου leafpad και πληκτρολογήστε τον παρακάτω html κώδικα: <html> <body> <h1>Hello from a template!</h1> </body> </html> Αποθηκεύστε το στο φάκελο templates με την ονομασία: index.html. H HTML είναι το ακρωνύμιο των λέξεων HyperText Markup Language (γλώσσα μορφοποίησης υπερκειμένου) και είναι η βασική γλώσσα δόμησης σελίδων του World Wide Web (ή απλά ιστού: Web). Είναι μία γλώσσα προγραμματισμού. Χρησιμοποιείται για να σημαίνει ένα τμήμα κειμένου και να το κάνει να εμφανίζεται καλύτερα. Επιτρέπει την ενσωμάτωση ήχου και εικόνων στις web σελίδες. Αρχικά είχε κατασκευασθεί με σκοπό μόνο την μορφοποίηση κειμένου, αλλά μεγάλωσε και ενσωμάτωσε σχεδιαστικές τεχνικές κ.α. Η γλώσσα χρησιμοποιεί ένα αριθμό από tags για την μορφοποίηση κειμένου, για την δημιουργία συνδέσμων (links) μετάβασης ανάμεσα των σελίδα, για την εισαγωγή εικόνων, ήχου κ.α. Όταν ένας Web Browser ανοίγει ένα αρχείο HTML τα στοιχεία (tags) μεταφράζονται σε κατάλληλα χαρακτηριστικά με αποτελέσματα στην εμφάνιση και στην λειτουργικότητα της συγκεκριμένης σελίδας. Επιστρέψτε στον Thonny editor και τροποποιήστε το app.py ως εξής: from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') #Το περιεχόμενο της index σελίδας που θα σερβίρει ο server
if __name__ == '__main__': app.run(debug=True, host='0.0.0.0')
60
Αποθηκεύστε το στο φάκελο: web_server. Αν έχει σταματήσει να τρέχει από προηγουμένως, ξανατρέξτε το.
Ανοίξτε τον browser και θα δείτε πως ο server ψάχνει τη σελίδα index.html στο φάκελο templates και τη σερβίρει. Θα δείτε λοιπόν αυτό:
Χρησιμοποιώντας CSS To CSS είναι μια απλή γλώσσα που μας βοηθάει να ορίσουμε με σαφήνεια και ιδιαίτερη ευελιξία τον τρόπο με τον οποίο θα εμφανίζονται τα διάφορα στοιχεία στην ιστοσελίδα μας. Ποια πλεονεκτήματα έχει η χρήση CSS έναντι της μορφοποίησης μέσω HTML attributes? ■ Πολύ μεγαλύτερη ευελιξία. To CSS κατέστησε εφικτές μορφοποιήσεις οι οποίες ήταν αδύνατες ή πολύ δύσκολες με την κλασσική HTML. ■ Ευκολότερη συντήρηση των ιστοσελίδων. Η εμφάνιση ενός ολόκληρου site μπορεί να ελέγχεται από ένα μόνο εξωτερικό αρχείο CSS. Έτσι, κάθε αλλαγή στο στυλ της ιστοσελίδας μπορεί να γίνεται με μια μοναδική αλλαγή σε αυτό το αρχείο, αντί για την επεξεργασία πολλών σημείων σε κάθε σελίδα που υπάρχει στο site. ■ Μικρότερο μέγεθος αρχείου, δεδομένου ότι ο κάθε κανόνας μορφοποίησης γράφεται μόνο μια φορά και όχι σε κάθε σημείο που εφαρμόζεται. ■ Καλύτερο SEO (Search engine optimization). Οι μηχανές αναζήτησης δεν «μπερδεύονται» ανάμεσα σε περιεχόμενο και τη μορφοποίηση του, αλλά έχουν πρόσβαση στο περιεχόμενο σκέτο, οπότε είναι πολύ ευκολότερο να το καταγράφουν και να το αρχειοθετήσουν (indexing). ■ Γρηγορότερες σελίδες. Όταν χρησιμοποιούμε εξωτερικό αρχείο CSS, ο browser την πρώτη φορά που θα φορτώσει κάποια σελίδα του site μας το αποθηκεύει στην cache, οπότε δεν χρειάζεται να το κατεβάσει ξανά κάθε φορά που κατεβάζει ο χρήστης του κάποια άλλη σελίδα του site μας. Ας δούμε πώς θα μπορούσαμε να χρησιμοποιήσουμε css με τον web server μας. Ανοίξτε το Terminal και μεταβείτε στο φάκελο web_server. Μέσα σε αυτόν δημιουργήστε τον φάκελο static. Ανοίξτε το leafpad και πληκτρολογήστε:
61
body { background: red; # Ορίζει κόκκινο το χρώμα του background color: yellow; # Ορίζει κίτρινο το χρώμα των γραμμάτων } Αποθηκεύστε μέσα στον φάκελο static που θα δημιουργήσετε μέσα στον weather, με την ονομασία: style.css. Στο Terminal μεταβείτε στο φάκελο templates και ανοίξτε στο leafpad το αρχείο index.html. Για να γίνει αυτό απλά πληκτρολογήστε: sudo leafpad index.html Τροποποιήστε το αρχείο ως εξής: <html> <head> <link rel="stylesheet" href='/static/style.css' /> #Φορτώνει το style.css στην html σελίδα </head> <body> <h1>Hello from a template!</h1> </body> </html> Αποθηκεύστε το index.html και ξανασερβίρετε όπως πριν. Θα δείτε το παρακάτω:
62
Δυναμικό περιεχόμενο Θα προσθέσουμε δυναμικό περιεχόμενο αλλάζοντας την δρομολόγηση των σελίδων μας και χρησιμοποιώντας μεταβλητές. Μέσα στο app.py προσθέστε τα εξής: @app.route('/hello/<name>') # Δρομολόγηση στη συνάρτηση hello και πέρασμα σ’ αυτή της μεταβλητής name def hello(name): # Συνάρτηση hello με όρισμα name return render_template('page.html', name=name) Εδώ παρατηρούμε πως έχουμε τη συνάρτηση hello με όρισμα name. Ο server θα σερβίρει την σελίδα page.html και θα περνάει το όνομα στη μεταβλητή name. Στο leafpad πληκτρολογήστε: <html> <head> <link rel="stylesheet" href='/static/style.css' /> #Φορτώνει το style.css στην html σελίδα </head> <body> <h1>Hello {{ name }}!</h1> </body> </html> Αποθηκεύστε στο φάκελο templates με την ονομασία: page.html Σερβίρετε, πληκτρολογώντας στη γραμμή διευθύνσεων στον browser: 127.0.0.1/hello/Paul Θα δείτε να γράφει τη φράση: Hello Paul με κίτρινα γράμματα σε κόκκινο φόντο. Αλλάξτε το όνομα Paul με το όνομα της επιλογής σας και κάντε ανανέωση στον browser. Θα δείτε τον χαιρετισμό με το αντίστοιχο όνομα.
Τοπική σύνδεση στον web server Ας δούμε πώς μπορούμε να δούμε το περιεχόμενο των σελίδων που σερβίρει ο server, από άλλες συσκευές του δικτύου μας. Ανοίξτε το Terminal και πληκτρολογήστε: hostname –I Θα σας επιστρέψει την IP του RaspberryPi. Ας υποθέσουμε ότι σας επιστρέφει την τιμή: 192.168.1.3 Ανοίξτε τον Browser από κάποια άλλη συσκευή που είναι συνδεδεμένη στο ίδιο δίκτυο, π.χ. από το laptop σας, το tablet ή το κινητό σας και στη γραμμή διευθύνσεων πληκτρολογήστε:
63
192.168.1.3:5000 Μόλις πατήσετε ENTER θα δείτε την σελίδα που σερβίρει ο Flask Web Server του RaspberryPi. Στην διπλανή εικόνα βλέπουμε την σελίδα όπως σερβίρεται σε κινητό τηλέφωνο android. Εδώ θα πρέπει να προσθέσουμε πως ο Flask Web Server δεν είναι ο μόνος web server που θα μπορούσαμε να εγκαταστήσουμε. Είναι όμως από τους πιο απλούς για εκπαιδευτική χρήση. Δημοφιλή λογισμικά για Web Server εκτός από τον Flask είναι: LAMP (Linux, Apache, MySQL, PHP) και Node.js. Αργότερα θα δούμε πώς εγκαθιστούμε Node.js στο RaspberryPi.
ΠΡΟΣΒΑΣΗ ΟΙΚΙΑΚΟΥ SERVER ΑΠΟ INTERNET Η πρόσβαση του οικιακού server από το internet δεν είναι εύκολη υπόθεση. Χρειάζονται γνώσεις και ρυθμίσεις που δεν είναι εύκολες για αρχάριους. Η λύση που θα προτείνουμε είναι πολύ απλή αλλά χρησιμοποιείται για μικρή χρονική διάρκεια και σχετικά μικρό όγκο δεδομένων.
Ngrok tunneling Ανοίξτε το Terminal και πληκτρολογήστε: cd /tmp Θα μεταβείτε στον φάκελο tmp. Κατόπιν πληκτρολογήστε: wget https://dl.ngrok.com/ngrok_2.0.19_linux_amd64.zip Θα κατέβει το συμπιεσμένο αρχείο, το οποίο θα πρέπει να αποσυμπιέσουμε. Πληκτρολογήστε: unzip ngro*
64
Ας υποθέσουμε ότι έχετε δημιουργήσει έναν Flask Web Server και τον έχετε ενεργό στο Terminal στη θύρα 5000. Ανοίξτε νέο Terminal και πληκτρολογήστε: ./ngrok http 5000 Θα σας επιστρέψει μια διεύθυνση της μορφής: a3grtkb.ngrok.io Ανοίξτε έναν φυλλομετρητή από οποιαδήποτε συσκευή που έχει πρόσβαση στο Internet και στη γραμμή διευθύνσεων πληκτρολογήστε την διεύθυνση που σας επέστρεψε το ngrok. Θα δείτε την σελίδα σας.
ΑΝΑΨΤΕ ΕΝΑ LED ΑΠΟ ΤΟ INTERNET ΜΕ ΧΡΗΣΗ SIGNAL Θα συνδυάσουμε όσα μάθαμε παραπάνω για να ανάψουμε ένα Led μέσω Internet. Για να το επιτύχουμε αυτό θα χρησιμοποιήσουμε UNIX SIGNALS. Κάθε φορά που εκτελείται ένα script σε ένα σύστημα Unix (θυμηθείτε πως το Raspbian είναι διανομή του Debian, το οποίο είναι διανομή του Linux, η αρχιτεκτονική του οποίου έχει βασιστεί στο παλαιότερο Unix), το σύστημα δημιουργεί ένα αναγνωριστικό διαδικασίας (pid) το οποίο είναι διαφορετικό κάθε φορά. Ένα signal λειτουργεί ως διακόπτης λογισμικού που ειδοποιεί μια διαδικασία για ένα συμβάν ή ένα αίτημα. Στον παρακάτω πίνακα βλέπετε τα συνηθέστερα pid που μπορεί να συναντήσετε:
65
Εμείς θα χρησιμοποιήσουμε το 10 και το 12 δηλ. τα SIGUSR1 και SIGUSR2. Δημιουργήστε ένα φάκελο με το όνομα: WebSignals. Μέσα σε αυτόν δημιουργήστε τον φάκελο templates. Στον editor του Thonny πληκτρολογήστε:
66
from flask import * import os import signal app = Flask(__name__)
@app.route('/') def index(): return render_template('index.html')
@app.route('/trigger1') def process1(): #read process id from text file fh=open("processid.txt","r") processId = int(fh.read()) fh.close()
#send signal to process id os.kill(processId, signal.SIGUSR1)
return render_template('trigger1.html')
@app.route('/trigger2') def process2(): #read process id from text file fh=open("processid.txt","r") processId = int(fh.read()) fh.close()
67
#send signal to process id os.kill(processId, signal.SIGUSR2) return render_template('trigger2.html')
if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')
Αποθηκεύστε το με την ονομασία: app.py στον φάκελο WebSignals. Ανοίξτε νέο αρχείο στο Thonny και πληκτρολογήστε: import os import signal import time from gpiozero import LED led=LED(23) fh=open("processid.txt","w") fh.write(str(os.getpid())) #get current process id and store in file fh.close()
def handUSR1(signum,frame): print('led is on',signum) led.on()
def handUSR2(signum,frame): print('led is off',signum) led.off()
68
signal.signal(signal.SIGUSR1,handUSR1) signal.signal(signal.SIGUSR2,handUSR2)
while(True): time.sleep(1) print("Waiting for signal")
Αποθηκεύστε το στον ίδιο με προηγουμένως φάκελο ως: SignalReceiver.py Ανοίξτε το leafpad και πληκτρολογήστε: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Light a Led</title> </head>
<body> <a href="/trigger1">Turn On</a><br /><br /> <a href="/trigger2">Turn Off</a><br /> </body>
</html> Αποθηκεύστε στο φάκελο templates με το όνομα index.html Επίσης δημιουργήστε άλλα δύο αρχεία στον ίδιο φάκελο με ονομασίες: trigger1.html και trigger2.html Trigger1.html <!DOCTYPE html> <html>
69
<head> <meta charset="UTF-8"> <title>Led is On</title> </head>
<body> <a href="/trigger1">Turn On</a><br /><br /> <a href="/trigger2">Turn Off</a><br /> </br> Led is on! </body>
</html>
Trigger2.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Led is off</title> </head>
<body> <a href="/trigger1">Turn On</a><br /><br /> <a href="/trigger2">Turn Off</a><br /> </br> Led is off!!
70
</body>
</html> Ανοίξτε ένα Terminal και «ανεβάστε» αρχικά τον server πληκτρολογώντας: python3 app.py Ανοίξτε νέο Terminal για να τρέξετε το SignalReceiver.py με την εντολή: python3 SignalReceiver.py Κατόπιν ανοίξτε τον browser στην διεύθυνση: 127.0.0.1:5000 Και θα μπορέσετε να ανάψετε και να σβήσετε το Led που θα πρέπει να έχετε συνδέσει στο pin 23. Για να κάνετε τη σελίδα σας ορατή στο Internet θα πρέπει να ανοίξετε νέο Terminal και να τρέξετε το ngrok με την εντολή: ./ngrok http 5000 Μόλις σας επιστρέψει το url θα μπορείτε να αναβοσβήσετε το led από οπουδήποτε μέσω internet.
ΑΝΑΨΤΕ ΔΥΟ LED ΑΠΟ ΤΟ INTERNET ΜΕ ΧΡΗΣΗ RPI Συνδέστε δύο Led στα pin 23 και 24 αντίστοιχα. Μην ξεχάσετε να συνδέσετε αντίσταση σε κάθε Led. Δημιουργήστε έναν φάκελο με το όνομα: internetLed. Μεταβείτε μέσα σε αυτόν και δημιουργήστε έναν νέο φάκελο με το όνομα templates. Ανοίξτε το Thonny και πληκτρολογήστε: import RPi.GPIO as GPIO from flask import Flask, render_template, request app = Flask(__name__) GPIO.setmode(GPIO.BCM) # Create a dictionary called pins to store the pin number, name, and pin state: pins = { 23 : {'name' : 'GPIO 23', 'state' : GPIO.LOW}, 24 : {'name' : 'GPIO 24', 'state' : GPIO.LOW} }
71
# Set each pin as an output and make it low: for pin in pins: GPIO.setup(pin, GPIO.OUT) GPIO.output(pin, GPIO.LOW) @app.route("/") def main(): # For each pin, read the pin state and store it in the pins dictionary: for pin in pins: pins[pin]['state'] = GPIO.input(pin) # Put the pin dictionary into the template data dictionary: templateData = { 'pins' : pins } # Pass the template data into the template main.html and return it to the user return render_template('main.html', **templateData)
# The function below is executed when someone requests a URL with the pin number and action in it: @app.route("/<changePin>/<action>") def action(changePin, action): # Convert the pin from the URL into an integer: changePin = int(changePin) # Get the device name for the pin being changed: deviceName = pins[changePin]['name'] # If the action part of the URL is "on," execute the code indented below: if action == "on": # Set the pin high: GPIO.output(changePin, GPIO.HIGH)
72
# Save the status message to be passed into the template: message = "Turned " + deviceName + " on."
if action == "off": GPIO.output(changePin, GPIO.LOW) message = "Turned " + deviceName + " off."
# For each pin, read the pin state and store it in the pins dictionary: for pin in pins: pins[pin]['state'] = GPIO.input(pin)
# Along with the pin dictionary, put the message into the template data dictionary: templateData = { 'pins' : pins }
return render_template('main.html', **templateData)
if __name__ == "__main__": app.run(host='0.0.0.0', port=80, debug=True) Αποθηκεύστε το στον φάκελο internetLed με το όνομα: app.py Ανοίξτε τον Leafpad και πληκτρολογήστε: <!DOCTYPE html> <head><title>RPi Web Server</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha3841q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
73
<!-- Optional theme --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstraptheme.min.css" integrity="sha384fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous"> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha3840mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script> </head>
<body> <h1>RPi Web Server</h1> {% for pin in pins %} <h2>{{ pins[pin].name }} {% if pins[pin].state == true %} is currently <strong>on</strong></h2><div class="row"><div class="col-md-2"> <a href="/{{pin}}/off" class="btn btn-block btn-lg btn-default" role="button">Turn off</a></div></div> {% else %} is currently <strong>off</strong></h2><div class="row"><div class="col-md-2"> <a href="/{{pin}}/on" class="btn btn-block btn-lg btn-primary" role="button">Turn on</a></div></div> {% endif %} {% endfor %} </body> </html> Αποθηκεύστε στον φάκελο templates του internetLed με την ονομασία main.html. Στο Terminal πληκτρολογήστε python3 app.py
74
Με αυτή την εντολή τρέχει ο Web Server. Ανοίξτε νέο Terminal και πληκτρολογήστε: ./ngrok http 80 Τώρα πλέον ο server σας ορατός στο δίκτυο. Από οποιαδήποτε συσκευή που έχει πρόσβαση στο διαδίκτυο πληκτρολογήστε στην γραμμή διευθύνσεων τη διεύθυνση (url) που σας απέδωσε το ngrok. Θα δείτε δύο κουμπιά με τη βοήθεια των οποίων θα ανοιγοκλείνετε τα Led.
ΑΙΣΘΗΤΗΡΕΣ Temperature Log Στο system on a chip ( SoC) του RaspberryPi υπάρχει ενσωματωμένος αισθητήρας θερμοκρασίας που μπορεί να μετρά τόσο τη θερμοκρασία του Chip κατά την διάρκεια λειτουργίας του, όσο και τη θερμοκρασία του περιβάλλοντος. Θα δημιουργήσουμε λοιπόν ένα πρόγραμμα σε Python, το οποίο θα τρέχει αυτόματα κατά την εκκίνηση του RaspberryPi και θα καταγράφει σε αρχείο, τις τιμές που θα δίνει ο ενσωματωμένος αισθητήρας θερμοκρασίας, σε καθορισμένα χρονικά διαστήματα. Επίσης θα δίνει την δυνατότητα διαβάσματος του αρχείου καταγραφών (Log File) και «ζωντανής» γραφικής απεικόνισης των καταγεγραμμένων στοιχείων. Δημιουργήστε τον φάκελο με την ονομασία: cputemp. Στον editor του Thonny πληκτρολογήστε: from gpiozero import CPUTemperature #Εισαγωγή βιβλιοθήκης για τη μέτρηση της θερμοκρασίας της CPU from time import sleep, strftime, time #Εισαγωγή βιβλιοθήκης χειρισμού χρόνου, συμβολοσειρών import matplotlib.pyplot as plt #Εισαγωγή βιβλιοθήκης γραφικών απεικονίσεων
plt.ion() #Κάνε την γραφική παράσταση αλληλεπιδραστική x = [] y = [] cpu=CPUTemperature() with open("cpu_temp.csv", "a") as log: #Δημιουργία αρχείου καταγραφών while True: temp = cpu.temperature #Καταχώρησε την τιμή της θερμοκρασίας στη μεταβλητή temp y.append(temp) #Καταχώρησε στις τιμές του άξονα y την τρέχουσα θερμοκρασία x.append(time())#Καταχώρησε στις τιμές του άξονα x την τρέχουσα ημερομηνία/ώρα plt.clf()
75
plt.scatter(x,y) plt.plot(x,y) plt.draw() log.write("{0},{1}\n".format(strftime("%d-%m-%Y %H:%M:%S"),str(temp)))#Γράψε στο αρχείο καταγραφών τα ζεύγη ημερομηνίας/ώρας-θερμοκρασίας sleep(1)#Περίμενε 1 δευτερόλεπτο για την επόμενη καταγραφή Τρέξτε το αρχείο αφού πρώτα το αποθηκεύσετε μέσα στο φάκελο cputemp, με την ονομασία:cputemp.py Θα δείτε να ανοίγει ένα παράθυρο και μέσα σε αυτό θα αρχίσει να σχηματίζεται η γραφική παράσταση θερμοκρασίας – χρόνου, η οποία θα μεταβάλλεται διαρκώς, καθώς θα εμπλουτίζεται με νέες τιμές που θα καταγράφονται και στο αρχείο καταγραφών. Ανοίξτε ένα παράθυρο Terminal και πληκτρολογήστε: sudo leafpad cpu_temp.csv Θα ανοίξει το αρχείο καταγραφών στο οποίο θα μπορείτε να διαβάσετε όλες τις τιμές θερμοκρασίαςχρόνου. Αυτό είναι ένα αρχείο .csv. Αυτά τα αρχεία ανοίγουν και από το Excell στο οποίο θα μπορούσατε να κάνετε την γραφική παράσταση επίσης. Θα τροποποιήσουμε αυτό το αρχείο προκειμένου να πάρει μια πιο οργανωμένη μορφή, με την χρήση συναρτήσεων. Οι συναρτήσεις στην Python είναι κομμάτια επαναλαμβανόμενου κώδικα που εκτελούν μια ενέργεια. Για να μην γράφω τον κώδικα συνέχεια, τον τοποθετώ σε μια συνάρτηση και τον καλώ κάθε φορά που θέλω να εκτελέσω τη συγκεκριμένη εργασία. Οι συναρτήσεις στην Python δηλώνονται με το προσδιοριστικό def <όνομα συνάρτησης>(Όρισμα συνάρτησης). Το όρισμα της συνάρτησης είναι κάποια μεταβλητή που περνάει στη συνάρτηση προκειμένου να χρησιμοποιηθεί στην διαδικασία που εκτελεί η συνάρτηση. Το πρόγραμμα θα γίνει ως εξής: from gpiozero import CPUTemperature from time import sleep, strftime, time import matplotlib.pyplot as plt
cpu = CPUTemperature()
plt.ion() x = [] y = []
76
def write_temp(temp): with open("cpu_temp.csv", "a") as log: log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str(temp)))
def graph(temp): y.append(temp) x.append(time()) plt.clf() plt.scatter(x,y) plt.plot(x,y) plt.draw()
while True: temp = cpu.temperature write_temp(temp) graph(temp) sleep(1) Η συνάρτηση write_temp(temp) παίρνει σαν όρισμα την θερμοκρασία της cpu, ανοίγει το αρχείο καταγραφής με την ονομασία: cpu_temp.csv με την ιδιότητα της προσθήκης. Δηλ. θα μπορούν στο τέλος του αρχείου να προστίθενται νέες γραμμές με τις καινούριες καταγραφές. Οι καταγραφές γίνονται με καθορισμένο τρόπο που καθορίζεται με την εντολή: log.write("{0},{1}\n".format(strftime("%Y-%m%d %H:%M:%S"),str(temp))) Η συνάρτηση graph(temp) δημιουργεί την γραφική παράσταση. Το κυρίως πρόγραμμα είναι μέσα στην δομή επανάληψης while true στο οποίο κάθε φορά καλούνται να εκτελεστούν οι δύο συναρτήσεις, που ορίστηκαν προηγουμένως. Αποθηκεύστε το πρόγραμμα με την ονομασία: cputemp_def.py. Αν το τρέξετε θα δείτε πως εκτελεί τις ίδιες λειτουργίες με προηγουμένως. Θα μπορούσατε να τροποποιήσετε το πρόγραμμα με τέτοιο τρόπο ώστε μόλις η θερμοκρασία της cpu υπερβεί κάποια τιμή, να σας ειδοποιεί στέλνοντάς σας ένα tweet ή να ανάβει ένα προειδοποιητικό led.
77
Εισαγωγή στο Sense Hat Το Sense Hat είναι μια πρόσθετη πλακέτα που «κουμπώνει» πάνω στο RaspberryPi.
Έχει ενσωματωμένους αισθητήρες: ατμοσφαιρικής πίεσης, υγρασίας, θερμοκρασίας. Διαθέτει επιταχυνσιόμετρο, μαγνητόμετρο και γυροσκόπιο. Επίσης έχει ένα panel από led διαστάσεων 8X8 καθώς και ένα μικρό joystick.
Για όσους όμως δεν διαθέτουν Sense Hat υπάρχουν προσομοιωτές στους οποίους μπορείτε να δοκιμάζετε τα προγράμματα που δημιουργείτε. Υπάρχει ένας προσομοιωτής ενσωματωμένος στο λειτουργικό Raspbian. Αυτός είναι ο προσομοιωτής της επιφάνειας εργασίας. Για να τον εγκαταστήσετε ανοίξτε το Terminal και πληκτρολογήστε διαδοχικά και ξεχωριστά τις παρακάτω εντολές:
78
sudo apt-get update sudo apt-get install python-sense-emu python3-sense-emu python-sense-emu-doc sense-emu-tools -y
Κατόπιν στην επιφάνεια εργασίας από το κεντρικό μενού και πατώντας στην επιλογή: Προγραμματισμός, θα δείτε την επιλογή: Sense Hat Emulator. Την επιλέγετε και θα δείτε την παρακάτω εικόνα:
Αυτός είναι ο προσομοιωτής της επιφάνειας εργασίας. Μπορείτε να τον «εξερευνήσετε» μετακινώντας τα sliders της θερμοκρασίας, υγρασίας ή πίεσης ή αυτά του προσανατολισμού. Για όσους δεν θέλουν να χρησιμοποιήσουν την επιφάνεια εργασίας υπάρχει και ένας web προσομοιωτής που τρέχει μέσα από τον φυλλομετρητή σας. Αυτός βρίσκεται στην διεύθυνση: https://trinket.io/sense-hat Από δω και στο εξής δεν έχουμε παρά να ξεκινήσουμε να γράφουμε τα πρώτα Python προγράμματά μας για το Sense Hat. Για όσους θέλουν έναν εύχρηστο οδηγό που θα τους εισάγει στο Sense Hat μπορούν να κάνουν δωρεάν download στο παρακάτω pdf: https://www.raspberrypi.org/magpi-issues/Essentials_SenseHAT_v1.pdf Σε αυτό θα βρείτε πολλά παραδείγματα με κώδικες τους οποίους θα «τρέξουμε» στο εργαστήριο και θα δούμε τα αποτελέσματα στον προσομοιωτή. Δημιουργήστε έναν φάκελο με την ονομασία: sensehat όπου εκεί θα αποθηκεύουμε τα προγράμματα για το sense hat.
79
Αισθητήρας θερμοκρασίας DHT-22 Ένας από τους πιο διαδεδομένους αισθητήρες υγρασίας – θερμοκρασίας είναι ο αισθητήρας DHT-22
Κοστίζει 7,80 ευρώ και είναι η ιδανική επιλογή για να πάρουμε δεδομένα υγρασίας-θερμοκρασίας περιβάλλοντος με το RaspberryPi. Στο εργαστήριο που ακολουθεί, θα φτιάξουμε έναν ανιχνευτή θερμοκρασίας – υγρασίας περιβάλλοντος και θα παρακολουθούμε τις γραφικές παραστάσεις θερμοκρασίας-χρόνου και υγρασίας-χρόνου σε ζωντανό χρόνο από το διαδίκτυο. Η συνδεσμολογία που πρέπει να κάνουμε είναι η παρακάτω: Ο αισθητήρας έχει 4 ακροδέκτες. Ο πρώτος αριστερά συνδέεται στα 3,3 V. Τον δεύτερο ακροδέκτη θα τον συνδέσουμε με το pin 18. Ο τέταρτος ακροδέκτης γειώνεται. Προσέξτε να υπάρχει οπωσδήποτε μια αντίσταση 10KΩ ανάμεσα στον πρώτο και δεύτερο ακροδέκτη. Αφού κάνετε την σύνδεση και βεβαιωθείτε πως όλα είναι όπως πρέπει εκκινήστε το RaspberryPi.
80
Ανοίξτε το Terminal και πληκτρολογήστε: sudo apt-get install git git clone https://github.com/adafruit/Adafruit_Python_DHT.git Με αυτόν τον τρόπο κατεβάζουμε στον υπολογιστή μας τις βιβλιοθήκες python για τον αισθητήρα. Κατόπιν πληκτρολογήστε: cd Adafruit_Python_DHT sudo python setup.py install Με την τελευταία εντολή εγκαθιστούμε τις βιβλιοθήκες αυτές στο RaspberryPi. Δεν απομένει παρά να γράψουμε τον κώδικα με τον οποίο θα συλλέγουμε δεδομένα από τον αισθητήρα. Τα δεδομένα αυτά θα πρέπει να τα μεταβιβάζουμε σε κάποιον server στο διαδίκτυο, προκειμένου να έχουμε πρόσβαση από οπουδήποτε. Για τον λόγο αυτό ανοίξτε τον φυλλομετρητή σας και μεταβείτε στην διεύθυνση: https://thingspeak.com/users/sign_up Πρόκειται για μια ελεύθερης χρήσης διαδικτυακή πλατφόρμα συλλογής και επεξεργασίας δεδομένων. Θα πρέπει να ακολουθήσουμε την διαδικασία εγγραφής συμπληρώνοντας τα παρακάτω στοιχεία:
81
Αφού ολοκληρώσετε την εγγραφή σας θα πρέπει να δημιουργήσετε ένα νέο κανάλι. Επιλέξτε: Channells -> MyChannels-> New Channel Συμπληρώστε στα πεδία που θα σας ζητήσει τα παρακάτω:
Μόλις δημιουργηθεί το κανάλι πατήστε το TAB που λέει «API KEYS». Εκεί θα βρείτε το WRITE API KEY. Σημειώστε το γιατί θα το χρειαστούμε. Μέσα από το Terminal πληκτρολογήστε: mkdir thingspeak
/Δημιουργία φακέλου
cd thingspeak
/Μετάβαση στον φάκελο
sudo leafpad dht22.py
/Άνοιγμα του dht22.py
Μέσα στο dht22.py πληκτρολογήστε τα εξής: """ dht22.py Temperature/Humidity monitor using Raspberry Pi and DHT22. Data is displayed at thingspeak.com Original author: Mahesh Venkitachalam at electronut.in Modified by Adam Garbo on December 1, 2016 """ import sys import RPi.GPIO as GPIO from time import sleep import Adafruit_DHT import urllib2
82
myAPI = "<your API code here>" def getSensorData(): RH, T = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 18) return (str(RH), str(T)) def main(): print 'starting...' baseURL = 'https://api.thingspeak.com/update?api_key=%s' % myAPI while True: try: RH, T = getSensorData() f = urllib2.urlopen(baseURL + "&field1=%s&field2=%s" % (RH, T)) print f.read() f.close() sleep(300) #uploads DHT22 sensor values every 5 minutes except: print 'exiting.' break # call main if __name__ == '__main__': main() Προσέξτε μέσα στην μεταβλητή myAPI = "<your API code here>" , μέσα στα εισαγωγικά να πληκτρολογήσετε το WRITE API KEY που είχατε σημειώσει προηγουμένως. Αποθηκεύστε το αρχείο και τρέξτε το μέσα από το Terminal πληκτρολογώντας: sudo python dht22.py Το αρχείο τρέχει και καταγράφει τιμές θερμοκρασίας-υγρασίας κάθε πέντε λεπτά. Αν θέλετε να μεταβάλλεται το χρονικό διάστημα καταγραφής π.χ. αντί για 5 λεπτά να το κάνετε δύο λεπτά θα πρέπει στο αρχείο dht22.py να αλλάξετε την τιμή στην εντολή sleep της παρακάτω γραμμής: sleep(300) #uploads DHT22 sensor values every 5 minutes
83
Για να γίνει δύο λεπτά πληκτρολογήστε sleep(120)
Μέσα από τον browser συνδεθείτε στην τoποθεσία thingspeak και θα πρέπει να δείτε τα διαγράμματα στο κανάλι σας. Θα δείτε μια εικόνα όπως η παρακάτω:
Για να γίνουν ορατές οι αυξομειώσεις θερμοκρασίας – υγρασίας θα μπορούσατε να ανοίξετε ή να κλείσετε τον κλιματισμό στο δωμάτιο που έχετε τον αισθητήρα και να δείτε τις αντίστοιχες τιμές να μεταβάλλονται. Το πρόγραμμα τερματίζεται με ctrl-c.
84
ΔΙΚΤΥΩΝΟΝΤΑΣ ΤΑ RASPBERRYPI Ας προσπαθήσουμε να φτιάξουμε ένα δίκτυο με τα RaspberryPi του εργαστηρίου μας. Το δίκτυο αυτό θα είναι τοπικό. (L.A.N – Local Area Network). Κάθε φορά που συνδέουμε το RaspberryPi στο internet ο router του αναθέτει διαφορετική ip διεύθυνση. Εμείς θα ρυθμίσουμε το δίκτυο ώστε το κάθε RaspberryPi να έχει μια στατική ip.
Απόδοση στατικής ip στο RaspberryPi Ανοίξτε το Terminal και πληκτρολογήστε: sudo leafpad /etc/dhcpcd.conf Στο τέλος του αρχείου που άνοιξε, προσθέστε: interface eth0
static ip_address=192.168.0.2/24 static routers=192.168.0.1 static domain_name_servers=192.168.0.1
interface wlan0
static ip_address=192.168.0.2/24 static routers=192.168.0.1 static domain_name_servers=192.168.0.1 Όπως βλέπετε το router έχει ip=192.168.0.1 και στο RaspberryPi αποδώσατε την ip=192.168.0.2 τόσο αν συνδεθείτε με Ethernet καλώδιο όσο και ασύρματα. Κάθε φορά που θα επανεκκινείτε το RaspberryPi θα παίρνει αυτήν την διεύθυνση ip. Φυσικά το κάθε RaspberryPi θα έχει την δική του. Δηλ. το ένα θα έχει: 192.168.02, το επόμενο 192.168.0.3 κοκ. Καλό θα ήταν να κολλήσετε ένα χαρτάκι post-it στην θέση που κάθεστε ώστε να θυμάστε την ip του RaspberryPi σας. Γενικά, δεν θέλουμε να υπάρχει στατική ip. Γι’ αυτό αν θέλετε να επαναφέρετε τη ρύθμιση σε δυναμική ip, ανοίγετε με τον ίδιο τρόπο το παραπάνω αρχείο και σβήνετε τις γραμμές που προσθέσατε. Ας υποθέσουμε λοιπόν ότι έχουμε δύο RaspberryPi με static ip’s: 192.168.0.2 και 192.168.0.3 αντίστοιχα.
85
Ανταλλάσσοντας μηνύματα μέσω Ethernet Συνδέστε τα δύο RaspberryPi με ένα Ethernet καλώδιο. Από το RaspberryPi με την ip 192.168.0.2 ανοίξτε ένα Terminal και πληκτρολογήστε: ping 192.168.0.3 –c5 Αυτή είναι είναι μια εντολή που επιτρέπει σε έναν χρήστη να επαληθεύσει την ύπαρξη μιάς συγκεκριμένης ip και αν αυτή μπορεί να δεχτεί αιτήματα. Το –c5 δηλώνει πως τα μηχανήματα είναι συνδεδεμένα με καλώδιο τύπου cat-5, το γνωστό μας Ethernet καλώδιο. Αυτό που θα σας επιστρέψει η εντολή αυτή είναι κάτι τέτοιο: PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_req=1 ttl=128 time=3.46 ms [...four more PINGs ...]
--- 192.168.0.3 ping statistics --5 packets transmitted, 5 received, 0% packet loss, time 4007ms rtt min/avg/max/mdev = 3.466/3.788/4.380/0.322 ms Αν δεν σας επιστρέψει απάντηση, ελέγξτε την σύνδεση με το καλώδιο ή αν έγινε κάποιο λάθος στην πληκτρολόγηση και ξαναπροσπαθήστε. Αν όλα είναι εντάξει ανοίξτε το Terminal και στα δύο RaspberryPi και πληκτρολογήστε: sudo leafpad chat.py Μέσα στον editor πληκτρολογήστε: # A simple internet-chat application import network import sys def heard(phrase): print("them:" + phrase) if (len(sys.argv) >= 2): network.call(sys.argv[1], whenHearCall=heard) else: network.wait(whenHearCall=heard)
86
while network.isConnected(): #phrase = raw_input() #python2 phrase = input() # python3 print("me:" + phrase) network.say(phrase) Αποθηκεύστε και κλείστε τον leafpad editor. Από το RaspberryPi με την διεύθυνση 192.168.0.2 πληκτρολογήστε στο Terminal: python3 chat.py για να τρέξει το πρόγραμμα. Με αυτόν τον τρόπο ορίζετε αυτόν τον υπολογιστή ως server. Από το Terminal του άλλου RaspberryPi πληκτρολογήστε: python3 chat.py 192.168.0.2 Με αυτόν τον τρόπο «τρέχετε» το πρόγραμμα και δηλώνετε πως ο server είναι το μηχάνημα με ip .0.2 Από εδώ και μπρος και για όσο τρέχει το πρόγραμμα, ο,τι πληκτρολογεί ο ένας εμφανίζεται ως μήνυμα στον άλλο.
Σύνδεση RaspberryPi με Windows PC/LAPTOP Δεν είναι κουραστικό κάθε φορά που θέλετε να ανοίξετε το RaspberryPi να πρέπει να το συνδέσετε με οθόνη, πληκτρολόγιο και ποντίκι; Θα πρέπει να έχετε τις τρείς αυτές συσκευές διαθέσιμες συνέχεια ή να τις αποσυνδέετε από το pc σας και μετά να τις επανασυνδέετε σε αυτό. Τι θα λέγατε αν συνδέαμε το RaspberryPi με το pc μας και κάθε φορά που θα το ανοίγουμε να συνδέουμε μόνο την τροφοδοσία και να το «ελέγχουμε» από το pc ή το laptop μας; Ας δούμε πώς γίνεται. Αρχικά συνδέστε κανονικά το RaspberryPi με οθόνη πληκτρολόγιο και ποντίκι και ανοίξτε το. Στο Terminal πληκτρολογήστε: sudo apt install -y tightvncserver Αφού ολοκληρωθεί η εγκατάσταση, πληκτρολογήστε: sudo apt install -y xrdp Αφού και αυτή η εγκατάσταση ολοκληρωθεί, πληκτρολογήστε: sudo apt-get -y install samba Μόλις εγκατασταθεί το samba πηγαίνετε στο laptop σας και ανοίγοντας την γραμμή εντολών πληκτρολογήστε: ping raspberrypi
87
αν το όνομα του RaspberryPi σας είναι raspberrypi. Αν η εγκατάσταση του samba είχε γίνει επιτυχώς θα πρέπει και η εντολή ping να σας επιστρέψει επιτυχές αποτέλεσμα. Άρα σιγουρευτήκαμε ότι το laptop μας «βλέπει» το RaspberryPi μας. Κατόπιν στο laptop και πατώντας το εικονίδιο των windows στα Βοηθήματα των Windows θα επιλέξετε την επιλογή: «Απομακρυσμένη Σύνδεση Εργασίας». Στο πλαίσο computer συμπληρώστε το όνομα που έχει το RaspberryPi σας και τίποτε άλλο. Κατόπιν επιλέξτε το Tab Display και ρυθμίστε το σε Full screen και μετά πατήστε connect.
Μόλις πατήσετε connect θα δείτε την παρακάτω εικόνα:
Εισάγετε τα διαπιστευτήριά σας και πατήστε ΟΚ. Θα δείτε στην οθόνη του laptop σας την επιφάνεια εργασίας του RaspberryPi και θα μπορείτε να ανοίγετε προγράμματα κανονικά σα να δουλεύετε απ’ ευθείας στο RaspberryPi.
88
Κλείστε κανονικά το RaspberryPi και αποσυνδέστε οθόνη και πληκτρολόγιο. Ανοίξτε χωρίς οθόνη και πληκτρολόγιο το RaspberryPi. Περιμένετε λίγη ώρα να σβήσει το πράσινο φωτάκι που αναβοσβήνει και από το laptop πατήστε την Απομακρυσμένη Σύνδεση Εργασίας. Επαναλάβατε όπως πριν και θα έχετε συνδεθεί στο RaspberryPi από το laptop σας. Άρα πλέον δεν χρειάζεστε οθόνη και πληκτρολόγιο παρά μόνο το laptop και το RaspberryPi.
Διαμοιρασμός αρχείων μεταξύ laptop-RaspberryPi Θα ρυθμίσουμε τον διαμοιρασμό αρχείων ανάμεσα στο windows laptop και το RaspberryPi. Με αυτόν τον τρόπο θα μπορούμε πολύ εύκολα, με drag and drop, να μεταφέρουμε και να αντιγράφουμε φακέλους και αρχεία από το laptop στο RaspberryPi και αντίστροφα. Ανοίξτε το Terminal του RaspberryPi και πληκτρολογήστε: mkdir ~/share Έτσι δημιουργείτε ένα φάκελο με το όνομα share. Κατόπιν πληκτρολογήστε: sudo leafpad /etc/samba/smb.conf & Με αυτόν τον τρόπο ανοίγουμε το αρχείο ρυθμίσεων του samba. Στο τέλος του αρχείου αυτού προσθέστε τα παρακάτω: [PiShare] comment=Raspi Share path=/home/pi/share browseable=Yes writeable=Yes only guest=No create mask=0740 directory mask=0750 public=no Αποθηκεύστε και κλείστε το leafpad. Το Raspbian θα επανεκκινήσει το samba, στο παρασκήνιο, με τις νέες ρυθμίσεις. Τώρα θα επιστρέψουμε στο Terminal για να δημιουργήσουμε ένα νέο χρήστη στο samba, προκειμένου να συνδεόμαστε με ασφάλεια απ’ τα windows. Θα δημιουργήσουμε τον χρήστη με το όνομα pi. Θυμηθείτε πως και στο Raspbian το όνομα του χρήστη είναι pi. Ο χρήστης pi του samba δεν έχει καμμιά σχέση με τον χρήστη pi του Raspbian. Για να δημιουργήσουμε τον χρήστη pi στο samba πληκτρολογούμε στο Terminal: sudo smbpasswd -a pi
89
Μόλις πατήσετε enter θα σας ζητηθεί να ορίσετε ένα password και να το επαληθεύσετε. Σημειώστε αυτό το password γιατί θα το χρειαστείτε σε λίγο. Πηγαίνετε στο windows pc ή laptop και πατήστε τα πλήκτρα windows-R. Θα ανοίξει το παράθυρο Εκτέλεση των windows
Μέσα στο πλαίσιο πληκτρολογήστε \\ και το hostname του RaspberryPi, όπως το είχατε ορίσει στη σελίδα 11. Π.χ. αν το hostname είναι raspberrypi πληκτρολογήστε: \\raspberrypi και πατήστε ΟΚ. Θα σας ζητηθεί username και password. Στο username πληκτρολογήστε: raspberrypi\pi, αν φυσικά το hostname είναι raspberrypi. Στο password πληκτρολογήστε το password του samba user που σημειώσατε προηγουμένως. Κατόπιν ανοίξτε τον Windows Explorer και επιλέγοντας: Αυτός ο υπολογιστής πατήστε την επιλογή: Αντιστοίχιση δίσκου δικτύου.
90
Θα δείτε την παρακάτω εικόνα:
Στο πεδίο Μονάδα δίσκου γράψτε όποιο γράμμα επιθυμείτε και δεν αντιστοιχεί ήδη σε δίσκο του συστήματός σας. Το P: είναι μια καλή επιλογή. Στο πεδίο Φάκελος γράψτε το hostname του RaspberryPi π.χ. \\raspberrypi\PiShare. Τσεκάρετε το τετραγωνάκι: Επανασύνδεση κατά την είσοδο Και πατήστε Τέλος. Θα σας ζητήσει τα διαπιστευτήριά σας. Γράψτε το password του samba user και μην ξεχάσετε να επιλέξετε το τετραγωνάκι Remember my credentials. Πατήστε Οκ. Τώρα πλέον στο αριστερό τμήμα του explorer θα έχει προστεθεί και το γράμμα: P μαζί με τους άλλους δίσκους του συστήματός σας. Κάθε φορά που θα έχετε ανοιχτό το RaspberryPi θα μπορείτε να βλέπετε τα αρχεία που έχει ο φάκελος share του RaspberryPi. Αν μέσα στον εικονικό δίσκο P των windows που μόλις δημιουργήσατε δημιουργήσετε έναν φάκελο, αυτός ο φάκελος θα φανεί κατευθείαν και μέσα στο φάκελο share του RaspberryPi.
91
ΠΗΓΕΣ https://www.raspberrypi.org/resources/learn/ https://www.raspberrypi.org/learning/using-pip-on-windows/ https://www.raspberrypi.org/learning/noobs-install/worksheet/ https://www.pcsteps.gr/52828-%CF%84%CE%B9%CE%B5%CE%AF%CE%BD%CE%B1%CE%B9-%CF%84%CE%BF-raspberry-pi/ http://linuxcommand.org/index.php https://www.raspberrypi.org/learning/demo-programs/ https://projects.raspberrypi.org/en/projects/physical-computing https://www.raspberrypi.org/learning/getting-started-with-the-twitter-api/ https://www.raspberrypi.org/learning/fetching-the-weather/ https://www.raspberrypi.org/learning/mapping-the-weather/ https://www.raspberrypi.org/learning/graphing-the-weather/ https://www.raspberrypi.org/learning/people-in-space-indicator/ http://4dimkal-robot.weebly.com/chirhoetasigmaiotamuomicronpiomicroniota974nutaualphasigmafbreadboard.html https://www.raspberrypi.org/learning/teachers-guide/ https://gpiozero.readthedocs.io/en/stable/ https://www.raspberrypi.org/learning/python-web-server-with-flask/ http://randomnerdtutorials.com/raspberry-pi-web-server-using-flask-to-control-gpios/ http://thisdavej.com/solution-for-cant-ping-raspberry-pi-hostname-on-the-network/ https://www.hackster.io/adamgarbo/raspberry-pi-2-iot-thingspeak-dht22-sensor-b208f4 http://thisdavej.com/beginners-guide-to-installing-node-js-on-a-raspberry-pi/ https://ngrok.com/ https://www.samba.org/samba/what_is_samba.html https://www.raspberrypi.org/learning/networking-lessons/ https://openhomeautomation.net/control-a-relay-from-anywhere-using-the-raspberry-pi https://www.python.org/ https://www.raspberrypi.org/blog/desktop-sense-hat-emulator/
92
https://www.raspberrypi.org/learning/getting-started-with-the-sense-hat/
https://www.raspberrypi.org/learning/turing-test-lessons/ https://www.raspberrypi.org/learning/temperature-log/
93