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

Universal TV Remote - Ardiuino, Υπέρυθρο: 5 Βήματα
Universal TV Remote - Ardiuino, Υπέρυθρο: 5 Βήματα

Βίντεο: Universal TV Remote - Ardiuino, Υπέρυθρο: 5 Βήματα

Βίντεο: Universal TV Remote - Ardiuino, Υπέρυθρο: 5 Βήματα
Βίντεο: Arduino IR TV Remote 2024, Ιούλιος
Anonim
Universal TV Remote - Ardiuino, Υπέρυθρο
Universal TV Remote - Ardiuino, Υπέρυθρο

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

Λίγο παρασκήνιο για το τι με ενέπνευσε να φτιάξω αυτό το τηλεχειριστήριο - εγώ, όπως και οι περισσότεροι από εσάς, χάνω τα τηλεχειριστήρια μου συνεχώς και αυτή η συμφορά είναι αρκετά απογοητευτική, οπότε σκέφτομαι να το λύσω! Έχω χτίσει αυτό το τηλεχειριστήριο και το έχω ενσωματώσει διακριτικά στο δικό μου προσαρμοσμένο πλαίσιο κρεβατιού (είμαι επίσης ξυλουργός) - δεν μπορώ να χάσω το τηλεχειριστήριο αν είναι μέρος του πλαισίου του κρεβατιού μου!

Προμήθειες

Πράγματα που θα χρειαστείτε: -Arduino UNO ή Nano - τα χιλιόμετρα μπορεί να διαφέρουν με άλλες σανίδες

-Χωρίς ψωμί χωρίς κόλλα (ή κολλητή ταινία αν θέλετε να γίνει πιο μόνιμη)

-Jumperwires διαφόρων χρωμάτων και μηκών

-Πρόσθετα κουμπιά (5) (μπορείτε να προσθέσετε περισσότερα κουμπιά, αλλά θα χρειαστεί να χρησιμοποιήσετε ψηφιακές ακίδες, καθώς χρησιμοποιούνται όλες οι αναλογικές ακίδες εκτός από 1 - θα πρέπει να εξετάσετε τη σωστή χρήση αντιστάσεων έλξης, ή τραβήξτε προς τα κάτω αντιστάσεις και καταργήστε τα κουμπιά)

-Αντίσταση 10K Ohm (5) (αν θέλετε περισσότερα κουμπιά, θα χρειαστείτε περισσότερα από αυτά)

-470 Ohm αντίσταση (2)

-Υπέρυθρες λυχνίες LED

-Κόκκινο LED

-Υπέρυθρος αισθητήρας (χρησιμοποίησα τον αριθμό εξαρτήματος VS1838B, μπορείτε να χρησιμοποιήσετε έναν άλλο, απλώς ελέγξτε την εξαγωγή)

(Προαιρετικό) Συγκολλητικό σίδερο, συγκολλητικό, συγκολλητικό Flux.

Βήμα 1: Δημιουργία κυκλώματος:

Χτίζοντας το κύκλωμα
Χτίζοντας το κύκλωμα

1). Πάντα μου αρέσει να ξεκινάω με την τοποθέτηση των εξαρτημάτων μου, καθώς αυτό οδηγεί πάντα τη διάταξη στο breadboard.

-Πατήστε τα κουμπιά

-LEDS: Το κόκκινο LED και το LED LED είναι ενσύρματα ταυτόχρονα, ώστε να μπορείτε να δείτε τι κάνει το IR LED.

-Αισθητήρας

2). Αντιστάσεις

- Οι πέντε αντιστάσεις 10Κ που έχουμε προσαρτήσει στα κουμπιά ονομάζονται αντιστάσεις "έλξης προς τα κάτω". Τραβήξτε προς τα κάτω τις αντιστάσεις βεβαιωθείτε ότι όταν δεν πατήσετε ένα κουμπί, ο αντίστοιχος πείρος Arduino παίρνει 0 Volt (ή τουλάχιστον κοντά σε αυτό). Για περισσότερες πληροφορίες σχετικά με τις αντιστάσεις έλξης προς τα κάτω (ή προς τα πάνω), ακολουθεί ένας αναλυτικός οδηγός:

www.electronics-tutorials.ws/logic/pull-up…

Αυτές οι αντιστάσεις μπορεί να μην είναι απολύτως απαραίτητες, αλλά αν σπρώχνετε "φάντασμα", είναι πιθανό ότι προκαλείται από χωρητική σύζευξη και οι αντιστάσεις τραβήγματος προς τα κάτω το αποτρέπουν.

3). Σύρματα κυκλώματος

4). 5V και καλώδια γείωσης

Χρησιμοποιήστε την παρεχόμενη εικόνα για αναφορά! μην φοβάστε να το αλλάξετε για τις ανάγκες σας όμως!

Βήμα 2: Κωδικός:

#include const int RECV_PIN = 7; // Αισθητήρας IR ανάγνωσης pin int Button1 = A4; // Farthest Left int int Button2 = A3; // 2ο από τα αριστερά int Κουμπί3 = A2; // Κουμπί Middle int4 = A1; // 2ο προς τα δεξιά int Κουμπί5 = A0; // Μακρινότερα προς τα δεξιά int LED = 3; // IR LED & Κόκκινο LED int val = 0; // Αλλαγή τιμής IRsend irsend; IRrecv irrecv (RECV_PIN); decode_results αποτελέσματα?

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, OUTPUT); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // χρήση αναλογικής ανάγνωσης αντί ψηφιακής ανάγνωσης για αποφυγή προβλημάτων χωρητικότητας αιχμαλωσίας. επίσης, βοηθά στην κατάργηση των κουμπιών. // Έχοντας την αναλογική ανάγνωση στο 900, μπορείτε να αλλάξετε χώρο στις τιμές, πράγμα που σημαίνει ότι το σήμα υπέρυθρων θα αποσταλεί ακόμη και αν δεν εφαρμοστεί πλήρης 5V στην ακίδα. // αλλά το 900 είναι αρκετά υψηλό για να μην διαβάζεται λανθασμένα λόγω καθυστέρησης ζεύξης χωρητικότητας (100);} // RGB Strip On & Off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // αλλάζοντας την τιμή στο "i <3" θα αλλάξει ο αριθμός των φορών που επαναλαμβάνεται αμέσως το σήμα. έτσι το "i <2" θα επαναλάβει το σήμα δύο φορές. // ίσως χρειαστεί να παίξετε με αυτόν τον αριθμό εάν η τηλεόρασή σας δεν ανταποκρίνεται, γενικά, 1 ή 3 λειτουργούν περισσότερο, αν όχι, δοκιμάστε περιττούς αριθμούς. // μπορεί επίσης να χρειαστεί να παίξετε με τις τιμές χρονισμού καθυστέρησης εντός του σήματος, για παράδειγμα, για το TV 10 που λειτουργεί, αλλά το 30 όχι. {irsend.sendSony (0xa90, 12); // Ο κωδικός τροφοδοσίας της τηλεόρασης Sony, για την τηλεόρασή μου, ο κωδικός πρέπει να αποσταλεί 3x3, οπότε 3 παλμοί, τρεις ξεχωριστές φορές καθυστέρηση (10). // "καθυστέρηση εντός σήματος" για (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" είναι ο αριθμός bit, διαφορετικά πρωτόκολλα απαιτούν διαφορετικούς αριθμούς bit. Το NEC είναι 32, η Sony είναι 12, μπορείτε να αναζητήσετε τις άλλες καθυστερήσεις (10). για (int i = 0; i 900) {για (int i = 0; i 900) {για (int i = 0; i 900) {για (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Καθυστέρηση έντασης έντασης ισχύος της τηλεόρασης Sony (100);}}} καθυστέρηση (100);} εάν (irrecv.decode (& results)) // το παρακάτω τμήμα του κώδικα σάς επιτρέπει να ερμηνεύετε υπέρυθρα σήματα από διάφορα τηλεχειριστήρια. {Serial.println (results.value, HEX); // θα δημιουργήσει τη διαδικασία "NEC, Sony, κ.λπ." και έναν κωδικό τηλεόρασης "c90, a90, FF02FD" θα πρέπει να προσθέσετε 0x στο μπροστινό μέρος του διακόπτη TV Code (results.decode_type) {case DENON: Serial.println ("DENON"); Διακοπή; θήκη NEC: Serial.println ("NEC"); Διακοπή; θήκη PANASONIC: Serial.println ("PANASONIC"); Διακοπή; θήκη SONY: Serial.println ("SONY"); Διακοπή; θήκη RC5: Serial.println ("RC5"); Διακοπή; θήκη JVC: Serial.println ("JVC"); Διακοπή; θήκη SANYO: Serial.println ("SANYO"); Διακοπή; θήκη MITSUBISHI: Serial.println ("MITSUBISHI"); Διακοπή; θήκη SAMSUNG: Serial.println ("SAMSUNG"); Διακοπή; θήκη LG: Serial.println ("LG"); Διακοπή; θήκη RC6: Serial.println ("RC6"); Διακοπή; θήκη DISH: Serial.println ("DISH"); Διακοπή; θήκη SHARP: Serial.println ("SHARP"); Διακοπή; θήκη ΓΙΑΤΙ: Serial.println ("WHYNTER"); Διακοπή; θήκη AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); Διακοπή; προεπιλογή: περίπτωση ΑΓΝΩΣΤΟ: Serial.println ("ΑΓΝΩΣΤΟ"); διάλειμμα;} irrecv.resume ();}}

Βήμα 3: Κωδικός σε βάθος: Αποστολή σημάτων IR

Θα αναφερθώ σε γραμμές κώδικα με τον αριθμό γραμμής τους - για να ακολουθήσετε, χρησιμοποιήστε αυτόν τον σύνδεσμο:

pastebin.com/AQr0fBLg

Πρώτον, πρέπει να συμπεριλάβουμε τη IR Remote Library by z3t0.

Ακολουθεί σύνδεσμος προς τη βιβλιοθήκη:

github.com/z3t0/Arduino-IRremote

Εάν χρειάζεστε έναν οδηγό για το πώς να κατεβάσετε σωστά μια βιβλιοθήκη και να την εγκαταστήσετε στο IDE:

www.arduino.cc/en/guide/libraries

Η γραμμή 1 περιλαμβάνει τη βιβλιοθήκη.

Στη συνέχεια, πρέπει να δηλώσουμε μερικές μεταβλητές, οι γραμμές 2-12 το κάνουν αυτό.

Χρησιμοποιούμε το "κόστος int" για να ορίσουμε μεταβλητές που δεν θα αλλάξουν, όλες εκτός από μία εμπίπτουν σε αυτήν την κατηγορία.

Χρησιμοποιούμε το "int" για να ορίσουμε μεταβλητές που θα αλλάξουν.

Πρέπει να χρησιμοποιήσουμε έναν πείρο με παλμό με διαμόρφωση (PWM) για τον πείρο LED - κάθε πείρος που έχει "~" δίπλα του αρκεί, στον κωδικό μου - χρησιμοποιούμε τον ψηφιακό ακροδέκτη 3.

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

Παρατηρήστε ότι ορίζουμε τις εισόδους και τις εξόδους μας (15-20), ενεργοποιούμε τη σειριακή οθόνη (21), ενεργοποιούμε τον αισθητήρα IR (22) και λέμε στο Arduino να αναβοσβήνει την ενσωματωμένη λυχνία LED κάθε φορά που λαμβάνουμε σήμα στον αισθητήρα (23).

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

Στη γραμμή 25, χρησιμοποιούμε μια δήλωση if, η οποία λέει στο Arduino "αναζητήστε αυτά τα συγκεκριμένα κριτήρια, εάν πληρούνται αυτά τα κριτήρια, κάντε αυτό το συγκεκριμένο πράγμα". Σε αυτήν την περίπτωση, τα κριτήρια είναι analogRead (Button1)> 900, ή με άλλα λόγια - "Arduino, Κοιτάξτε το κουμπί1, το οποίο ορίσαμε ως pin A4 νωρίτερα, εάν το αναλογικό σήμα που λαμβάνεται είναι μεγαλύτερο από 900, προχωρήστε στις επόμενες οδηγίες μας, αν όχι, προχωρήστε ». Υπάρχει κάτι για αποσυσκευασία εδώ, οπότε ας βουτήξουμε: ένα αναλογικό σήμα στο Arduino είναι μια τιμή ίση ή μικρότερη από 5V, με 5V να ισούται με 1023, και 0V να ισούται με 0. Κάθε δεδομένη τάση μεταξύ 0 και 5V μπορεί να οριστεί από έναν αριθμό, και με λίγα μαθηματικά, μπορούμε να καταλάβουμε αυτόν τον αριθμό, ή αντίστροφα, μια τάση. Διαιρέστε το 1024 (συμπεριλαμβάνουμε το 0 ως μονάδα) με το 5, που μας δίνει 204,8. Για παράδειγμα, χρησιμοποιούμε τον αριθμό 900, για να το μετατρέψουμε σε τάση, απλά διαιρούμε το 900 επί 204,8, δίνοντάς μας ~ 4,4V. Λέμε στο Arduino να αναζητήσει τάση μεγαλύτερη από 4 4,4 βολτ, και αν είναι, κάντε την επόμενη οδηγία μας.

Μιλώντας για τις επόμενες οδηγίες (γραμμή 25), βλέπουμε το irsend.sendNEC (0xFF02FD, 32). Αυτό λέει "Arduino, στείλτε έναν διαμορφωμένο παλμό που ακολουθεί το πρωτόκολλο NEC, συγκεκριμένα το σήμα FF02FD και βεβαιωθείτε ότι έχει μήκος 32 bits". Αυτό θα κάνει το LED LED να τρεμοπαίζει με τρόπο που να καταλαβαίνουν οι άλλες συσκευές. Σκεφτείτε το λίγο σαν τον Κώδικα Μορς, αλλά μόνο με αόρατο φως! Υπάρχουν πολλά διαφορετικά πρωτόκολλα, το καθένα με εκατοντάδες αν όχι χιλιάδες μεμονωμένα σήματα και το καθένα με τον συγκεκριμένο αριθμό bit - η συσκευή μας θα μπορεί να αναγνωρίσει ένα μεγάλο αριθμό αυτών των σημάτων, αλλά θα καταδυθούμε αργότερα!

Στη γραμμή 28, έχουμε την πρώτη μας καθυστέρηση - εδώ είναι για να αποτρέψουμε ακούσια επαναλαμβανόμενα σήματα, μόλις πατηθεί το κουμπί και αποσταλεί το σήμα IR, έχουμε 100 χιλιοστά του δευτερολέπτου για να βγάλουμε το δάχτυλό μας από το κουμπί. αυτό δεν ακούγεται πολύς χρόνος, αλλά στην πράξη, φαίνεται να λειτουργεί καλά. Η λειτουργία καθυστέρησης λέει στο Arduino "μην κάνετε τίποτα για Χ χιλιοστά του δευτερολέπτου" και για αναφορά, είναι 1000 χιλιοστά του δευτερολέπτου σε ένα δευτερόλεπτο.

Προχωρώντας στο επόμενο κουμπί μας στη γραμμή 29, κουμπί 5 (είχα αρχικά 4 κουμπιά σε αυτό το τηλεχειριστήριο, πρόσθεσα ένα πέμπτο, γι 'αυτό είμαστε εκτός λειτουργίας). Αυτό, στο πνεύμα, είναι το ίδιο πράγμα με το κουμπί 1, αλλά με μερικές βασικές διαφορές. Η πρώτη διαφορά που θα δείτε είναι μια δήλωση for - αυτός είναι ουσιαστικά ένας άλλος βρόχος - ένας βρόχος με έναν άλλο μεγαλύτερο βρόχο, loopception. Συγκεκριμένα έχουμε "for (int i = 0; i <3; i ++)", διαβάστε αυτό ως "Arduino, ξεκινάμε από το 0, επαναλαμβάνουμε τις ακόλουθες οδηγίες μέχρι να φτάσουμε σε 3 φορές". Η συνάρτηση for χρησιμοποιείται επειδή πολλές συσκευές είναι προγραμματισμένες να αναζητούν επαναλαμβανόμενο σήμα, και στην περίπτωσή μας εδώ, 3 φορές. Μπορείτε απλά να αλλάξετε τον αριθμό 3 σε διαφορετικό αριθμό εάν η συσκευή σας ζητήσει διαφορετικό πρόγραμμα επανάληψης. Μια άλλη βασική διαφορά με το κουμπί 5 είναι ότι επαναλαμβάνεται ξανά, 3 φορές ή 3x3. Με άλλα λόγια, στέλνουμε το σήμα 3 φορές, περιμένουμε 10 χιλιοστά του δευτερολέπτου, το στέλνουμε ξανά 3 φορές, περιμένουμε άλλα 10 χιλιοστά του δευτερολέπτου και στη συνέχεια το στέλνουμε ξανά 3 φορές. Αυτός ο τύπος επικοινωνίας είναι κοινός για την ενεργοποίηση και απενεργοποίηση των συσκευών και μπορεί να είναι ακριβώς αυτό που ζητά η τηλεόραση ή η συσκευή σας - το κλειδί για αυτό είναι να παίξετε με όλες τις μεταβλητές μέχρι να έχετε το επιθυμητό αποτέλεσμα. Αλλάξτε την τιμή σύντομης καθυστέρησης, αλλάξτε την τιμή επανάληψης, στείλτε 6 παρτίδες αντί για 3 κ.λπ. Οι συσκευές προγραμματίζονται με αυθαίρετους κανόνες σήματος σκόπιμα, φανταστείτε αν το τηλεχειριστήριο της τηλεόρασής σας έστειλε το ίδιο σήμα τύπου με τη γραμμή ήχου σας. κάθε φορά που αλλάζετε κανάλι στην τηλεόρασή σας, η γραμμή ήχου σας κλείνει - γι 'αυτό υπάρχουν διαφορετικοί κανόνες σήματος.

Τα επόμενα τρία κουμπιά είναι προγραμματισμένα με τις ίδιες αρχές, τουλάχιστον εν μέρει, όπως περιγράφονται παραπάνω - έτσι μπορούμε να παραλείψουμε μέχρι τη γραμμή 55.

Βήμα 4: Κωδικός σε βάθος: Λήψη σημάτων IR

Κωδικός σε βάθος: Λήψη σημάτων IR
Κωδικός σε βάθος: Λήψη σημάτων IR

Στη γραμμή 55, ξεκινάμε τον προγραμματισμό του Arduino ώστε να ερμηνεύει σήματα IR που αποστέλλονται από άλλα τηλεχειριστήρια - αυτό είναι απαραίτητο για να μπορέσετε να καταλάβετε τα πρωτόκολλα και τα σήματα που χρησιμοποιούν τα τηλεχειριστήριά σας. Η πρώτη γραμμή κώδικα στη γραμμή 55 είναι εάν (uncrec.decode (& results) διαβάστε αυτό ως "Arduino, αναζητήστε έναν κωδικό IR, αν βρείτε έναν, επιστρέψτε μια πραγματική τιμή, αν δεν βρέθηκε τίποτα, επιστρέψτε ψευδής. Όταν είναι αληθής, καταγράψτε τις πληροφορίες σε "αποτελέσματα" ".

Προχωρώντας στη γραμμή 56, έχουμε το Serial.println (results.value, HEX) που λέει "Ardunio, εκτύπωσε τα αποτελέσματα στη σειριακή οθόνη σε μορφή HEX". Το Hex, που σημαίνει δεκαεξαδικό, είναι ένας τρόπος με τον οποίο μπορούμε να συντομεύσουμε μια δυαδική συμβολοσειρά (μόλις 0 και 1) σε κάτι λίγο πιο εύκολο να πληκτρολογήσουμε. Για παράδειγμα, το 101010010000 είναι "a90", ο κωδικός που χρησιμοποιείται για την απενεργοποίηση και την ενεργοποίηση της τηλεόρασής μου και το 111111110000001011111101 είναι 0xFF02FD, το οποίο ελέγχει τη λωρίδα RGB μου. Μπορείτε να χρησιμοποιήσετε το παραπάνω γράφημα για να μετατρέψετε δυαδικό σε εξάγωνο και αντίστροφα, ή μπορείτε να χρησιμοποιήσετε τον ακόλουθο σύνδεσμο:

www.rapidtables.com/convert/number/hex-to-…

Στη γραμμή 57, έχουμε μια νέα λειτουργία, που ονομάζεται θήκη διακόπτη.

Ουσιαστικά, μια περίπτωση μεταγωγής μας επιτρέπει να καθορίσουμε διαφορετικές οδηγίες με βάση τα αποτελέσματα μιας δεδομένης μεταβλητής (περίπτωση). Το break βγαίνει από την εντολή switch και χρησιμοποιείται στο τέλος κάθε εντολής.

Χρησιμοποιούμε τη θήκη διακόπτη για να αλλάξουμε τον τρόπο εκτύπωσης στη σειριακή οθόνη με βάση τα πρωτόκολλα που αισθάνεται το Arduino μας από τα διάφορα τηλεχειριστήρια.

Βήμα 5: Συμπέρασμα

Εάν έχετε κάποια ερώτηση - μη διστάσετε να επικοινωνήσετε μαζί μου εδώ! Είμαι στην ευχάριστη θέση να προσπαθήσω να σας βοηθήσω όσο καλύτερα μπορώ.

Ελπίζω να μάθατε κάτι που μπορείτε να χρησιμοποιήσετε για να κάνετε τη ζωή σας λίγο καλύτερη!

-RB

Συνιστάται: