Για τον έλεγχο των κινητήρων DC πρέπει να χρησιμοποιήσουμε μια μονάδα ελεγκτή που επιτρέπει την τρέχουσα κατανάλωση αυτών των συσκευών καθώς και τον έλεγχο της ταχύτητας και της κατεύθυνσης περιστροφής αυτών. Η Cytron διαθέτει μονάδα ελέγχου που μπορούμε να χρησιμοποιήσουμε αυτόνομα και μέσω των ακίδων εξόδου της κάρτας Raspbery Pi Pico.

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

Αν δουλεύουμε με την κάρτα MAKER PI PICO μπορούμε να δούμε μερικά παραδείγματα στον ΣΥΝΔΕΣΜΟ. Μεταξύ αυτών είναι ένα που μας δείχνει πώς να ελέγχουμε τους κινητήρες με αυτήν τη μονάδα. Θα εφαρμόσουμε τα παραδείγματά μας με την κάρτα MAKER PI RP2040 που συνοδεύει τον ελεγκτή κινητήρα DC που έχει ήδη εφαρμοστεί.

1 Έλεγχος διπλών κινητήρων DC με Maker Pi RP2040
Σκοπός
Έλεγχος κινητήρα DC μέσω της πλακέτας MAKER PI RP2040
Λειτουργικότητα
Για να κάνουμε αυτό το πρόγραμμα θα χρησιμοποιήσουμε τη βιβλιοθήκη “motor” που θα μας επιτρέψει να ελέγξουμε τους δύο κινητήρες που μπορούν να συνδεθούν στην κάρτα. Με την συνάρτηση “speed” μπορούμε να περιστρεψουμε τους κινητήρες τροποποιώντας τις παραμέτρους της συνάρτησης. Η λειτουργία “brake” σταματά τον κινητήρα.
Το πρόγραμμα
"""
Διπλός έλεγχος MOTOR1 και MOTOR2
με την πλακέτα MAKER PI RP2640
και χρήση βιβλιοθήκης
"""
from motor_driver import * # εισαγωγή βιβλιοθήκης motor_driver
# Ενεργοποίηση δύο κινητήρων: Motor1 και Motor2
# M1A = 8, M1B = 9, M2A = 10, M2B = 11
motor = motor_driver(8,9,10,11)
# Ταχύτητα λειτουργίας (self, speedLeft, speedRight). Μέγιστη ταχύτητα 100
motor.speed(50,50) # κινείται προς τα εμπρός κινητήρες με ταχύτητα 50
utime.sleep(5) # περιμένει 5 δευτερόλεπτα
motor.speed(0,50) # Στρίψτε αριστερά με ταχύτητα 50
utime.sleep(5)
motor.speed(50,0) # Στρίψτε δεξιά με ταχύτητα 50
utime.sleep(5)
motor.brake() # Σταματά τους κινητήρες
Στην πράξη

2. Έλεγχος κινητήρα DC, χωρίς χρήση βιβλιοθήκης
Σκοπός
Γράψτε ένα πρόγραμμα που μας επιτρέπει να ελέγχουμε την κίνηση ενός κινητήρα συνεχούς ρεύματος.
Λειτουργικότητα
Περιλαμβάνει τη σύνταξη μιας ακολουθίας κινήσεων που συμμορφώνεται με τον ακόλουθο πίνακα:
| 1 | Προχωρήστε αργά προς τα εμπρός | Για 1 δευτερόλεπτο |
| 2 | Σταματήστε | Για 1 δευτερόλεπτο |
| 3 | Προχωρήστε | Για 1 δευτερόλεπτο |
| 4 | Σταματήστε | Για 1 δευτερόλεπτο |
| 5 | Μετακινηθείτε προς τα πίσω | Για 1 δευτερόλεπτο |
| 6 | Σταματήστε | Για 1 δευτερόλεπτο |
| 7 | Μετακινηθείτε αργά προς τα πίσω | Για 1 δευτερόλεπτο |
| 8 | Ακινητοποιηθείτε | Για 1 δευτερόλεπτο |
Θα χρησιμοποιήσουμε έναν κινητήρα συνδεδεμένο στην έξοδο Motor 1 της πλακέτας MAKER PI RP2040. Θα το κάνουμε χωρίς να χρησιμοποιήσουμε κάποια βιβλιοθήκη ειδικά για τον έλεγχο του κινητήρα. Θα χρησιμοποιήσουμε τις εντολές:
M1A.duty_u16(xx)
M1B.duty_u16(xx)
της οποίας η παράμετρος “xx” είναι η τιμή μεταξύ 0 και 65535 που θα είναι υπεύθυνη για την αποστολή μιας μεταβλητής τάσης σε λειτουργία PWM στις εξόδους ελέγχου:
M1A = machine.PWM(machine.Pin(8))
M1B = machine.PWM(machine.Pin(9))
Το πρόγραμμα
Η κατασκευή του προγράμματος θα πραγματοποιηθεί σύμφωνα με τα ακόλουθα βήματα:
1. Φορτώστε τις βιβλιοθήκες
import machine
import utime
2. Καθορίστε τις ακίδες σύνδεσης M1A και M1B και ρυθμίστε τη συχνότητα του σήματος βάσης του PWM
M1A = machine.PWM(machine.Pin(8))
M1B = machine.PWM(machine.Pin(9))
M1A.freq(50)
M1B.freq(50)
3. Γράψτε κάθε μία από τις κινήσεις με την ακόλουθη επαναλαμβανόμενη μορφή:
print("Slow forward")
M1A.duty_u16(0)
M1B.duty_u16(30000)
utime.sleep(1)
Ο κώδικας:
# Έλεγχος κινητήρα χωρίς χρήση ειδικής βιβλιοθήκης
import machine
import utime
# Ρύθμιση ακίδων κινητήρα DC
M1A = machine.PWM(machine.Pin(8))
M1B = machine.PWM(machine.Pin(9))
M1A.freq(50)
M1B.freq(50)
while True:
print("Πήγαίνε μπροστά αργά")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(30000)
utime.sleep(1)
print("Σταμάτα")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
utime.sleep(1)
print("Εμπρός")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(65535)
utime.sleep(1)
print("Σταμάτα")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
utime.sleep(1)
print("Πίσω")
M1A.duty_u16(65535) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
utime.sleep(1)
print("Σταμάτα")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
utime.sleep(1)
print("Πίσω αργά")
M1A.duty_u16(30000) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
utime.sleep(1)
print("Ακίνητος")
M1A.duty_u16(65535) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(65535)
utime.sleep(1)
Στην πράξη

Ανάλυση και πρόταση δραστηριοτήτων
- Ελέγξτε τη λειτουργία του προγράμματος παρατηρώντας πώς στην κονσόλα στο Thonny εμφανίζεται η κίνηση που γίνεται.
- Τροποποιήστε τους χρόνους μεταξύ κάθε κίνησηςς και ελέγξτε τις αλλαγές όταν τροποποιούνται οι τιμές ταχύτητας
M1A.duty_u16(xx)
M1B.duty_u16(xx)
utime.sleep(1)
16.3 Έλεγχος δύο κινητήρων
Σκοπός
Ελέγξτε δύο κινητήρες ενός ρομπότ για να το τοποθετήσετε σε διαφορετικές θέσεις χρησιμοποιώντας το ίδιο προηγούμενο πρόγραμμα.
Λειτουργικότητα
Πρόκειται για την εκτέλεση του ίδιου προηγούμενου προγράμματος, αλλά αυτή τη φορά χρησιμοποιώντας δύο κινητήρες που συνδέουμε στους ακροδέκτες Motor1 και Motor 2:
| 1 | Κινήστε τα Μ1 και Μ2 αργά προς τα εμπρός | Για 1 δευτερόλεπτο |
| 2 | Σταματήστε τα Μ1 και Μ2 | Για 1 δευτερόλεπτο |
| 3 | Προχωρήστε τα Μ1 και Μ2 | Για 1 δευτερόλεπτο |
| 4 | Σταματήστε τα Μ1 και Μ2 | Για 1 δευτερόλεπτο |
| 5 | Κινήστε προς τα πίσω τα Μ1 και Μ2 | Για 1 δευτερόλεπτο |
| 6 | Σταματήστε τα Μ1 και Μ2 | Για 1 δευτερόλεπτο |
| 7 | Κινήστε αργά προς τα πίσω τα Μ1 και Μ2 | Για 1 δευτερόλεπτο |
| 8 | Ακινητοποιείστε τα Μ1 και Μ2 | Για 1 δευτερόλεπτο |
Το πρόγραμμα
Παραλείπουμε την επεξήγηση του προγράμματος αφού είναι ίδια με το προηγούμενο:
# Έλεγχος κινητήρων με την πλακέτα MAKER Pi RP2040
# Έλεγχος των κινητήρων Motor1 και Motor2
import machine
import utime
# Ρύθμιση ακίδων των κινητήρων DC
M1A = machine.PWM(machine.Pin(8))
M1B = machine.PWM(machine.Pin(9))
M2A = machine.PWM(machine.Pin(10))
M2B = machine.PWM(machine.Pin(11))
M1A.freq(50)
M1B.freq(50)
M2A.freq(50)
M2B.freq(50)
while True:
print("Πήγαίνε μπροστά αργά")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(30000)
M2A.duty_u16(0)
M2B.duty_u16(30000)
utime.sleep(1)
print("Σταμάτα")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
M2A.duty_u16(0)
M2B.duty_u16(0)
utime.sleep(1)
print("Εμπρός")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(65535)
M2A.duty_u16(0)
M2B.duty_u16(65535)
utime.sleep(1)
print("Σταμάτα")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
M2A.duty_u16(0)
M2B.duty_u16(0)
utime.sleep(1)
print("Πίσω")
M1A.duty_u16(65535) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
M2A.duty_u16(65535)
M2B.duty_u16(0)
utime.sleep(1)
print("Σταμάτα")
M1A.duty_u16(0) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
M2A.duty_u16(0)
M2B.duty_u16(0)
utime.sleep(1)
print("Πίσω αργά")
M1A.duty_u16(30000) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(0)
M2A.duty_u16(30000)
M2B.duty_u16(0)
utime.sleep(1)
print("Ακίνητος")
M1A.duty_u16(65535) # Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1B.duty_u16(65535)
M2A.duty_u16(65535)
M2B.duty_u16(65535)
utime.sleep(1)
Στην πράξη

Ανάλυση και πρόταση δραστηριοτήτων
- Ελέγξτε τη λειτουργία του προγράμματος παρατηρώντας πώς στην κονσόλα στο Thonny εμφανίζεται η κίνηση που γίνεται.
- Τροποποιήστε τους χρόνους μεταξύ κάθε κίνησηςς και ελέγξτε τις αλλαγές όταν τροποποιούνται οι τιμές ταχύτητας
M1A.duty_u16(xx)
M1B.duty_u16(xx)
M2A.duty_u16(xx)
M2B.duty_u16(xx)
utime.sleep(1)
4. Έλεγχος ταχύτητας κινητήρα με ποτενσιόμετρο
Σκοπός
Με αυτή την πρακτική θα πειραματιστούμε με τη μεταβολή της ταχύτητας ενός κινητήρα.
Λειτουργικότητα
Περιλαμβάνει τη σύνδεση ενός κινητήρα στους ακροδέκτες M1 της πλακέτας MAKER PI RP2040 , η οποία διέπεται από τους ακροδέκτες M1A GP8 και M1B GP9.
Εργαζόμαστε με σήματα PWM τροποποιώντας την τιμή εξόδου των προαναφερθέντων ακίδων M1A και M1B με τη βοήθεια του αναλογικού σήματος που θα δημιουργήσουμε στον ακροδέκτη ADC (27) συνδέοντας ένα ποτενσιόμετρο.
Πρόγραμμα
Θα ακολουθήσουμε τα παρακάτω βήματα:
1. Εισαγάγετε τις βιβλιοθήκες
from machine import Pin, PWM
import time
2. Προσδιορίστε την αναλογική είσοδο ADC(27) και τις ακίδες εξόδου PWM M1A και M1B
MIN_DUTY = 1600
MAX_DUTY = 8400
servo = PWM(Pin(15)) # Συνδέστε τον σερβομηχανισμό στην ακίδα GP15
servo.freq(50)
3. Ρυθμίζουμε τη συχνότητα λειτουργίας του σήματος PWM
servo.duty_u16(MIN_DUTY) # Ορισμός χρόνου κύκλου εργασίας.
time.sleep_ms(1000)
servo.duty_u16(MAX_DUTY)
time.sleep_ms(1000)
4. Στο τμήμα while συσχετίζουμε τη μεταβλητή ταχύτητας με την τιμή που διαβάζεται από το αναλογικό κανάλι, εκτυπώνουμε την ταχύτητα στην κονσόλα Thonny , στέλνουμε την τιμή ταχύτητας στον ακροδέκτη εξόδου M1B και ορίζουμε καθυστέρηση.
Ο κώδικας:
# Έλεγχος της ταχύτητας ενός κινητήρα
from machine import ADC, Pin
import time
pot = ADC(27) # Ανάγνωση αναλογικού σήματο
M1A = machine.PWM(machine.Pin(8))
M1B = machine.PWM(machine.Pin(9))
M1A.freq(50)
M1B.freq(50)
while True:
velocity = pot.read_u16()
print("ταχύτητα", velocity)
# Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1A.duty_u16(0)
M1B.duty_u16(velocity)
time.sleep(0.1)
Στην πράξη

5. Έλεγχος της ταχύτητας και της κατεύθυνσης περιστροφής ενός κινητήρα
Σκοπός
Να ελέγξουμε την ταχύτητα και την κατεύθυνση περιστροφής ενός κινητήρα DC.
Λειτουργικότητα
Θα χρησιμοποιήσουμε ένα ποτενσιόμετρο που θα συνδέσουμε στον ακροδέκτη GP27 στον οποίο θα λάβουμε ένα μεταβλητό αναλογικό σήμα που θα χρησιμοποιήσουμε για να τροποποιήσουμε την ταχύτητα του κινητήρα. Για να ελέγξουμε την κατεύθυνση περιστροφής θα το κάνουμε με ένα κουμπί συνδεδεμένο στο GP17. Θέλουμε επίσης να παρακολουθούμε την κατεύθυνση περιστροφής χρησιμοποιώντας δύο ψηφιακές εξόδους στις οποίες θα συνδέσουμε LED, GP3 και GP5. Θα εκτυπώσουμε την τιμή της ταχύτητας σε % με τέτοιο τρόπο ώστε για να γίνει αυτό θα πρέπει να χαρτογραφήσουμε την τιμή της “velocity”.
Πρόγραμμα
Θα ακολουθήσουμε τα παρακάτω βήματα:
1. Εισαγάγετε τις βιβλιοθήκες
from machine import Pin, ADC, PWM
import time
2. Προσδιορίστε τις εισόδους και τις εξόδους που εμπλέκονται
direction_of_rotation = Pin(17,Pin.IN)
right = Pin(3, Pin.OUT) # GP3 δεξιά
left = Pin(5, Pin.OUT) # GP5 αριστερά
pot = ADC(27) #ανάγνωση αναλογικόυ σήματος
M1A = machine.PWM(machine.Pin(8))
M1B = machine.PWM(machine.Pin(9))
3. Ρύθμιση συνθηκών εκκίνησης
M1A.freq(50)
M1B.freq(50)
rigch.value(0)
left.value(0)
4. Ορίστε τη συνάρτηση χάρτη (map) για να κλιμακώσετε την τιμή ταχύτητας μεταξύ 0 και 100.
def map(s, a1, a2, b1, b2):
return b1 + (s - a1) * (b2 - b1) / (a2 - a1)
5. Στον βρόχο while, αυτό που θα κάνουμε είναι να διαβάσουμε την τιμή της ταχύτητας και να την χαρτογραφήσουμε, στη συνέχεια δοκιμάζουμε την τιμή της κατεύθυνσης εισόδου περιστροφής και με βάση αυτήν την τιμή τοποθετούμε τις τιμές “0” ή “ταχύτητα” στις εξόδους M1A και M1B του ελέγχου κινητήρα M1 της πλακέτας. Εκτός από την ενεργοποίηση της κατεύθυνσης περιστροφής GP3 και GP5, θα γράψουμε την ταχύτητα σε % και την κατεύθυνση στην κονσόλα του Thonny.
velocity = pot.read_u16()
speed_percentage = map(velocity, 0, 65535, 0, 100)
if direction_of_rotation.value() == 1:
# Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1A.duty_u16(0)
M1B.duty_u16(velocity)
right.value(0)
left.value(1)
print('Ταχύτητα {:.0f}'.format(speed_percentage), "Δεξιά")
time.sleep(0.1)
else:
M1A.duty_u16(velocity)
M1B.duty_u16(0)
time.sleep(0.1)
right.value(1)
left.value(0)
print('Ταχύτητα {:.0f}'.format(speed_percentagel), "Αριστερά")
time.sleep(0.1)
Το πλήρες πρόγραμμα θα έχει ως εξής
# Έλεγχος ταχύτητας κινητήρα
from machine import Pin, ADC, PWM
import time
direction_of_rotation = Pin(17,Pin.IN)
right = Pin(3, Pin.OUT) # GP3 δεξιά
left = Pin(5, Pin.OUT) # GP5 αριστερά
pot = ADC(27) #ανάγνωση αναλογικόυ σήματος
M1A = machine.PWM(machine.Pin(8))
M1B = machine.PWM(machine.Pin(9))
M1A.freq(50)
M1B.freq(50)
right.value(0)
left.value(0)
def map(s, a1, a2, b1, b2):
return b1 + (s - a1) * (b2 - b1) / (a2 - a1)
while True:
velocity = pot.read_u16()
speed_percentage = map(velocity, 0, 65535, 0, 100)
if direction_of_rotation.value() == 1:
# Ο κύκλος λειτουργίας πρέπει να είναι μεταξύ 0 και 65535
M1A.duty_u16(0)
M1B.duty_u16(velocity)
right.value(0)
left.value(1)
print('Ταχύτητα {:.0f}'.format(speed_percentage), "Δεξιά")
time.sleep(0.1)
else:
M1A.duty_u16(velocity)
M1B.duty_u16(0)
time.sleep(0.1)
right.value(1)
left.value(0)
print('Ταχύτητα {:.0f}'.format(speed_percentagel), "Αριστερά")
time.sleep(0.1)
Στην πράξη
