dfrobot maqueen robot with gamepad

Έλεγξε το Maqueen με το GamePad

Χρησιμοποίησε ένα χειριστήριο για να ελέγξεις την ταχύτητα και την πορεία του Maqueen!

DFRobot GamePad V4

Το GamePad είναι ένα προγραμματιζόμενο χειριστήριο με πολλαπλές λειτουργίες. Τοποθέτησε στην πλατφόρμα του GamePad ένα Microbit και εκμεταλλεύσου τις δυνατότητές του για να ελέγξεις το Maqueen από απόσταση!

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

  • Αναλογικό joystick 2 αξόνων (x-y) με ενσωματωμένο κουμπί (z)
  • 4 μεγάλα και εύχρηστα κουμπιά
  • 2 κουμπιά σε πρακτικές θέσεις συνδεδεμένα με τα Α και Β του Microbit
  • Κινητήρα δόνησης με LED ένδειξης λειτουργίας
  • Διακόπτη ενεργοποίησης/απενεργοποίησης χειριστηρίου
  • Θήκη μπαταριών 2xAAA ενσωματωμένη στο χειριστήριο

Τι θα χρειαστείς

Ηλεκτρονικά μέρη

  • Κινητήρες
  • Πίνακας LED Microbit
  • Radio
  • Κουμπιά GamePad
  • Joystick GamePad
  • Κινητήρας δόνησης GamePad

Έννοιες προγραμματισμού

  • Τελεστές σύγκρισης
  • Μεταβλητές
  • Εντολές επανάληψης
  • Εντολές επιλογής

Προγραμματισμός με MakeCode

Για να προγραμματίσεις το Microbit με MakeCode ακολούθησε τις οδηγίες που θα βρεις εδώ:

Microbit & MakeCode: Ένας Οδηγός για Αρχάριους

Προγραμματισμός GamePad (Transmitter)

Κάνε κλικ στην κατηγορία “Μεταβλητές” και έπειτα επίλεξε “Δημιουργία μεταβλητής”. Δημιούργησε τη μεταβλητή “speed”. Πλέον, στην κατηγορία “Μεταβλητές” εμφανίζονται τα νέα block με τις εντολές που σχετίζονται με τη μεταβλητή.

Κατά την έναρξη θα πρέπει να οριστεί το ομαδικό id των ραδιοφωνικών επικοινωνιών. Στην κατηγορία εντολών “Ράδιο” θα βρεις την αντίστοιχη εντολή. Το id μπορεί να είναι ένας αριθμός από 0 έως 255 και τα Microbit ακούνε ένα id κάθε φορά. Όπως θα δεις και στη συνέχεια του οδηγού, το Microbit του Maqueen θα είναι και αυτό συντονισμένο στην ομάδα 1. Παράλληλα, αρχικοποίησε τη μεταβλητή “speed” δίνοντάς της αρχική τιμή 150.

Χρησιμοποίησε την εντολή “για πάντα” για να δημιουργήσεις μια δομή επανάληψης. Στην κατηγορία εντολών “Led”, θα βρεις την εντολή που θα σου επιτρέψει να φωτίσεις τον 5x5 πίνακα με τα LED του Microbit, ανάλογα με την τιμή που έχει κάθε φορά η μεταβλητή “speed”. Σημείωσε τον αριθμό 255 σαν μέγιστη τιμή έτσι ώστε να φωτίζουν όλα τα LED του Microbit του GamePad όταν η “speed” πάρει τη μέγιστη τιμή της.

Έπειτα, με την εντολή “εάν” πρόσθεσε μια δομή επιλογής και μέσα της βάλε ακόμα μία “εάν-αλλιώς”.

Στο πλαίσιο της εξωτερικής συνθήκης που εξετάζεται βάλε την εντολή “κουμπί Α είναι πατημένο” και έπειτα στο πλαίσιο της εσωτερικής συνθήκης βάλε έναν τελεστή σύγκρισης που θα βρεις στην κατηγορία “Λογική” και το μπλοκ της μεταβλητής “speed” .

Πατώντας το κουμπί Α του GamePad -και κατ’ επέκταση του Microbit- η τιμή της “speed” ελαττώνεται κατά 5 εκτός κι αν έχει φτάσει στο κατώτατο όριο που είναι το 0. Τότε, με την εντολή “ψηφιακή εγγραφή ακροδέκτης … στο …” που θα βρεις στην κατηγορία “Ακροδέκτες”, θα ενεργοποιείται (εγγραφή 1) και θα απενεργοποιείται (εγγραφή 0) συνεχώς και με γρήγορή εναλλαγή, ο κινητήρας δόνησης που διαθέτει το GamePad και είναι συνδεδεμένος μέσω των τυπωμένων κυκλωμάτων του χειριστηρίου στον ακροδέκτη 12 του Microbit.

Αντίστοιχα, πατώντας το κουμπί Β του GamePad, η τιμή της “speed” αυξάνεται κατά 5 εκτός κι αν έχει φτάσει στο ανώτατο όριο που είναι το 255, όπου και πάλι μπαίνει σε λειτουργία με τον ίδιο τρόπο ο κινητήρας δόνησης.

Μέσα στη “για πάντα” και κάτω από τις προηγούμενες εντολές, πρόσθεσε ακόμα μία δομή επιλογής με την εντολή “εάν-αλλιώς” και τροποποίησέ την όπως φαίνεται στην εικόνα, πατώντας στο σύμβολο “+”.

Οι τιμές που καταγράφονται με “αναλογική ανάγνωση” κινώντας το joystick του GamePad είναι από 0 έως 1023, είτε στον x είτε στον y άξονα. Όσο κινείς το joystick προς τα αριστερά οι τιμές πλησιάζουν προς το 0, ενώ αντίστοιχα προς τα δεξιά πλησιάζουν το 1023. Όταν το joystick βρίσκεται στην κεντρική θέση καταγράφονται τιμές στο κοντά 500. Με τη βοήθεια των τελεστών σύγκρισης ορίζονται τα διαστήματα στα οποία ενεργοποιείται η αποστολή των αντίστοιχων μηνυμάτων από το Microbit του GamePad προς το Microbit του Maqueen. Το κάθε μήνυμα περιλαμβάνει μία λέξη ετικέτα (π.χ. LEFT) και την τιμή που είναι καταχωρημένη εκείνη τη στιγμή στη μεταβλητή “speed”.

Το πρόγραμμα για τον πομπό ολοκληρώνεται με τις εντολές για τον y άξονα. Κινώντας το joystick προς τα κάτω οι τιμές πλησιάζουν προς το 0, ενώ αντίστοιχα σπρώχνοντας τον μοχλό προς τα πάνω οι τιμές που καταγράφονται από τον αντίστοιχο ακροδέκτη του Microbit προσεγγίζουν το 1023. Παρακάτω μπορείς να δεις συνολικά το πρόγραμμα για το Microbit του GamePad (Transmitter).

Προγραμματισμός Maqueen (Receiver)

Ξεκίνα προσθέτοντας τις εντολές που σχετίζονται με τον έλεγχο του Maqueen Plus V2. Πάτησε στο εικονίδιο των ρυθμίσεων και έπειτα κάνε κλικ στις “Επεκτάσεις”.

επεκτασεις make code addons

Συμπλήρωσε στη γραμμή αναζήτησης το link της επέκτασης:

https://github.com/DFRobot/pxt-DFRobot_MaqueenPlus_v20

add an addon on makecode

Κάνε κλικ στην επέκταση και μόλις επιστρέψεις στην κεντρική σελίδα θα βρεις τις νέες εντολές που αφορούν το Maqueen Plus V2.

extension maqueen plus v2 makecode

Κατά την έναρξη ξεκινά η επικοινωνία του Microbit με την πλατφόρμα του Maqueen με το πρωτόκολλο I2C και το Microbit του Maqueen μπαίνει στην ίδια ομάδα με αυτό του GamePad (ομάδα 1).

Μέσα στην εντολή “κατά τη ραδιοφωνική λήψη name value που θα βρεις στην κατηγορία “Ράδιο”, πρόσθεσε μια δομή επιλογής με την εντολή “εάν-αλλιώς”.

Τροποποίησε την “εάν-αλλιώς” πατώντας το σύμβολο “+” 5 φορές. Αναίρεσε την τελευταία “αλλιώς” κάνοντας κλικ μία φορά στο τελευταίο “-”.

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

Αν το Maqueen λάβει μήνυμα “RIGHT” ή “LEFT”, θα περιστραφεί αντίστοιχα επιτόπου κινώντας τους 2 κινητήρες του με αντίθετη φορά. Και εδώ θα πρέπει να πάρεις το μπλοκ “value” από την κορυφή της ροζ εντολής για να το αφήσεις στις εντολές που κινούν τους κινητήρες του ρομπότ.

Ο αριθμός “value” είναι η τιμή της μεταβλητής “speed” που έστειλε ο πομπός όπως αυτή διαμορφώθηκε πατώντας τα κουμπιά A ή Β του GamePad. Παρακάτω μπορείς να δεις το προτεινόμενο πρόγραμμα για το Microbit του Maqueen (Receiver) συνολικά.

Δοκίμασε να το τροποποιήσεις και μη διστάσεις να πειραματιστείς!

Προγραμματισμός με Python

Για να προγραμματίσεις το Microbit με Python ακολούθησε τις οδηγίες που θα βρεις εδώ:

Microbit & Python: Κάντε τα πρώτα σας βήματα

Επιπλέον, στον παραπάνω οδηγό θα βρεις αναλυτικές οδηγίες για το τρόπο που εισάγεις μία βιβλιοθήκη στον συγκεκριμένο editor. Κατέβασε τη βιβλιοθήκη “GRobotronicsMaqueen” από εδώ:

https://github.com/grobotronics/Microbit/blob/main/Maqueen/GRobotronicsMaqueen.py

Προγραμματισμός GamePad (Transmitter)

Στη αρχή του προγράμματος πρόσθεσε τις βιβλιοθήκες “microbit”, “radio” και “time”. Η βιβλιοθήκη “radio” εισάγεται απλώς με την εντολή import και γι’ αυτό στον κώδικα θα παρατηρήσεις ότι υπάρχει το όνομά της στην αρχή μιας εντολής που σχετίζεται με αυτήν. 

from microbit import *
import radio
from time import sleep

Με την εντολή radio.on()” ενεργοποιείς τη δυνατότητα επικοινωνίας μεταξύ των Microbit μέσω ραδιοκυμάτων. Στην αρχή του προγράμματος θα πρέπει επίσης να οριστεί το ομαδικό id (group) των ραδιοφωνικών επικοινωνιών. Το id μπορεί να είναι ένας αριθμός από 0 έως 255 και τα Microbit ακούνε ένα id κάθε φορά. Με την εντολή radio.config(group=1)” βάλε το Microbit του GamePad στην ομάδα 1 και όπως θα δεις και στη συνέχεια του οδηγού, το Microbit του Maqueen θα είναι και αυτό συντονισμένο στην ομάδα 1.

radio.on()
radio.config(group=1)

Παράλληλα, αρχικοποίησε τη μεταβλητή “speed” δίνοντάς της αρχική τιμή 50 και δημιούργησε το αντικείμενο “image” που θα σου επιτρέψει να μεταβάλεις τη φωτεινότητα του 5x5 πίνακα με τα LED του Microbit.

speed = 50
image = Image(5,5)

Το κύριο μέρος του προγράμματος θα βρίσκεται μέσα σε μια δομή επανάληψης που ορίζεται με την εντολή “while True”. Αρχικά προγραμμάτισε τα LED του Microbit: Θα φωτίζουν όλα συνεχώς, αλλά με μεταβαλλόμενο φωτισμό που εξαρτάται από την τιμή της μεταβλητής “speed”. Πιο συγκεκριμένα, η εντολή “image.fill(…)” παίρνει σαν παράμετρο έναν αριθμό από 0 έως 9 που αντιπροσωπεύει τη φωτεινότητα των LED. Οι τιμές της “speed” από την άλλη, όπως θα διαπιστώσεις και στη συνέχεια του οδηγού, οριοθετούνται από 0 έως 100.

Tο αποτέλεσμα της πράξης “//” (Floor division) δίνει το ακέραιο μέρος της διαίρεσης του “speed” με το 10.1 ακολουθούμενο από την υποδιαστολή και το μηδέν και τελικά με την εντολή round(…)” θα μείνει μόνο το ακέραιο μέρος (π.χ. 100/10.1≈9.9, ενώ 100//10.1=9.0 και round(100//10.1)=9).

while True:
    image.fill(round(speed//10.1))
    display.show(image)

Χρησιμοποίησε την εντολή if για να δημιουργήσεις μία δομή επιλογής και την εντολή ifelse για να δημιουργήσεις μία δεύτερη δομή επιλογής μέσα στην προηγούμενη. Η εντολή button_a.is_pressed()” θα επιστρέψει “True” μόνο αν πατήσεις το κουμπί, διαφορετικά θα δίνει “False” και η εσωτερική δομή επιλογής δεν θα εκτελείται.

while True:
    image.fill(round(speed//10.1))
    display.show(image)
    
    if button_a.is_pressed():
        if:

        else:

Πατώντας το κουμπί Α του GamePad -και κατ’ επέκταση του Microbit- η τιμή της “speed” ελαττώνεται κατά 5 εκτός κι αν έχει φτάσει στο κατώτατο όριο που είναι το 0. Μια μικρή παύση 0,1s είναι χρήσιμη ώστε να μην μεταβάλλεται η “speed” υπερβολικά γρήγορα. Τελικά, η νέα τιμή της “speed” μετατρέπεται με τη βοήθεια της “str(…)” από ακέραιος αριθμός σε μια σειρά (string) από χαρακτήρες και με την εντολή radio.send(str(speed))” αποστέλλεται στο Microbit του Maqueen.

while True:
    image.fill(round(speed//10.1))
    display.show(image)
    
    if button_a.is_pressed():
        if speed > 0:
            speed = speed - 5
            sleep(0.1)
            radio.send(str(speed))
        else:

Αν η “speed” φτάσει στο κατώτατο όριο (0), με την εντολή “pin12.write_digital(…)” θα ενεργοποιείται (write 1) και θα απενεργοποιείται (write 0) συνεχώς και με γρήγορή εναλλαγή, ο κινητήρας δόνησης που διαθέτει το GamePad και είναι συνδεδεμένος μέσω των τυπωμένων κυκλωμάτων του χειριστηρίου στον ακροδέκτη 12 του Microbit.

while True:
    image.fill(round(speed//10.1))
    display.show(image)
    
    if button_a.is_pressed():
        if speed > 0:
            speed = speed - 5
            sleep(0.1)
            radio.send(str(speed))
        else:
            pin12.write_digital(1)
            sleep(0.1)
            pin12.write_digital(0)

Αντίστοιχα, πατώντας το κουμπί Β του GamePad, η τιμή της “speed” αυξάνεται κατά 5 εκτός κι αν έχει φτάσει στο ανώτατο όριο που είναι το 100, όπου και πάλι μπαίνει σε λειτουργία με τον ίδιο τρόπο ο κινητήρας δόνησης.

if button_a.is_pressed():
        if speed > 0:
            speed = speed - 5
            sleep(0.1)
            radio.send(str(speed))
        else:
            pin12.write_digital(1)
            sleep(0.1)
            pin12.write_digital(0)
            
    if button_b.is_pressed():
        if speed < 100:
            speed = speed + 5
            sleep(0.1)
            radio.send(str(speed))
        else:
            pin12.write_digital(1)
            sleep(0.1)
            pin12.write_digital(0)

Στη συνέχεια του προγράμματος προστίθενται οι εντολές που επιστρέφουν τις τιμές που καταγράφονται από το joystick του GamePad. Οι τιμές αυτές καταχωρούνται στις μεταβλητές “Xvalue” και “Yvalue”.

    Xvalue = pin1.read_analog()
    Yvalue = pin2.read_analog()

Οι τιμές που καταγράφονται με “αναλογική ανάγνωση” κινώντας το joystick του GamePad είναι από 0 έως 1023, είτε στον x είτε στον y άξονα. Όσο κινείς το joystick προς τα αριστερά οι τιμές πλησιάζουν προς το 0, ενώ αντίστοιχα προς τα δεξιά πλησιάζουν το 1023. Όταν το joystick βρίσκεται στην κεντρική θέση καταγράφονται τιμές στο κοντά 500.

Με τη βοήθεια των τελεστών σύγκρισης ορίζονται τα διαστήματα στα οποία ενεργοποιείται η αποστολή των αντίστοιχων μηνυμάτων από το Microbit του GamePad προς το Microbit του Maqueen. Για την αποστολή κάποιου μηνύματος χρησιμοποιείται και πάλι η εντολή “radio.send(…)” και το κάθε μήνυμα αποτελείται από μια λέξη ετικέτα (π.χ. LEFT).

    Xvalue = pin1.read_analog()
    Yvalue = pin2.read_analog()

    if Xvalue < 450:
        radio.send("LEFT")
    elif Xvalue > 550:
        radio.send("RIGHT")

Το πρόγραμμα για τον πομπό ολοκληρώνεται με τις εντολές για τον y άξονα. Κινώντας το joystick προς τα κάτω οι τιμές πλησιάζουν προς το 0, ενώ αντίστοιχα σπρώχνοντας τον μοχλό προς τα πάνω οι τιμές που καταγράφονται από τον αντίστοιχο ακροδέκτη του Microbit προσεγγίζουν το 1023. Παρακάτω μπορείς να δεις συνολικά το πρόγραμμα για το Microbit του GamePad (Transmitter).

from microbit import *
import radio
from time import sleep

radio.on()
radio.config(group=1)

speed = 50

image = Image(5,5)

while True:
    image.fill(round(speed//10.1))
    display.show(image)
    
    if button_a.is_pressed():
        if speed > 0:
            speed = speed - 5
            sleep(0.1)
            radio.send(str(speed))
        else:
            pin12.write_digital(1)
            sleep(0.1)
            pin12.write_digital(0)
            
    if button_b.is_pressed():
        if speed < 100:
            speed = speed + 5
            sleep(0.1)
            radio.send(str(speed))
        else:
            pin12.write_digital(1)
            sleep(0.1)
            pin12.write_digital(0)

    Xvalue = pin1.read_analog()
    Yvalue = pin2.read_analog()

    if Xvalue < 450:
        radio.send("LEFT")
    elif Xvalue > 550:
        radio.send("RIGHT")
    elif Yvalue < 450:
        radio.send("BACKWARD")
    elif Yvalue > 550:
        radio.send("FORWARD")
    else:
        radio.send("STOP")

Προγραμματισμός Maqueen (Receiver)

Και εδώ, στη αρχή του προγράμματος πρόσθεσε τις βιβλιοθήκες “microbit” και “radio”. Επιπλέον, για τον έλεγχο του Maqueen και τη λήψη των εντολών από το GamePad, θα χρησιμοποιηθούν και οι κλάσεις “MoveMaqueen” και “DigitalGamePad” της βιβλιοθήκης “GRobotronicsMaqueen”.

from microbit import *
from GRobotronicsMaqueen import MoveMaqueen, DigitalGamePad
import radio

Έπειτα δημιούργησε το αντικείμενο “robot” της κλάσης “MoveMaqueen” και το αντικείμενο “gamepad” της κλάσης “DigitalGamePad” και βάλε το Microbit του Maqueen στην ίδια ομάδα με αυτό του GamePad (ομάδα 1).

robot = MoveMaqueen()
gamepad = DigitalGamePad()

speed = 50

radio.config(group=1)
robot.stop()

Μέσα σε μια δομή επανάληψης, καταχωρείται συνεχώς στη μεταβλητή “msg” η τιμή που επιστρέφει η εντολή “gamepad.get_message()”. Χρησιμοποίησε την εντολή “if-elif” για να δημιουργήσεις μία δομή επιλογής στην οποία θα ελέγχεται μέσω της συνάρτησης “isinstance(value, type)” αν το μήνυμα που έφτασε από το Microbit του GamePad είναι η τιμή της ταχύτητας ή η κατεύθυνση της κίνησης, ώστε το μήνυμα να καταχωρείται είτε στη μεταβλητή “speed” είτε στη “message”.

while True:
    msg = gamepad.get_message()
    
    if isinstance(msg, int):
        speed = msg
    elif isinstance(msg, str):
        message = msg

Με μια δεύτερη δομή επιλογής, εντός της προηγούμενης, εξετάζεται το μήνυμα που αφορά την κατεύθυνση του ρομπότ με τη βοήθεια του τελεστή σύγκρισης “==”. Αν το Maqueen λάβει μήνυμα “RIGHT” ή “LEFT”, θα περιστραφεί αντίστοιχα επιτόπου κινώντας τους 2 κινητήρες του με αντίθετη φορά, λόγω του πλην στην ταχύτητα του ενός από τους δύο κινητήρες. Η τιμή της ταχύτητας είναι αυτή της μεταβλητής “speed” που έστειλε ο πομπός όπως αυτή διαμορφώθηκε πατώντας τα κουμπιά A ή Β του GamePad.

    if isinstance(msg, int):
        speed = msg
    elif isinstance(msg, str):
        message = msg
        if message == "LEFT":
            robot.move(-speed, speed)
        elif message == "RIGHT":
            robot.move(speed, -speed)

Συμπλήρωσε το πρόγραμμα με τις περιπτώσεις που το Maqueen κινείται μπροστά, πίσω ή είναι σταματημένο. Παρακάτω μπορείς να δεις το προτεινόμενο πρόγραμμα για το Microbit του Maqueen (Receiver) συνολικά.

Δοκίμασε να το τροποποιήσεις και μη διστάσεις να πειραματιστείς!

from microbit import *
from GRobotronicsMaqueen import MoveMaqueen, DigitalGamePad
import radio

robot = MoveMaqueen()
gamepad = DigitalGamePad()

speed = 50

radio.config(group=1)
robot.stop()

while True:
    msg = gamepad.get_message()
    
    if isinstance(msg, int):
        speed = msg
    elif isinstance(msg, str):
        message = msg
        if message == "LEFT":
            robot.move(-speed, speed)
        elif message == "RIGHT":
            robot.move(speed, -speed)
        elif message == "FORWARD":
            robot.move(speed, speed)
        elif message == "BACKWARD":
            robot.move(-speed, -speed)
        elif message == "STOP":
            robot.stop()

Προσαρμογή για το Maqueen Lite

Αν διαθέτεις Maqueen Lite και όχι Maqueen Plus V2, για να το προγραμματίσεις με Python δεν απαιτείται κάποια αλλαγή στα προγράμματα του GamePad (Transmitter) ή του Maqueen (Receiver).

Αν θέλεις να προγραμματίσεις το Maqueen Lite με MakeCode το πρόγραμμα για τον πομπό, δηλαδή για το Gamepad, παραμένει το ίδιο με την περίπτωση του Maqueen Plus V2, όμως αλλάζει το πρόγραμμα που αφορά τον δέκτη, δηλαδή το ρομποτάκι Maqueen.

Τώρα, για να προσθέσεις την επέκταση με τις εντολές που αφορούν το ρομπότ χρησιμοποίησε αυτό το link: https://github.com/DFRobot/pxt-maqueen

Η δομή και η λογική του προγράμματος παραμένουν ίδιες με την περίπτωση του Maqueen Plus V2 και απλώς αλλάζουν μορφή οι εντολές που σχετίζονται με το Maqueen.  

Αρχεία

Σύνδεσμοι

Προγραμμάτισε το Maqueen βγαίνει από λαβύρινθους

Εκπαιδευτική ρομποτική για Προσχολική ηλικία με το BeeBot!

Κάνε το Maqueen να ακολουθεί το χέρι σου

Microbit & Python: Κάντε τα πρώτα σας βήματα