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

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

Για το κινητό-ρομπότ Thymio, θα περίμενε κανείς ότι τα περιβάλλοντα προγραμματισμού VPL («Οπτικός προγραμματισμός») και του BLOCKLY θα υποστήριζαν μια εντολή του τύπου { Προχώρα μπροστά <βήματα> } όπως ισχύει για τα αντικείμενα – sprites τα οποία κινούνται στην οθόνη του υπολογιστή μας (βλέπε τα γνωστά ως Logo-Like περιβάλλοντα, για παράδειγμα, το Scratch www.scratch.mit.edu ) .  Αντί γι αυτό  μας παρέχεται η ταχύτητα των τροχών – κινητήρων, όπως φαίνεται από τα blocks στα δύο γνωστά μας περιβάλλοντα καθώς και οι εντολές στο «Text Programming».

thymio7-1

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

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

Πρώτο παράδειγμα – Επίδειξη

Αυτό που θέλουμε είναι να κινηθεί τo κινητό-ρομποτάκι Thymio μόνο για 1 δευτερόλεπτο με ταχύτητα 100 μονάδες και να μετρήσουμε την απόσταση που αυτό διανύει. Στη διάθεσή μας έχουμε ένα Thymio που κινείται οριζόντια πάνω σε χαρτί Α4, ένα βαθμονομημένο σε cm χάρακα, ένα μαρκαδόρο και τα δύο γνωστά περιβάλλοντα VPL και BLOCKLY.

1_a) Στο περιβάλλον του «Οπτικού προγραμματισμού VPL» για προχωρημένους (advanced VPL) έχουμε τη δυνατότητα να χρονομετρούμε τη διάρκεια μιας κίνησης. Γι αυτό το σκοπό αξιοποιούμε τόσο το εικονίδιο δράσης – action (ονομάζεται timer) το οποίο μας επιτρέπει να επιλέγουμε τη χρονική διάρκεια μιας πράξης (1, 2, 3 ,4 sec καθώς και μερικές ενδιάμεσες τιμές) thymio7-2
όσο και το εικονίδιο γεγονός – event  (ονομάζεται timer elapsed) το οποίο ενεργοποιείται με την παρέλευση της χρονικής διάρκειας του timer thymio7-3

Με βάση τα παραπάνω, ο κώδικας του προγράμματος διαμορφώνεται ως εξής:

thymio7-4

Αντιπαραβάλλοντας τον «Οπτικό προγραμματισμό» με τα εικονίδια και το «Text Programming» οι δύο γραμμές του κώδικα μας λένε ότι:

thymio7-5

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

thymio7-6

Σημείωση:

Με βάση τα παραπάνω, εύκολα μπορεί να απαντηθεί και το ερώτημα

« Πόση απόσταση, περίπου, διανύει το ίδιο ρομποτάκι – σε ίδιες συνθήκες πειραματισμού – σε χρόνο 3 δευτερολέπτων;»

Απάντηση:  περίπου τριπλάσια απόσταση

Η επαλήθευση μπορεί να γίνει με το προηγούμενο προγραμματάκι VPL με μια μόνο αλλαγή: στην πρώτη γραμμή θέτουμε 3 sec αντί για 1 sec.

thymio7-7

1_b) Το περιβάλλον του BLOCKLY διαθέτει ένα αρκετά χρήσιμο block το οποίο αναφέρεται στην ανανέωση (updated) της θερμοκρασίας του «κάθε δευτερόλεπτο» και αυτό θα αξιοποιήσουμε.

thymio7-8

Μια ιδέα είναι να ορίσουμε μια μεταβλητή με όνομα < time > και να της αποδίδεται η τιμή μηδέν με το άγγιγμα του κουμπιού «μπροστά» (forward).

Στη συνέχεια, στο block < on temperature updated > επιτυγχάνεται η αλλαγή της μεταβλητής < time > κατά ένα δευτερόλεπτο.

Μια εντολή του τύπου  < if … do …else > μας βοηθάει να προσδιορίζουμε τη χρονική διάρκεια που επιθυμούμε να κινείται το Thymio (εδώ για ένα δευτερόλεπτο), όπως φαίνεται στον κώδικα BLOCKLY και στο αντίστοιχο «Text programming».

thymio7-9

Και σ’ αυτό το περιβάλλον, για τον πειραματισμό μας χρησιμοποιήσαμε το ίδιο ρομποτάκι σε διαφορετικές οριζόντιες επιφάνειες και διαπιστώσαμε ότι:

η διανυόμενη απόσταση σε ένα δευτερόλεπτο για την ταχύτητα 100 μονάδων κυμαινόταν μεταξύ 3 – 3,5 εκατοστά.

thymio7-10

Δεύτερο παράδειγμα – Επίδειξη

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

2_a) Στο περιβάλλον του «Οπτικού προγραμματισμού VPL» για προχωρημένους (advanced VPL)

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

Πρώτον: Στην πρώτη φάση της κίνησης, με το άγγιγμα του κουμπιού «μπροστά», θα ήθελα το ρομποτάκι να κινείται ευθύγραμμα και ομαλά με ταχύτητα 100 μονάδες για χρονική διάρκεια 2 δευτερολέπτων (2000 ms).  Επιπλέον, δεν πρέπει να ξεχνάω ότι η νέα κατάσταση – state του Thymio αλλάζει (new_state [0] = 1) και πρέπει να φροντίσω γι αυτό.

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

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

Τέταρτον:  Με το πέρας χρόνου της τρίτης φάσης ολοκληρώνεται η κίνηση του Thymio με το σταμάτημά του (μηδενική ταχύτητα και των δύο κινητήρων – τροχών).

thymio7-11

2_b)  Βασιζόμενος στα παραπάνω, ο προγραμματισμός στο περιβάλλον του BLOCKLY είναι πολύ εύκολος (ιδιαίτερα για όσους είναι εξοικειωμένοι με τη γλώσσα προγραμματισμού Scratch  www.scratch.mit.edu )

thymio7-12

Πριν από τη μελέτη της επιταχυνόμενης κίνησης του ρομπότ Thymio (βλέπε σε επόμενη δραστηριότητα)  ας δούμε δύο απλά παραδείγματα  που δείχνουν με ποιο τρόπο μπορούμε να χρησιμοποιήσουμε το block υπο-ρουτίνα {subroutine <όνομα>}  στο περιβάλλον του BLOCKLY με θέμα την ευθύγραμμη ομαλή κίνηση.

Τρίτο παράδειγμα – Επίδειξη  (χρήση τηλεκοντρόλ)                                   

Πώς να προγραμματίσω το Thymio έτσι ώστε:

α) να ελέγχω την κίνηση του (μπροστά/πίσω/ σταμάτημα)  με τη χρήση των αντίστοιχων κουμπιών του τηλεκοντρόλ και με δεδομένη την ταχύτητα των κινητήρων (60 μονάδες);

β) να επιλέγω έναν μικρό αριθμό συγκεκριμένων τιμών ταχύτητας χρησιμοποιώντας, για παράδειγμα κουμπιά 1, 2, 3, 4 …..του τηλεκοντρόλ;

α) Ορίζω μια μεταβλητή με όνομα <speed>, ταχύτητα που αναφέρεται στους κινητήρες – τροχούς του κινητού Thymio και αξιοποιώ το block {subroutine <όνομα>}  δίνοντας στην υπο-ρουτίνα το όνομα <motion>

 thymio7-13

Με αυτόν τον τρόπο η υπο-ρουτίνα <motion> αποτελεί μια νέα λειτουργία η οποία ορίζεται από τον ίδιο το χρήστη.

Στη συνέχεια χρησιμοποιώ το block {on <remote control signal > received}  για να προγραμματίσω τα τρία κουμπιά, μπροστά/πίσω/stop του τηλεκοντρόλ, ακολουθώντας τη γνωστή λογική της «μετάφρασης» του τι θέλουμε με λόγια σε κώδικα BLOCKLY:

thymio7-14

Υπενθυμίζουμε ότι οι κωδικοί για τα τρία κουμπιά του τηλεκοντρόλ, μπροστά/πίσω/stop, είναι 80, 81 και 87 αντίστοιχα  (Βλέπε την 1η Δραστηριότητα στην «Ελληνική Πύλη Παιδείας» (eduportal) αναφορικά με τον προγραμματισμό με το τηλεκοντρόλ  που διαθέτει το κινητό-ρομποτάκι Thymio ή συμβατό Universal τηλεκοντρόλ).

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

thymio7-15

β) Χρησιμοποιώ την ίδια υπο-ρουτίνα <motion>, την ίδια μεταβλητή <speed>  και το ίδιο block  προγραμματισμού των κουμπιών του τηλεκοντρόλ. Τελικά, βασιζόμενος στο προηγούμενο προγραμματάκι και μετά από δοκιμές κατέληξα στο παρακάτω BLOCKLY.

thymio7-16

Τέταρτο παράδειγμα – Επίδειξη  (χρήση κουμπιών του Thymio)  

 Πώς να προγραμματίσω το Thymio έτσι ώστε:

α) να ελέγχω την κίνηση του (μπροστά/πίσω/ σταμάτημα)  με τη χρήση των αντίστοιχων κουμπιών του Thymio και με δεδομένη την ταχύτητα των κινητήρων (60 μονάδες);

Θα μας εξυπηρετήσει η υπο-ρουτίνα <motion> που φτιάξαμε προηγουμένως και με ξεχωριστά blocks του τύπου {on <forward button> touched}, για παράδειγμα, θα προγραμματίσουμε τις δύο επιθυμητές κινήσεις μπροστά/πίσω καθώς και το <σταμάτημα>. Επιπλέον, χρήσιμη είναι και η αξιοποίηση μιας μεταβλητής <speed>.

Τα παραπάνω μας βοηθούν να φτιάξουμε το πρόγραμμα στο περιβάλλον BLOCKLY που ακολουθεί:

thymio7-17