Smart and Autonomous parking.
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.
 
 
 

261 lines
17 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), έτσι ώστε να ανιχνεύει και να κωδικοποιεί για μία συγκεκριμένη θέση έαν υπάρχει
κάποιο όχημα ή όχι.
.Φάκελος Κώδικα
[NOTE]
====
https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/sensorNode/sensorNode.ino
====
* Το 2~ο~ μέρος αποτελείται από τον συσκευή gateway σε Raspberry Pi1, η οποία διαβάζει στη σειριακή του
τη πληροφορία από το Arduino Uno, που κάνει "sense" μία θέση parking, και στέλνει αυτή την πληροφορία
σε έναν web server με χρήση REST API.
.Φάκελος Κώδικα
[NOTE]
====
https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/gatewayNode
====
* To 3~o~ μέρος αποτελείται από τον WEB Server ο οποίος αποτελείται από ένα process υλοποιημένο σε γλώσσα προγραμματιμού python.
Το proccess αυτό υλοποιεί έναν REST API WEB Server έτσι ώστε να μπορεί να αποθηκεύει την κατάσταση κάθε θέσης parking σε μία βάση
δεδομένων δύο δομή λίστας με χαρακτηριστικό κλειδί τον κωδικό κάθε θέσης parking.
.Φάκελος Κώδικα
[NOTE]
====
https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/serverNode
====
* Το 4~o~ μέρος αποτελείται από την διεπαφή χρήστη (Interface), η οποία μέσω WEB σελίδας βλέπει κανείς την κατάσταση
του parking, δηλαδή πόσες και ποιές θέσεις μέσα στον χώρο είναι ελεύθερες.
.Φάκελος Κώδικα
[NOTE]
====
https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/webInterface
====
=== 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) ο οποίος είναι υπεύθυνος για την
μετάδοση της πληροφορίας στο διαδίκτυο. Η πληροφορία αυτή λαμβάνεται στον "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) or WiFi adapter
==== Υλοποίηση και Προγραμματισμός
Η υλοποίηση αποτελείται από την εγκατάσταση του Raspbian OS (light version) στο Raspberry και τη δημιουργία ενός proccess
σε γλώσσα Python (v3). Το process αυτό διαβάζει από την σειριακή θύρα του την πληροφορία που λαμβάνει από ένα Arduino Uno με
την μορφή <κωδικός θέσης>#<διαθεσιμότητα 0 ή 1>. Ύστερα αποκωδικοποιεί την πληροφορία η οποία περιγράφει τον κωδικό της θέσης
και την διαθεσιμότητα της, και την αποστέλει μέσω ενός REST API με την μέθοδο POST σε έναν WEB Server. Για να αποσταλεί η πληροφορία
στον WEB Server πρέπει να πάρει την μορφή JSON (JavaScript Object Notation).
Η μέθοδος του POST γίνεται στην περίπτωσή που η κατάσταση του Parking μεταβληθεί. Σε αντίθετη περίπτωση ο Server δεν ενημερώνεται.
Στον ίδιο φάκελο του κώδικα βρίσκεται ένα configuration αρχείο το οποίο περιέχει ένα JSON με την μορφή:
[source, JSON]
----
{
"ip": "iot-smart-parking.herokuapp.com",
"port": "443"
}
----
Το αρχείο αυτό περιέχει ρυθμίσεις που αφορά τη σύνδεσή του με τον WEB Server την διευθυνδή του δηλαδή και την πόρτα
που ακούει.
==== Διασύνδεηση στο Διαδίκτυο
Ο κόμβος Gateway έχει διασύνδεση με το διαδίκτυο μέσω ενός καλωδίου Ethernet (UTP) έτσι ώστε να μπορέσει
να στείλει την πληροφορία στο διαδίκτυο, δηλαδή στον WEB Server.
== Server Node (3~ο~ μέρος - Κεντρικός Server όπου κρατά την κατάσταση της κάθε θέσης του Parking)
Ο κόμβος αυτός υλοποιεί ένα process γραμμένο σε γλώσσα προγραμματισμού Python (v3). Αυτό το 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], για την οποιά μπορούμε να βρούμε περεταίρω πληροφορίες στον σύνδεσμο
παραπάνω.
Στην δωρεάν έκδοσή του δεν έχουμε περιορισμούς στο τμήμα του HTTP service που εκτελούμε, ενώ στη βάση δεδομένων
υπάρχουν περιοριμοί στις συνδέδεις που μπορούν να γίνουν ανα κάποιο χρονικό διάστημα (περίπου 10 συνδέσει ανα 1 ώρα).
[.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~ο~ μέρος)
=== Η διεπαφή του χρήστη
Η διεπαφή του χρήστη αποτελείται από μία HTML σελίδα η οποία ενσωματώνει και δύο JavaScript Processes.
Σκοπός αυτής είναι η ανααπαράσταση της κατάστασης του Parking. Η σελίδα λοιπόν ενσωματώνει για κάθε θέση
parking
== 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.