Έλεγχος κινητήρων DC με το RP2040

Για τον έλεγχο των κινητήρων 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)  

Στην πράξη