Hallo ich möchte mir eine Schaltbox Bauen, welche mir eine Relaiskarte Schaltet beim Empfangen der Tastenbetätigung einer Samsung-Led Tv Fernbedienung. Grundlagen der Arduino Programmierung beherrsche ich sowohl über basecom und arduini. Welchen IR-Empfänger benötigt man bei Samsung? 38 MHz? und wie kann ich die einzelnen Codes der PWM auslesen und einem Schaltbefehl zuordnen? Gruß Ralle
Max Schmidt schrieb: > Welchen IR-Empfänger benötigt man bei Samsung? 38 MHz? MHz? eine elektromagnetische Welle im MHz Bereich ist aber schon Funk und kein Licht. Du meinst eher kHz. > und wie kann ich > die einzelnen Codes der PWM auslesen und einem Schaltbefehl zuordnen? PWM? Da ist keine PWM im Spiel. IRMP
ok dann bin ich schonmal ein wenig schlauer,was die grundlage des sendens und empfangen betrifft. welchen IR-Empfänger benötige ich für herrkömliche samsung fernbedienungen? es werden 2 varianten (38 und 36khz) aufgeführt samsung32 und samsung. und wieder zu meiner oben genannten fragestellung. ie bekomme ich das signal bzw die unterschiedlichen schaltbefehle mit meinem arduinoboard übersetzt, so dass ich diese verwenden kann?
Für die verschiedenen Sender/Empfänger gibt es fertige Lösungen, zu den verschiedenen Frequenzen (KHz). Wie schon gesagt, das ganze hat nichts mit PWM zutun. Die Fernsteuerung folgt einem relativ gut dokumentierten Protokoll. Findest Du bestimmt in der Wikipedia oder auch sonst im Internet. Darüber hinaus gibt es auch fertige Bibliotheken für die Zappelei.
Ok wir drehen uns auf der stelle =) punkt 1 ist die Hardware. Auswahl des TSOP zum Beispiel. Unterschied zwischen Samsung 32 und Samsung. Bei der besagten Fernbedienung handelt es sich um eine zu einem Ue32C6700 gehörigen Fernbedienung. Codes findet man viele aber wie werden diese angewendet? wird in Arduino einfach auf diese verwiesen und sie werden dann im Hintergrund ausgeführt? Meine Fähigkeiten begrenzen sich momentan darauf,dass ich ein und Ausgange zuweisen und beschalten kann. Wie ich eine Sendebefehl als schaltbefehl umgesetzt bekomme ist mir aktuell völlig unklar.
Hallo Max Schmidt, ich probier dir das mal genau zu erklären. Senden: >>> Eine Infrarot LED hat eine bestimmte Lichtfarbe (Wellenlänge die sie aussendet), sagen wir einfach mal 850 Nanometer. Diese LED lasse ich nun ständig aus-, und angehen. Das kann der Atmel relativ gut. Macht man eigentlich mit PWM, kann man aber auch einfach mit Arduino "digitalWrite(PIN, HIGH)" und "digitalWrite(PIN, LOW)" machen. Damit zappelt die IR-LED im (sagen wir mal) hunderstel Sekundentakt. <<< Empfangen: >>> Ein (fertig zu kaufender) Empfänger hat erstmal eine Schicht die nur Licht einer bestimmen Wellenlänge durchlässt. Wir kaufen uns also einen der nur 850 Nanometer sieht. Somit ist dem schonmal egal wenn du ihn mit der Taschenlampe anleuchtest. Das nächste was der Empfänger macht ist dass er mittels eines Filter dafür sorgt dass er nur IRLEDs sieht, die in einem bestimmten Muster an, und ausgehen. Unser Empfänger also ist so gebaut dass er nur eine IRLED sieht die im hunderstel Sekundentakt blinkt. Wenn er diese sieht, purzelt hinten ein HIGH raus. Sieht er keine IRLED die genau in diesem Muster zappelt so purzelt ein LOW raus. <<< Soweit alles verstanden ? Aktuell zappelt also unsere IRLED und der Empfänger gibt immer HIGH, denn er sieht sie ja. Zuletzt fehlt also noch die Frage: Wie übertrage ich nun Daten über diese Strecke ? Stell dir einfach vor wir übertragen unsere Daten im Sekundentakt. Ist also in Sekunde 0 die IRLED gerade zu sehen, so hat der Empfänger ein HIGH, also eine 1. In Sekunde 1 schaltet der Arduino die LED ganz aus, deshalb gibt der Empfänger LOW (0) In Sekunde 2 schaltet der Arduino die LED (wieder genau im richtigen Takt) wieder an, deshalb nochmal ein HIGH (1). In Sekunde 3 schaltet unser Arduino die IRLED wieder ab. Der Empfänger sieht sie nicht mehr, geht also auf LOW (0). Was fällt auf? Wir haben gerade den Wert 1-0-1-0 übertragen. Und genauso geht der Datenaustausch über Infrarot. Natürlich ist unser ausgedachtes Protokoll (jede Sekunde schauen wir ob die Led an oder aus ist, und haben entsprechend eine 1 oder 0) ziemlich nutzlos weil elend langsam. Aber es würde funktionieren. Bessere Protokolle haben sich kluge Menschen schon ausgedacht: http://de.wikipedia.org/wiki/Manchester-Code http://de.wikipedia.org/wiki/Non_Return_to_Zero Und dann gibts da noch exakt die Protokolle die tatsächlich gerne bei Fernbedienungen verwendet werden: http://www.mikrocontroller.net/articles/IRMP Und jetzt bin ich sogar noch so frei und zeige dir einen Arduino Code den ich mal für eine Lichtschranke geschrieben habe. Da gibts eine IRLED, und einen dazu passenden (Wellenlänge + Frequenz) IR-Empfänger. Da die Wellenlänge der LED (ich glaube 850nm) zu der spezifiezierten Wellenlänge des Empfänger passte, brauchte ich mich nur noch drum zu kümmern die IRLED mit dem Arduino immer im richtigen Takt (38 kiloHertz) an-, und auszuschalten. Sobald ich diese Frequenz richtig habe kann der Empfänger meine LED sehen. Erschreck übrigens nicht, denn um diesen Takt richtig hinzubekommen muss man aus der Arduinowelt ausbrechen und direkt dem Timer des Atmel verwenden. Dieser ist quasi automatisch mit dem PIN der IRLED verbunden. Der Code ist für Sender und Empfänger gleich.
1 | void setup() |
2 | {
|
3 | // Der Arduino Takt ist 16 MHz, also 16000000 Hertz |
4 | // Also eine 0.0000000625 Sekunde |
5 | // Das entspricht 62.5 Nanosekunden |
6 | // Für einen 38 kHz Träger müssen wir 38000 Mal in der Sekunde toggeln, |
7 | // Also alle 0.00002631578 Sekunden |
8 | // Das sind 26315.78 Nanosekunden |
9 | // Wir sollten wir alle 421,05248 Takte einen Pin Toggeln :-) |
10 | // Wenn wir einen Timer-Prescaler von 8 nehmen bedeutet das ca. alle 53 Timertakte |
11 | |
12 | // Arduino Pin3 entspricht PD3, und das ist OC2B - Output von Timer2 Output Compare Match B |
13 | pinMode(3, OUTPUT); |
14 | |
15 | // Pin OC2B (Arduino Pin 3) wird gecleart wenn wir den Wert OCR2A treffen |
16 | // WGM22 + WGM21 + WGM20 bedeutet Modus 7 => Fast PWM, Zählertop ist OCRA |
17 | TCCR2A = (1 << COM2B1) | (1 << WGM21) | (1 << WGM20); |
18 | // CS21: Prescaler des Counters ist 8, jeder Countertick dauert 8 Prozessortakte = 500 Nanosekunden |
19 | TCCR2B = (1 << WGM22) | (1 << CS21); |
20 | // Wenn wir bei 0x34 = 52 angekommen sind, haben wir 500 * 51 Nanosekunden gebraucht, also 25500 Nanosekunden |
21 | // Also 25,5 Mikrosekunden |
22 | OCR2A = 0x34; |
23 | // Umschalten tun wir unseren PIN wenn wir bei 0x1A (26) vorbeikommen, das ist die Hälfte von 52 und somit haben wir 50% |
24 | // Duty-Cycle. Schalten tun wir beim hoch und runterzählen |
25 | OCR2B = 0x1A; |
26 | |
27 | // Bei einem Arduino-Uno haben wir hiermit 37.88 kHz bei genau 50% Duty-Cycle am Pin 3 :-) |
28 | } |
29 | |
30 | void loop() |
31 | {
|
32 | // Interne LED auf Output |
33 | pinMode(13, OUTPUT); |
34 | |
35 | // Pin 10 kommt das Signal unseres IR-Empfänger - der geht LOW wenn er einen 38 kHz Träger sieht |
36 | if (digitalRead(10) == LOW) |
37 | {
|
38 | digitalWrite(13, HIGH); |
39 | } |
40 | else |
41 | {
|
42 | digitalWrite(13, LOW); |
43 | } |
44 | } |
Was soll man sagen... viel lernen du musst junger Padawan! Thomas
Ui... das bringt doch schonmal ein wenig Infrarotlicht ins Dunkle =) Ich habe mich mittlerweile durch zahlreiche Foreneinträge und Homepages durchgelesen. Zunächst werde ich ein paar Bauteile bestellen und einen IR-Testaufbau aufbauen, bevor ich mich an die kleinen Gemeinheiten, wie zum Beispiel die Samsung Codierung ranmache. Dein Beitrag hat mich schonmal bereichert =) Gruß
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.