- Γνωριμία με το nRF24L01 RF Module
- Διασύνδεση nRF24L01 με τον Arduino
- Πλευρά δέκτη: Συνδέσεις μονάδας Arduino Uno nRF24L01
- Πλευρά πομπού: Συνδέσεις μονάδας Arduino Nano nRF24L01
- Εργασία με τη μονάδα ασύρματου πομποδέκτη nRF24L01 +
- Προγραμματισμός nRF24L01 για Arduino
- Έλεγχος του Servo Motor χρησιμοποιώντας το nRF24L01 ασύρματα
Ενώ το Internet of Things (IoT), το Industry 4.0, η επικοινωνία μεταξύ μηχανών και μηχανών κ.λπ. γίνονται όλο και πιο δημοφιλή, η ανάγκη ασύρματης επικοινωνίας έχει καθιερωθεί, με περισσότερα μηχανήματα / συσκευές να μιλούν μεταξύ τους στο cloud. Οι σχεδιαστές χρησιμοποιούν πολλά ασύρματα συστήματα επικοινωνίας, όπως Bluetooth Low Energy (BLE 4.0), Zigbee, ESP43 Wi-Fi Modules, 433MHz RF Modules, Lora, nRF κ.λπ. και η επιλογή του μέσου εξαρτάται από τον τύπο της εφαρμογής στην οποία χρησιμοποιείται.
Μεταξύ όλων, ένα δημοφιλές ασύρματο μέσο για τοπική επικοινωνία δικτύου είναι το nRF24L01. Αυτές οι μονάδες λειτουργούν σε 2,4GHz (ζώνη ISM) με ρυθμό baud από 250Kbps έως 2Mbps, το οποίο είναι νόμιμο σε πολλές χώρες και μπορεί να χρησιμοποιηθεί σε βιομηχανικές και ιατρικές εφαρμογές. Υποστηρίζεται επίσης ότι με τις κατάλληλες κεραίες αυτές οι μονάδες μπορούν να μεταδίδουν και να δέχονται απόσταση μεταξύ τους 100 μέτρα. Ενδιαφέρον σωστά !! Έτσι, σε αυτό το σεμινάριο θα μάθουμε περισσότερα για αυτές τις μονάδες nRF24l01 και πώς να το συνδέσουμε με μια πλατφόρμα μικροελεγκτή όπως το Arduino. Θα μοιραστούμε επίσης μερικές λύσεις για τα προβλήματα που αντιμετωπίζονται συνήθως κατά τη χρήση αυτής της ενότητας.
Γνωριμία με το nRF24L01 RF Module
Οι μονάδες nRF24L01 είναι μονάδες πομποδέκτη, που σημαίνει ότι κάθε λειτουργική μονάδα μπορεί να στέλνει και να λαμβάνει δεδομένα, αλλά δεδομένου ότι είναι ημι-αμφίδρομη μπορεί είτε να στείλει είτε να λάβει δεδομένα κάθε φορά. Η μονάδα διαθέτει το γενικό ICRR24L01 από Nordic ημιαγωγούς που είναι υπεύθυνος για τη μετάδοση και τη λήψη δεδομένων. Το IC επικοινωνεί χρησιμοποιώντας το πρωτόκολλο SPI και ως εκ τούτου μπορεί να συνδεθεί εύκολα με οποιονδήποτε μικροελεγκτή. Γίνεται πολύ πιο εύκολο με το Arduino, καθώς οι βιβλιοθήκες είναι άμεσα διαθέσιμες. Τα pinouts μιας τυπικής μονάδας nRF24L01 παρουσιάζονται παρακάτω
Η μονάδα έχει τάση λειτουργίας από 1,9V έως 3,6V (συνήθως 3,3V) και καταναλώνει πολύ λιγότερο ρεύμα μόνο 12mA κατά τη διάρκεια της κανονικής λειτουργίας, γεγονός που το καθιστά αποδοτικό στην μπαταρία και ως εκ τούτου μπορεί ακόμη και να λειτουργήσει σε κελιά νομισμάτων. Παρόλο που η τάση λειτουργίας είναι 3,3V, οι περισσότερες ακίδες είναι ανθεκτικές στα 5V και ως εκ τούτου μπορούν να συνδεθούν απευθείας με μικροελεγκτές 5V όπως το Arduino. Ένα άλλο πλεονέκτημα της χρήσης αυτών των ενοτήτων είναι ότι, κάθε ενότητα έχει 6 αγωγούς. Δηλαδή, κάθε ενότητα μπορεί να επικοινωνήσει με 6 άλλες ενότητες για μετάδοση ή λήψη δεδομένων. Αυτό καθιστά τη μονάδα κατάλληλη για τη δημιουργία δικτύων αστεριού ή πλέγματος σε εφαρμογές IoT. Επίσης, έχουν ένα ευρύ φάσμα διευθύνσεων 125 μοναδικών αναγνωριστικών, επομένως σε μια κλειστή περιοχή μπορούμε να χρησιμοποιήσουμε 125 από αυτές τις ενότητες χωρίς να παρεμβαίνουμε.
Διασύνδεση nRF24L01 με τον Arduino
Σε αυτό το σεμινάριο θα μάθουμε πώς να διασυνδέουμε το nRF24L01 με το Arduino ελέγχοντας τον σερβο κινητήρα που είναι συνδεδεμένος με ένα Arduino μεταβάλλοντας το ποτενσιόμετρο στο άλλο Arduino. Για λόγους απλότητας χρησιμοποιήσαμε το ένα nRF24L01 module ως πομπό και το άλλο είναι δέκτη, αλλά κάθε module μπορεί να προγραμματιστεί για την αποστολή και λήψη δεδομένων ξεχωριστά.
Το διάγραμμα κυκλώματος για τη σύνδεση της μονάδας nRF24L01 με το Arduino φαίνεται παρακάτω. Για ποικιλία, έχω χρησιμοποιήσει το UNO για την πλευρά του δέκτη και το Nano για την πλευρά του πομπού. Αλλά η λογική για σύνδεση παραμένει η ίδια για άλλους πίνακες Arduino όπως mini, mega επίσης.
Πλευρά δέκτη: Συνδέσεις μονάδας Arduino Uno nRF24L01
Όπως ειπώθηκε νωρίτερα, το nRF24L01 επικοινωνεί με τη βοήθεια του πρωτοκόλλου SPI. Στο Arduino Nano και το UNO οι ακίδες 11, 12 και 13 χρησιμοποιούνται για επικοινωνία SPI. Ως εκ τούτου συνδέουμε τους ακροδέκτες MOSI, MISO και SCK από το nRF στις ακίδες 11, 12 και 13 αντίστοιχα. Οι καρφίτσες CE και CS είναι διαμορφώσιμες από τον χρήστη, έχω χρησιμοποιήσει τους ακροδέκτες 7 και 8 εδώ, αλλά μπορείτε να χρησιμοποιήσετε οποιαδήποτε καρφίτσα αλλάζοντας το πρόγραμμα. Η μονάδα nRF τροφοδοτείται από τον πείρο 3.3V στο Arduino, ο οποίος στις περισσότερες περιπτώσεις θα λειτουργήσει. Εάν όχι, μπορείτε να δοκιμάσετε ένα ξεχωριστό τροφοδοτικό. Εκτός από τη διασύνδεση του nRF, έχω συνδέσει επίσης έναν σερβοκινητήρα στον ακροδέκτη 7 και τον τροφοδότησα μέσω του ακροδέκτη 5V στο Arduino. Ομοίως το κύκλωμα του πομπού φαίνεται παρακάτω.
Πλευρά πομπού: Συνδέσεις μονάδας Arduino Nano nRF24L01
Οι συνδέσεις για τον πομπό είναι επίσης οι ίδιες, επιπλέον έχω χρησιμοποιήσει ένα ποτενσιόμετρο συνδεδεμένο στον πείρο γείωσης 5V του Arduino. Η αναλογική τάση εξόδου που θα κυμαίνεται από 0-5V συνδέεται στον ακροδέκτη A7 του Nano. Και οι δύο πίνακες τροφοδοτούνται μέσω της θύρας USB.
Εργασία με τη μονάδα ασύρματου πομποδέκτη nRF24L01 +
Ωστόσο, για να κάνουμε το nRF24L01 μας να λειτουργεί χωρίς θόρυβο, ίσως θέλουμε να λάβουμε υπόψη τα ακόλουθα πράγματα. Δουλεύω σε αυτό το nRF24L01 + για πολύ καιρό και έμαθα τα ακόλουθα σημεία που μπορούν να σας βοηθήσουν να χτυπήσετε σε έναν τοίχο. Μπορείτε να τα δοκιμάσετε όταν οι λειτουργικές μονάδες δεν λειτουργούσαν κανονικά.
1. Οι περισσότερες από τις μονάδες nRF24L01 + στην αγορά είναι ψεύτικες. Τα φθηνά που μπορούμε να βρούμε στο Ebay και το Amazon είναι τα χειρότερα (Μην ανησυχείτε, με λίγα τσιμπήματα μπορούμε να τα κάνουμε να λειτουργούν)
2. Το κύριο πρόβλημα είναι το τροφοδοτικό και όχι ο κωδικός σας. Οι περισσότεροι από τους διαδικτυακούς κωδικούς θα λειτουργούν σωστά, εγώ ο ίδιος έχω έναν κωδικό εργασίας τον οποίο έχω δοκιμάσει προσωπικά.
3. Δώστε προσοχή γιατί οι μονάδες που εκτυπώνονται ως NRF24L01 + είναι στην πραγματικότητα Si24Ri (Ναι κινεζικό προϊόν).
4. Ο κλώνος και οι ψεύτικες μονάδες θα καταναλώνουν περισσότερη ισχύ, επομένως μην αναπτύσσετε το κύκλωμα ισχύος σας με βάση το φύλλο δεδομένων nRF24L01 +, επειδή το Si24Ri θα έχει υψηλή κατανάλωση ρεύματος περίπου 250mA.
5. Προσοχή στους κυματισμούς τάσης και τις τρέχουσες υπερτάσεις, αυτές οι μονάδες είναι πολύ ευαίσθητες και μπορεί εύκολα να καούν. (;-(μέχρι τώρα 2 ενότητες)
6. Η προσθήκη ζεύγους πυκνωτών (10uF και 0.1uF) σε Vcc και Gnd της μονάδας βοηθά στο να κάνετε την τροφοδοσία σας καθαρή και αυτό λειτουργεί για τις περισσότερες από τις μονάδες.
Ακόμα, αν έχετε προβλήματα αναφέρετε στην ενότητα σχολίων ή διαβάστε αυτό, ή υποβάλετε τις ερωτήσεις σας στο φόρουμ μας.
Ελέγξτε επίσης το διαπερατό έργο μας για τη δημιουργία μιας αίθουσας συνομιλίας χρησιμοποιώντας το nRF24L01
Προγραμματισμός nRF24L01 για Arduino
Ήταν πολύ εύκολο να χρησιμοποιήσετε αυτές τις ενότητες με το Arduino, λόγω της εύκολα διαθέσιμης βιβλιοθήκης που δημιουργήθηκε από το maniacbug στο GitHub. Κάντε κλικ στο σύνδεσμο για να κατεβάσετε τη βιβλιοθήκη ως φάκελο ZIP και να την προσθέσετε στο Arduino IDE σας χρησιμοποιώντας το Σκίτσο -> Συμπερίληψη βιβλιοθήκης -> Προσθήκη.ZIP βιβλιοθήκης επιλογή. Μετά την προσθήκη της βιβλιοθήκης μπορούμε να ξεκινήσουμε τον προγραμματισμό για το έργο. Πρέπει να γράψουμε δύο προγράμματα, το ένα για την πλευρά του πομπού και το άλλο για την πλευρά του δέκτη. Ωστόσο, όπως είπα νωρίτερα, κάθε μονάδα μπορεί να λειτουργήσει τόσο ως πομπός όσο και ως δέκτης. Και τα δύο προγράμματα δίνονται στο τέλος αυτής της σελίδας, στον κώδικα του πομπού η επιλογή δέκτη θα σχολιάζεται και στο πρόγραμμα δέκτη ο κωδικός του πομπού θα σχολιάζεται. Μπορείτε να το χρησιμοποιήσετε εάν δοκιμάζετε ένα έργο στο οποίο η ενότητα πρέπει να λειτουργεί και ως τα δύο. Η λειτουργία του προγράμματος εξηγείται παρακάτω.
Όπως όλα τα προγράμματα ξεκινάμε συμπεριλαμβάνοντας τα αρχεία κεφαλίδας. Δεδομένου ότι το nRF χρησιμοποιεί πρωτόκολλο SPI, έχουμε συμπεριλάβει την κεφαλίδα SPI και επίσης τη βιβλιοθήκη που μόλις κατεβάσαμε. Η σερβο βιβλιοθήκη χρησιμοποιείται για τον έλεγχο του σερβο κινητήρα.
#περιλαμβάνω
Η επόμενη γραμμή είναι η σημαντική γραμμή όπου καθοδηγούμε τη βιβλιοθήκη σχετικά με τις καρφίτσες CE και CS. Στο διάγραμμα κυκλώματος έχουμε συνδέσει το CE στον ακροδέκτη 7 και το CS στον ακροδέκτη 8 οπότε θέτουμε τη γραμμή ως
RF24 myRadio (7, 8);
Όλες οι μεταβλητές που σχετίζονται με τη βιβλιοθήκη RF πρέπει να δηλώνονται ως σύνθετη δομή μεταβλητών. Σε αυτό το πρόγραμμα η μεταβλητή msg χρησιμοποιείται για την αποστολή και λήψη δεδομένων από τη μονάδα RF.
πακέτο struct { int msg; }; πακέτο typedef struct πακέτο? Δεδομένα πακέτου;
Κάθε μονάδα RF έχει μια μοναδική διεύθυνση χρησιμοποιώντας την οποία μπορεί να στείλει δεδομένα στην αντίστοιχη συσκευή. Δεδομένου ότι έχουμε μόνο ένα ζευγάρι εδώ, θέτουμε τη διεύθυνση στο μηδέν τόσο στον πομπό όσο και στον δέκτη, αλλά εάν έχετε πολλαπλή ενότητα μπορείτε να ορίσετε το αναγνωριστικό σε οποιαδήποτε μοναδική 6ψήφια συμβολοσειρά.
διευθύνσεις byte = {"0"};
Στη συνέχεια, μέσα στη λειτουργία κενής ρύθμισης αρχικοποιούμε τη μονάδα RF και ρυθμίζουμε να λειτουργούμε με 115 ζώνες που είναι απαλλαγμένες από θόρυβο και επίσης ρυθμίζουμε τη μονάδα να λειτουργεί σε λειτουργία ελάχιστης κατανάλωσης ισχύος με ελάχιστη ταχύτητα 250Kbps.
άκυρη ρύθμιση () { Serial.begin (9600); myRadio.begin (); myRadio.setChannel (115); // 115 ζώνη πάνω από το WIFI σηματοδοτεί το myRadio.setPALevel (RF24_PA_MIN); // Ισχύς MIN χαμηλής οργάνωσης myRadio.setDataRate (RF24_250KBPS); // Ελάχιστη ταχύτητα myservo.attach (6); Serial.print ("Ρύθμιση αρχικοποιήθηκε"); καθυστέρηση (500) }
Η συνάρτηση void WriteData () γράφει τα δεδομένα που μεταβιβάζονται σε αυτήν. Όπως ειπώθηκε προηγουμένως, το nRF έχει 6 διαφορετικούς σωλήνες στους οποίους μπορούμε να διαβάζουμε ή να γράφουμε δεδομένα, εδώ χρησιμοποιήσαμε το 0xF0F0F0F066 ως διεύθυνση για την εγγραφή δεδομένων. Από την πλευρά του δέκτη πρέπει να χρησιμοποιήσουμε την ίδια διεύθυνση στο ReadData () για να λάβουμε τα δεδομένα που γράφτηκαν.
άκυρο WriteData () { myRadio.stopListening (); // Διακοπή λήψης και έναρξη transminitng myRadio.openWritingPipe (0xF0F0F0F066); // Αποστολή δεδομένων σε αυτήν τη διεύθυνση 40-bit myRadio.write (& data, sizeof (data)); καθυστέρηση (300) }
Η συνάρτηση void WriteData () διαβάζει τα δεδομένα και τα βάζει σε μια μεταβλητή. Και πάλι από 6 διαφορετικούς σωλήνες χρησιμοποιώντας τους οποίους μπορούμε να διαβάσουμε ή να γράψουμε δεδομένα εδώ, χρησιμοποιήσαμε το 0xF0F0F0F0AA ως διεύθυνση για την ανάγνωση δεδομένων. Αυτό σημαίνει ότι ο πομπός της άλλης μονάδας έχει γράψει κάτι σε αυτήν τη διεύθυνση και ως εκ τούτου το διαβάζουμε από το ίδιο.
άκυρο ReadData () { myRadio.openReadingPipe (1, 0xF0F0F0F0AA); // Ποιος σωλήνας για ανάγνωση, 40 bit Διεύθυνση myRadio.startListening (); // Διακοπή μετάδοσης και έναρξη επανεξέτασης εάν (myRadio.available ()) { while (myRadio.available ()) { myRadio.read (& data, sizeof (data)); } Serial.println (data.text); } }
Εκτός από αυτές τις γραμμές, οι άλλες γραμμές του προγράμματος χρησιμοποιούνται για την ανάγνωση του POT και τη μετατροπή του σε 0 έως 180 χρησιμοποιώντας τη λειτουργία χάρτη και την αποστολή της στη μονάδα δέκτη όπου ελέγχουμε το σερβο ανάλογα. Δεν τους εξήγησα γραμμικά, αφού το μάθαμε ήδη στο μάθημα Servo Interfacing.
Έλεγχος του Servo Motor χρησιμοποιώντας το nRF24L01 ασύρματα
Μόλις είστε έτοιμοι με το πρόγραμμα, ανεβάστε τον κωδικό πομπού και δέκτη (δίνεται παρακάτω) στις αντίστοιχες πλακέτες Arduino και ενεργοποιήστε τους με θύρα USB. Μπορείτε επίσης να ξεκινήσετε τη σειριακή οθόνη και των δύο πλακέτων για να ελέγξετε ποια τιμή μεταδίδεται και τι λαμβάνεται. Εάν όλα λειτουργούν όπως αναμένεται όταν γυρίζετε το κουμπί POT στην πλευρά του πομπού, το σερβο στην άλλη πλευρά θα πρέπει επίσης να περιστρέφεται ανάλογα.
Η πλήρης εργασία του έργου φαίνεται στο παρακάτω βίντεο. Είναι πολύ φυσιολογικό να μην λειτουργούν αυτές οι μονάδες στην πρώτη δοκιμή. Εάν έχετε αντιμετωπίσει κάποιο πρόβλημα, ελέγξτε ξανά τον κωδικό και την καλωδίωση και δοκιμάστε τις παραπάνω οδηγίες σχετικά με τη λήψη προβλημάτων. Εάν τίποτα δεν λειτουργεί δημοσιεύστε το πρόβλημά σας στα φόρουμ ή στην ενότητα σχολίων και θα προσπαθήσω να τα επιλύσω.