SHOP NOW

There and Back Again

Ελέγξτε με ακρίβεια τις κινήσεις του Alvik προς τα εμπρός και προς τα πίσω

Οι μαθητές:

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

Arduino Alvik

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

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

λήψη

Εισαγωγή

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

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

Καλή τύχη!

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

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

  • Εμπόδια (βιβλία, κουτιά, μαύρη ταινία κ.λπ.)
  • Μεζούρα ή χάρακα
  • Κομπιουτεράκι
  • Σημειωματάριο (συνιστάται)

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

Prepare

distance 30 cm για Arduino

Move Alvik Move

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

Ακούγεται εύκολο;

Δοκιμάστε το challenge χρησιμοποιώντας τον κώδικα. Θα παρατηρήσετε ότι είναι παρόμοιος με το παράδειγμα από το προηγούμενο μάθημά μας. Ξεκινάμε με την αρχικοποίηση και στη συνέχεια προσθέτουμε τις βασικές οδηγίες μέσα στον βρόχο while True:. Σε αυτή την περίπτωση, έχουμε επίσης προσθέσει μια εντολή «break» διακοπής – διαφορετικά, το ρομπότ σας θα συνέχιζε να κινείται προς τα εμπρός και προς τα πίσω για πάντα.

Code

				
					from time import sleep

print("Hello! I'm a talkative robot. What's your name?")
student_name = input("Your name: ")
print("Great meeting you, " + student_name + "! Would you like to name me?")
robot_name = input("Robot's name: ")

print(f"{robot_name} is a fantastic name! I feel more human already.")

sleep(2) # Use sleep() to make interaction feel more natural
print(f"Okay, {student_name}, time for a quick laugh:")
sleep(2)
print("Have you heard of the robot that tried to swim?")
sleep(4)
print("It shocked everyone. :D")
sleep(5)
				
			

Οι πιθανότητες λένε ότι δεν έχετε πλησιάσει τόσο καλά όσο θα θέλατε ή ότι μπορεί να έχετε πέσει πάνω στο απέναντι βιβλίο. Ας δούμε αν μπορούμε να τα πάμε καλύτερα προσαρμόζοντας τα arguments μέσα στις συναρτήσεις robot.set_speeds() και sleep().

Καθώς θα δοκιμάζετε διαφορετικές τιμές, θυμηθείτε ότι χρησιμοποιούμε στροφές ανά λεπτό (Revolutions Per Minute, RPM) για να μετρήσουμε την ταχύτητα του Alvik, πράγμα που σημαίνει ότι η περιστροφή του τροχού έχει άμεση σχέση με τη διάρκεια του χρόνου μέσα στη συνάρτηση sleep().

Ως ένα απλό παράδειγμα αυτής της σχέσης, φανταστείτε ότι αλλάζετε τη χρονική καθυστέρηση σε sleep(60) διατηρώντας την ταχύτητα των τροχών στις 20 RPM. Δεδομένου ότι 60 δευτερόλεπτα = 1 λεπτό και η ταχύτητα περιστροφής μας έχει οριστεί σε 20, γνωρίζουμε ότι το ρομπότ θα πραγματοποιήσει 20 περιστροφές των τροχών πριν εκτελεστεί η επόμενη γραμμή κώδικα. Αν αλλάξουμε τη διάρκεια του χρόνου σε sleep(30), το μισό χρόνο από ό,τι πριν, το ρομπότ θα ολοκληρώσει 10 περιστροφές των τροχών

Η ομορφιά των μαθηματικών

Ώρα να αφησούμε το καλώδο στην άκρη

Έως τώρα, εκτελούμε όλα τα script μας απευθείας από το Arduino Lab for MicroPython, το οποίο επικοινωνεί με τον Alvik μέσω καλωδίου USB. Όμως, η η εργασία με ένα μικρό καλώδιο επηρεάζει τις κινήσεις του Alvik. Μάντεψε τι θα κανουμε όμως! Έχουμε τον τρόπο να το διορθώσουμε αυτό! Ας δούμε πώς μπορούμε να αποθηκεύσουμε τα αρχεία μας στο ρομπότ και να τα τρέξουμε χωρίς την χρήση καλωδίου.

Θυμηθείτε ό,τι έχουμε μάθει για το πώς μπορούμε να διαχειριστούμε τα αρχεία μας στο Arduino Lab κάνοντας κλικ στο κουμπί Files (Αρχεία). Εδώ, μπορούμε να δούμε όλα τα αρχεία name.py που έχουμε αποθηκεύσει τοπικά στον υπολογιστή μας μέσα σε έναν φάκελο. Στο χώρο στα αριστερά της διαχείρισης αρχείων τοπικά, μπορούμε να διαχειριστούμε τα αρχεία που είναι αποθηκευμένα στον Alvik όταν αυτός είναι συνδεδεμένος με τον editor.

1. Αρχικά, πρέπει να βρούμε και να ανοίξουμε το αρχείο «main.py» που είναι ήδη αποθηκευμένο στη μνήμη του Alvik. Αυτός θα είναι ο χώρος εργασίας στον οποίο θα κάνουμε τα μαγικά μας.

2. Μόλις ανοίξουμε το αρχείο, είναι ώρα να το επεξεργαστούμε με την εισαγωγή του κώδικα πάνω στον οποίο δουλέψαμε στην προηγούμενη ενότητα. Αντιγράψτε τον και επικολλήστε τον στο νέο μας αρχείο «main.py» που μόλις ανοίξαμε.

				
					from arduino_alvik import ArduinoAlvik
from time import sleep
import sys

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

while True:
    alvik.set_wheels_speed(20,20)
    sleep(5)
    alvik.set_wheels_speed(-20,-20)
    sleep(5)
    alvik.set_wheels_speed(0,0)
    break
				
			

3. Τέλος, ας βεβαιωθείτε ότι έχετε αποθηκεύσει το αρχείο μας στη μνήμη του Alvik.

Μόλις αποσυνδέσουμε το καλώδιο, θέλουμε το πρόγραμμά μας να εκτελεστεί αυτόματα, όταν το ρομπότ κάνει reset ή ενεργοποιηθεί. Στη MicroPython, όπως ακριβώς και στην Python, ένα αρχείο που ονομάζεται main.py είναι πάντα το πρώτο που εκτελείται όταν η πλακέτα σας ενεργοποιείται. Ρίξτε μια ματιά στα αρχεία που είναι αποθηκευμένα στην πλακέτα σας και δείτε αν μπορείτε να εντοπίσετε τις αλλαγές που έγιναν στο αρχείο main.py.

Τώρα είμαστε έτοιμοι για την πρώτη εμπειρία χωρίς καλώδια. Αποσυνδέστε το καλώδιο USB-C® από το Nano ESP32 σας και πατήστε το λευκό κουμπί reset (επαναφορά) στο πάνω μέρος της πλακέτας σας. Μετά από μερικά δευτερόλεπτα, το script σας θα ξεκινήσει αυτόματα.

 

Τα μαθηματικά είναι ο super ήρωάς σου

Πώς ήταν η προηγούμενη δοκιμασία – αρκετά εύκολη, σωστά; Ίσως χρειάστηκαν λίγες παραπάνω δοκιμές για να φτάσετε στο στόχο, ίσως να κάνατε και κάποια λάθη (trial and error), αλλά τελικά τα καταφέρατε. Ίσως αναπροσαρμόσατε την ταχύτητα, τον χρόνο ή ακόμα και τα δύο – ή χρησιμοποιήσατε έναν χάρακα για να μετρήσετε τη διανυθείσα απόσταση και προσαρμόσατε ανάλογα τους υπολογισμούς σας.

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

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

Ένας κύκλος

Παρατηρήστε το ρομπότ σας και φανταστείτε ότι οι τροχοί είναι απλοί κύκλοι. Υπάρχουν διάφοροι τρόποι με τους οποίους θα μπορούσαμε να μετρήσουμε τον τροχό ως κύκλο, όπως:
 
  • Ακτίνα: Η απόσταση από το κέντρο του κύκλου μέχρι την εξωτερική του άκρη.
  • Διάμετρος: Η απόσταση κατά μήκος του κύκλου, που διέρχεται από το κεντρικό του σημείο.
  • Περίμετρος: Το μήκος της εξωτερικής γραμμής που δημιουργεί τον ίδιο τον κύκλο.

Όπως βλέπετε στην παραπάνω εικόνα, η διάμετρος d του τροχού του Alvik είναι 34 χιλιοστά. Με τον ακόλουθο τύπο, μπορούμε να υπολογίσουμε την Περίμετρο C του τροχού χρησιμοποιώντας τη διάμετρο και το π (3.14)

𝐶 = 𝜋 X 𝑑

Συνδυάζοντας τους αριθμούς, βρίσκουμε C = 3,14 x 34 ή C = 106,8 χιλιοστά σε μήκος.

Έτσι, αν η απόσταση περιμετρικά του τροχού είναι 106,8 χιλιοστά σε μήκος, μπορούμε να συμπεράνουμε ότι μια πλήρης περιστροφή του τροχού κατά 360º θα μετακινήσει το ρομπότ κατά μια ακριβή απόσταση 106,8 χιλιοστών. Και πράγματι, αυτό βγάζει νόημα. Φανταστείτε ότι θα μπορούσαμε να τυλίξουμε έναν χάρακα γύρω από τον τροχό για να μετρήσουμε την περίμετρό του. Μόλις απλώσουμε τον χάρακα σε επίπεδη επιφάνεια, θα βλέπαμε το μήκος ως μια ευθεία γραμμή. Αυτή η γραμμή αντιπροσωπεύει την απόσταση που διανύει το ρομπότ μας κάθε φορά που οι ρόδες περιστρέφονται πλήρως.

Πάμε να χρησιμοποιήσουμε τη γνώση αυτή για να δημιουργήσουμε έναν άλλο τύπο. Δεδομένου ότι ο Alvik διανύει 106,8 χιλιοστά κάθε φορά που οι τροχοί του πραγματοποιούν μια πλήρη περιστροφή, μπορούμε εύκολα να υπολογίσουμε τη συνολική απόσταση που διανύει πολλαπλασιάζοντας την περίμετρο με τον αριθμό των περιστροφών. Για παράδειγμα, η απόσταση που διανύθηκε για δύο περιστροφές θα υπολογιζόταν ως 2 x 106,8 = 213,6 χιλιοστά. Αυτός ο τύπος παρουσιάζεται παρακάτω χρησιμοποιώντας τις μεταβλητές Στροφές/περιστροφές (R), Περίμετρος (C) και Απόσταση (D) για τον υπολογισμό της συνολικής διανυθείσας απόστασης.

D = C X R

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

Σκεφτείτε το παρακάτω παράδειγμα για καλύτερη αποσαφήνιση. Η ταχύτητα των τροχών ρυθμίζεται σε 1 περιστροφή ανά λεπτό για μια περίοδο 60 δευτερολέπτων, πριν τελικά μηδενιστεί η ταχύτητα – επομένως, οι τροχοί ολοκληρώνουν μια μόνο πλήρη περιστροφή. Η αλλαγή του χρόνου σε sleep(120) θα είχε ως αποτέλεσμα δύο πλήρεις περιστροφές, ενώ η sleep(30) θα μας έδινε μισή περιστροφή 180º.

				
					alvik.set_wheels_speed(1, 1)
 sleep(60)
 alvik.set_wheels_speed(0,0)
				
			

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

D = C X R, t/60

Με αυτόν τον τύπο, αποκτήσατε μια υπερδύναμη – την ικανότητα να προγραμματίζετε γρήγορα το ρομπότ σας να κινείται με μεγάλη ακρίβεια. Περνάμε στο επόμενο script για να το διαπιστώσουμε στην πράξη.

Δοκιμές και ξανά δοκιμές

Ας δοκιμάσουμε τον τύπο και ας προσθέσουμε τους αριθμούς σε ένα script.

Υποθέστε ότι t = 20(sec) δευτερόλεπτα και R = 10 RPM, ενώ γνωρίζουμε ήδη ότι C = 106,8 χιλιοστά. Πολλαπλασιάζοντας αυτές τις τιμές 106,8 x 10 x 20/60, υπολογίζουμε ότι η διανυόμενη απόσταση (D) είναι περίπου 356 χιλιοστά.

Στον κώδικά μας, τα t και R εμφανίζονται ως εξής:

  • sleep(t)
  • alvik.set_wheels_speed(R, R)

Ακολουθεί πώς φαίνεται η εισαγωγή των τιμών μέσα σε έναν while loop, χρησιμοποιώντας τις τιμές t = 20 και R = 10:

				
					while True:
    alvik.set_wheels_speed(10, 10)
    sleep(20)
    alvik.set_wheels_speed(0, 0)
    break
				
			

Ή αν χρησιμοποιούμε μεταβλητές στον κώδικά μας, τότε θα μπορούσε να μοιάζει ως εξής:

				
					R = 10
t = 20

while True:
    alvik.set_wheels_speed(R, R)
    sleep(t)  
    alvik.set_wheels_speed(0, 0)  
    break
				
			

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

Συγκρίνετε τις μετρήσεις σας με την υπολογισμένη τιμή D των 356 χιλιοστών. Ταιριάζει η μέτρησή σας με την απόσταση που υπολογίστηκε;

Δοκιμάστε ξανά με νέες τιμές για το R και το t. Μετρήστε τα αποτελέσματα και συγκρίνετε τα με τις νέες τιμές D.

Δοκιμασία: Μπορείτε να βρείτε τον τύπο για τον υπολογισμό του R; Πώς διαμορφώνεται το script προκειμένου να διανύσουμε 300 χιλιοστά σε 15 δευτερόλεπτα;

Φανταστείτε τώρα ότι θέλουμε να διανύσουμε 200 χιλιοστά με την ταχύτητα να είναι 5 RPM, όμως μας λείπει η τιμή για το t. Ποιος είναι ο τύπος για τον υπολογισμό του t; Πώς θα είναι το τελικό script;

Run Chicken Run

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

Για να εμπεδώσουμε όσα μάθαμε, ας οργανώσουμε έναν διασκεδαστικό διαγωνισμό – ένα chicken run!

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

Λάβετε θέσεις, ετοιμαστείτε, προγραμματίστε!

Τι ψάχνουμε;