Αυτόματο αποχιονιστικό μηχάνημα

Αυτόματο αποχιονιστικό μηχάνημα

Μια από τις προτάσεις του ομίλου μας για τον 1ο Πανελλήνιο Διαγωνισμό Εκπαιδευτικής Ρομποτικής και Physical Computing Ανοιχτών Τεχνολογιών. Μπορείτε να δείτε το έργο μας και στο Githb.

Περιεχόμενα

Επιλογή και Έρευνα θέματος

Αρχικά μέσα από μια δίωρη ιδεοθύελλα (brainstorming) δημιουργήσαμε τον εννοιολογικό χάρτη με τα γενικά θέματα τα οποία μας απασχολούν. Στην επόμενη συνάντηση μας, αφού μελετήσαμε τον εννοιολογικό χάρτη και τις πληροφορίες που είχαμε συλλέξει για τα θέματα που είχαν αποτυπωθεί σε αυτόν, ξεκινήσαμε να γράφουμε ιδέες και προτάσεις. Η συγγραφή και ο σχολιασμός ιδεών και προτάσεων διήρκησε τρεις εβδομάδες.

Μια από τις δημοφιλείς ιδέες ήταν ένα αυτόνομο εκχιονιστικό όχημα. Στην πόλη μας (Φλώρινα) κατά τους χειμερινούς μήνες έχουμε συχνά χιονοπτώσεις οι οποίες συνοδεύονται από χαμηλές θερμοκρασίες, με αποτέλεσμα προβλήματα στις μετακινήσεις, καθώς και στην λειτουργία των σχολείων. Ύστερα από κάθε ισχυρή χιονόπτωση, τα εκχιονιστικά μηχανήματα του Δήμου δουλεύουν συνεχώς για να καθαρίσουν τους δρόμους της πόλης και των γύρω χωριών, καθώς και τις αυλές των σχολείων πριν προλάβει να παγώσει το χιόνι. Αρκετές φορές τα σχολεία παραμένουν κλειστά γιατί δεν έχουν προλάβει να καθαριστεί οι αυλές, καθώς δίνεται προτεραιότητα τους δρόμους.

Επιλέξαμε λοιπόν να κατασκευάσουμε ένα αυτόνομο εκχιονιστικό μηχάνημα, το οποίο θα αναλαμβάνει να καθαρίσει το χιόνι από έναν συγκεκριμένο χώρο (για παράδειγμα την αυλή ενός σχολείου) χωρίς να χρειάζεται οδηγό.

Επίσκεψη στις εγκαταστάσεις αποχιονισμού του Δήμου Φλώρινας

Στις 30/1/2019 μας δόθηκε η ευκαιρία να επισκεφτούμε τις εγκαταστάσεις του Δήμου Φλώρινας στο πρώην στρατόπεδο Τάγαρη και να ενημερωθούμε για τη λειτουργία των εκχιονιστικών μηχανημάτων.

Η επίσκεψη διήρκησε περίπου μια ώρα. Αρχικά ο υπεύθυνος Πολιτικής Προστασίας του Δήμου Φλώρινας κ. Στεφανόπουλος Δανιήλ και ο υπάλληλος της Τεχνικής Υπηρεσίας του Δήμου και επιβλέπων αποχιονισμού κ. Σαχινίδης Βασίλειος, ενημέρωσαν τα παιδιά για τη διαδικασία αποχιονισμού, τους διάφορους τύπους μηχανημάτων που υπάρχουν, τη χρήση μέσων για την αντιμετώπιση του πάγου, όπως το χοντρό αλάτι, καθώς και τους παράγοντες που παίζουν ρόλο στην επιλογή των μεθόδων αποχιονισμού.

Στη συνέχεια ο κ. Σαχινίδης μας συνόδεψε στις εγκαταστάσεις που βρίσκονται τα μηχανήματα, όπου και πραγματοποιήθηκε επίδειξη της λειτουργίας τους από τους χειριστές που βρίσκονταν στον χώρο. Συγκεκριμένα τα παιδιά είδαν τη διαδικασία φόρτωσης αλατιού, τη λειτουργία του μηχανισμού διασποράς αλατιού στον δρόμο, τη λειτουργία των λεπίδων απώθησης του χιονιού και τον τρόπο με τον οποίο τα ελέγχουν οι χειριστές μέσα από το όχημα. Επίσης, οι χειριστές των μηχανημάτων ενημέρωσαν τα παιδιά για τις τεχνικές που χρησιμοποιούν στη δουλειά τους (πχ πόσο ψηλά έχουν τη λεπίδα, προς τα πού απωθούν το χιόνι, πώς ορίζουν την ακτίνα διασποράς του αλατιού κλπ), ανάλογα με τις καιρικές συνθήκες.

Βίντεο από την επίσκεψη στα αποχιονιστικά μηχανήματα του Δήμου Φλώρινας

Σχεδιασμός λειτουργίας

Οι βασικές λειτουργίες που έχει το σύστημα μας είναι οι εξής:

  • Μπορεί να κινηθεί σε ευθεία διαδρομή καθαρίζονας το χιόνι με το μαχαίρι και αντιλαμβάνεται τυχόν αποκλίσεις τις οποίες διορθώνει, με την βοήθεια γυροσκόπιου.
  • Αντιλαμβάνεται πότε φτάνει στα όρια της αυλής με τον αισθητήρα απόστασης υπέρηχων και μπορεί να συνεχίσει την πορεία του προς την αντίθετη πλευρά με ακρίβεια αξιοποιώντας το γυροσκόπιο.
  • Αντιλαμβάνεται την κίνηση ανθρώπων στον χώρο της αυλής (αισθητήρας PIR) και σταματάει εκπέμποντας προειδοποιητικά μηνύματα και φώτα.
  • Αντιλαμβάνεται αν υπάρχουν συνθήκες δημιουργίας πάγου (αισθητήρας θερμοκρασίας και βροχόπτωσης) και να ρίχνει αλάτι στην αυλή.

Μελλοντικά σχέδια

  • Υπολογισμός της θέσης του μέσα στην αυλή του σχολείου αξιοποιώντας τα δεδομένα από το γυροσκόπιο και τον αισθητήρα απόστασης.
  • Επικοινωνία με έξυπνα κινητά τηλέφωνα ώστε να στέλνει και να δέχεται δεδομένα για την κατάσταση αποχιονισμού.

Λίστα υλικών

Αποφασίσαμε να ξεκινήσουμε τις κατασκευές μας αξιοποιώντας κάποιες έτοιμες πλατφόρμες οχημάτων, οι οποίες να περιλαμβάνουν το σασί και τους κινητήρες και πάνω σε αυτές να κάνουμε τις προσθήκες που χρειαζόμαστε χρησιμοποιώντας και άλλα απλά δομικά υλικά. Επίσης αποφασίσαμε να αγοράσουμε αισθητήρες και ενεργοποιητές για να υλοποιήσουμε τις δυνατότητες των οχημάτων.

Επιλογή πλατφόρμας οχημάτων

Για την βάση των οχημάτων μας, επιλέξαμε τρεις διαφορετικές πλατφόρμες τις οποίες βρήκαμε σε ελληνικά ηλεκτρονικά καταστήματα. Οι δυο από αυτές έχουν σκελετό από πλέξι γκλας και χρησιμοποιούν 4 κινητήρες DC, ενώ η τρίτη είναι ένα όχημα με ερπύστριες και δυο κινητήρες DC. Τα κιτ που επιλέξαμε είναι τα εξής:

Το συνολικό κόστος για την αγορά των 3 οχημάτων ήταν 64 ευρώ.

Επιλογή ελεγκτών

  • Ως βασικό ελεγκτή για το αποχιονιστικό μας μηχάνημα επιλέξαμε το Arduino Mega, με κόστος 18 ευρώ. Η επιλογή της συγκεκριμένης πλακέτας έγινε γιατί μας δίνει την δυνατότητα να συνδέσουμε περισσότερους αισθητήρες και ενεργοποιητές σε σχέση με το Arduino uno.
  • Για τον έλεγχο των κινητήρων, επιλέξαμε το L293D Motor Driver Shield το οποίο μας δίνει τη δυνατότητα να συνδέσουμε ταυτόχρονα 4 κινητήρες DC και 2 servo, με κόστος 5 ευρώ.

Το συνολικό κόστος για την αγορά 3 Arduino Mega και 3 οδηγών κινητήρων ήταν 69 ευρώ.

Επιλογή αισθητήρων

Οι αισθητήρες που αποφασίσαμε να χρησιμοποιήσουμε σε κάθε όχημα είναι οι εξής:

Το συνολικό κόστος για την αγορά των αισθητήρων για τα 3 οχήματα ήταν 38,4 ευρώ.

Επιλογή ενεργοποιητών

Και οι 3 βασικές πλατφόρμες που επιλέξαμε περιλαμβάνουν τους δικούς κινητήρες για την κίνηση των οχημάτων. Το ερπυστριοφόρο περιλαμβάνει 2 DC κινητήρες, ενώ τα άλλα δυο οχήματα περιλαμβάνουν 4 κινητήρες Geard DC. Εκτός λοιπόν από αυτούς του κινητήρες, για κάθε όχημα χρησιμοποιούμε:

  • 2 x Sg90 TowerPro Micro Servo, για τον έλεγχο του μαχαιριού αποχιονισμού και τον διασκορπισμό του αλατιού, με συνολικό κόστος 8 ευρώ.
  • 1 x 28BYJ-48-5V Stepper motor + DRIVER BOARD ULN2003 για τον έλεγχο του κοχλία μεταφοράς του αλατιού, με κόστος 4 ευρώ.
  • 1 x 3W High Power Led Module, για το φως προειδοποίησης, με κόστος 2,5 ευρώ.
  • 1 x Active Buzzer Alarm Module, για τους ήχους προειδοποίησης, με κόστος 2 ευρώ.

Το συνολικό κόστος για την αγορά των ενεργοποιητών για τα 3 οχήματα ήταν 49,5 ευρώ.

Τροφοδοσία

Σε κάθε όχημα που κατασκευάζουμε έχουμε αποφασίσει να χρησιμοποιήσουμε δυο πηγές ρεύματος, μία για να τροφοδοτεί το Arduino Mega, και μία ξεχωριστή για τους κινητήρες. Συνολικά και για τα 3 οχήματα χρησιμοποιήσαμε:

Το συνολικό κόστος για την αγορά τους ήταν 17,5 ευρώ

Εργαλεία

Για την κατασκευή των οχημάτων χρειαστήκαμε διάφορα εργαλεία τα οποία διαθέτει το εργαστήριο μας:

  • Κατσαβίδια,
  • πένσες,
  • κοπίδια,
  • κόφτες και απογυμνωτές καλωδίων,
  • πιστόλι σιλικόνης,
  • χαράκια,
  • κολλητήρι,
  • δραπανοκατσάβιδο.

Επίσης κατασκευάσαμε και τα δικά μας απωθητικά οσμών από την διαδικασία της κόλλησης καλωδίων, αξιοποιώντας ανεμιστήρες από παλιούς υπολογιστές και φίλτρα από απορροφητήρες. Μπορείτε να δείτε περισσότερα από την διαδικασία κατασκευής τους σε αυτή την ανάρτηση.

Αναλώσιμα

Εκτός από τις βασικές μονάδες (αισθητήρες, ενεργοποιητές, ελεγκτές), χρησιμοποιήσαμε αρκετά αναλώσιμα τα οποία διαθέτει το εργαστήριο μας.

  • Καλώδια dupont,
  • breadboard,
  • καλάι,
  • βίδες,
  • παξιμάδια,
  • αποστάτες
  • μακετόχαρτο,
  • ράβδους σιλικόνης,
  • ταινίες διπλής όψης,
  • μπαταρίες AA

Μελέτη μηχανισμών και αισθητήρων

Πριν από την φάση της κατασκευής αλλά και κατά την διάρκεια της, πραγματοποιήθηκαν εργαστήρια στα οποία μελετήσαμε αναλυτικά τον τρόπο λειτουργίας των μηχανισμών και των αισθητήρων που περιλαμβάνουν τα αυτόνομα οχήματα μας.

Τι είναι οι έξυπνες συσκευές

Το πρώτο εργαστήριο που πραγματοποιήσαμε στην πρώτη συνάντηση του ομίλου μας για φέτος, είχε ως στόχο να συζητήσουμε και να κατανοήσουμε τον όρο “έξυπνη συσκευή”. Μπορείτε να δείτε λεπτομέρειες στην ανάρτηση που υπάρχει εδώ.

Εισαγωγή στους αισθητήρες

Σε αυτό το εργαστήριο μελετήσαμε τον τρόπο με τον οποίο μπορούμε να λαμβάνουμε τιμές από τον πραγματικό κόσμο και να τις μετατρέπουμε σε ψηφιακές, χρησιμοποιώντας το Arduino και διάφορους αισθητήρες. Μπορείτε να δείτε λεπτομέρειες στην ανάρτηση που υπάρχει εδώ.

Εργαστήριο Κινητήρων

Σε αυτό το εργαστήριο μελετήσαμε την αρχή λειτουργίας των κινητήρων DC, Servo και Stepper και τους τρόπους με τους οποίους μπορούμε να τους ελέγξουμε με την χρήση του Arduino. Στο πλαίσιο του εργαστηρίου κατασκευάσαμε και μερικούς ανεμιστήρες με φίλτρο, αξιοποιώντας παλιές συσκευές που υπάρχουν στο υπόγειο του σχολείου, τους οποίους χρησιμοποιήσαμε αργότερα για την απομάκρυνση των οσμών από την κόλληση καλωδίων. Μπορείτε να δείτε περισσότερες λεπτομέρειες στην ανάρτηση που υπάρχει εδώ.

Αναζήτηση κινητήρων σε παλιές συσκευές

Εργαστήριο 3Δ σχεδίασης και εκτύπωσης

Η ΕΛΛΑΚ έχει παραχωρήσει στον όμιλο μας έναν τρισδιάστατο εκτυπωτή RepRap Prusa, τον οποίο αξιοποιούμε κάθε χρόνο στις κατασκευές μας. Για την εισαγωγή των μαθητών στις έννοιες της 3Δ σχεδίασης και εκτύπωσης αφιερώσαμε μια συνάντηση στην πλατφόρμα tinkercad. Μπορείτε να δείτε παραπάνω λεπτομέρειες σε αυτή την ανάρτηση.

Μελέτη αισθητήρα απόστασης υπερήχων

Στα αυτόνομα αποχιονιστικά που σχεδιάζουμε χρησιμοποιούμε αισθητήρες απόστασης υπερήχων για να υπολογίζουμε την απόσταση των οχημάτων από εμπόδια. Για την μελέτη αυτών των αισθητήρων αφιερώσαμε μια συνάντηση του ομίλου μας. Μπορείτε να δείτε αναλυτικά το εργαστήριο σε αυτή την ανάρτηση.

Μελέτη αισθητήρα PIR

Ένας από τους αισθητήρες που θα περιλαμβάνουν τα αυτόνομα αποχιονιστικά μας, είναι ο αισθητήρας κίνησης PIR για την ανίχνευση κινήσεων από ανθρώπους. Με τον τρόπο αυτό θα προσπαθήσουμε να αποφύγουμε τυχόν ατυχήματα που θα μπορούσαν να σημειωθούν. Στο εργαστήριο που πραγματοποιήσαμε, μελετήσαμε την αρχή λειτουργίας των αισθητήρων PIR, ενώ τα παιδιά κατασκεύασαν και προγραμμάτισαν ένα απλό κύκλωμα ειδοποίησης, συμπεριλαμβάνοντας λαμπάκια led και μονάδες buzzer. Αναλυτικά το εργαστήριο μπορείτε να το δείτε σε αυτή την ανάρτηση.

Μελέτη συστημάτων πλοήγησης αδράνειας

Ο τρόπος με τον οποίο τα αυτόνομα αποχιονιστικά μας θα κρατάν σταθερή την πορεία τους στον χώρο, βασίζεται στην μονάδα πλοήγησης αδράνειας (IMU) που διαθέτουν. Μια τέτοια μονάδα περιλαμβάνει δυο βασικούς αισθητήρες: επιταχυνσιομέτρο και γυροσκόπιο. Για την μελέτη αυτών των αισθητήρων αφιερώσαμε μια συνάντηση του ομίλου μας. Μπορείτε να δείτε αναλυτικά το εργαστήριο σε αυτή την ανάρτηση.

Διαδικασία κατασκευής

Η διαδικασία κατασκευής των οχημάτων κράτησε αρκετό καιρό καθώς περιελάμβανε αρκετά στάδια και απαιτούσε καλό σχεδιασμό ώστε όλες οι μονάδες να μπορέσουν να χωρέσουν στα οχήματα και να είναι αυτά λειτουργικά.

Βασική συναρμολόγηση οχημάτων

Συναρμολογώντας ένα από τα οχήματα μας

Το ερπυστριοφόρο όχημα που επιλάξαμε δεν απαιτεί συναρμολόγηση ενώ τα δύο τετρακίνητα οχήματα δεν περιλάμβαναν στη συσκευασία τους οδηγίες συναρμολόγησης. Μετά από μια σχετικά εύκολη αναζήτηση στο διαδίκτυο βρήκαμε αρκετά βίντεο τα οποία παρουσιάζουν τα βασικά βήματα που απαιτούνται. Ένα από τα πιο αναλυτικά είναι αυτό που ακολουθεί.

Βίντεο με οδηγίες συναρμολόγησης αυτοκινήτου με 4 κινητήρες

Τρισδιάστατη εκτύπωση

Εκτυπώνοντας το μαχαίρι για τα αποχιονιστικά μας

Από την στιγμή που στον όμιλο διαθέτουμε τρισδιάστατο εκτυπωτή (ευγενική παραχώρηση της ΕΛΛΑΚ) και τον έχουμε χρησιμοποιήσει αρκετά τις προηγούμενες χρονιές, αποφασίσαμε να τον αξιοποιήσουμε και φέτος για την κατασκευή κάποιων βασικών μονάδων για τα αποχιονιστικά μας οχήματα.

Αξιοποιήσαμε το σχέδιο Snow Plow for a RC Car or Truck by reedwc, για να κατασκευάσουμε τα “μαχαίρια” των αποχιονιστικών μηχανημάτων μαζί με τους μηχανισμούς στήριξης και μετακίνησης τους (πάνω – κάτω). Επειδή οι βραχίονες του μηχανισμού δεν μας βόλευαν ώστε να πετύχουμε καλή κίνηση του μαχαιριού, βασιστήκαμε σε σχέδιο του μαθητή μας Μιλτιάδη Παπαευαγγέλου και τους τροποποιήσαμε. Το σχέδιο του βελτιωμένου βραχίονα μπορείτε να το βρείτε εδώ. Αρκετά απαιτητική εκτύπωση η οποία χρειάζεται περίπου πέντε ώρες για όλα τα εξαρτήματα του μαχαιριού.

Η εκτυπωμένη αλατιέρα με τον ατέρμων κοχλία

Επίσης αξιοποιήσαμε το σχέδιο 5v Stepper Motor Mount and Auger by TeamKRF, για να κατασκευάσουμε την αλατιέρα για ένα από τα αποχιονιστικά μας. Αν και το σχέδιο προορίζεται για μηχανές pet feeder, εμάς μας φάνηκε ιδιαίτερα χρήσιμο για να αποθηκεύουμε το αλάτι και να το ρίχνουμε με την χρήση ενός ατέρμων κοχλία.

Τέλος χρησιμοποιήσαμε το σχέδιο Servo mount bracket by atoomnet, για να εκτυπώσουμε 2 στηρίγματα κινητήρων servo για κάθε μας όχημα.

Χωροθέτηση και επιπλέον κατασκευές με μακετόχαρτο

Ο διαθέσιμος χώρος που υπήρχε στα οχήματα μας για την τοποθέτηση όλων των υλικών ήταν αρκετά περιορισμένος. Μπαταρίες, μονάδα Arduino, οδηγοί, κινητήρες και αισθητήρες μαζί με τα αρκετά καλώδια μας δημιουργούσαν πρόβλημα χώρου. Αφιερώσαμε αρκετές συνανήσεις σε δοκιμές διαφόρων σχεδίων χωροθέτησης και προσθήκης νέων ορόφων στα οχήματα μας, μέχρι που καταλήξαμε σε δυο βασικά σχέδια.

Το αποχιονιστικό 1 με τους τρεις ορόφους

Σε ένα από τα οχήματα μας (αποχιονιστικό 1) επιλέξαμε την προσθήκη ενός ακόμα ορόφου (είχε δυο και με τον επιπλέον έγιναν τρεις) με διπλό μακετόχαρτο στο οποίο θα υπάρχει μια τρύπα για την άνετη τοποθέτηση της αλατιέρας του κάτω ορόφου. Στον πρώτο όροφο τοποθετήσαμε την μονάδα Arduino, το breadboard, την μονάδα IMU και τα δυο servo (για μαχαίρι και διασκορπισμό αλατιού). Στον δεύτερο όροφο τοποθετήσαμε τις μπαταρίες και το powerbank, καθώς και το σύστημα της αλατιέρας. Στον τρίτο όροφο τοποθετήσαμε τους αισθητήρες χιονιού, θερμοκρασίας, απόστασης, κίνησης, καθώς και το φως led με το buzzer.

Το αποχιονιστικό 2 με το αυτοσχέδιο σασί

Στο δεύτερο όχημα (αποχιονιστικό 2) τα παιδιά σχεδίασαν και κατασκεύασαν με δική τους πρωτοβουλία ένα σασί από μακετόχαρτο, το οποίο καλύπτει όλη την κατασκευή. Στον πρώτο όροφο της χωράν μόνο οι κινητήρες dc, ενώ στον επάνω όροφο τοποθετήσαμε την μονάδα Arduino Mega, το breadboard, τις μπαταρίες και τους δυο κινητήρες servo (για το μαχαίρι και τον διασκορπισμό αλατιού. Στο σασί που κατασκεύασαν τα παιδιά, το οποίο έχει και την δική του υποδοχή για το αλάτι, τοποθετήθηκαν οι μηχανισμοί του ατέρμον κοχλία και όλων των υπόλοιπων μονάδων.

Σύνδεση μονάδων – σχηματικά

Παλεύουμε με τα καλώδια…

Τα αποχιονιστικά μας μηχανήματα περιλαμβάνουν τους DC κινητήρες για την κίνηση τους στον χώρο, δυο κινητήρες servo για την μετακίνησης του μαχαιριού και τον διασκορπισμό του αλατιού, έναν βηματικό κινητήρα για την κίνηση του ατέρμων κοχλία της αλατιέρας, ένα φωτάκι led, ένα buzzer, την μονάδα IMU (γυροσκόπιο και επιταχυνσιόμετρο), έναν αισθητήρα απόστασης υπερήχων, έναν αισθητήρα κίνησης PIR, έναν αισθητήρα θερμοκρασίας και έναν αισθητήρα βροχής – χιονιού.

Πλήρες σχηματικό συνδέσεων των μονάδων στο Arduino Mega.

Σύνδεση μονάδας Motor Driver

Και τα τρία οχήματα που κατασκευάσαμε χρησιμοποιούν κινητήρες DC για να μπορούν να μετακινηθούν στον χώρο. Το ερπυστριοφόρο όχημα διαθέτει 2 κινητήρες, ενώ τα άλλα οχήματα διαθέτουν από 4 κινητήρες το καθένα. Μπορείτε να δείτε περισσότερες λεπτομέρειες για την λειtουργία των κινητήρων DC στο αντίστοιχο εργαστήριο.

Για την σύνδεση των κινητήρων αυτών χρησιμοποιούμε το L293D Motor Driver Shield που μας επιτρέπει να συνδέσουμε μέχρι και 4 κινητήρες DC και 2 κινητήρες servo στο Arduino. Αυτό φυσικά σημαίνει ότι χρησιμοποιεί πολλά από τα digital pins του Arduino.

Τοποθέτηση του Driver Shield πάνω στο Arduino

Το Motor Driver Shield τοποθετείται πάνω στην πλακέτα Arduino Uno και Arduino Mega. Για να καταφέρουμε να κάνουμε την σωστή τοποθέτηση θα πρέπει να προσέξουμε να εισάγουμε τα Αναλογικά pins του Driver στα αντίστοιχα της κάθε πλακέτας.

Σύνδεση του Motor Driver στην πλακέτα Arduino Uno
Σύνδεση του Motor Driver στην πλακέτα Arduino Mega
Τοποθέτηση του Motor Driver πάνω στην πλακέτα Arduino Mega

Αφαίρεση του jumper από το Driver Shield

Το Motor Driver Shield που έχουμε επιλέξει δέχεται μέχρι και 4 DC κινητήρες στις θέσεις από M1 μέχρι Μ4 που διαθέτει. Κάθε θέση δέχεται δυο καλώδια που έρχονται από τον κάθε κινητήρα. Επίσης επειδή οι κινητήρες απαιτούν αρκετό ρεύμα και παράγουν ηλεκτρικό θόρυβο που είναι πιθανό να δημιουργήσει πρόβλημα στο Arduino, χρειάζεται να συνδέσουμε χωριστά στο Motor Driver Shield μια πηγή ρεύματος με μπαταρίες. Σε αυτή τη περίπτωση δεν θα πρέπει να ξεχάσουμε να αφαιρέσουμε το jumper που υπάρχει στην πλακέτα του Driver.

Δεν πρέπει να ξεχάσουμε να αφαιρέσουμε το πλαστικό jumper από την πλακέτα. Όταν αυτό είναι στη θέση του τότε οι κινητήρες παίρνουν ρεύμα από το Arduino, ενώ όταν το αφαιρούμε παίρνουν ρεύμα χωριστά από μια άλλη πηγή όπως απλές μπαταρίες.

Σύνδεση κινητήρων και μπαταριών

Στο όχημα 1 έχουμε 4 διαφορετικού κινητήρες και θα αξιοποιήσουμε και τις 4 θέσεις (M1, M2, M3, M4) συνδέοντας στην κάθε μία έναν διαφορετικό κινητήρα, όπως φαίνεται στην παρακάτω εικόνα.

Σύνδεση και των 4 κινητήρων σε 4 διαφορετικές θέσεις.

Στο όχημα 2, επειδή το Driver Shield που έχουμε είναι ελαττωματικό και δεν δουλεύει η θέση M1, μπορούμε να κάνουμε το εξής. Να συνδέσουμε δυο κινητήρες σε μία θέση. Έτσι μπορούμε να συνδέσουμε τους κινητήρες της αριστερής πλευράς στην θέση M3 και τους κινητήρες της δεξιάς πλευράς στην M4. Κάθε φορά που θα κινούμε την αριστερή πλευρά θα ενεργοποιούνται οι 2 κινητήρες που είναι στην Μ3 και κάθε φορά που θα κινούμε την δεξιά πλευρά θα ενεργοποιούνται οι 2 κινητήρες που είναι στην M4.

Σύνδεση των 4 κινητήρων σε 2 θέσεις. Η δεξιά πλευρά στο M4 και η αριστερή στο M3

Στην περίπτωση του οχήματος με τις ερπύστριες που έχουμε μόνο δυο κινητήρες DC η σύνδεση γίνεται όπως φαίνεται στην παρακάτω εικόνα.

Συνδέουμε τους δυο κινητήρες σε δύο από τις 4 θέσεις. Στην περίπτωση μας επιλέξαμε τις θέσεις M3 και Μ4 για πρακτικούς λόγους, αφού η θέση M1 ήταν ελαττωματική.

Σύνδεση servo και βηματικών κινητήρων

Η σύνδεση των δυο κινητήρων servo γίνεται απευθείας πάνω στην μονάδα του Motor driver shield στις θέσεις που υπάρχουν για αυτούς.

Για τον βηματικό κινητήρα, χρησιμοποιούμε τον οδηγό ULN2003, ο οποίος χρειάζεται 4 ψηφιακά pins από το arduino.

Σύνδεση LED και Buzzer

Οι δυο τελευταίοι ενεργοποιητές μας συνδέονται σε ψηφιακά pins του Arduino.

Σύνδεση αισθητήρων

Από τους αισθητήρες που διαθέτουμε, οι δυο (θερμοκρασία, χιόνι) συνδέονται σε αναλογικά pins, άλλοι δυο (απόστασης και PIR) σε ψηφιακά Pins και η μονάδα IMU (γυροσκόπιο και επιταχυνσιόμετρο) συνδέεται στα pins SDA και SCL, αξιοποιώντας το I2C bus.

Προγραμματισμός

Προσθήκη απαραίτητων βιβλιοθηκών

Αρκετές από τις μονάδες και τους αισθητήρες που χρησιμοποιούμε, διαθέτουν έτοιμες βιβλιοθήκες για τον πιο εύκολο χειρισμό τους μέσα από το περιβάλλον του Arduino. Πριν ξεκινήσουμε λοιπόν τα προγράμματα μας θα πρέπει να προσθέσουμε αυτές τις βιβλιοθήκες.

Προσθήκη της βιβλιοθήκης Motor Shield

Το Motor Shield που έχουμε συνδέσει στο Arduino χρησιμοποιεί την βιβλιοθήκη Adafruit Motor Shield V1. Για να την προσθέσουμε στο περιβάλλον του Arduino ακολουθούμε τα παρακάτω βήματα.

Από το μενού Σχέδιο επιλέγουμε Συμπερίληψη βιβλιοθήκης και μετά Διαχείριση βιβλιοθηκών
Αναζητούμε την Ardafruit Motor Shield library, έκδοση V1 και την κάνουμε εγκατάσταση

Προσθήκη βιβλιοθήκης για την μονάδα IMU

Υπάρχουν πολλές βιβλιοθήκες για την μονάδα που έχουμε επιλέξει. Μια από τις πιο εύκολες στη χρήση είναι η βιβλιοθήκη MPU6050_tockn, η οποία αναλαμβάνει να κάνει περίπλοκους υπολογισμούς και επιστρέφει τα αποτελέσματα περιστροφής σε μοίρες για τους άξονες X,Y,Z. Η διαδικασία εγκατάστασης της είναι παρόμοια.

Αναζητούμε την βιβλιοθήκη mpu6050_tockn και την κάνουμε εγκατάσταση

Προσθήκη βιβλιοθήκης για τον αισθητήρα απόστασης

Αν και στο εργαστήριο για τον αισθητήρα απόστασης, μάθαμε να υπολογίζουμε τα εκατοστά από τον χρόνο επιστροφής του υπερήχου, αποφασίσαμε να χρησιμοποιήσουμε την βιβλιοθήκη NewPing, η οποία μας επιτρέπει να κάνουμε πιο απλό το πρόγραμμα μας, καθώς αναλαμβάνει να κάνει αυτόματα αυτούς τους υπολογισμούς. Η προσθήκη της στο περιβάλλον του Arduino γίνεται με παρόμοιο τρόπο.

Αναζητούμε την βιβλιοθήκη NewPing και την κάνουμε εγκατάσταση

Προσθήκη βιβλιοθήκης για τον αισθητήρα θερμοκρασίας

Ο αισθητήρας θερμοκρασίας που χρησιμοποιούμε (DHT11) απαιτεί την εγκατάσταση της βιβλιοθήκης DHT Sensor Library, για να μπορέσουμε να τον αξιοποιήσουμε.

Αναζητούμε την βιβλιοθήκη DHT sesnor library και την κάνουμε εγκατάσταση

Προγράμματα δοκιμών

Αφού εγκαταστήσαμε και τις βιβλιοθήκες μας, ξεκινήσαμε να δοκιμάζουμε ένα – ένα τα στοιχεία που έχουμε συνδέσει, παρατηρώντας αν συμπεριφέρονται όπως αναμένουμε. Αυτή η διαδικασία ήταν ιδιαίτερα σημαντική, καθώς με τον τρόπο αυτό είδαμε και τις εντολές που απαιτούνται για κάθε αισθητήρα και ενεργοποιητή και μπορέσαμε να φτιάξουμε αρχικά μικρά προγράμματα, τα οποία συνθέσαμε αργότερα στο τελικό μας πρόγραμμα.

Στο πεδίο των δοκιμών

Δοκιμή κινητήρων DC

Το πρόγραμμα δοκιμών για κάθε όχημα το χρησιμοποιήσαμε για να δούμε αν έχουμε κάνει σωστά τις συνδέσεις. Το αποτέλεσμα της εκτέλεσης των προγραμμάτων πρέπει να το είναι το εξής: Διαρκώς οι κινητήρες θα κινούνται προς τα εμπρός για 3 δευτερόλεπτα με ταχύτητα 200 και θα σταματάν για άλλα 3 δευτερόλεπτα. Αν κάποιοι ή όλοι οι κινητήρες κινούνται ανάποδα από αυτό που έχουμε προβλέψει, τότε θα χρειαστεί να αλλάξουμε τις συνδέσεις των καλωδίων πάνω στο Motor Driver Shield. Έτσι αν για παράδειγμα ο κινητήρας που είναι στη σύνδεση Μ3 πηγαίνει ανάποδα, τότε θα αντιμεταθέσουμε την θέση των 2 καλωδίων που συνδέονται εκεί.

Τα προγράμματα δοκιμών των κινητήρων για τα οχήματα μας, μπορείτε να τα βρείτε στο αποθετήριο μας στο Github:

Δοκιμή κινητήρων servo

Στην θέση SERVO 1 της μονάδας Motor Shield έχουμε τοποθετήσει τον κινητήρα για τον έλεγχο του μαχαιριού και στην θέση SERVO 2 έχουμε τοποθετήσει τον κινητήρα για τον διασκορπισμό του αλατιού. Για να μπορέσουμε να προχωρήσουμε στην δοκιμή θα πρέπει να ξέρουμε σε ποια pin του Arduino ανταποκρίνονται αυτές οι θέσεις. Η θέση SERVO 1 συνδέεται με το Digital pin 9 και η θέση SERVO 2 με το digital pin 10.

Το πρόγραμμα δοκιμής που έχουμε περιστρέφει και τους δυο κινητήρες μεταξύ των ακραίων θέσεων που μπορεί να έχουν, δηλαδή τις 0 μοίρες και τις 180 μοίρες. Εμείς αυτό που είχαμε να κάνουμε, είναι να βρούμε ποιες είναι οι κατάλληλες θέσεις που μας βολεύουν ιδίως για το μαχαίρι που πρέπει να απομακρύνει το χιόνι. Ύστερα από δοκιμές καταλήξαμε σε διαφορετικές ακραίες τιμές για κάθε όχημα.

Δοκιμή μονάδας IMU

Αφού κάνουμε εγκατάσταση την βιβλιοθήκη για την μονάδα IMU, μπορούμε να πάμε από το μενού Αρχείο στα Παραδείγματα και από εκεί να πάμε στην βιβλιοθήκη MPU6050_tockn και να διαλέξουμε το παράδειγμα GetAngle. Το φορτώνουμε στην κατασκευή μας, ανοίγουμε την σειριακή οθόνη και ελέγχουμε αν αναγνωρίζει τις αλλαγές την διεύθυνση του οχήματος μας, καθώς εμείς το γυρνάμε με τα χέρια μας.

Για να κατανοήσουμε καλύτερα τις τιμές που μας επιστρέφει η συγκεκριμένη βιβλιοθήκη μπορούμε να μελετήσουμε πρώτα το παρακάτω 3D μοντέλο.

Η τιμή της γωνίας περιστροφής Χ που μας επιστρέφει η βιβλιοθήκη, αφορά την περιστροφή του οχήματος γύρω από τον άξονα Χ και τα ίδια ισχύουν για τις άλλες δυο τιμές (γωνία Υ και γωνία Ζ). Άρα εμάς που μας ενδιαφέρει να ελέγξουμε αν το όχημα μας πηγαίνει ευθεία, μας χρειάζεται η περιστροφή γύρω από τον άξονα Z. Μπορείτε να φορτώσετε στο Arduino το πρόγραμμα δοκιμής για την γωνία περιστροφής γύρω από τον άξονα Ζ που έχουμε στο Github και να ελέγξετε τις τιμές που επιστρέφει στην σειριακή οθόνη.

Η μονάδα GY-521 με την βιβλιοθήκη MPU6050_tockn, επιστρέφουν θετικές τιμές για την περιστροφή προς τα αριστερά γύρω από τον άξονα Ζ

Η μονάδα GY-521 με την βιβλιοθήκη MPU6050_tockn, επιστρέφουν αρνητικές τιμές για την περιστροφή προς τα αριστερά γύρω από τον άξονα Ζ

Μπορούμε λοιπόν τώρα να κάνουμε μια δοκιμή αξιοποιώντας την μονάδα IMU ώστε να διατηρήσουμε την πορεία των οχημάτων μας σταθερή σε ευθεία. Ο αλγόριθμος που θα χρησιμοποιήσουμε θα λειτουργεί ως εξής:

  • Ελέγχω την τιμή της γωνίας Ζ
  • Αν η γωνία Ζ είναι μικρότερη από -1 μοίρα, τότε στρίβω προς τα αριστερά, (δίνω μεγαλύτερη ταχύτητα στους δεξιά κινητήρες).
  • Αλλιώς αν η γωνία Ζ είναι μεγαλύτερη από 1 μοίρα, τότε στρίβω προς τα δεξιά, (δίνω μεγαλύτερη ταχύτητα στους αριστερά κινητήρες).
  • Αλλιώς αν η γωνία Ζ είναι μεταξύ -1 και 1 μοιρών τότε δεν έχω χάσει αρκετά από την πορεία μου και συνεχίζω ευθεία (όλοι οι κινητήρες με την ίδια ταχύτητα).

Στο αποθετήριο μας στο Github μπορείτε να βρείτε το πρόγραμμα για την δοκιμή της σταθερής πορείας για το αποχιονιστικό 1. Μπορείτε να πειραματιστείτε με την απόκλιση της γωνίας Ζ και να δοκιμάσετε μικρότερες τιμές (-2 μέχρι 2 ή -1 μέχρι 1). Για να κάνετε δοκιμές στα άλλα 2 αποχιονιστικά θα πρέπει να τροποποιήσετε το πρόγραμμα.

Δοκιμή μονάδας φωτός

Την μονάδα φωτός την έχουμε συνδέσει στο Digital pin 29. Το πρόγραμμα δοκιμής μας (που έχουμε στο Github), ανάβει και σβήνει το φως κάθε ένα δευτερόλεπτο. Κατεβάστε στο στο αποχιονιστικό και ελέγξτε ότι δουλεύει σωστά. Μπορείτε να αλάξετε την καθυστέρηση, αλλάζοντας τα χιλιοδευτερόλεπτα στις εντολές delay.

Δοκιμή ηχείου (buzzer)

Το buzzer το έχουμε συνδέσει στο digital pin 27. Το πρόγραμμα δοκιμής μας (που έχουμε στο Github), ενεργοποιεί και απενεργοποιεί το buzzer κάθε ένα δευτερόλεπτο. Κατεβάστε στο στο αποχιονιστικό και ελέγξτε ότι δουλεύει σωστά. Μπορείτε να αλάξετε την καθυστέρηση, αλλάζοντας τα χιλιοδευτερόλεπτα στις εντολές delay.

Δοκιμή αισθητήρα απόστασης υπέρηχων

Τον αισθητήρα τον έχουμε συνδέσει στο digital pin 23. Το πρόγραμμα δοκιμής μας (που έχουμε στο Github), ελέγχει την απόσταση των εμποδίων που υπάρχουν μπροστά από τον αισθητήρα σε εκατοστά και τα εμφανίζει στην σειριακή οθόνη, αξιοποιώντας την βιβλιοθήκη New Ping. Κατεβάστε στο στο αποχιονιστικό και ελέγξτε ότι δουλεύει σωστά. Παρατηρήστε τι συμβαίνει αν μπροστά από το όχημα μας δεν υπάρχει εμπόδιο για αρκετά μέτρα. Μερικές φορές επιστρέφει τιμή 0. Αυτό μπορεί να είναι σημαντικό πρόβλημα αργότερα στο πρόγραμμα μας και θα πρέπει να το λάβουμε υπόψη μας!

Δοκιμή του αισθητήρα PIR

Τον αισθητήρα PIR τον έχουμε συνδέσει στο digital pin 25. Το πρόγραμμα δοκιμής μας (που έχουμε στο Github), ελέγχει αν υπάρχει κίνηση και εμφανίζει μήνυμα στην σειριακή οθόνη. Κατεβάστε στο στο αποχιονιστικό και ελέγξτε ότι δουλεύει σωστά.

Δοκιμή του αισθητήρα θερμοκρασίας

Τον αισθητήρα θερμοκρασίας τον έχουμε συνδέσει στο αναλογικό pin Α14. Το πρόγραμμα δοκιμής μας (που έχουμε στο Github), εμφανίζει την θερμοκρασία στην σειριακή οθόνη.

Δοκιμή του αισθητήρα βροχής/χιονιού

Τον αισθητήρα βροχής/χιονιού τον έχουμε συνδέσει στο αναλογικό pin Α15. Το πρόγραμμα δοκιμής μας (που έχουμε στο Github), εμφανίζει τις τιμές του αισθητήρα στην σειριακή οθόνη. Κατεβάστε στο στο αποχιονιστικό και ελέγξτε ότι δουλεύει σωστά, χρησιμοποιώντας ένα ποτηράκι νερό (με τα δάχτυλα σας ρίξετε σταγόνες επάνω του). Παρατηρήστε το εξής: Όταν δεν υπάρχει νερό πάνω στον αισθητήρα οι τιμές που επιστρέφει είναι μεγάλες, κοντά στο 1023. Αντίθετα όταν υπάρχει νερό, οι τιμές που επιστρέφει ο αισθητήρας είναι μικρές, κοντά στο 0. Θα ήταν καλύτερα να μετατρέπουμε αυτές τις τιμές σε μια άλλη κλίμακα, για παράδειγμα μεταξύ του 0-100 και οι υψηλότερες τιμές να σήμαιναν υψηλότερη υγρασία. Μπορούμε να το κάνουμε αν χρησιμοποιήσουμε τη συνάρτηση map ως εξής:

rain = map(rain,0,1023,100,0);

Έτσι οι τιμές που είναι από 0-1023 θα γίνουν από 100-0. Προσθέστε και δοκιμάστε την παραπάνω εντολή στο πρόγραμμα.

Δοκιμή βηματικού κινητήρα

Ο βηματικός κινητήρας που έχουμε, υπάρχει για να γυρνάει τον κοχλία της αλατιέρας. Μπορείτε να κατεβάσετε στο Arduino το πρόγραμμα δοκιμής του που έχουμε στο Github και να ελέγξετε την λειτουργία του.

Τελικό πρόγραμμα

Ο κύριος σκοπός μας από την αρχή ήταν να δημιουργήσουμε ένα αυτόνομο μηχάνημα το οποίο να μπορεί να κινείται μόνο του και να λαμβάνει αποφάσεις για τον αποχιονισμό και την κίνηση, χωρίς να χρειάζεται κάποιον άνθρωπο να το καθοδηγεί.

Το πιο δύσκολο κομμάτι αφορά την κίνηση του οχήματος στον χώρο με ασφάλεια και ακρίβεια. Τα σύγχρονα αυτόνομα οχήματα που αναπτύσσονται από διάφορες εταιρίες τα τελευταία χρόνια και κινούνται στον δρόμο, χρησιμοποιούν πλήθος αισθητήρων για να λαμβάνουν τις σωστές αποφάσεις κατά την οδήγηση. Στην δική μας περίπτωση υποθέτουμε ότι έχουμε σχολικές αυλές που έχουν σχήμα ορθογώνιο παραλληλόγραμμο. Το όχημα μας θα πρέπει να μπορεί να κινηθεί στην αυλή πρωτίστως με ασφάλεια και με ακρίβεια. Έτσι θα πρέπει να αντιλαμβάνεται την ύπαρξη ανθρώπων, την θέση των ορίων της αυλής (τοίχοι) ενώ θα πρέπει να διατηρεί με ακρίβεια την πορεία του (κίνηση σε ευθεία και στροφές).

Επίσης το όχημα μας θα πρέπει να αντιλαμβάνεται αν υπάρχουν συνθήκες που ευνοούν τον σχηματισμό πάγου στην αυλή (θερμοκρασία και υγρασία) και να αποφασίζει για το αν θα ρίξει αλάτι ή όχι.

Η μέχρι τώρα υλοποίηση μας μπορεί να καθαρίσει το χιόνι από μια ορθογώνια αυλή με δυο περάσματα. Τα αποχιονιστικά μηχανήματα μας μπορούν να κινηθούν με σε ευθεία και να στρίψουν με ακρίβεια, μπορούν να αντιληφθούν τα όρια της αυλής, αν υπάρχουν άνθρωποι, καθώς και τις συνθήκες δημιουργίας πάγου. Στο παρακάτω βίντεο γίνεται η ανάλυση του αλγορίθμου μας:

Για να μπορέσουμε να φτιάξουμε το τελικό μας πρόγραμμα, αρχικά δημιουργήσαμε μικρότερα υπο-προγράμματα τα οποία υλοποιούν το κάθε βήμα του αλγορίθμου ξεχωριστά. Στη συνέχεια καλούμε τα υποπρογράμματα αυτά με τη σειρά που θέλουμε να εκτελεστούν.

Βήμα 1ο – Αρχικοποίηση

Το πρώτο βήμα αρχικοποιεί την μονάδα IMU (γυροσκόπιο) και ανεβάζει το μαχαίρι στην αρχική του θέση (πάνω). Επειδή θέλουμε να δώσουμε χρόνο ώστε να τοποθετήσουμε το όχημα πριν ξεκινήσει η ρύθμιση του γυροσκοπίου, περιμένουμε αρχικά 5 δευτερόλεπτα, ενώ χρησιμοποιούμε το λαμπάκι LED για να μας δείξει το όχημα πότε ξεκινάει και πότε σταματάει η αρχικοποίηση την μονάδας IMU (θέλει περίπου 3 δευτερόλεπτα).

//Η συνάρτηση start κάνει την αρχικοποίηση του οχήματος μας
//Θα πρέπει να ενεργοποιήσουμε το γυροσκόπιο και να σηκώσουμε το μαχαίρι
void start() {
  delay(5000);                  //Περιμένουμε 5 δευτερόλεπτα για να τοποθετήσουμε το όχημα
  digitalWrite(pinL,HIGH);      //Ανάβουμε το φως
  Wire.begin();                 //Ξεκινάμε τις βιβλιοθήκες της μονάδα imu
  imu.begin();                  //Ξεκινάμε τις βιβλιοθήκες της μονάδα imu 
  imu.calcGyroOffsets(true);    //Ζητάμε από την μονάδα να κάνει την αρχική ρύθμιση (θέλει 3 δευτερόλεπτα)
  digitalWrite(pinL,LOW);       //Μόλις η ρύθμιση τελειώσει σβήνουμε το φως.
  front.attach(pinServoM);      //Ενεργοποιώ τον κινητήρα servo του μαχαιριού
  front.write(100);             //Ανεβάζω το μαχαίρι ;
}

Βήμα 2ο – έλεγχος για συνθήκες πάγου

Πριν ξεκινήσουμε το καθαρισμό της αυλής ελέγχουμε την θερμοκρασία της ατμόσφαιρας και την υγρασία που υπάρχει πάνω στον αισθητήρα βροχής-χιονιού και αποφασίζουμε αν υπάρχουν συνθήκες πάγου, ώστε καθώς κινείται το όχημα μας να ρίχνει αλάτι.

//Η συνάρτηση checkIce θα ελέγχει τις συνθήκες θερμοκρασίας και βροχόπτωσης/χιονόπτωσης και
//αν αυτές είναι τέτοιες ώστε να υπάρχει πάγος θα κάνει την μεταβλητή ice true αλλιώς θα την κάνει false
void checkIce() {
  DHT.read11(pinT);                           //Διαβάζουμε τις τιμές από τον αισθητήρα θερμοκρασίας
  temp = DHT.temperature;                     //Παίρνουμε την θερμοκρασία στην μεταβλητή temp
  rain = map(analogRead(pinR),0,1023,100,0);  //Παίρνουμε την τιμή της βροχόπτωσης/χιονόπτωσης
  if (temp < 0 && rain > 50) {                //Αν η θερμοκρασίας είναι κάτω από 0 και υπάρχει βροόπτωση/χιονόπτωση πάνω από 50% τότε
    ice = true;                               //Κάνω την μεταβλητή του πάγου σε true  
  } else {                                    //Αλλιώς
    ice = false;                              //Κάνω την μεταβλητή του πάγου σε false  
  }
}

Βήμα 3ο, 5ο και 7ο – πορεία του οχήματος σε ευθεία

Σε αυτά τα βήματα του αλγορίθμου μας, κατεβάζουμε το μαχαίρι και ξεκινάμε μια πορεία σε ευθεία γραμμή, μέχρι να φτάσουμε στον τοίχο (όριο της αυλής). Σε αυτή την πορεία διαρκώς ελέγχουμε μήπως υπάρχει κάποιος άνθρωπος μπροστά από το όχημα, οπότε και σταματάμε και προειδοποιούμε με ήχο και φως. Επίσης αν ο έλεγχος των συνθηκών πάγου που κάναμε στην αρχή είχε βγει αληθής, ρίχνουμε και αλάτι καθώς προχωράμε.

Στα τρία αυτά βήματα (3ο,5ο και 7ο) το μόνο που αλλάζει είναι η κατεύθυνση προς την οποία κινούμαστε. Αρχικά προχωράμε στην κατεύθυνση των 0 μοιρών (ευθεία από την αρχική θέση), στο 5ο βήμα προχωράμε στην κατεύθυνση των 90 μοιρών (αριστερά από την αρχική ευθεία) και στο 7ο βήμα προχωράμε στην κατεύθυνση των 180 μοιρών. Επειδή όλες οι άλλες εντολές είναι ίδιες, αντί να κάνουμε 3 διαφορετικά υποπρογράμματα, φτιάξαμε ένα το οποίο θα δέχεται τις μοίρες της κατεύθυνσης ως μεταβλητή.

//Η συνάρτηση drive οδηγεί το όχημα σε ευθεία στις μοίρες m που θέλουμε 
//Έτσι αν το όχημα μας κινείται μπροστά θα την γράψουμε ως drive(0), ενώ αν επιστρέφει 
//θα την γράψουμε ως drive(180)
void drive(float m) {       
  front.write(150);             //Κατεβάζω το μαχαίρι 
  motorR.run(FORWARD);          //Ενεργοποιώ τους κινητήρες
  motorL.run(FORWARD);          //Ενεργοποιώ τους κινητήρες
  cm = sonar.ping_cm();         //Παίρνουμε την απόσταση του τοίχου από τον αισθητήρα υπερήχων
  while (cm > 20 || cm == 0) {  //Όσο η απόσταση από τον τοίχο είναι μεγαλύτερη από 20 εκατοστά ή είναι μηδενική (μπορεί να μας δίνει τέτοια τιμή ο αισθητήρας αν δεν υπάρχει εμπόδιο κοντά
    checkPir();                 //Καλούμε τη συνάρτηση που ελέγχει για ανθρώπους
    if (ice == true) {          //Αν υπάρχει πάγος τότε
      salt.setSpeed(6);         //Ορίζω την ταχύτητα του κοχλία αλατιού σε 6 rpm
      salt.step(1);             //Περιστρέφω τον κοχλία της αλατιέρας για 1 βήμα
    }
    imu.update();               //Ανανεώνουμε τις τιμές του γυροσκόπιου
    mZ = imu.getAngleZ();       //Παίρνουμε τις μοίρες περιστροφής γύρω από τον άξονα Ζ
    if (mZ < m-1) {             //Αν η γωνία περιστροφής είναι μικρότερη από -1 μοίρα το όχημα έχει φύγει λίγο δεξιά οπότε
      motorR.setSpeed(150);     //Δίνουμε ταχύτητα 150 στους 2 κινητήρες δεξιά  
      motorL.setSpeed(0);       //Σταματάμε τους δυο κινητήρες αριστερά
    } else if (mZ > m+1) {      //Αν η γωνία περιστροφής είναι μεγαλύτερη από 1 μοίρα το όχημα έχει φύγει λίγο αριστερά οπότε
      motorL.setSpeed(150);     //Δίνουμε ταχύτητα 150 στους 2 κινητήρες αριστερά  
      motorR.setSpeed(0);       //Σταματάμε τους δυο κινητήρες δεξιά
    } else {                    //Αλλιώς αν δεν έχουμε ξεφύγει από την ευθεία
      motorL.setSpeed(150);     //Ορίζουμε την ταχύτητα και δεξιά και αριστερά στο 150 
      motorR.setSpeed(150);     //Ορίζουμε την ταχύτητα και δεξιά και αριστερά στο 150
    }
    cm = sonar.ping_cm();       //Παίρνουμε ξανά την απόσταση του τοίχου από τον αισθητήρα υπερήχων   
  }                             
  motorR.run(RELEASE);          //Όταν πλέον φτάσουμε στον τοίχο απενεργοποιούμε τους 4 κινητήρες
  motorL.run(RELEASE);          //Απενεργοποιούμε τους 4 κινητήρες
  front.write(100);             //Ανεβάζω το μαχαίρι 
}

Το κομμάτι του ελέγχου για την ύπαρξη ανθρώπων το υλοποιήσαμε και αυτό σε ξεχωριστό υποπρόγραμμα:

//Η συνάρτηση checkPir ελέγχει αν υπάρχει κίνηση ανθρώπων μπροστά από το όχημα και το σταματάει εκπέμποντας προειδοποιητικό ήχο και φως
void checkPir() {
  pir = digitalRead(pinP);      //Διαβάζω την τιμή του αισθητήρα PIR
  if (pir == HIGH) {            //Αν υπάρχει κίνηση
    motorR.run(RELEASE);        //Απενεργοποιώ τους κινητήρες
    motorL.run(RELEASE);        //Απενεργοποιώ τους κινητήρες 
    digitalWrite(pinL,HIGH);    //Ανάβω το φως 
    digitalWrite(pinS,HIGH);    //Ανοίγω το ηχείο 
  } else {                      //Αλλιώς αν δεν υπάρχει κίνηση 
    digitalWrite(pinL,LOW);     //Κλείνω το φως 
    digitalWrite(pinS,LOW);     //Κλείνω το ηχείο 
    motorR.run(FORWARD);        //Ενεργοποιώ τους κινητήρες
    motorL.run(FORWARD);        //Ενεργοποιώ τους κινητήρες
  }
}

Βήμα 4ο και 6ο – Στροφή προς τα αριστερά

Σε αυτά τα βήματα θέλουμε το όχημα μας να κάνει επιτόπια στροφή προς τα αριστερά, μέχρι να φτάσει σε κάποια συγκεκριμένη γωνία από την αρχική του θέση. Έτσι στο 4ο βήμα θέλουμε μια στροφή που θα καταλήγει στις 90 μοίρες, ενώ στο 6ο βήμα μια στροφή που θα καταλήγει στις 180 μοίρες.

//Η συνάρτηση turnLeft στρίβει το όχημα μας αριστερά μέχρι να φτάσει τις m μοίρες
void turnLeft(float m) {    
  while (mZ < m) {          //Όσο ακόμα δεν έχει φτάσει το όχημα τις επιθυμητές μοίρες
    motorL.run(BACKWARD);   //Βάζω τους αριστερά κινητήρες να κινηθούν ανάποδα
    motorR.run(FORWARD);    //Τους δεξιά κινητήρες να κινηθούν μπροστά
    motorL.setSpeed(200);   //Ορίζω την ταχύτητα των κινητήρων
    motorR.setSpeed(200);   //Ορίζω την ταχύτητα των κινητήρων
    imu.update();           //Ενημερώνω τις τιμές του γυροσκόπιου
    mZ = imu.getAngleZ();   //Παίρνω τη νέα τιμής της γωνίας Z
  }
  motorR.run(RELEASE);      //Όταν πλέον φτάσω τις επιθυμητές μοίρες απενεργοποιώ τους κινητήρες
  motorL.run(RELEASE);      //Απενεργοποιώ τους κινητήρες
}

Το κυρίως πρόγραμμα

Αφού λοιπόν φτιάξαμε όλα τα παραπάνω υποπρογράμματα, μπορούμε πλέον να τα χρησιμοποιούμε στο κυρίως πρόγραμμα μας που βρίσκεται μέσα στην συνάρτηση setup:

start();        //Βήμα 1ο Αρχικοποιώ το όχημα
checkIce();     //Βήμα 2ο Ελέγχω τις συνθήκες θερμοκρασίας - υγρασίας για το αν υπάρχει πάγος
  
//Οι οδηγίες που ακολουθούν καθαρίζουν έναν διάδρομο στην αυλή του σχολείου 
//Μπορούμε να τις βάλουμε σε επανάληψη για να καθαρίσουμε περισσότερη επιφάνεια
drive(0);       //Βήμα 3ο Στέλνω το όχημα σε ευθεία μέχρι να βρει τον τοίχο
delay(1000);    //Περιμένω 1 δευτερόλεπτο
turnLeft(90);   //Βήμα 4ο Στρίβω αριστερά στις 90 μοίρες
delay(1000);
drive(90);      //Βήμα 5ο Οδηγώ σε ευθεία μέχρι να βρω τον τοίχο
delay(1000);
turnLeft(180);  //Βήμα 6ο Στρίβω αριστερά στις 180 μοίρες
delay(1000);
drive(180);     //Βήμα 7ο Οδηγώ σε ευθεία μέχρι να βρω τον τοίχο 

Μπορείτε να δείτε τα τελικά μας προγράμματα για τα δυο οχήματα στο github:

Φωτογραφίες και βίντεο

Μπορείτε να δείτε πλούσιο φωτογραφικό υλικό από τις συναντήσεις μας σε αυτό το λεύκωμα.

Μετά τις 5/5/2019

Η προθεσμία υποβολής του έργου μας για τον 1ο Πανελλήνιο Διαγωνισμό Ρομποτικής Ανοιχτών Τεχνολογιών, έληγε στις 5/5/2019. Μετά από αυτή την ημερομηνία, έχουμε βρεθεί άλλες πέντε φορές (8/5/2019 και 15/5/2019, 22/05/2019, 29/05/2019 και 5/06/2019) και προχωράμε σε αλλαγές του αλγορίθμου και του προγράμματος μας και τις οποίες δεν έχουμε ενσωματώσει σε αυτή τη σελίδα. Όλες τις αλλαγές θα τις προσθέσουμε, αφού ολοκληρωθεί η διαδικασία αξιολόγησης.

3 Σχόλια

Αφήστε μια απάντηση