SHOP NOW

Obby Course

Γίνε ο πρώτος που θα φτάσει στη γραμμή του τερματισμού σε ένα συναρπαστικό αγώνα δρόμου μετ' εμποδίων

Οι μαθητές:

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

Arduino Alvik

Την εφαρμογή Arduino Lab for MicroPython

Μεζούρες/Χάρακα

Μοιρογνωμόνιο

 

λήψη

Εισαγωγή

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

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

Να είστε δημιουργικοί με το σχεδιασμό της διαδρομής σας, να χαράξετε τη στρατηγική της πορείας του ρομπότ σας και προετοιμαστείτε για διασκέδαση σε υψηλές ταχύτητες!

Πριν ξεκινήσουμε

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

Για το μάθημα του παραδείγματός μας, χρειαζόμαστε τα ακόλουθα υλικά:

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

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

Prepare

Παράδειγμα για τη δημιουργία πίστας

Functions - το απόλυτο εργαλείο στα χέρια σου

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

Στην πραγματικότητα, έχουμε ήδη δημιουργήσει τμήματα κώδικα που εκτελούν ειδικές εργασίες. Απλώς δεν έχουμε δημιουργήσει ένα function που να περιέχει όλες τις εντολές. Δείτε το παρακάτω παράδειγμα που αφορά το κομμάτι κώδικα που χρησιμοποιήσαμε προηγουμένως για να κάνουμε τον Alvik να στρίψει κατά 90º προς τα δεξιά.

				
					alvik.set_wheels_speed(30,0)
sleep(3.2)
alvik.set_wheels_speed(0,0)

				
			

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

Συνεπώς, η καλύτερη λύση είναι απλά να ορίσουμε το δικό μας custom function.

				
					def pivot_90_right():
​        alvik.set_wheels_speed(30,0)
​        sleep(3.2)
​        alvik.set_wheels_speed(0,0)
				
			

Στο παράδειγμα αυτό, τοποθετήσαμε το κομμάτι κώδικα μέσα σε ένα καθορισμένο function το οποίο ονομάσαμε pivot_90_right() που ορίζεται από τη λέξη-κλειδί def. Όσον αφορά το όνομα, μπορείτε να το ορίσετε όπως θέλετε, αλλά προσπαθήστε να είναι όσο το δυνατόν πιο μικρό και περιγραφικό. Τώρα, όποτε θέλετε να εκτελέσετε τις τρεις γραμμές κώδικα που οδηγούν σε μια δεξιά στροφή, το μόνο που χρειάζεται να κάνετε είναι να καλέσετε τη συνάρτηση (function) με τον ακόλουθο τρόπο:

				
					pivot_90_right()
				
			

Πολύ καλύτερα, δεν συμφωνείς; Δεν είναι μόνο ότι γράφετε ταχύτερα τον κώδικά σας, αλλά είναι και πιο διαισθητικό στην κατανόηση. Στη συνέχεια, θα δούμε ένα άλλο παράδειγμα που χρησιμοποιεί parameters (παραμέτρους) και αργότερα θα απαιτούν ένα argument. Αυτή την συνάρτηση θα την χρησιμοποιήσουμε για να οδηγήσουμε τον Alvik προς τα εμπρός με οποιαδήποτε ταχύτητα περιστροφής (RPM) επιθυμούμε.

				
					def forward(R, t):
        alvik.set_wheels_speed(R,R)
        sleep(t)
        alvik.set_wheels_speed(0,0)
				
			

Στη συνάρτηση(function) forward(R, t), συμπεριλάβαμε τις παραμέτρους (parameters) R για τα RPM (ταχύτητα) και t για τα Seconds (δευτερόλεπτα). Οι παράμετροι (parameters) είναι μεταβλητές(ariables) ή placeceholders όπου μπορούμε αργότερα να αναθέσουμε τιμές. Όταν περνάμε μια τιμή (value) στην παράμετρο (parameter) της συνάρτησης (function), η τιμή αυτή ονομάζεται όρισμα (Arguement). Κοιτάξτε το παρακάτω παράδειγμα όπου καλούμε τη συνάρτηση.

				
					forward(50, 1)
				
			

Όταν καλούμε τη συνάρτηση (function), εισάγουμε τα ορίσματα (Arguments) 50 και 1, τα οποία αντιστοιχούν στις παραμέτρους (parameters) της, ως R = 50 και t = 1. Αυτές οι τιμές περνούν στο κομμάτι κώδικα μέσα στη συνάρτηση, δίνοντάς μας τα robot.set_speeds(50, 50) και sleep(1). Σημειώστε ότι κάθε περίπτωση της συνάρτησής μας είναι μοναδική, πράγμα που σημαίνει ότι είμαστε ελεύθεροι να καλέσουμε τη συνάρτηση όσες φορές θέλουμε και μπορούμε να χρξσιμοποιούμε διαφορετικά ορίσματα κάθε φορά που την καλούμε. Το κομμάτι κώδικα μέσα στην συνάρτηση παραμένει πάντα ανέπαφο.

Στο επόμενο παράδειγμα, θα δούμε πού ορίζονται οι συναρτήσεις και πώς τις καλούμε. Όλα αυτά σε ένα script. Σε επόμενα μαθήματα θα μάθουμε πώς να οργανώνουμε τα custom functions μας σε ένα ξεχωριστό αρχείο που θα εισάγουμε ως module. Το πλεονέκτημα είναι ότι ο κώδικάς μας θα είναι πιο καθαρός και καλύτερα οργανωμένος.

				
					from arduino_alvik import ArduinoAlvik
from time import sleep

alvik = ArduinoAlvik()
alvik.begin()
sleep(5) # Wait a few seconds to complete initialization

def forward(R, t):
    alvik.set_wheels_speed(R, R)
    sleep(t)
    alvik.set_wheels_speed(0, 0)
def backward(R, t):
    alvik.set_wheels_speed(-R, -R)
    sleep(t)
    alvik.set_wheels_speed(0, 0)
def pivot_90_right():
    alvik.set_wheels_speed(30, 0)
    sleep(3.2)
    alvik.set_wheels_speed(0, 0)
def pivot_90_left():
    alvik.set_wheels_speed(0, 30)
    sleep(3.2)
    alvik.set_wheels_speed(0, 0)

while True:
  forward(10, 2)
  pivot_90_right()
  backward(20, 5)
  pivot_90_left()
  break
				
			

Μπορεί να χρειάζεται αρκετή ώρα για να ορίσουμε στην αρχή τις συναρτήσεις αυτές, αλλά μόλις ολοκληρώσουμε, μπορούμε να τις προσθέσουμε σε οποιοδήποτε από τα scripts μας για να κάνουμε τον προγραμματισμό μέσα στο loop μας παιχνιδάκι. Δίχως τις συναρτήσεις, το πρόγραμμα μέσα στο while loop θα έμοιαζε κάπως έτσι

				
					while True:
        alvik.set_wheels_speed(10, 10)
        sleep(1)
        alvik.set_wheels_speed(0, 0)
        alvik.set_wheels_speed(30, 0)
        sleep(3.2)
        alvik.set_wheels_speed(0, 0)
        alvik.set_wheels_speed(-20, -20)
        sleep(5)
        alvik.set_wheels_speed(0, 0)
        alvik.set_wheels_speed(0, 30)
        sleep(3.2)
        alvik.set_wheels_speed(0, 0)
        break
				
			

Η διαφορά είναι μεγάλη, σωστά; Θεωρούμε πως η αξία και το όφελος της χρήσης custom-defined functions στο πρόγραμμά σας είναι απολύτως ξεκάθαρα.

Challenge: Ποιες άλλες συναρτήσεις θα μπορούσαν να φανούν χρήσιμες; Προσπαθήστε να δημιουργήσετε ένα νέο αρχείο .py στο φάκελο των projects σας, όπου θα αποθηκεύσετε όλα τα defined functions που έχετε ορίσει. Κάθε φορά που εντοπίζετε ένα χρήσιμο σύνολο εντολών, εξετάστε το ενδεχόμενο να δημιουργήσετε μια συνάρτηση γι’ αυτό και προσθέστε την στη λίστα σας. Για παράδειγμα, πώς θα μπορούσε να ορισθεί μια συνάρτηση για την εκτέλεση μιας στροφής 45º προς τα αριστερά;

Να δοκιμάσουμε καινούριες τεχνικές – στριψίματος

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

Καθώς προχωράμε, να θυμάστε να καταγράφετε τα ευρήματά σας και να αποθηκεύετε τις νέες συναρτήσεις σας. Αυτό θα βοηθήσει αργότερα στην τελική “Obby” πρόκληση.

Διαφορετική τύποι στροφών

Στροφή καμπυλωτή – Smooth Turn

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

καμπυλωτή στροφή προς τα δεξιά

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

				
					alvik.set_wheels_speed(20, 10)
				
			

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

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

Challenge: Μπορείτε να προγραμματίσετε αριστερές και δεξιές καμπυλωτές στροφές; Πειραματιστείτε με τις τιμές για να δείτε αν μπορείτε να κάνετε τον Alvik να κινείται κυκλικά σε έναν μικρό κύκλο πάνω στο γραφείο σας.

Στροφή πάνω στον άξονα – Spin Turn

Στροφή πάνω στον άξονα

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

				
					alvik.set_wheels_speed(10, -10) # αργή στροφή πάνω στον άξονα προς τα δεξιά
  alvik.set_wheels_speed(-50, 50) # γρήγορη στροφή πάνω στον άξονα προς τα αριστερά
				
			

Obby Challenge

Ήρθε η ώρα! Ανατρέξτε γρήγορα σε όλες τις κατηγορίες μαθημάτων για να βεβαιωθείτε ότι όλοι οι στόχοι είναι ξεκάθαροι

Ας ξεκινήσει ο αγώνας

Ξεκινήστε: Αρκετά obby-ous (από το obvious), σωστά; Απλά σιγουρευτείτε ότι εκκινείτε πάντα από την ίδια ακριβώς θέση.
Ζώνη 1: Πηγαίνετε ευθεία κατά μήκος της διαδρομής, αλλά μην ακουμπήσετε τα σύνορα με τη μαύρη ταινία.
Ζώνη 2: Σπρώξτε τη χάρτινη μπάλα έτσι ώστε να βρίσκεται μέσα στον κύκλο της μαύρης ταινίας.
Ζώνη 3: Κάνοντας σλάλομ γύρω από τα εμπόδια, φτάστε στη γραμμή τερματισμού.
Τερματισμός: Μπορεί να τερματίσετε, αλλά το παιχνίδι δεν έχει τελειώσει ακόμα – συνεχίστε να προσπαθείτε. Μπορείτε να βελτιώσετε τον χρόνο τερματισμού σας;

Παράδειγμα για τη δημιουργία πίστας
Τι ψάχνουμε;