Μάθετε πώς να ελέγχετε τη φωτεινότητα ενός LED που είναι συνδεδεμένο σε ένα Raspberry Pi χρησιμοποιώντας PWM.
Το PWM είναι κάτι που όλοι χρησιμοποιούμε καθημερινά, ακόμα κι αν δεν το γνωρίζουμε. Είναι μια τεχνική που είναι απλή και απίστευτα χρήσιμη σε μια σειρά εφαρμογών. Το καλύτερο ακόμα, είναι κάτι που το Raspberry Pi σας μπορεί να κάνει χωρίς να ιδρώσει. Πως? Ας ΡΙΞΟΥΜΕ μια ΜΑΤΙΑ.
Τι είναι το PWM;
Όπως λέει η ορολογία, το "Pulse-Width Modulation" ακούγεται αρκετά φανταχτερό. Αλλά το μόνο για το οποίο πραγματικά μιλάμε εδώ είναι να απενεργοποιήσουμε και να ενεργοποιήσουμε ξανά ένα ηλεκτρικό σήμα—εξαιρετικά γρήγορα. Γιατί μπορεί να θέλουμε να το κάνουμε αυτό; Απλά επειδή είναι ένας πολύ εύκολος τρόπος προσομοίωσης ενός μεταβλητού αναλογικού σήματος, χωρίς να καταφύγουμε σε Raspberry Pi HAT, πρόσθετα, ή επιπλέον κύκλωμα. Για ορισμένες εφαρμογές, όπως η θέρμανση μιας σόμπας, η οδήγηση κινητήρα ή η μείωση της φωτεινότητας ενός LED, ένα σήμα PWM κυριολεκτικά δεν διακρίνεται από μια "πραγματική" αναλογική τάση.
Κύκλοι Καθηκόντων
Έτσι, έχουμε μια σειρά από παλμούς που τροφοδοτούνται σε ένα φορτίο (αυτό που οδηγούμε). Αυτό από μόνο του δεν είναι και τόσο χρήσιμο—μέχρι να αρχίσουμε να αλλάζουμε (ή να διαμορφώνουμε) το πλάτος αυτών των παλμών. Η φάση "on" μιας δεδομένης περιόδου ενεργοποίησης-απενεργοποίησης μπορεί να καταλαμβάνει οπουδήποτε από 0–100% του συνολικού κύκλου. Αυτό το ποσοστό ονομάζουμε το κύκλος καθηκόντων.
Για παράδειγμα, ας υποθέσουμε ότι έχουμε ένα σήμα 3V PWM με κύκλο λειτουργίας 50%. Η μέση ποσότητα ισχύος που διέρχεται από το LED θα ισοδυναμούσε με ένα σήμα 1,5V που είναι πάντα ενεργό. Ανεβάστε τον κύκλο λειτουργίας και η λυχνία LED γίνεται πιο φωτεινή. πληκτρολογήστε το και η λυχνία LED σβήνει. Μπορούμε να δημιουργήσουμε ήχο χρησιμοποιώντας την ίδια μέθοδο—γι' αυτό η έξοδος ήχου στο Raspberry Pi μπορεί να σταματήσει να λειτουργεί εάν χρησιμοποιείτε PWM για άλλα πράγματα.
PWM στο Raspberry Pi
Μπορείτε να χρησιμοποιήσετε λογισμικό PWM σε κάθε pin GPIO του Raspberry Pi. Αλλά το υλικό PWM είναι διαθέσιμο μόνο σε GPIO12, GPIO13, GPIO18, και GPIO19.
Ποιά είναι η διαφορά? Λοιπόν, εάν πρόκειται να χρησιμοποιήσετε λογισμικό για να δημιουργήσετε το σήμα, τότε θα καταναλώνετε κύκλους CPU. Ωστόσο, η CPU σας μπορεί να έχει καλύτερα πράγματα να κάνει από το να λέει μια λυχνία LED να σβήσει και να ανάψει αρκετές εκατοντάδες φορές το δευτερόλεπτο. Στην πραγματικότητα, μπορεί να αποσπαστεί και να βαλτώσει από άλλες εργασίες, οι οποίες μπορεί να μπερδέψουν σοβαρά τους χρονισμούς PWM.
Κατά συνέπεια, είναι συχνά καλύτερη ιδέα να αναθέσετε την εργασία σε εξειδικευμένα κυκλώματα. Στην περίπτωση του Raspberry Pi, αυτό το κύκλωμα ζει μέσα το σύστημα στο τσιπ που στεγάζει την CPU. Το PWM υλικού είναι συχνά πολύ πιο ακριβές και βολικό, και επομένως είναι η προτιμώμενη επιλογή στις περισσότερες περιπτώσεις. Αν θέλετε μια ιδέα για το τι συμβαίνει κάτω από την κουκούλα στο τσιπ Broadcom BCM2711 του Raspberry Pi 4, τότε μπορείτε να δείτε την τεκμηρίωση BCM2711. Το Κεφάλαιο 8 καλύπτει τα πράγματα PWM!
Μείωση φωτισμού LED
Για να λειτουργήσει η λυχνία LED μας με το Raspberry Pi, θα χρειαστεί να κάνουμε λίγη πλάκα ψωμιού. Αυτό σημαίνει δύο στοιχεία: το ίδιο το LED και μια αντίσταση περιορισμού ρεύματος, την οποία θα συνδέσουμε σε σειρά με αυτήν. Χωρίς την αντίσταση, η λυχνία LED σας κινδυνεύει να πεθάνει σε μια δύσοσμη ρουφηξιά καπνού εάν περάσει πολύ ρεύμα μέσα από αυτήν.
Υπολογισμός της τιμής της αντίστασης
Δεν έχει σημασία σε ποιο άκρο του LED συνδέετε την αντίσταση. Αυτό που έχει σημασία είναι η τιμή της αντίστασης. Το Raspberry Pi 4 μπορεί να παρέχει περίπου 16 milliamps ανά καρφίτσα. Μπορούμε λοιπόν χρησιμοποιήστε το νόμο του Ohm για να υπολογίσετε την τιμή της αντίστασης που απαιτείται.
Ο εν λόγω νόμος ορίζει ότι η αντίσταση πρέπει να είναι ίση με την τάση στο ρεύμα. Γνωρίζουμε την τάση που βγαίνει από τον ακροδέκτη GPIO του Pi (3,3 V) και γνωρίζουμε ποιο θα πρέπει να είναι το ρεύμα (16 milliamps ή 0,016 amps). Αν διαιρέσουμε το πρώτο με το δεύτερο, παίρνουμε 206,25. Τώρα, αφού θα δυσκολευτείτε να βρείτε αντιστάσεις αυτής της τιμής, ας πάμε για 220 ohms.
Συνδέστε την άνοδο του LED (μακρύ πόδι) στο GPIO 18 (το οποίο είναι φυσικό pin 12 στο Raspberry Pi). Συνδέστε την κάθοδο (κοντό σκέλος) σε οποιαδήποτε από τις ακίδες γείωσης του Pi. Μην ξεχάσετε την αντίσταση, κάπου κατά μήκος της διαδρομής. Είστε τώρα έτοιμοι να πάτε!
Εφαρμογή PWM στο Raspberry Pi
Για να λειτουργήσει το υλικό PWM στο Raspberry Pi, θα χρησιμοποιήσουμε το βιβλιοθήκη rpi-hardware-pwm από τον Cameron Davidson-Pilon, προσαρμοσμένο από κώδικας από τον Jeremy Impson. Αυτό έχει χρησιμοποιηθεί στο Pioreactor (ένας βιοαντιδραστήρας με βάση το Pi)—αλλά είναι αρκετά απλός για τους σκοπούς μας.
Πρώτον, ας επεξεργαστείτε το config.txtαρχείο, που βρέθηκε στο /boot Ευρετήριο. Απλά πρέπει να προσθέσουμε μία γραμμή: dtoverlay=pwm-2chan. Εάν θέλαμε να χρησιμοποιήσουμε πινέζες GPIO εκτός των 18 και 19, θα μπορούσαμε να προσθέσουμε μερικά επιπλέον ορίσματα εδώ. Προς το παρόν, ας κρατήσουμε τα πράγματα απλά.
Επανεκκινήστε το Pi σας και εκτελέστε:
lsmod | grep pwm
Αυτή η εντολή παραθέτει όλες τις μονάδες που έχουν φορτωθεί στο κεντρικό τμήμα του λειτουργικού συστήματος, που ονομάζεται πυρήνας. Εδώ, τα φιλτράρουμε για να βρούμε μόνο το υλικό PWM, χρησιμοποιώντας το grep (αυτό είναι "παγκόσμια εκτύπωση κανονικής έκφρασης") εντολή.
Αν pwm_bcm2835 εμφανίζεται ανάμεσα στις αναφερόμενες ενότητες, τότε είμαστε στο σωστό δρόμο. Έχουμε σχεδόν τελειώσει την προετοιμασία! Το μόνο που μένει είναι να εγκαταστήσετε την πραγματική βιβλιοθήκη. Από το τερματικό, εκτελέστε:
sudo pip3 install rpi-hardware-pwm
Τώρα είμαστε έτοιμοι να ξεκινήσουμε.
Κωδικοποίηση του κυκλώματος LED PWM
Καιρός να λερώσουμε τα χέρια μας με λίγο κωδικοποίηση σε Python. Ενεργοποιήστε τον Thonny και αντιγράψτε τον παρακάτω κώδικα. Μετά χτυπήστε Τρέξιμο.
from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()
Όλα καλά, θα δείτε τη λυχνία LED να γίνεται σταδιακά πιο φωτεινή μέχρι το Εγώ η μεταβλητή μετρητή φτάνει το 100. Μετά θα σβήσει. Τι συμβαίνει εδώ? Ας το περπατήσουμε.
Εισάγουμε το σχετικό κομμάτι της βιβλιοθήκης PWM υλικού (μαζί με το χρόνος ενότητα) και δηλώνοντας μια νέα μεταβλητή. Μπορούμε να ορίσουμε το pwm_channel σε 0 ή 1, που αντιστοιχούν αντίστοιχα στις ακίδες GPIO 18 και 19 στο Pi.
ο hz τιμή που μπορούμε να ορίσουμε σε όποια συχνότητα θέλουμε (αν και τελικά περιοριζόμαστε από την ταχύτητα ρολογιού του Pi). Στα 60 Hz, δεν πρέπει να βλέπουμε κανένα τρεμόπαιγμα PWM. Αλλά ίσως είναι καλή ιδέα να ξεκινήσετε με μια πολύ χαμηλή τιμή (όπως το 10) και σταδιακά να αλλάξετε τα πράγματα προς τα πάνω. Κάντε αυτό και θα μπορείτε πραγματικά να δείτε τους παλμούς να συμβαίνουν. Μην παίρνετε το λόγο μας!
Δουλεύουμε τον κύκλο εργασίας μας (Εγώ) από 0 έως 100 χρησιμοποιώντας έναν βρόχο Python for. Αξίζει να σημειωθεί ότι μπορούμε να ορίσουμε το ώρα.ύπνο όρισμα για όσο διάστημα μας αρέσει—καθώς το PWM χειρίζεται σε υλικό, θα εκτελείται στα παρασκήνια, όσο καιρό λέμε στο πρόγραμμα να περιμένει.
Υπάρχουν περισσότερα για να μάθετε με το PWM
Συγχαρητήρια! Έχετε γράψει το πρώτο σας πρόγραμμα PWM. Αλλά, όπως συμβαίνει συχνά με το Raspberry Pi, υπάρχουν πολλά που μπορείτε να κάνετε με αυτό το υλικό, ειδικά αν αυξήσετε το Raspberry Pi σας με το σωστό ΚΑΠΕΛΟ PWM. Επομένως, μην αρκεστείτε σε ένα μικρό LED. Μπορείτε να χρησιμοποιήσετε αυτή τη νέα ισχύ για να ελέγξετε κινητήρες, να κωδικοποιήσετε μηνύματα και να δημιουργήσετε ήχους συνθεσάιζερ. Ένας κόσμος διαμόρφωσης περιμένει!