Forum: Mikrocontroller und Digitale Elektronik Samsung IR-Empfänger Arduino


von Max S. (ralle87)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Max S. (ralle87)


Lesenswert?

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?

von Amateur (Gast)


Lesenswert?

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.

von Max S. (ralle87)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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

von Max S. (ralle87)


Lesenswert?

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
Noch kein Account? Hier anmelden.