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.
492 lines
31 KiB
492 lines
31 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 για τον οποίο είναι υπεύθυνος. Με κόκκινο χαρακτηρίζεται η θέση που είναι
|
|
δεσμευμένη από ένα όχημα και με μπλε η ελεύθερη θέση, όπως φαίνεται στις παραπάνω εικόνες.
|
|
|
|
|
|
[.float-group]
|
|
--
|
|
[.center]
|
|
.Παρουσίαση ενός σχηματικού του κυκλώματος.
|
|
image::Photos/diagram1.png[1000,800]
|
|
--
|
|
|
|
==== Προγραμματισμός Κόμβου
|
|
Για τον προγραμματισμό του Arduino Uno χρησιμοποιήσαμε μία σειριακή σύνδεση του μικροελεγκτή με τον
|
|
υπολογιστή μας ο οποίος έφερε εγκατεστημένο το IDE του Arduino στον οποίο υπήρχαν όλες οι απαραίτητες
|
|
βιβλιοθήκες για την υλοποίηση του. Η διαδικασία "καψίματος" ενός μικροελεγκτή Arduino είναι πολύ απλή.
|
|
Το μόνο που χρειάζεται να κάνει κανείς είναι να δώσει δικαιώματα γραψήματος και ανάγνωσης στην συσκευή
|
|
ttyACM0 που βρίσκεται στο directory (/dev/ στα linux) και λίγες γνώσεις από κώδικα.
|
|
|
|
Η γλώσσα του Arduino είναι γλώσσα που μοιάζει πάρα πολύ με τη C.
|
|
|
|
==== Λειτουργία του 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
|
|
|
|
==== Υλοποίηση Gateway Κόμβου
|
|
Η υλοποίηση αποτελείται από την εγκατάσταση του 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.
|
|
Οι ρυθμίσεις αυτές αφορούν ουσιαστικά την IP και την πόρτα του WEB Server που ένας τέτοιος κόμβος θα πρέπει να επικοινωνεί,
|
|
τα στοιχεία αυθεντικοποίησής του καθώς και τον κωδικό της θέσης του parking που εξυπηρετεί. Το αρχείο θα έχει τη μορφή:
|
|
|
|
[source, JSON]
|
|
----
|
|
{
|
|
"ip": "iot-smart-parking.herokuapp.com",
|
|
"port": "443",
|
|
"username": "root",
|
|
"password": "root",
|
|
"device": 1
|
|
}
|
|
----
|
|
|
|
Μετά της αυθεντικοποίηση του από τον Server τότε λαμβάνει ένα μύνημα το οποίο περιέχει το Session ID το οποίο χρησιμοποιεί
|
|
για την μετέπειτα επικοινωνία με αυτόν. Η απάντηση του αιτήματος αυθεντικοποίησης έχει την παρκάτω μορφή.
|
|
|
|
[source, JSON]
|
|
----
|
|
{
|
|
"cookie": "8yhuxQL0iCid++BPZFXPM959EclBhDmvvrZrqt+yv1s="
|
|
}
|
|
----
|
|
|
|
==== Προγραμματισμός Κόμβου
|
|
Ο επικοινωνία και ο προγραμματισμός του κόμβου αυτού, που είναι βασισμένος σε ένα Raspberry Pi 1, έγινε με σύνδεση (ssh)
|
|
έχοντας βέβαια και οι δύο (Raspberry και εμείς) πρόσβαση στο ίδιο δίκτυο. Η γλώσσα που χρησιμοποιήσαμε για τον έλεγχο
|
|
της σειριακής θύρας και την επικοινωνία του με ένα REST WEB Server ήταν η Python (version 3).
|
|
|
|
==== Διασύνδεηση στο Διαδίκτυο
|
|
Ο κόμβος Gateway έχει διασύνδεση με το διαδίκτυο μέσω ενός καλωδίου Ethernet (UTP) έτσι ώστε να μπορέσει
|
|
να στείλει την πληροφορία που παράγει από τα δεδομένα του μικροελεγκτή Arduino (sensor) στο διαδίκτυο, δηλαδή
|
|
στον REST WEB Server. Από την άλλη επικοινωνεί με το Arduino με μία σειριακή σύνδεση.
|
|
|
|
|
|
=== Server Node (3~ο~ μέρος - Κεντρικός Server όπου κρατά την κατάσταση της κάθε θέσης του Parking)
|
|
Ο κόμβος αυτός υλοποιεί ένα process γραμμένο σε γλώσσα προγραμματισμού Python (v3). Αυτό το process υλοποιεί ένα
|
|
REST API έτσι ώστε να μπορούν να επικοινωνούν εύκολα οι Gateway κόμβοι μας με αυτόν. Στην είσοδό του και στην έξοδό του
|
|
η πληροφορία έχει την μορφή JSON.
|
|
|
|
Ο Server αποθηκεύει όλα τα απαραίτητα δεδομένα σε μία σχεσιακή βάση δεδομένων MySQL, η οποία διαθέτει έναν πίνακα.
|
|
Ο πίνακας κρατά όλα τα απαραίτητα πεδία που είναι:
|
|
|
|
* Τον κωδικό της θέσης parking
|
|
* Την διαθεσιμότητά της αντίστοιχης θέση (0 ή 1)
|
|
|
|
Ακόμα υπάρχει και ένας δεύτερος πίνακας σε αυτή που έχει καταχωρημένα στοιχεία αυθεντικοποίησης που μπορεί να
|
|
χρησιμοποιήσει ένας κόμβος (Gateway Node) για να μπορεί να ενημερώνει την κατάσταση μίας θέσης Parking. Ο πίνακας
|
|
αυτός έχει τα απαραίτητα πεδία:
|
|
|
|
* Τον κωδικό του χρήστη.
|
|
* Το όνομα χρήστη (username).
|
|
* Έναν κωδικό πρόσβασης (password).
|
|
|
|
Τέλος σε έναν τρίτο πίνακα καταχωρούμε ένα ιστορίκό για την διαθεσιμότητα άρα και για την ζήτηση που έχει το parking.
|
|
Ελέγχοντας κάθε φορά που αλλάζει η κατάσταση μίας θέσης του parking, το πλήθος των ελεύθερων θέσεων, το καταχωρούμε
|
|
σε αυτόν τον πίνακα σε συνδυασμό με ένα timestamp, εκείνης τις στιγμής.
|
|
|
|
[source, sql]
|
|
----
|
|
CREATE TABLE IF NOT EXISTS PARKING (
|
|
PARKING_CODE INT(4) NOT NULL UNIQUE,
|
|
PARKING_STATUS BOOLEAN NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS USERS (
|
|
USER_NO INT(4) AUTO_INCREMENT,
|
|
USER_NAME VARCHAR(40) NOT NULL UNIQUE,
|
|
USER_PASS VARCHAR(40) NOT NULL,
|
|
PRIMARY KEY(USER_NO)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS PARKING_USAGE (
|
|
PARKING_USAGE_NO INT(10) AUTO_INCREMENT,
|
|
PARKING_METER INT(10) NOT NULL,
|
|
PARKING_DATE DATETIME NOT NULL,
|
|
PRIMARY KEY(PARKING_USAGE_NO)
|
|
);
|
|
----
|
|
|
|
==== Υλοποίηση Κόμβου
|
|
Για τον προγραμματισμό του κόμβου επιλέχθηκε η γλώσσα προγραμματισμού Python (version 3). Για την υλοποίηση του WEB Server
|
|
χρησιμοποιήσαμε ένα WSGI και συγκεκριμένα το FLASK module της Python. Για την εκτέλεσή του έχουμε δύο υλοποιήσεις. Τη μία
|
|
που είναι με το FLASK όπου η εκτέλεση θα πραγματοποιηθεί σε έναν από τους υπολογιστές μας και η άλλη που είναι με gunicorn-
|
|
WEB Server στη Python όπου η εκτέλεση θα πραγματοποιηθεί σε μία υπηρεσία του Heroku.
|
|
|
|
|
|
==== Προγραμματισμός REST API WEB Server
|
|
Το REST API ενεργοποιεί δύο (τρεις) υπηρεσίες. Αυτές είναι:
|
|
|
|
* / [GET]: επιστρέφει ένα Array από JSON objects, ένα JSON για κάθε θέση του parking αν είναι διαθέσιμη ή όχι κωδικοποιημένα με 0 ή 1.
|
|
Τα δεδομένα που επιστρέφει γίνονται fetch από τη βάση δεδομένων.
|
|
|
|
Για παράδειγμα:
|
|
|
|
[source, json]
|
|
----
|
|
[{"no": 1, "status": false}, {"no": 2, "status": false}, {"no": 3, "status": false}, {"no": 4, "status": true}, {"no": 5, "status": false}, {"no": 6, "status": false}, {"no": 7, "status": false}, {"no": 8, "status": false}]
|
|
----
|
|
|
|
* /chart [GET]: επιστρέφει ένα array από JSON objects, το καθένα από τα οποία εκφράζουν το πλήθως των ελεύθερων parking και
|
|
το αντίστοιχο timestamp της ενημέρωσης. Αυτή η υπηρεσία θα μας βοηθήσει στο να σχεδιάσουμε ένα γράφημα με ματρήσεις ενός 24 ώρου,
|
|
της ημέρας.
|
|
|
|
[source, json]
|
|
----
|
|
[
|
|
{
|
|
"usage": 6,
|
|
"time": "2020-01-23 01:15:52"
|
|
},
|
|
{
|
|
"usage": 1,
|
|
"time": "2020-01-23 01:22:29"
|
|
},
|
|
{
|
|
"usage": 0,
|
|
"time": "2020-01-23 01:22:33"
|
|
},
|
|
{
|
|
"usage": 1,
|
|
"time": "2020-01-23 01:23:01"
|
|
}
|
|
]
|
|
----
|
|
|
|
* /parkingStatus [POST] (content-type = "application/json"): που μας επιτρέπει να αλλάξουμε την κατάσταση μίας θέσης parking. Στο POST τα δεδομένα
|
|
ορίζονται στο body σε αναπαράσταση JSON, έτσι ώστε ο Server να είναι ικανός να τα επεξεργαστεί και να τα αποθηκεύσει
|
|
στη βάση δεδομένων που χρησιμοποιούμε.
|
|
|
|
Για παράδειγμα:
|
|
|
|
[source, json]
|
|
----
|
|
{"no": 2, "status": false}
|
|
----
|
|
|
|
Ακόμα το REST API υλοποιεί μηχανιμσό αυθεντικοποίησης έτσι ώστε οι μεταβολές-ενημερώσεις των θέσεων του parking
|
|
να γίνονται μόνο από τους εξουσιοδοτημένους κόμβους του συστήματος. Αυτό επιτυγχάνεται με την ενεργοποίηση μίας
|
|
υπηρεσίας όπως περιγράφεται παρακάτω:
|
|
|
|
* /authentication [POST] (content-type = "application/json): Η υπηρεσία αυτή κάνει register ένα Session σε κάθε
|
|
εξουσιοδοτημένο κόμβο ο οποίος αυθεντικοποιείται από τον Server με username και password. Όταν ο server αυθεντικοποιήσει
|
|
έναν κόμβο τότε ορίζει για αυτόν ένα χαρακτηριστικό που είναι ο κωδικός της θέσης που βρίσκεται, και ο Server του γυρνάει
|
|
ένα Session_id. Με βάση αυτό το κλειδί μπορεί ο κάθε (εξουσιοδοτημένος) κόμβος να χρησιμοποιήσει μία τέτοια υπηρεσία
|
|
όπως αυτή της καταχώρησης της διαθεσιμότητας κάθε θέσης από τους κόμβους αντίστοιχα.
|
|
|
|
|
|
==== Εκτέλεση του Process στο Cloud
|
|
Για την εκτέλεση του process χρησιμοποιούμε μία πλατφόρμα IAAS (Infrastructure as a Service) -
|
|
link:++https://www.heroku.com/platform++[Heroku], για την οποιά μπορούμε να βρούμε περεταίρω πληροφορίες στον σύνδεσμο
|
|
παραπάνω.
|
|
|
|
Η πλατφόρμα μας επιτρέπει να ανεβάσουμε τον κώδικα του Server μας (Python) και να τον εκτελέσουμε στο Cloud.
|
|
|
|
Στην δωρεάν έκδοσή του δεν έχουμε περιορισμούς στο τμήμα του HTTP service που εκτελούμε, ενώ στη βάση δεδομένων
|
|
υπάρχουν περιοριμοί στις συνδέδεις που μπορούν να γίνουν ανα κάποιο χρονικό διάστημα (περίπου 10 συνδέσει ανα 1 ώρα) και ένας
|
|
αριθμός Query (~3500) ανά 1~2 ώρες.
|
|
|
|
Στα πλαίσια της άσκησης δεν θα δημιουργηθεί κάποιο πρόβλημα όσων αφορά την εκτέλεση του κεντρικού Server στο Cloud.
|
|
|
|
[.float-group]
|
|
--
|
|
[.center]
|
|
.Describe Infrastructure as a Service as an example.
|
|
image::Photos/itops-pizza_as_a_service.png[1000,800]
|
|
--
|
|
|
|
Για το deployment εκτελούμε ένα σύνολο βημάτων τα οποία αποτελούνται από την ανάρτηση του κώδικα
|
|
σε ένα repository του link:++https://github.com/oulievancs/serverNode++[GitHub] και την δημιουργία ενός project στην πλατφόρμα Heroku.
|
|
, link:++https://stackabuse.com/deploying-a-flask-application-to-heroku/++[περισσότερα για το deployment εδώ]. Ακόμα
|
|
εγκαθισούμε στο project που μόλις φτιάξαμε μία MySQL βάση δεδομένων για να μπορούμε να αποθηκεύσουμε τα δεδομένα μας.
|
|
|
|
==== Deployment
|
|
* Το πρώτο πράγμα που χρειαζόμαστε είναι όλες οι απαραίτητες βιβλιοθήκες που χρησιμοποιεί ο κώδικας, έτσι ώστε να γνωρίζει
|
|
το Heroku τι να μας προσφέρει. Αυτό επιτυγχάνεται με την αρχειοθέτηση αυτών σε ένα αρχείο με όνομα requirements.txt .
|
|
|
|
Το αρχείο που περιέχει όλα τα απαραίτητα modules για τον κώδικά μας είναι:
|
|
|
|
[source, text]
|
|
----
|
|
flask
|
|
flask_restful
|
|
flask_cors
|
|
gunicorn==19.9.0
|
|
mysql-connector
|
|
----
|
|
|
|
* Έπειτα την δημιουργία ενός αρχείου που περιγράφει το που βρίσκεται η κύρια συνάρτηση μας (main) για την
|
|
έναρξη του process. Αυτό το αρχείο ονομάζεται Procfile . Στο αρχείο αυτό αναφέτεται ένα gunicorn module.
|
|
Το gunicorn είναι ένα Python HTTP WEB server. Αυτό ουσιαστικά είναι ο πυρήνας για την εκτέλεση του REST API μας.
|
|
|
|
* Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης γίνονται στο Heroku,
|
|
πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση.
|
|
|
|
* Τέλος το αρχείο Procfile το οποίο περιέχει το αρχείο το οποίο φορτώσει το gunicorn το οποίο έχει τη μορφή:
|
|
|
|
[source, conf]
|
|
----
|
|
web: gunicorn serv:app --preload --timeout 150000
|
|
----
|
|
|
|
.Gunicorn
|
|
[NOTE]
|
|
====
|
|
Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model. The Gunicorn server is broadly compatible with various web frameworks, simply implemented, light on server resources, and fairly speedy.
|
|
|
|
Source: https://gunicorn.org
|
|
====
|
|
|
|
* Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης δίνονται από Heroku,
|
|
πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση των δεδομένων.
|
|
|
|
==== Σε άλλη περίπτωση Deployment στο Localhost
|
|
|
|
Στην περίπτωση όπου η πλατφόρμα Heroku μας περιορίζει στα ερωτήματα στη βάση δεδομένων που χρησιμοποιούμε
|
|
κάνουμε deploy της εφαρμογής στον localhost. Για να το επιτύχουμε αυτό θα εκτελέσουμε τις εξής εντολές στο
|
|
terminal.
|
|
|
|
[source, script]
|
|
----
|
|
export FLASK_APP=serv
|
|
export FLASK_DEBUG=1
|
|
flask run --host=[IP-v4] --port=8080
|
|
----
|
|
|
|
|
|
|
|
=== Διεπαφή Χρήστη (4~ο~ μέρος)
|
|
==== Η διεπαφή του χρήστη
|
|
Η διεπαφή του χρήστη αποτελείται από μία HTML σελίδα η οποία ενσωματώνει δύο JavaScript Processes.
|
|
Σκοπός αυτής είναι η αναπαράσταση της κατάστασης του Parking σε ένα γραφικό, φιλικό προς τον χρήστη περιβάλλον.
|
|
Η σελίδα λοιπόν επεικονίζει για κάθε θέση parking με χρώμα κόκκινο την "μη ελεύθεση" και με πράσινο την "ελεύθερη".
|
|
|
|
Ακόμα, μέσω της υπηρεσία /charts [GET] του REST API, απεικονίσεται ένα διάγραμμα με βάση την διαθεσιμότητα του parking
|
|
το τελευταίο 24 ώρο, πιο συσκεκριμένα την τελευταία μέρα.
|
|
|
|
Ένα παράδειγμα μέσω στιγμιοτύπου παρουσιάζεται παρακάτω.
|
|
|
|
[.float-group]
|
|
--
|
|
[.center]
|
|
.Στιγμιότυπο παραδείγματος εκτέλεσης της διεπαφής χρήστη.
|
|
image::Photos/screenshot_web_ui.png[1000,800]
|
|
--
|
|
|
|
|
|
== Autonomous Parking
|
|
Το αυτόνομο παρκάριμα αποτελείται από το όχημα με εγκατεστημένους τους απαραίτητους αισθητήρες και ελεγκτές
|
|
καθώς & έναν μικροελεγκτή (Arduino) για τον έλεγχο αυτών των ελεγκτών και ένα Raspberry Pi1. Σκοπός είναι το όχημα να μπορεί
|
|
να μάθει μέσω του διαδικτύου το "Status" του parking και να παρκάρει στην 1η διαθέσιμη θέση εφ' όσων
|
|
υπάρχει μία τουλάχιστoν διαθέσιμη θέση στον χώρο στάθμευσης.
|
|
|
|
*Η υλοποίηση του αυτόνομου parking χωρίζεται σε δύο βασικά μέρη.*
|
|
|
|
* Το 1~ο~ μέρος αποτελείται από τον μικροελεγκτή για τον έλεγχο των αισθητήρων και των κινητήρων του οχήματος και
|
|
εκτελώντας τα απαραίτητα βήματα, να μπορέσει να παρκάρει το όχημα.
|
|
|
|
* Το 2~ο~ μέρος αποτείται από τον κόμβο ο οποίος θα έχει πρόσβαση στο διαδίκτυο, όπου αφού ελέγξει αν υπάρχει
|
|
διαθέσιμη θέση και γνωρίζει ποια είναι η πρώτη ελεύθερη θέση, να δώσει εντολή στον μικροελεγκτή να παρκάρει σε αυτή.
|
|
|
|
=== Microcotroller and Car (1~ο~ Μέρος)
|
|
|
|
==== Υλικά Κόμβου
|
|
* 1 x Arduino Uno
|
|
* 1 x Servo Motor
|
|
* 1 x Motor Driver (Shield 1.1 - L2981)
|
|
* 4 x Moter για τους 4 τροχούς
|
|
* 1 x Ultrasonic
|
|
* 1 x USB Power from Raspberry PI
|
|
* 1 x Car
|
|
|
|
==== Υλοποίηση Microcontroller on Car
|
|
Ο motor driver, το Servo motor καθώς και ο Ultrasonic αισθητήρας κουμπώνουν στον μικροελεγκτή Arduino Uno που χρησιμοποιούμε,
|
|
τον οποίο τον εγκαθηστούμε πάνω στο καλούπι του οχήματος το οποίο έχει εγκατεστημένα 4 τροχούς. Οι τροχοί οδηοούνται από 4 moters
|
|
τα οποία τροφοδοτούνται από τον motor driver. Ο motor driver πέρνει εντολές από το Arduino , ενώ το Arduino περιμένει μέχρι το Rasperry να στείλει πληροφορία.
|
|
Μόλις λάβει την πληροφορία από το Rasperry, υπολογίζουμε με το υπόλοιπο & το πηλίκο της θέσης του parking με το 2, την γραμμή και την θέση που το όχημα πρέπει να παρκάρει.
|
|
Στην συνέχεια , μόλις το όχημα έχει φτάσει μπροστά από την θέση που πρέπει να παρκάρει , με τις μετρήσεις του ultrasonic ελέγχει το πόσο μπροστά ή πίσω θα πάει το όχημα.
|
|
|
|
[source, C]
|
|
----
|
|
row = (parkingNo / 2);
|
|
side = (parkingNo % 2);
|
|
|
|
if (side == 0) {
|
|
row = row - 1;
|
|
}
|
|
----
|
|
|
|
==== Προγραμματισμός Microcontroller on Car
|
|
O προγραμματισμός του Arduino έγινε με την ίδια λογική όπως έγινε και ο προγραμματισμός του Arduino παραπάνω.
|
|
|
|
|
|
Η συνδεσμολογία έχει την διάταξη που παρουσιάζεται παρακάτω:
|
|
|
|
[.float-group]
|
|
--
|
|
[.center]
|
|
.Συνδεσμολογία moter, motor driver, arduino, ultrasonic sensor και servo motor.
|
|
image::Photos/diagram.png[1000,800]
|
|
--
|
|
|
|
|
|
=== Gateway Κόμβος (2~ο~ Μέρος)
|
|
==== Υλικά Κόμβου
|
|
* 1 x Raspberry Pi 1
|
|
* 1 x TP-Link WiFi Adapter
|
|
* 1 x Powerbank Power
|
|
|
|
Ο Gateway κόμβος του αυτόνομου οχήματος που θα έρθει στην θέση να παρκάρει μόνο του στο parking, είναι υπεύθυνος
|
|
για την διασύνδεση του οχήματος με το διαδίκτυο. Γι' αυτό το λόγο το process που σχεδιάσαμε να τρέχει σε αυτό το σημείο
|
|
είναι υπεύθυνο για την αναζήτηση της πληροφορίας, ποια είναι η πρώτη ελεύθερη για να παρκάρει το όχημα και στη συνέχεια
|
|
να αποστέλει τον αριθμό της θέσης στον μικροελεγκτή Arduino ο οποίος είναι υπεύθυνος να πάρει αυτή την τιμή και να κατευθύνει
|
|
το όχημα.
|
|
|
|
==== Υλοποίηση Gateway on Car
|
|
Ο gateway κόμβος ξεκινά μια HTTP σύνδεση με τον κετντρικό Server, ζητώντας μέσω υπηρεσίας REST API το 1~ο~ διαθέσιμο parking.
|
|
Αφού διαβάσει την απάντησή του τότε την απόστέλει σε μορφή String στο Arduino μέσω σειριακής επικοινωνίας στο arduino.
|
|
|
|
==== Προγραμματιμός Gateway on Car
|
|
Το process που εκτελεί αυτή την επικοινωνία μεταξύ του κεντρικου Server και το Arduino στο όχημα είναι προγραμματισμένο σε γλώσσα
|
|
προγραμματισμού Python.
|
|
|
|
== Προβλήματα που αντιμετωπίσαμε
|
|
|
|
* Δεν καταφέραμε να κάνουμε Deploy στο swarmlab τον κεντρικό Server μας έτσι ώστε να έχουμε
|
|
via Internet επικοινωνία.
|
|
|
|
* Δεν καταφέραμε να τελειοποιήσουμε το αυτόνομο παρκάριμα, και την ενορχύστρωσή του με το υπόλοιπο σύστημα. Το πρόβλημα που
|
|
αντιμετωπίσαμε συγκεκριμένα ήταν ο έλεγχος των δεδομένων που από το raspberry στο Arduino και το καθαρισμό του buffer στο
|
|
Arduino. Αυτό συνεπώς δεν μας επέτρεπε στο Arduino να διαβάσουμε από την σειριακή τον ακέραιο αριθμό (θέση parking) που έστελνε
|
|
το raspberry.
|
|
|
|
|
|
|
|
.Reminder
|
|
[NOTE]
|
|
|
|
SLOW SUCCESS BUILDS CHARACTER, FAST SUCCESS BUILDS EGO.
|
|
|
|
|