Πώς να ελέγχω την κίνηση του Thymio προγραμματίζοντας τους δύο κινητήρες -τροχούς που διαθέτει; (9η Δραστηριότητα)

του Νίκου Δαπόντε

Μέχρι τώρα γνωρίσαμε ότι το ρομποτάκι Thymio διαθέτει δύο τροχούς – κινητήρες (Direct Current- DC, συνεχούς ρεύματος) ενσωματωμένους στο κύριο σώμα του κινητού οι οποίοι  μπορούν να περιστρέφονται στα άκρα ενός κοινού άξονα μήκους L = 9.4 εκατοστών όπως δείχνεται στα παρακάτω σχήματα.

thymio9-1

Επιπλέον, τα προγραμματιστικά περιβάλλοντα που υποστηρίζουν το ρομποτάκι μας συμπεριλαμβάνουν ορισμένες εντολές οι οποίες στηρίζονται στις ταχύτητες κίνησης των δύο κινητήρων (speed_R και speed_L  για το δεξιό και τον αριστερό τροχό, αντίστοιχα, με όρια τιμών -500 ως 500 μονάδων). Τελικά, με αυτούς τους δύο κινητήρες – που μπορούν να περιστρέφονται με διαφορετικές ταχύτητες και επομένως να διαγράφουν κυκλικά τόξα – το κινητό- ρομποτάκι Thymio καταφέρνει:

  • να περιστρέφεται δεξιά / αριστερά γύρω από το Κέντρο του ρομπότ,
  • να κινείται μπροστά / πίσω,
  • να στρίβει δεξιά / αριστερά στον περιβάλλοντα κόσμο που βρίσκεται.

(Μελετήστε προσεκτικά τις δύο παρακάτω εικόνες στις οποίες αναπαριστάνονται με σχήματα οι διαφορετικές περιπτώσεις)

thymio9-2

Προτού ασχοληθούμε ιδιαίτερα με τον προγραμματισμό των πιο πάνω περιπτώσεων αξίζει να ασχοληθούμε με μια προσομοίωση του Thymio (που φτιάχτηκε με το εκπαιδευτικό λογισμικό Γεωμετρίας Geogebra και μάλιστα τρέχει online  στη διεύθυνση: https://www.geogebra.org/b/npXGkgnT#material/nPvBVkKV )

Σ’ αυτό το περιβάλλον του Geogebra επιλέγουμε τις ταχύτητες των δύο κινητήρων – τροχών (με τους sliders v0 και v1, ταχύτητες του αριστερού και δεξιού τροχού, αντίστοιχα) και παίρνουμε τόσο την προσομοίωση της κίνησης του Thymio στην οθόνη όσο και τις τροχιές που διαγράφουν οι δύο τροχοί αλλά δυστυχώς δεν αισθητοποιείται η τροχιά του κέντρου το ρομπότ. Επιπλέον, ταυτόχρονα παρουσιάζονται στην οθόνη μας οι τιμές διαφόρων μεγεθών όπως η ταχύτητα vf, η γωνιακή ταχύτητα ω καθώς και η ακτίνα R της κυκλικής τροχιάς που διαγράφει το Κέντρο του Thymio, όπου:

thymio9-3

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

thymio9-4

Στο παρακάτω στιγμιότυπο, σχεδίασα ότι θα χρειαστούμε για την παρουσίαση των δικών μας παραδειγμάτων –επιδείξεων με τη βοήθεια των προγραμματιστικών περιβαλλόντων του Thymio (VPL,  BLOCKLY και «Text Programming»).

thymio9-5

Σημείωση: Σκέφτηκα να φτιάξω μια προσομοίωση του κινητού ρομπότ στο περιβάλλον του Scratch αλλά να χρησιμοποιήσω ως sliders για το πιλοτάρισμά του όχι τις ταχύτητες των δύο τροχών (VR και VL), όπως είδαμε στο Geogebra, αλλά την ταχύτητα ( V ) και τη γωνιακή του ταχύτητα ( ω ) του ρομπότ Thymio. Πρόκειται για ένα τεστ δικό μου για τον έλεγχο της κίνησης ενός κινητού-ρομπότ εδάφους και ισχύει για όλα τα ρομποτάκια με δύο τροχούς (https://scratch.mit.edu/projects/122624983/).

thymio9-6

Τώρα, ας αφήσουμε τις προσομοιώσεις και ας δουλέψουμε με το ρομποτάκι πάνω σ’ ένα πραγματικό τραπέζι ή στo πάτωμα και ας αξιοποιήσουμε τις δυνατότητες που μας προσφέρει το Advanced VPL (βλέπε στο Eduportal την 6η Δραστηριότητα για το Thymio).

thymio9-7

Το περιβάλλον «Οπτικού προγραμματισμού» περιλαμβάνει την εντολή δράσης (action) που αναφέρεται στην επιλογή των δύο κινητήρων -δεξιού / αριστερού του Thymio- μετακινώντας τους δύο μεταβολείς (sliders) που διαθέτει όπως στο σχήμα:

thymio9-8

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

Στο προγραμματάκι που έφτιαξα στο VPL, στην πρώτη γραμμή, δείχνω τις θέσεις των sliders για τις ταχύτητες των δύο τροχών. Ακριβώς στα δεξιά τοποθέτησα το τμήμα του «Text Programming» που με ενδιαφέρει όπου διαβάζω τις τιμές 100 και -100 για την ταχύτητα αριστερού και δεξιού τροχού αντίστοιχα. Επιπλέον, διαβάζω και την επιλογή 2000 ms για τη χρονική διάρκεια της δεξιόστροφής κίνηση του κινητού ρομπότ.

Στην τρίτη γραμμή, δείχνω τις θέσεις των sliders για τη δεξιά περιστροφή και για χρονική διάρκεια 2750 ms που επέλεξα για την αριστερόστροφη κίνηση του Thymio.

Σημείωση: Η δεύτερη και η τέταρτη γραμμή είναι απαραίτητες για το σταμάτημα του κινητού μας μετά την «εξάντληση» των χρόνων περιστροφής 2000 ms και 2750 ms αντίστοιχα.

thymio9-9

Συμπέρασμα:  Οποιοδήποτε κινητό ρομποτάκι για να περιστραφεί γύρω από το Κέντρο του θα πρέπει οι ταχύτητες των δύο τροχών του να είναι ίσες και αντίθετες, VR = –VL.

thymio9-10

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

Στην πρώτη γραμμή, με το slider της αριστερής ρόδας θέτω VL=0 και με το αντίστοιχο για τη δεξιά ρόδα θέτω VR=100. Στην τέταρτη γραμμή θέτω VL=0 και VR=-100.

thymio9-11

Συμπέρασμα:  Οποιοδήποτε κινητό ρομποτάκι για να περιστραφεί γύρω από τη μία του ρόδα (π.χ. την αριστερή) θα πρέπει η ταχύτητα VL=0 και η ταχύτητα της δεξιάς ρόδας να είναι θετική ή αρνητική (VR=100 για την αριστερόστροφη κίνηση ή VR=-100 για την δεξιόστροφη κίνηση). Με παρόμοιο τρόπο σκέφτομαι για την περίπτωση περιστροφής του κινητού ρομπότ γύρω από τον ακίνητο δεξιό τροχό.

thymio9-12

Για τον προγραμματισμό, αρχικά φτιάχνω μια subroutine με όνομα < UNIFORM_MOTION> η οποία εκφράζει την κίνηση των δύο τροχών με ταχύτητες <speed_Right> και <speed_left>.

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

κίνηση μπροστά (ίσες ταχύτητες, θετικές {70 , 70 }),

κίνηση πίσω (ίσες ταχύτητες, αρνητικές {-70, -70})

δεξιόστροφη κίνηση γύρω από τον ακίνητο δεξιό τροχό ( {0 , 70})

αριστερόστροφη κίνηση γύρω από τον ακίνητο αριστερό τροχό ( {70 , 0} )

σταμάτημα του ρομπότ ( {0 , 0} )

thymio9-13

thymio9-14

Όποιος ενδιαφέρεται μπορεί να «διαβάσει» τον αντίστοιχο κώδικα του προγράμματος στο περιβάλλον «Text Programming» ή να πειραματιστεί αλλάζοντας τις τιμές των δύο μεταβλητών ταχυτήτων < speed_Right > και < speed_left >.

thymio9-15

Εφόσον το τέταρτο «καθήκον» ζητάει από το ρομποτάκι Thymio  να πραγματοποιεί διάφορα γεγονότα, σε διαδοχικές χρονικές διάρκειες, θα χρησιμοποιήσω το block <on temperature> updated. Επιπλέον, θα φτιάξω μια subroutine με όνομα < motion > η οποία αναλαμβάνει να πραγματοποιεί τα διαδοχικά γεγονότα:

Ευθύγραμμη ομαλή κίνηση μπροστά με ταχύτητα 100 μονάδες

Περιστροφική κίνηση γύρω από το Κέντρο του άξονα των τροχών

Στροφή γύρω από τον αριστερό (ακίνητο τροχό)

Περιστροφική κίνηση γύρω από το Κέντρο του άξονα των τροχών.

Για την αρχή μέτρησης του χρόνου set <time> 0 φτιάχνω τη διαδικασία on <center> button touched  οπότε ξεκινάνε τα προγραμματισμένα σε χρονική σειρά απλά γεγονότα.

Στο πλαίσιο που ακολουθεί δίνεται ο κώδικας του μικρού προγράμματος τόσο στο περιβάλλον BLOCKLY όσο και στο «Text Programming».

thymio9-16

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

thymio9-17

Πρώτα σκέφτομαι τι θέλω να κάνει το ρομποτάκι αν του πατήσω τα τρία κουμπιά (περιστροφές δεξιά ή αριστερά γύρω από το Κέντρο και σταμάτημα). Στη συνέχεια ορίζω τις μεταβλητές <speed_R> και <speed_L) και φτιάχνω μια subroutine με όνομα <TURN_CENTER> που  αποδίδει αυτές τις ταχύτητες στους αντίστοιχους κινητήρες-τροχούς.

Μετά από αυτό ενεργοποιώ το γνωστό από προηγούμενες δραστηριότητες block {on<remote control signal>received} προσδιορίζοντας ακριβώς «τι θα ήθελα να κάνει το ρομποτάκι» με το πάτημα των κουμπιών δεξιά/αριστερά/stop του τηλεχειριστήριου.

Α) Για να περιστραφεί το ρομποτάκι γύρω από το Κέντρο «δεξιόστροφα» θα πρέπει οι ταχύτητες των δύο κινητήρων (αριστερού και δεξιού τροχού) να είναι ίσες και αντίθετες. Στον κώδικα χρησιμοποίησα τις τιμές {88 για τον αριστερό και -88 για τον δεξιό} .

Β) Με την ίδια λογική, για να περιστραφεί το ρομποτάκι γύρω από το Κέντρο «αριστερόστροφα» θα πρέπει οι ταχύτητες των δύο κινητήρων (αριστερού και δεξιού τροχού) να είναι και πάλι ίσες και αντίθετες. Αυτή τη φορά, στον κώδικα χρησιμοποίησα τις τιμές {-88 για τον αριστερό και 88 για το δεξιό}.

thymio9-18

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

Α) Αν πατήσω το κουμπί (με τιμή 80, δηλ. «μπροστά» στο τηλεκοντρόλ) και η τιμή της ταχύτητας του αριστερού τροχού είναι 88 μονάδες τότε η εντολή start <turning left > with speed < 88  > μεταφράζεται ως:

η ταχύτητα του αριστερού τροχού =0

η ταχύτητα του δεξιού τροχού = 88

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

Β) Αν πατήσω το κουμπί (με τιμή 81, δηλ. «πίσω» στο τηλεκοντρόλ) τότε έχουμε περιστροφή του κινητού γύρω από τον ακίνητο δεξιό τροχό.

(Όσο για τις δράσεις που προκαλούν τα άλλα κουμπιά μπορείς εύκολα να πειραματιστείς ο ίδιος).

thymio9-19