You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
14 KiB
215 lines
14 KiB
= Smart & Autonomous Parking
|
|
|
|
*_Authors_*
|
|
|
|
|===
|
|
|
|
| Ουλής Ευάγγελος | cs151051@uniwa.gr
|
|
|
|
| Ουλής Νικόλαος | cs161079@uniwa.gr
|
|
|
|
| Κατσίμπρας Δρόσος| cs131110@uniwa.gr
|
|
|
|
|===
|
|
|
|
// Metadata:
|
|
:description: IoT Εφαρμογή Smart & Autonomous parking
|
|
:keywords: IoT, parking, smart-parking, autonomous parking
|
|
:data-uri:
|
|
:toc: right
|
|
:toc-title: Πίνακας Περιεχομένων
|
|
:toclevels: 4
|
|
:source-highlighter: highlight
|
|
:icons: font
|
|
:sectnums:
|
|
|
|
== Smart Parking
|
|
Το "Smart Parking" Έξυπνο πάρκινγκ βασίζεται στη διαδικασία όπου η κατάσταση του πάρκινγκ κοινοποιείται
|
|
μέσω ενός συνόλου hardware και software στο διαδίκτυο έτσι ώστε να πετυχουμε η κατάσταση του να είναι διαθέσιμη
|
|
"accesable" από το διαδίκτυο. Αυτό το χαρακτηριστικό κάνει αυτό το αντικειμένο μέρος του διαδικτύου και του κόσμου του IoT.
|
|
|
|
*Η υλοποίηση του Smart Parking χωρίζεται σε 4 βασικά μέρη:*
|
|
|
|
* Το 1~ο~ μέρος αποτελείται από ένα σύνολο αισθητήρων (ultrasonic) που εγκαθιστούντε σε κάθε θέση parking (sensor) και
|
|
έναν μικροελεγκτή (Arduino Uno), έτσι ώστε να ανιχνεύει και να κωδικοποιεί για μία συγκεκριμένη θέση έαν υπάρχει
|
|
κάποιο όχημα ή όχι.
|
|
|
|
* Το 2~ο~ μέρος αποτελείται από τον συσκευή gateway σε Raspberry Pi1, η οποία διαβάζει στη σειριακή του
|
|
τη πληροφορία από το Arduino Uno, που κάνει "sense" μία θέση parking, και στέλνει αυτή την πληροφορία
|
|
σε έναν web server με χρήση REST API.
|
|
|
|
* To 3~o~ μέρος αποτελείται από τον WEB Server ο οποίος αποτελείται από ένα process γραμμένο σε python. Το proccess αυτό υλοποιεί
|
|
έναν REST API WEB Server έτσι ώστε να μπορεί να αποθηκεύει την κατάσταση κάθε θέσης parking σε μία δομή λίστας με χαρακτηριστικό
|
|
κλειδί τον κωδικό κάθε θέσης parking.
|
|
|
|
* Το 4~o~ μέρος αποτελείται από την διεπαφή χρήστη (Interface), η οποία μέσω WEB σελίδας βλέπει κανείς την κατάσταση
|
|
του parking, δηλαδή πόσες και ποιές θέσεις μέσα στον χώρο είναι ελεύθερες.
|
|
|
|
=== Parking Sensor Node (1~ο~ μέρος)
|
|
|
|
==== Υλικά Κόμβου
|
|
* 1 x Arduino Uno
|
|
* 1 x Red led
|
|
* 1 x Blue led
|
|
* 8 x links
|
|
* 1 x Ultrasonic Sensor
|
|
|
|
==== Υλοποίηση του Parking Sensor
|
|
Σε κάθε θέση parking υπάρχει ένας κόμβος που αποτελείται από ένα Arduino Uno και έναν αισθητήρα
|
|
απόστασης (ultrasonic) εγκατεστημένος πάνω σε μικροελεγκτή Arduino Uno. Η λειτουργία αυτού βασίζεται στη
|
|
μέτρηση της απόστασης από τον κόμβο μέχρι κάποιο αντικείμενο (πιθανό αυτοκίνητο) που εμποδίζει τη θέση του parking,
|
|
καθώς και την εξαγωγή της κατάσταασης αντίστοιχης θέσης στη σειριακή θύρα του Arduino.
|
|
|
|
[.float-group]
|
|
--
|
|
[.left]
|
|
.Ο κόμβος αντιλαμβάνεται παρουσία οχήματος στη θέση.
|
|
image::Photos/arduino1.jpg[300,200]
|
|
|
|
.Ο κόμβος αντιλαμβάνεται κενή θέση.
|
|
[.right]
|
|
image::Photos/arduino2.jpg[300,200]
|
|
--
|
|
|
|
Ο κόμβος διαθέτει επιπλέον δύο leds ένα κόκκινο και ένα μπλε, σαν έξοδο της κατάστασης
|
|
της θέσης του parking για τον οποίο είναι υπεύθυνος. Με κόκκινο χαρακτηρίζεται η θέση που είναι
|
|
δεσμευμένη από ένα όχημα και με μπλε η ελεύθερη θέση, όπως φαίνεται στις παραπάνω εικόνες.
|
|
|
|
==== Λειτουργία του Parking Sensor
|
|
Κάθε κόμβος στέλνει στην σειριακή του τον κωδικό της θέσης, με τον οποίο έχει προγραμματιστεί το Arduino,
|
|
και την κατάσταση του parking, κωδικοποιημένα με τον διαχωριστή "#". Για την κατάσταση του parking ορίζουμε
|
|
με "1" ότι η θέση είναι ελεύθεση και με "0" ότι η θέση είναι δεσμευμένη. Ο έλεγχος του sensor γίνεται κάθε
|
|
500ms. Η έξοδος στη σειριακή γίνεται με την μορφή ενός string.
|
|
|
|
<κωδικός θέσης>#<διαθεσιμότητα 0 ή 1>
|
|
|
|
==== Διασύνδεση Κόμβου
|
|
Ο κόμβος αυτός συνδέεται με ένας "Gateway" κόμβο (βασισμένος σε Raspberry Pi) ο οποίος είναι υπεύθυνος για την
|
|
μετάδοση της πληροφορίας που αφορά την διαθεσιμότητα της θέσης του parking στο διαδίκτυο. Η πληροφορία αυτή
|
|
λαμβάνεται στον "Gateway" κόμβο ο οποίος στη συνέχεια την αποκωδικοποιεί και την αποστέλει στον WEB server μέσω του διαδικτύου.
|
|
|
|
|
|
=== Gateway Node (2~ο~ μέρος)
|
|
|
|
==== Υλικά Κόμβου
|
|
* 1 x Raspberry Pi 1
|
|
* 1 x Serial Link (Connects to Arduino)
|
|
* 1 x Power Link (Micro Usb)
|
|
* 1 x micro SD (Loaded with Raspbian OS)
|
|
* 1 x Ethernet Link (Connects to nearest Network)
|
|
|
|
==== Υλοποίηση και Προγραμματισμός
|
|
Η υλοποίηση αποτελείται από την εγκατάσταση του Raspbian OS στο Raspberry και τη δημιουργία ενός proccess
|
|
σε γλώσσα Python. Το process αυτό διαβάζει από την σειριακή θύρα του την πληροφορία που λαμβάνει από το αντίστοιχο Arduino Uno με
|
|
την μορφή <κωδικός θέσης>#<διαθεσιμότητα 0 ή 1>. Ύστερα αποκωδικοποιεί αυτή την πληροφορία η οποία περιγράφει τον κωδικό της θέσης
|
|
και την διαθεσιμότητα της και την αποστέλει μέσω ενός REST API με την μέθοδο POST σε έναν WEB Server. Τα δεδομέμα μας σε αυτήν
|
|
την επικοινωνία παίρνουν μία μορφή JSON (JavaScript Object Notation).
|
|
|
|
==== Διασύνδεηση στο Διαδίκτυο
|
|
Ο κόμβος Gateway έχει διασύνδεση με το διαδίκτυο μέσω ενός καλωδίου Ethernet (UTP) έτσι ώστε να μπορέσει
|
|
να στείλει την πληροφορία στο διαδίκτυο.
|
|
|
|
|
|
== Server Node (3~ο~ μέρος - Κεντρικός Server όπου κρατά την κατάσταση της κάθε θέσης του Parking)
|
|
Ο κόμβος αυτός υλοποιεί ένα process γραμμένο σε γλώσσα προγραμματισμού Python 3. Αυτό το process εκτελεί ένα
|
|
REST API έτσι ώστε να μπορούν να επικοινωνούν εύκολα πολλοί Gateway κόμβοι. Στην είσοδό του και στην έξοδό του
|
|
τα δεδομένα μας έχουν την μορφή JSON.
|
|
|
|
Ο server αποθηκεύει όλα τα απαραίτητα δεδομένα σε μία Βάση δεδομένων MySQL, η οποία διαθέτει ένα πίνακα.
|
|
Ο πίνακας κρατά όλα τα απαραίτητα πεδία που είναι:
|
|
|
|
* Τον κωδικό της θέσης parking
|
|
* Την διαθεσιμότητά της αντίστοιχης θέση (0 ή 1)
|
|
|
|
=== Εκτέλεση του Process στο Cloud
|
|
Για την εκτέλεση του process χρησιμοποιούμε μία πλατφόρμα IAAS (Infrastructure as a Service) ονόματι
|
|
link:++https://www.heroku.com/platform++[Heroku], για την οποιά μπορούμε να βρούμε περεταίρω πληροφορίες στον σύνδεσμο
|
|
παραπάνω.
|
|
|
|
[.float-group]
|
|
--
|
|
[.center]
|
|
.Describe Infrastructure as a Service as an example.
|
|
image::Photos/itops-pizza_as_a_service.png[1000,800]
|
|
--
|
|
|
|
Για την διαδικασία του deployment εκτελούμε ένα σύνολο βημάτων τα οποία αποτελούνται από την αντιγραφή του κώδικα
|
|
σε ένα reposetory του link:++https://github.com/oulievancs/serverNode++[GitHub] και την δημιουργία ενός project στην πλατφόρμα για το
|
|
τρέξιμο του process. link:++https://stackabuse.com/deploying-a-flask-application-to-heroku/++[περισσότερα]. Ακόμα
|
|
εγκαθισούμε στο project που μόλις φτιάξαμε μία MySQL βάση δεδομένων για να μπορούμε να αποθηκεύσουμε τα δεδομένα μας.
|
|
|
|
==== Deployment
|
|
* Το πρώτο πράγμα που χρειαζόμαστε είναι όλες οι απαραίτητες βιβλιοθήκες που χρησιμοποιεί ο κώδικας, έτσι
|
|
ώστε να γνωρίζει το Heroku τι να μας προσφέρει. Αυτό επιτυγχάνεται με την αρχειοθέτηση αυτών σε ένα αρχείο
|
|
ονόματι requirements.txt .
|
|
|
|
* Έπειτα την δημιουργία ενός αρχείου που περιγράφει το που βρίσκεται η κύρια συνέρτησή μας (main) για την
|
|
έναρξη του process. Αυτό το αρχείο ονομάζεται Procfile . Στο αρχείο αυτό αναφέτεται ένα gunicorn module.
|
|
Ο gunicorn είναι ένας Python HTTP WEB server. Αυτό ουσιαστικά είναι ο ο πυρήνας για την εκτέλεση του API μας.
|
|
|
|
* Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης γαίνονται στο Heroku,
|
|
πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση.
|
|
|
|
==== REST API
|
|
Το REST API ουσιαστικά σηκώνει δύο υπηρεσίες. Αυτές είναι:
|
|
|
|
* / [GET]: που πας επιστρέφει για κάθε θέση του parking αν είναι διαθέσιμη ή όχι κωδικοποιημένα με 0 ή 1.
|
|
Στο response τα δεδομένα μας παίρνουν μορφή JSON. Τα δεδομένα που επιστρέφει γίνονται fetch από τη βάση δεδομένων.
|
|
|
|
* /parkingStatus [POST]: που μας επιτρέπει να αλλάξουμε την κατάσταση μίας θέσης parking. Το POST των δεδομένων
|
|
στο body γίνεται με την JSON αναπαράστασή τους έτσι ώστε να μπορέσει ο Server να τα επεξεργαστεί, ο οποίος στη
|
|
συνέχεια αποθηκεύει την νέα θέση στη Βάση δεδομένων.
|
|
|
|
|
|
== Διεπαφή Χρήστη (4~ο~ μέρος)
|
|
Η διεπαφή του χρήσρη π
|
|
|
|
|
|
== Autonomous Parking
|
|
Το αυτότομο πρκάριμα αποτελείται από το όχημα με εκατεστημένους τους απάραίτητους αισθητήρες και ελεγκτές
|
|
καθός και έναν μικροελεγκτή (Arduino) για τον έλεγχο αυτών των ελεγκτών. Σκοπός είναι το όχημα να μπορεί
|
|
να μάθει μέσω του διαδικτύου το "Status" του parking και να παρκάρει στην 1η διαθέσιμη θέση εφ' όσων
|
|
υπάρχει μία τουλάχιστων διαθέσιμη θέση στον χώρο στάθμευσης.
|
|
|
|
*Η υλοποίηση του αυτόνομου parking χωρίζεται σε δύο βασικά μέρη.*
|
|
|
|
* Το 1~ο~ μέρος αποτελείται από τον μικροελεγκτή για τον έλεγχο των αισθητήρων και των κινητήρων του οχήματος και
|
|
εκτελώντας τα απαραίτητα βήματα, να μπορέσει να παρκάρει το όχημα.
|
|
|
|
* Το 2~ο~ μέρος αποτείται από τον κόμβο ο οποίος θα έχει πρόσβαση στο διαδίκτυο, όπου αφού ελέγξει αν υπάρχει
|
|
διαθέσιμη θέση και γνωρίζει ποια είναι η πρώτη ελεύθερη θέση, να δώσει εντολή στον μικροελεγκτή να παρκάρει σε αυτή.
|
|
|
|
=== Microcotroller and Car
|
|
|
|
==== Υλικά Κόμβου
|
|
* 1 x Arduino Uno
|
|
* 1 x Servo Motor
|
|
* 1 x Motor Driver
|
|
* 4 x Moter για τους 4 τροχούς
|
|
* 1 x Ultrasonic
|
|
* 1 x 9V Battery
|
|
* 1 x 4,8V Battery
|
|
* 1 x Car
|
|
* 1 x Raspberry Pi
|
|
|
|
==== Υλοποίηση και Προγραμματισμός
|
|
Ο motor driver, το Servo motor καθώς και ο Ultrasonic αισθητήρας κουμπώνουν στον μικροελεγκτή Arduino Uno που χρησιμοποιούμε,
|
|
τον οποίο τον εγκαθηστούμε πάνω στο καλούπι του οχήματος το οποίο έχει εγκατεστημένα 4 τροχούς. Οι τροχοί οδηοούνται από 4 moters
|
|
τα οποία τροφοδοτούνται από τον motor driver.
|
|
|
|
Η συνδεσμολογία έχει την διάταξη που παρουσιάζεται παρακάτω:
|
|
|
|
[.float-group]
|
|
--
|
|
[.center]
|
|
.Συνδεσμολογία moter, motor driver, arduino, ultrasonic sensor και servo motor.
|
|
image::Photos/diagram.png[1000,800]
|
|
--
|
|
|
|
|
|
|
|
.Reminder
|
|
[NOTE]
|
|
|
|
SLOW SUCCESS BUILDS CHARACTER, FAST SUCCESS BUILDS EGO.
|
|
|
|
|