follow the line maqueen tutorial

Κάνε το Maqueen να ακολουθεί γραμμές

Κάνε το ρομποτάκι σου να ακολουθεί μια προκαθορισμένη πορεία ακολουθώντας μια μαύρη γραμμή.

Συμβαίνει στον πραγματικό κόσμο

Στην εποχή της 4ης Βιομηχανικής Επανάστασης (Industry 4.0) η αυτοματοποίηση της παραγωγής και των υπηρεσιών είναι δεδομένη. Έχεις αναρωτηθεί πως λειτουργούν τα ρομπότ στις μεγάλες αποθήκες (π.χ. Amazon); Πως καταφέρνει άραγε ένα ρομπότ να ακολουθεί συγκεκριμένες διαδρομές μεταφέροντας πακέτα; Ένας τρόπος που θα μπορούσε να το πετύχει είναι να χρησιμοποιήσει τους αισθητήρες που διαθέτει για να “διαβάσει” τα σημάδια που το καθοδηγούν και τις διαδρομές που έχουν χαραχτεί για να το κατευθύνουν στον προορισμό του.

follow line robots in warehouse

Ήρθε η στιγμή να κάνεις και το δικό σου ρομποτάκι να ακολουθεί προκαθορισμένες διαδρομές! Χρησιμοποίησε μία τυπωμένη πίστα line following με μαύρες γραμμές ή όρισε τη δική σου διαδρομή χρησιμοποιώντας μία μαύρη μονωτική ταινία σε ανοιχτόχρωμη επιφάνεια.

Πως τα καταφέρνει το Maqueen;

Για να ανιχνεύσουν τα Maqueen τη μαύρη γραμμή χρησιμοποιούν ειδικούς αισθητήρες που βρίσκονται κάτω απ’ την πλατφόρμα τους. Ο κάθε αισθητήρας αποτελείται από έναν IR Transmitter και έναν IR Receiver και η αρχή λειτουργίας τους βασίζεται στο ότι κάθε επιφάνεια, ανάλογα με το χρώμα της, αντανακλά στον δέκτη διαφορετική ποσότητα υπέρυθρου φωτός από αυτή που εκπέμπεται από τον πομπό. Γι’ αυτόν τον λόγο, το να βρίσκεται το ρομπότ “στον αέρα” ισοδυναμεί με το να βρίσκεται πάνω από μία μαύρη επιφάνεια, καθώς και στις δύο περιπτώσεις το μεγαλύτερο ποσοστό του IR φωτός που στέλνει ο πομπός δεν φτάνει πίσω στον δέκτη.

grayscale sensor maqueen

Το ρομποτάκι Maqueen Plus V2 είναι εφοδιασμένο με 5 αισθητήρες γραμμής που είναι σημειωμένοι ως “L2”, “L1”, “M”, “R1” και “R2”. Με τους αισθητήρες του Maqueen Plus V2 μπορεί να γίνει είτε “ψηφιακή ανάγνωση” (επιστρέφουν τιμή 1 ή 0), είτε “αναλογική ανάγνωση” (επιστρέφουν τιμές σε ένα εύρος από 0 μέχρι 240 περίπου).

maqueen line tracking sensors

Για να ακολουθήσει το Maqueen Plus V2 μία πίστα με απλές καμπύλες (όπως στο παράδειγμα του παρόντος οδηγού), χρησιμοποιούνται μόνο οι τρεις κεντρικοί αισθητήρες L1, M, R1. Οι πλαϊνοί αισθητήρες L2 και R2 μπορούν να αξιοποιηθούν σε πιο σύνθετες διαδρομές που διαθέτουν στροφές 90 μοιρών ή διασταυρώσεις.

maqueen line tracking sensors 1-2-3

Αντίστοιχα, το Maqueen Lite είναι εφοδιασμένο με 2 αισθητήρες γραμμής που είναι σημειωμένοι ως “Line-R” και “Line-L”. Όταν “κουμπώνεις” το Microbit πάνω στο ρομποτάκι, μέσω των κυκλωμάτων που διαθέτει η πλατφόρμα του Maqueen Lite, ο δεξής αισθητήρας συνδέεται στον ακροδέκτη 14 του Microbit ενώ ο αριστερός στον ακροδέκτη 13.

maqueen bottom view

Βαθμονόμηση αισθητήρων

Οι αισθητήρες ανίχνευσης γραμμής των Maqueen έχουν βαθμονομηθεί από το εργοστάσιο και δεν χρειάζεται να τους βαθμονομήσεις. Αν όμως διαπιστώσεις ότι κάποιος από τους αισθητήρες δεν αναγνωρίζει τις μαύρες γραμμές τότε μπορείς να τον βαθμονομήσεις ξανά.

Τοποθέτησε το Maqueen Plus V2 ή το Maqueen Lite πάνω σε μια μαύρη περιοχή και βεβαιώσου ότι όλοι οι αισθητήρες βρίσκονται στη μαύρη περιοχή.

maqueen on black map

Πάτησε παρατεταμένα το κουμπί βαθμονόμησης για περίπου 1 δευτερόλεπτο και τα 2 μπροστινά κόκκινα LED του Maqueen Plus V2 θα αρχίσουν να αναβοσβήνουν. Όταν σβήσουν οριστικά η βαθμονόμηση θα έχει ολοκληρωθεί.

calibration button

Η διαδικασία βαθμονόμησης για το Maqueen Lite είναι ακριβώς η ίδια, μόνο που τώρα δεν αναβοσβήνουν τα 2 μπροστινά κόκκινα LED αλλά 2 μικρά βοηθητικά μπλε που διαθέτει.

line tracking indicator maqueen

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

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

  • Κινητήρες
  • Αισθητήρες γραμμής

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

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

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

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

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

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

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

Συμπλήρωσε στη γραμμή αναζήτησης το 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.

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

Χρησιμοποίησε την εντολή “για πάντα” για να δημιουργήσεις μια δομή επανάληψης. Συνδύασε την εντολή “ορισμός … σε …” με την εντολή που σου επιστρέφει την τιμή (0 ή 1) που καταγράφουν οι αισθητήρες γραμμής.

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

Σε κάθε ένα από τα τρία πλαίσια πρόσθεσε τρεις τελεστές σύγκρισης.

Η τιμή που δίνει ένας αισθητήρας του Maqueen Plus V2 όταν βρίσκεται πάνω από μια μαύρη γραμμή είναι 1. Σε διαφορετική περίπτωση η τιμή που καταγράφεται είναι 0 (λευκή ή ανοιχτόχρωμη επιφάνεια). Οι τιμές 0 και 1 δεν συνδέονται με τη λογική low/high στους ακροδέκτες ενός μικροελεγκτή, αλλά απλώς αποτελούν μια ένδειξη του εντοπισμού ή όχι μιας μαύρης γραμμής. Για να καταφέρει να ακολουθήσει μία μαύρη γραμμή το ρομποτάκι, θα πρέπει να πραγματοποιείται συνεχώς έλεγχος των τιμών που καταγράφουν οι τρεις κεντρικοί αισθητήρες εντοπισμού γραμμής. Αν κανένας από τους αισθητήρες δεν εντοπίσει τη γραμμή το ρομποτάκι θα παραμένει ακίνητο

Φτιάξε μία συνάρτηση -ένα υποπρόγραμμα που θα καλείται όταν το Maqueen θα ακολουθεί τη μαύρη γραμμή. Επίλεξε “Για Προχωρημένους”, έπειτα “Συναρτήσεις” και τέλος “Δημιουργία συνάρτησης”.

Πάτησε τρεις φορές “Αριθμός” για να προσθέσεις τρεις παραμέτρους. Οι αριθμοί αυτοί είναι η πληροφορία που περνάει στη συνάρτηση από το κύριο πρόγραμμα.

Ονόμασε τη συνάρτηση “followLine” και τις παραμέτρους “left”, “middle” και “right” και κάνε κλικ στο “Ολοκλήρωση”.

Πλέον, στην κατηγορία “Συναρτήσεις” εμφανίζονται τα νέα block με τις εντολές που σχετίζονται με τη συνάρτηση.

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

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

Σύρε τα μπλοκ “left”, “middle” και “right” από την κορυφή της συνάρτησης και άφησέ τα στις από κάτω συνθήκες. Στην περίπτωση που μόνο ο κεντρικός αισθητήρας εντοπίσει τη μαύρη γραμμή, το Maqueen θα κινείται ευθεία με ταχύτητα 80. Το εύρος των τιμών της ταχύτητας είναι από 0 έως 255.

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

Στην επόμενη “αλλιώς εάν” εξετάζεται αν ο κεντρικός και ο αριστερός αισθητήρας δίνουν τιμή 1, τότε το Maqueen παρεκκλίνει λίγο από τη μαύρη γραμμή προς τα δεξιά και θα πρέπει να στρίψει λίγο προς τα αριστερά για να επανέλθει, περιστρέφοντας τον αριστερό κινητήρα με ταχύτητα 30 και τον δεξί με ταχύτητα 80. Με το ίδιο σκεπτικό, αν καταγράφεται τιμή 1 μόνο από τον αριστερό αισθητήρα, τότε το Maqueen παρεκκλίνει αρκετά από τη μαύρη γραμμή και θα πρέπει η διόρθωση προς τα αριστερά να είναι πιο έντονη, γι’ αυτό και αριστερός κινητήρας παραμένει τώρα ακίνητος.

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

Τελικά, η συνάρτηση “followLine” θα καλείται στο κυρίως πρόγραμμα μέσω της εντολής “κλήση followLine …”, που περιέχει και τις τρεις μεταβλητές στις οποίες καταχωρήθηκαν οι τιμές από τους αισθητήρες. Παρακάτω μπορείς να δεις το προτεινόμενο πρόγραμμα συνολικά. Δοκίμασε να το τροποποιήσεις και μη διστάσεις να πειραματιστείς!

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

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

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

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

https://github.com/grobotronics/Microbit/tree/main/Maqueen

Στη αρχή του προγράμματος πρόσθεσε τη βιβλιοθήκη “microbit”. Για τον έλεγχο του Maqueen θα χρησιμοποιηθούν και οι κλάσεις “MoveMaqueen” και “LineSensors” της βιβλιοθήκης “GRobotronicsMaqueen”.

from microbit import *
from GRobotronicsMaqueen import MoveMaqueen, LineSensors

Έπειτα δημιούργησε το αντικείμενο “robot” της κλάσης “MoveMaqueen” και το αντικείμενο “line” της κλάσης “LineSensors”.

robot = MoveMaqueen()
line = LineSensors()

Μέσα σε μια δομή επανάληψης καταχωρούνται συνεχώς στις μεταβλητές “L2”, “L1”, “M”, “R1” και “R2” οι τιμές που επιστρέφει η εντολή “line.return_sensor_values()”. Οι τιμές L2 και R2 δεν χρησιμοποιούνται στο συγκεκριμένο παράδειγμα καθώς αξιοποιούνται μόνο οι τρεις κεντρικοί αισθητήρες . Η “line.return_sensor_values()” επιστρέφει “BLACK” για τους αισθητήρες που βρίσκονται πάνω από μαύρη επιφάνεια, διαφορετικά επιστρέφει “WHITE”.

while True:
    L2, L1, M, R1, R2 = line.return_sensor_values()

Για να καταφέρει να ακολουθήσει μία μαύρη γραμμή το ρομποτάκι, θα πρέπει να πραγματοποιείται συνεχώς έλεγχος των τιμών που καταγράφουν οι τρεις κεντρικοί αισθητήρες εντοπισμού γραμμής. Χρησιμοποίησε την εντολή ifelse για να δημιουργήσεις μία δομή επιλογής και πρόσθεσε δύο λογικούς τελεστές “or”. Οι τελεστές σύγκρισης “==” αποτελούν τη μαθηματική έννοια της ισότητας και διαφέρουν από τους τελεστές εκχώρησης τιμής “=” που χρησιμοποιούνται για την αποθήκευση των τιμών. Αν κάποιος από τους αισθητήρες ανιχνεύσει τη γραμμή, τότε θα καλείται η followLine(L1, M, R1)” η οποία και θα ορίσεις στη συνέχεια τι θα κάνει. Διαφορετικά, το ρομποτάκι θα παραμένει ακίνητο.

while True:
    L2, L1, M, R1, R2 = line.return_sensor_values()
    if L1 == "BLACK" or M == "BLACK" or R1 == "BLACK":
        followLine(L1, M, R1)
    else:
        robot.stop()

Όρισε (define), έξω απ’ τη δομή επανάληψης, τη συνάρτηση “followLine()” -το υποπρόγραμμα που θα καλείται όταν το Maqueen θα ακολουθεί τη μαύρη γραμμή. Η συνάρτηση θα αξιοποιεί και τις τρεις παραμέτρους “left”, “middle” και “right”. Οι τρεις αυτοί αριθμοί, είναι η πληροφορία που περνάει στη συνάρτηση από το κυρίως πρόγραμμα.

def followLine(left, middle, right):

Χρησιμοποίησε την εντολή if για να δημιουργήσεις μία δομή επιλογής και πρόσθεσε δύο λογικούς τελεστές “and” και τρεις τελεστές σύγκρισης “==”. Στην περίπτωση που μόνο ο κεντρικός αισθητήρας εντοπίσει τη μαύρη γραμμή, το Maqueen θα κινείται ευθεία με ταχύτητα 60. Η εντολή “robot.move(value, value)” δέχεται ως πληροφορία την ταχύτητα περιστροφής του αριστερού και του δεξιού κινητήρα, με εύρος τιμών από -100 έως 100. Αν η τιμή είναι αρνητικός αριθμός ο κινητήρας περιστρέφεται αντίστροφα.

def followLine(left, middle, right):
    if left == "WHITE" and middle == "BLACK" and right == "WHITE":
        robot.move(60, 60)

Με την “elif” εξετάζεται αν ο κεντρικός και ο αριστερός αισθητήρας καταγράφουν “BLACK”. Σε αυτή την περίπτωση το Maqueen παρεκκλίνει λίγο από τη μαύρη γραμμή προς τα δεξιά και θα πρέπει να στρίψει λίγο προς τα αριστερά για να επανέλθει, περιστρέφοντας τον αριστερό κινητήρα με ταχύτητα 20 και τον δεξί με ταχύτητα 60. Με το ίδιο σκεπτικό, αν καταγράφεται τιμή “BLACK” μόνο από τον αριστερό αισθητήρα, τότε το Maqueen παρεκκλίνει αρκετά από τη μαύρη γραμμή και θα πρέπει η διόρθωση προς τα αριστερά να είναι πιο έντονη, γι’ αυτό και ο αριστερός κινητήρας παραμένει τώρα ακίνητος.

def followLine(left, middle, right):
    if left == "WHITE" and middle == "BLACK" and right == "WHITE":
        robot.move(60, 60)
    elif left == "BLACK" and middle == "BLACK" and right == "WHITE":
        robot.move(20, 60)
    elif left == "BLACK" and middle == "WHITE" and right == "WHITE":
        robot.move(0, 60)

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

from microbit import *
from GRobotronicsMaqueen import MoveMaqueen, LineSensors

robot = MoveMaqueen()
line = LineSensors()

def followLine(left, middle, right):
    if left == "WHITE" and middle == "BLACK" and right == "WHITE":
        robot.move(60, 60)
    elif left == "BLACK" and middle == "BLACK" and right == "WHITE":
        robot.move(20, 60)
    elif left == "BLACK" and middle == "WHITE" and right == "WHITE":
        robot.move(0, 60)
    elif left == "WHITE" and middle == "BLACK" and right == "BLACK":
        robot.move(60, 20)
    elif left == "WHITE" and middle == "WHITE" and right == "BLACK":
        robot.move(60, 0)
    elif left == "BLACK" and middle == "BLACK" and right == "BLACK":
        robot.move(60, 60)
        
while True:
    L2, L1, M, R1, R2 = line.return_sensor_values()

    if L1 == "BLACK" or M == "BLACK" or R1 == "BLACK":
        followLine(L1, M, R1)
    else:
        robot.stop()

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

Αν διαθέτεις Maqueen Lite και όχι Maqueen Plus V2, για να το προγραμματίσεις με MakeCode πρόσθεσε την επέκταση με αυτό το link: https://github.com/DFRobot/pxt-maqueen

Η δομή και η λογική του προγράμματος παραμένουν ίδιες με την περίπτωση του Maqueen Plus V2, όμως τώρα, οι συνθήκες που εξετάζονται είναι λιγότερες, καθώς το Maqueen Lite διαθέτει μόνο δύο αισθητήρες γραμμής. Μια ακόμη σημαντική διαφορά είναι ότι, σε αντίθεση με το Maqueen Plus V2, η τιμή που δίνει ένας αισθητήρας του Maqueen Lite όταν βρίσκεται πάνω από μια μαύρη γραμμή είναι 0. Σε διαφορετική περίπτωση η τιμή που καταγράφεται είναι 1 (λευκή ή ανοιχτόχρωμη επιφάνεια).

Λιγότερες είναι και οι συνθήκες που εξετάζονται και κατά τον προγραμματισμό του Maqueen Lite με Python, λόγω των τριών λιγότερων αισθητήρων. Επιπλέον, τώρα δεν χρησιμοποιείται η κλάση “LineSensors” και οι τιμές των αισθητήρων γραμμής καταχωρούνται μέσω της εντολής “read_digital()” από τη βιβλιοθήκη “microbit”.

from microbit import *
from GRobotronicsMaqueen import MoveMaqueen

robot = MoveMaqueen()

def followLine(left, right):
    if left == 0 and right == 0:
        robot.move(60, 60)
    elif left == 0 and right == 1:
        robot.move(0, 60)
    elif left == 1 and right == 0:
        robot.move(60, 0)
        
while True:
    L = pin13.read_digital()
    R = pin14.read_digital()

    if L == 0 or R == 0:
        followLine(L, R)
    else:
        robot.stop()

Αρχεία

Σύνδεσμοι

Κάντε τα πρώτα σας βήματα με το BBC micro:bit!

Προγραμμάτισε μια κινούμενη καρδιά στο BBC micro:bit σου!

NVIDIA Jetson Developer Kits

Αντιμετώπιση διασταυρώσεων με το Maqueen