Tο κινητό-ρομποτάκι Thymio μαθαίνει να μετράει τις μαύρες λωρίδες που συναντάει στο έδαφος (20η Δραστηριότητα με BLOCKLY)

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

Α. Εισαγωγή   

Πριν από μήνες αναρτήθηκε στην επίσημη σελίδα του Thymio μια δραστηριότητα (στα Γαλλικά) του Eric Schrafstetter https://www.thymio.org/creations-fr:initiation-aux-memoires με θέμα το σταμάτημα του κινητού – ρομπότ σε μια συγκεκριμένη διάβαση. Μ’ άρεσε η ιδέα του σταματήματος του κινητού στη δεύτερη διάβαση (όπως η δεύτερη μαύρη λωρίδα της φωτογραφίας) κάτι που σημαίνει πώς προγραμματιστικά, το θέμα, γενικεύοντάς το, παραπέμπει στη ιδέα «της απομνημόνευσης του αριθμού των λωρίδων που μπορεί να συναντάει τοThymio». Μετά από αυτό ανοίγεται και ένας δρόμος για την επινόηση δραστηριοτήτων τύπου «Barcode».

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

Τελικά, κατέληξα στην προτεινόμενη δραστηριότητα που έχει ως αντικείμενο το «να διδάξει το κινητό ρομποτάκι να μετράει τις μαύρες λωρίδες που συναντάει στη διαδρομή του» με την αξιοποίηση ενός τηλεκοντρόλ τύπου Universal ή αυτού που συνοδεύει το ρομποτάκι Thymio. 

Β. Η δραστηριότητα στο περιβάλλον BLOCKLY

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

Πρώτη φάση επίλυσης και οικοδόμησης του προγράμματος.

 Ας δούμε τη διατύπωση του απλού προβλήματος και τον κώδικα προγραμματισμού στο BLOCKLY.

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

a) να ξεκινάει με το κουμπί <μπροστά> του Thymio και

β) να σταματάει μόλις συναντήσει τη μαύρη λωρίδα η το σηκώσω ψηλά με το χέρι μου; 

Το πρόβλημα απαιτεί τόσο τη χρήση του κουμπιού < μπροστά > όσο και των δύο αισθητήρων εδάφους (δεξιό και αριστερό) του Thymio.

Διατυπώνω, με τη μορφή if …… then, τη σκέψη μου:

Για το πρώτο χρησιμοποιούμε την εντολή:

On < button values > updated

και για το δεύτερο την ακόλουθη:

On < proximity sensors > updated

Τελικά, κατέληξα στον παρακάτω κώδικα, με το V να παριστάνει την ταχύτητα των τροχών:

Στον πρώτο πειραματισμό, εύκολα διαπίστωσα, ότι για τη λωρίδα πάχους περίπου 2 cm το ρομποτάκι σταματάει για ταχύτητες μικρότερες του 560 mm / s. Επίσης, διαπίστωσα ότι το Thymio σταματάει και από ποικίλες κατευθύνσεις κινούμενο και όχι υποχρεωτικά κάθετα στη λωρίδα. Βέβαια, η λωρίδα δεν είναι ανάγκη να είναι ορθογώνια αλλά να παίρνει διάφορες μορφές και τέλος μπορεί να αξιοποιηθεί, για ευκολία μας, μόνο ο ένας από τους δύο αισθητήρες εδάφους.

Δεύτερη φάση επίλυσης και οικοδόμησης του προγράμματος.

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

Το πρόβλημα μπορεί να διατυπωθεί ως εξής:

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

a) να ξεκινάει με το κουμπί <μπροστά> του Thymio και

β) να σταματάει μόλις συναντήσει μια επιθυμητή (1η, 2η, .  .  .7η) μαύρη λωρίδα; 

Η απάντηση στο α) είναι ίδια με αυτήν που γνωρίσαμε προηγουμένως. Όσον αφορά το σταμάτημα στην επιθυμητή λωρίδα μια λύση μπορεί να προκύψει με την ιδέα που εφαρμόζεται στο block On <proximity sensors> updated:

Ορίζω μια ΜΕΤΑΒΛΗΤΗ με όνομα < item > η οποία να «αυξάνει κατά ένα» μόλις το ρομποτάκι συναντάει την επόμενη μαύρη λωρίδα, Set <item> <item> + 1

Αν θέλουμε να σταματήσει, για παράδειγμα, στην 6η λωρίδα, τότε, έχουμε την εντολή

Αν <item> = 6, TOTE, σταμάτα (θέσε V = 0)

Αν θέλουμε να σταματήσει, για παράδειγμα, στην 3η λωρίδα, τότε, έχουμε την εντολή

Αν <item> = 3, TOTE, σταμάτα (θέσε V = 0)

Ο κώδικας του προγράμματος τόσο σε BLOCKLY όσο και σε Text Programming (της πλατφόρμας ASEBA που μοιάζει με τη γνωστή γλώσσα C++)  παίρνει τη μορφή:

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

Τρίτη φάση επίλυσης και οικοδόμησης του προγράμματος   

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

Αυτό που απομένει είναι να δίνουμε με τα πλήκτρα του τηλεκοντρόλ την επιθυμητή τιμή του Ν οπότε χρειαζόμαστε την εντολή   on < remote control signal > received.

Μια σειρά από εντολές τύπου  if …….then μας εξυπηρετούν στην επιλογή του N με το πάτημα των κουμπιών 1, 2, 3….7. Βέβαια, χρειαζόμαστε και μια τελευταία εντολή σταματήματος του ρομπότ με το κουμπί < STOP > του τηλεκοντρόλ.

Το τηλεκοντρόλ του Thymio, οι κωδικοί προγραμματισμού και το Universal

Ο τελικός κώδικας προγραμματισμού του τηλεκοντρόλ, για την επιλογή του Ν, ακολουθεί:

Δύο φωτογραφίες …

και δύο βίντεο από τον πειραματισμό

https://youtu.be/qzuMqtjSiNg

https://youtu.be/lF59_HIknYI

Ευχαριστώ πολύ το φίλο Παναγιώτη Ζάφειρα, καθηγητή Μαθηματικών στο Γυμνάσιο Σύρου, για τη βοήθεια του στη φωτογράφηση και στη βιντεοσκόπηση ορισμένων εφαρμογών.

Για περισσότερα………