Πίνακας περιεχομένων:

Παρακολούθηση γραμμών GiggleBot χρησιμοποιώντας Python: 5 βήματα
Παρακολούθηση γραμμών GiggleBot χρησιμοποιώντας Python: 5 βήματα

Βίντεο: Παρακολούθηση γραμμών GiggleBot χρησιμοποιώντας Python: 5 βήματα

Βίντεο: Παρακολούθηση γραμμών GiggleBot χρησιμοποιώντας Python: 5 βήματα
Βίντεο: Αυτό είναι το σύστημα παρακολούθησης της Πράσινης Γραμμής 2024, Ιούλιος
Anonim
Οπαδός γραμμής GiggleBot χρησιμοποιώντας Python
Οπαδός γραμμής GiggleBot χρησιμοποιώντας Python
Οπαδός γραμμής GiggleBot χρησιμοποιώντας Python
Οπαδός γραμμής GiggleBot χρησιμοποιώντας Python
Οπαδός γραμμής GiggleBot χρησιμοποιώντας Python
Οπαδός γραμμής GiggleBot χρησιμοποιώντας Python

Αυτή τη φορά, προγραμματίζουμε στο MicroPython το Dexter Industries GiggleBot να ακολουθήσει μια μαύρη γραμμή χρησιμοποιώντας τον ενσωματωμένο αισθητήρα παρακολούθησης γραμμών.

Το GiggleBot πρέπει να συνδυαστεί με ένα μικροσκόπιο BBC: bit για να ελεγχθεί κατάλληλα.

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

Βήμα 1: Απαιτούμενα εξαρτήματα

Απαιτούμενα εξαρτήματα
Απαιτούμενα εξαρτήματα

Απαιτούνται τα ακόλουθα στοιχεία υλικού:

  1. x3 μπαταρίες AA - στην περίπτωσή μου χρησιμοποιώ επαναφορτιζόμενες μπαταρίες που έχουν συνολικά χαμηλότερη τάση.
  2. Ένα ρομπότ Dexter Industries GiggleBot για το micro: bit.
  3. Ένα μικρόβιο του BBC: λίγο.

Φυσικά, χρειάζεστε επίσης ένα καλώδιο micro USB για να προγραμματίσετε το BBC micro: bit - αυτό το καλώδιο γενικά περιλαμβάνεται στο πακέτο του BBC micro: bit ή μπορείτε πάντα να χρησιμοποιήσετε ένα που χρησιμοποιείται για τη φόρτιση smartphone (Android).

Αποκτήστε το GiggleBot για το micro: bit εδώ

Βήμα 2: Ρύθμιση των κομματιών

Ρύθμιση των κομματιών
Ρύθμιση των κομματιών

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

Το παραπάνω κομμάτι αποτελείται από τον ακόλουθο αριθμό διαφορετικών πλακιδίων:

  • 12 πλακάκια τύπου #1.
  • 5 πλακάκια τύπου #2.
  • 3 πρότυπα πλακιδίων τύπου #5.
  • 3 πρότυπα τύπου κεραμιδιών #6 - εδώ, θα καταλήξετε με ένα επιπλέον κεραμίδι.

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

Βήμα 3: Ρύθμιση του περιβάλλοντος

Ρύθμιση του Περιβάλλοντος
Ρύθμιση του Περιβάλλοντος

Για να μπορέσετε να προγραμματίσετε το BBC micro: bit στο MicroPython, πρέπει να ρυθμίσετε έναν επεξεργαστή για αυτό (το Mu Editor) και να ορίσετε τον χρόνο εκτέλεσης του GiggleBot MicroPython ως χρόνου εκτέλεσης. Για αυτό, πρέπει να ακολουθήσετε τις οδηγίες σε αυτήν τη σελίδα. Από εκείνη τη στιγμή, χρησιμοποιείται η έκδοση v0.4.0 του χρόνου εκτέλεσης.

Βήμα 4: Προγραμματισμός του GiggleBot

Πριν ασχοληθούμε με αυτό, ο χρόνος εκτέλεσης του GiggleBot MicroPython περιέχει τον κλασικό χρόνο εκτέλεσης για το BBC micro: bit και άλλες βιβλιοθήκες για την υποστήριξη του GiggleBot και άλλων αισθητήρων βιομηχανιών Dexter.

Αφού το ρυθμίσετε, ανοίξτε το ακόλουθο σενάριο στον επεξεργαστή Mu και κάντε κλικ στο Flash. Αυτό θα αναβοσβήσει το GiggleBot MicroPython Runtime και το σενάριο που μόλις ανοίξατε στο BBC micro: bit. Το σενάριο εμφανίζεται επίσης παρακάτω.

Μόλις ολοκληρωθεί η διαδικασία αναβοσβήματος, τοποθετήστε το μικροσκόπιο του BBC: μπείτε στο GiggleBot με τα νεοπίξελ του πίνακα στραμμένα προς τα εμπρός, τοποθετήστε το στην πίστα και ενεργοποιήστε το.

Παρατηρήστε ότι στο σενάριο, το PID και άλλες 2 σταθερές (το σημείο ρύθμισης ταχύτητας και οι σταθερές ελάχιστης ταχύτητας) έχουν ήδη οριστεί.

Σημείωση: Το ακόλουθο σενάριο μπορεί να έχει κενά κενά και αυτό φαίνεται να οφείλεται σε κάποιο πρόβλημα στην εμφάνιση των GitHub Gists. Κάντε κλικ στην ουσία για να μεταφερθείτε στη σελίδα του GitHub, όπου μπορείτε να αντιγράψετε-επικολλήσετε τον κώδικα.

GiggleBot PID Line Follower - Συντονισμένος με NeoPixels

από εισαγωγή microbit*
από εισαγωγή gigglebot*
από utime εισαγωγή sleep_ms, ticks_us
εισαγωγή ustruct
# αρχικοποίηση GB νεοπροστοιχείων
neo = init ()
# χρονισμός
βαθμός ενημέρωσης = 50
# κέρδη/σταθερές (υποθέτοντας ότι η τάση της μπαταρίας είναι περίπου 4,0 βολτ)
Kp = 25,0
Ki = 0,5
Kd = 35,0
σημείο_ ενεργοποίησης = 0,3
min_speed_percent = 0,3
base_speed = 70
setpoint = 0,5
last_position = setpoint
ολοκλήρωμα = 0,0
run_neopixels = True
center_pixel = 5# όπου το κεντρικό pixel του χαμόγελου βρίσκεται στο GB
# turquoise = tuple (map (lambda x: int (x / 5), (64, 224, 208)))
# τυρκουάζ = (12, 44, 41) # που είναι ακριβώς το παραπάνω τιρκουάζ που σχολιάστηκε πάνω από αυτό
error_width_per_pixel = 0,5/3# μέγιστο σφάλμα διαιρούμενο με τον αριθμό των τμημάτων μεταξύ κάθε νεοπροστοιχείου
defupper_bound_linear_speed_reducer (abs_error, trigger_point, above_bound, μικρότερη_κινητική_δύναμη, υψηλότερη_κινητική_δύναμη):
παγκόσμια βασική ταχύτητα
εάν abs_error> = σημείο_ ενεργοποίησης:
# x0 = 0,0
# y0 = 0,0
# x1 = πάνω_δεσμ. - σημείο_ ενεργοποίησης
# y1 = 1,0
# x = abs_error - σημείο_ ενεργοποίησης
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# το ίδιο με
y = (abs_error - trigger_point) / (above_bound - trigger_point)
motor_power = base_speed * (μικρότερη_κινητική_δύναμη + (1- έτη) * (υψηλότερη_κινητική_δύναμη - μικρότερη_κινητική_δύναμη))
επιστροφή_κινητήρα
αλλού:
επιστροφή base_speed * υψηλότερη_κινητική_δύναμη
τρέξιμο = Λάθος
προηγούμενο_σφάλμα = 0
ενώ Αλήθεια:
# αν πατηθεί το κουμπί a τότε ξεκινήστε να ακολουθείτε
εάν button_a.is_pressed ():
τρέχω = True
# αλλά αν πατηθεί το κουμπί b σταματήστε τον ακόλουθο γραμμής
εάν button_b.is_pressed ():
τρέξιμο = Λάθος
ολοκλήρωμα = 0,0
προηγούμενο_σφάλμα = 0,0
pixels_off ()
να σταματήσει()
sleep_ms (500)
αν τρέξει isTrue:
# διαβάστε τους αισθητήρες γραμμής
start_time = ticks_us ()
δεξιά, αριστερά = read_sensor (LINE_SENSOR, BOTH)
# γραμμή είναι στα αριστερά όταν η θέση <0,5
# γραμμή είναι στα δεξιά όταν η θέση είναι> 0,5
# γραμμή είναι στη μέση όταν η θέση = 0,5
# είναι ένας σταθμισμένος αριθμητικός μέσος όρος
προσπαθήστε:
θέση = δεξιά /πλωτήρας (αριστερά + δεξιά)
εκτόςZeroDivisionError:
θέση = 0,5
# το εύρος πρέπει να είναι (0, 1) και όχι [0, 1]
αν θέση == 0: θέση = 0,001
αν θέση == 1: θέση = 0,999
# χρησιμοποιήστε έναν ελεγκτή PD
σφάλμα = θέση - σημείο ρύθμισης
ολοκλήρωμα += σφάλμα
διόρθωση = Kp * error + Ki * integral + Kd * (error - previous_error)
previous_error = σφάλμα
# υπολογίστε τις στροφές του κινητήρα
motor_speed = upper_bound_linear_speed_reducer (abs (σφάλμα), setpoint * trigger_point, setpoint, min_speed_percent, 1.0)
leftMotorSpeed = ταχύτητα_κινητήρα + διόρθωση
rightMotorSpeed = ταχύτητα_κινητήρα - διόρθωση
# φωτίστε τα neopixels σύμφωνα με το δεδομένο σφάλμα
αν το run_neopixels είναι αληθινό και total_counts %3 == 0:
για i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08':
neo = (0, 0, 0)
για i inb '\ x00 / x01 / x02 / x03':
ifabs (σφάλμα)> error_width_per_pixel * i:
αν σφάλμα <0:
# neo [center_pixel + i] = τιρκουάζ
neo [center_pixel + i] = (12, 44, 41)
αλλού:
# neo [center_pixel - i] = τιρκουάζ
neo [center_pixel + i] = (12, 44, 41)
αλλού:
ποσοστά = 1- (error_width_per_pixel * i -abs (error)) / error_width_per_pixel
# φωτίστε το τρέχον εικονοστοιχείο
αν σφάλμα <0:
# neo [center_pixel + i] = πλειάδα (χάρτης (λάμδα x: int (x * ποσοστό), τιρκουάζ))
neo [center_pixel + i] = (int (64* τοις εκατό /5), int (224* τοις εκατό /5), int (208* τοις εκατό /5))
αλλού:
# neo [center_pixel - i] = πλειάδα (χάρτης (λάμδα x: int (x * ποσοστό), τιρκουάζ))
neo [center_pixel - i] = (int (64* τοις εκατό /5), int (224* τοις εκατό /5), int (208* τοις εκατό /5))
Διακοπή
neo.show ()
προσπαθήστε:
# κλιπ τις ταχύτητες του κινητήρα
αν μείνειMotorSpeed> 100:
leftMotorSpeed = 100
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100
αν είναι σωστόMotorSpeed> 100:
rightMotorSpeed = 100
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100
αν μείνειMotorSpeed <-100:
leftMotorSpeed = -100
αν είναι σωστόMotorSpeed <-100:
rightMotorSpeed = -100
# ενεργοποιήστε τους κινητήρες
set_speed (leftMotorSpeed, rightMotorSpeed)
οδηγώ()
# εκτύπωση ((σφάλμα, ταχύτητα_κινητήρα))
εκτός:
# σε περίπτωση που αντιμετωπίσουμε κάποιο αδιόρθωτο ζήτημα
πέρασμα
# και διατηρήστε τη συχνότητα του βρόχου
end_time = ticks_us ()
delay_diff = (ώρα λήξης - ώρα έναρξης) /1000
if1000.0/ update_rate - delay_diff> 0:
ύπνος (1000.0/ βαθμός ενημέρωσης - καθυστέρηση_διαφορά)

προβολή rawgigglebot_tuned_line_follower.py που φιλοξενείται με ❤ από το GitHub

Βήμα 5: Αφήστε το να τρέξει

Υπάρχουν 2 κουμπιά στο BBC micro: bit: κουμπί A και κουμπί B:

  • Πατώντας το κουμπί Α ορίζει το GiggleBot να ακολουθεί τη γραμμή (αν υπάρχει).
  • Πατώντας το κουμπί B σταματά το GiggleBot και γίνεται επαναφορά όλων, ώστε να μπορείτε να το χρησιμοποιήσετε ξανά.

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

Συνιστάται: