Forum: FPGA, VHDL & Co. Fernbedienung (NEC-Protokoll) mit FPGA realisieren


von Cihan K. (lazoboy61)


Lesenswert?

Hallo,

habe mal eine konkrete Frage. Hab grad ein kleines Projekt zu laufen, wo 
ich über einen HTC Handy über WLAN meinen Receiver bzw. LCD-TV ansteuern 
will. Die Verbindung sitzt bis zum FPGA, funktioniert also tadellos. Das 
einzige was mir nur noch fehlt ist, die Fernbedienung lässt sich nicht 
über das FPGA realisieren.

Habe diesbezüglich eine kleine Schaltung gelötet (ganz einfache 
Treiberstufe mit Transistor und der IR-Diode, in diesem Fall SFH485). 
Die Fernbedienungscodes habe ich mit einer Fotodiode (wieder selbst 
gelötet) auf dem Oszilloskopen abgetastet und in VHDL programmiert. Das 
heisst, die Fernbedienung und die IR-Diode des FPGAs senden identisch 
die gleichen Codes(es könnten höchstens µs Toleranzen drin sein, was ich 
eigentlich aber nicht vermute). Ich muss aber auch zugeben, das ich 
Anfangs nicht wusste mit welchem Protokoll ich zu tun habe, später fand 
ich hier im Forum, das es der NEC-Protokoll ist, die Pulsdauern des 
Start, "1" und "0" -Bits stimmen mit denen überein, die ich mit der 
Fotodiode über das Oszilloskop aufgenommen habe.

Nun leider funktioniert die Sache mit dem Senden der Codes über das FPGA 
nicht. Ich hatte auch die Vermutung, dass es vielleicht an der IR-Diode 
liegt, vielleicht brauche ich einen anderen Wellenlängenbereich, aber 
kenne mich da nicht so gut aus.

An dieser Stelle bräuchte ich eure Ratschläge, Erfahrungen und Ideen. 
Würde mich freuen wenn ich was brauchbares bekommen könnte.

mfg Cihan

____________
PS: Fernbedienung ist vom Sat-Receiver Opticum CR7100

von Silvia A. (silvia)


Lesenswert?

Zeig doch mal deinen Code.
Zeig mal deinen Schaltplan
und welches FPGA Board verwendest du ?

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Also, gehen wir dann mal reihe für reihe durch.

Und zwar,

die Schaltung die ich für die IR-Diode benutze ist unter Bild 1 zu 
sehen. Sie ist am FPGA IDE Stecker A2 verbunden. Vielleicht wäre an 
dieser Stelle Sinnvoll zu erwähnen, das FPGA Board was ich benutze ist 
von Xilinx das Spartan 3 Starter Board.

Hier mein VHDL Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity codierung is
    generic(first: integer := 450000;
          second: integer:= 225000;
      thirty: integer:= 28000;
      four: integer:= 28000;
      five: integer:= 84500
            );
    Port   (CLK : in  STD_LOGIC;
            RST : in  STD_LOGIC;
            IR_Out : out  STD_LOGIC;
      Taste: in STD_LOGIC_VECTOR (3 downto 0)
            );
end codierung;

architecture Behavioral of codierung is

type LU_table is array (0 to 2, 0 to 66) of integer;
signal Look:LU_table:= (
(first, second, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, four, thirty, four, thirty, five, thirty, four, thirty, four, 
thirty, four, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, five, thirty, four, thirty, five, thirty, four, thirty, five, 
thirty, five, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, four, thirty, five, thirty, four, thirty, four, thirty, five, 
thirty, five, thirty, five, thirty, five, thirty),
(first, second, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, four, thirty, four, thirty, five, thirty, four, thirty, four, 
thirty, four, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, five, thirty, four, thirty, five, thirty, four, thirty, five, 
thirty, five, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, four, thirty, five, thirty, four, thirty, four, thirty, five,
five, five, five, five, five, five, five),
(first, second, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, four, thirty, four, thirty, five, thirty, four, thirty, four, 
thirty, four, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, five, thirty, four, thirty, five, thirty, four, thirty, five, 
thirty, five, thirty, four, thirty, four, thirty, four, thirty, four, 
thirty, four, thirty, five, thirty, four, thirty, four, thirty, five,
thirty, thirty, thirty, thirty, thirty, thirty, thirty) );

signal Di_CLK : STD_LOGIC;
signal j: integer;
begin

Di_FRQ : process (CLK, RST)
variable zahl1: natural range 0 to 6249999;
variable i: integer;
variable senden: STD_LOGIC;
variable Tastev: STD_LOGIC_VECTOR(3 downto 0);
variable entprell: natural range 0 to 50000000;

begin
if RST = '1' then
  zahl1 := 0;
  j<=0;
  Di_CLK <= '0';
  entprell:=0;

elsif CLK='1' and CLK'event then
  if Taste(0) = '1' and Tastev (0) = '0' and entprell = 0 then
      senden:='1';
      i:=0;
      entprell:=50000000;
  elsif Taste(0) = '0' and Tastev (0) = '1' and entprell = 0 then
      entprell:=50000000;
  elsif Taste(1) = '1' then
      senden:='1';
      i:=1;
  elsif Taste(2) = '1' then
      senden:='1';
      i:=2;
  end if;
  Tastev(0):=Taste(0);
  if entprell > 0 then
    entprell := entprell - 1;
  end if;
  if senden = '1' then
    if zahl1 = 0 then
      zahl1 := Look(i,j);
      Di_CLK <= not Di_CLK;
      if j <= 66 then
        j <= j + 1;
      else
        j<=0;
        senden := '0';
      end if;
    else
      zahl1:= zahl1-1;
    end if;
  end if;
end if;
IR_Out <= Di_CLK;
end process Di_FRQ;

end Behavioral;

Das Prinzip der VHDL Programmierung ist, dass ein 3 dimensionaler Array 
mit 67 Attributen definiert wird. Diese 67 Attribute stellen die 
Fernbedienungscodes dar. Da ich später rausbekam, dass meine 
Fernbedienung mit dem NEC Protokoll arbeitet ist die Codierung 
folgendermaßen aufgebaut:
Startbit mit 9000µs Puls und 4500µs Pause (zwei Attribute), dann 32 
Datenbits jeweils für eine "0" 560µs Puls und 560s Pause und für eine 
"1" 560µs Puls und 1690µs Pause (64 Attribute) bzw. ganz am Ende noch 
der Stobbit mit 560µs Puls(1 Attribut)[insgesamt 67 Attribute im Array]. 
(Siehe auch unter NEC-Protokoll: 
http://www.mikrocontroller.net/articles/IRMP ).
Den Code der Fernbedienung habe ich über eine Fotodiode mit Messung über 
Oszilloskopen rausgefunden und mir die Pulse aufgeschrieben und in das 
Array der VHDL Programmierung einprogrammiert. Durch drücken der Taste 
ganz links vom FPGA wird die IF-Bedinung mit senden = 1 gestartet und 
das Signal (Code) wird über die IR-Diode übertragen.

Das Ergebnis oder der Zwischenstand zur Zeit ist, dass der Code richtig, 
vor allem identisch vom FPGA über die IR-Diode übertragen wird, doch 
allerdings reagiert der Sat-Receiver auf den Befehl nicht. Genau an 
dieser Stelle bin ich Ratlos, warum es nicht funktioniert.

Ich hoffe ich habe alles gut schildern können und habe hoffentlich auch 
nichts vergessen zu erwähnen.

Hoffe nun das ihr mir weiterhelfen könnt.

Danke im Voraus

Gruß Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Na, kann mir denn keiner weiterhelfen.

Oder fehlen Informationen?!

Bei Unklarheiten beantworte ich die Fragen gerne und würde mich auch 
freuen wenn ihr mir helfen könntet


Danke
gruß Cihan

von Roland P. (pram)


Lesenswert?

Ich kann leider kein VHDL, aber hast du die Pulse zusätzlich mit 36 bzw. 
38 KHz moduliert.

Kannst du das Sognal z.B. mit einem TSOP Ir-Empfänger empfangen?

Gruß
Roland

von Cihan K. (lazoboy61)


Lesenswert?

Danke für die Antwort erstmal Roland.

Ich selber kenne mich mit Fernbedienungen nicht gut aus, das einzige was 
ich gemacht habe ist, die Fernbedienung mit einer Fotodiode über dem 
Oszilloskopen darzustellen und mir die High / Low Flanken anzusehen.
Dann habe ich eben mit VHDL die Flanken genauso nachgemacht, aber 36 
oder 38 kHz, ??? sagt mir erstmal nicht viel bzw. warum und wie muss 
modulliert werden. Reicht es mit anderen Worten nicht, die Flanken 1 zu 
1 nachzumachen?

Gruß Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Ich habe ein bisschen recherchiert und bin auf diese Seite gestoßen:

http://www.ustr.net/infrared/index.shtml

In den Bildern habe ich folgendes erkannt:
das was mit dem 36kHz Modulation gemeint ist doch einfach nur, wenn der 
gesendetete Code auf Logisch 1 ist, z.B. beim Start Bit mit 9000µs, wird 
der 36kHz Signal durchgeschickt.

Ist das Richtig oder liege ich falsch?!?

von IR (Gast)


Lesenswert?

Hi,
mein Gott. Wenn Deine Signale identisch mit den Gewünschten sind, kanns 
doch nur noch an der Wellenlänge liegen. Was willste denn noch dieses 
Forengesülze ertragen? Bekommst hier doch eh nur dieses ermahnende 
Gelaber ala Silvia zu lesen.

Viele Grüße und viel Erfolg beim selber machen.

von Lattice User (Gast)


Lesenswert?

Cihan Kalayci schrieb:
> In den Bildern habe ich folgendes erkannt:
> das was mit dem 36kHz Modulation gemeint ist doch einfach nur, wenn der
> gesendetete Code auf Logisch 1 ist, z.B. beim Start Bit mit 9000µs, wird
> der 36kHz Signal durchgeschickt.
>
> Ist das Richtig oder liege ich falsch?

Das ist richtig,
Einfach ein 36 kHz Signal erzeugen und mit deinen gesendeten Codes 
verknüfpen und das Ergebnis auf die Led geben.

Die Empfänger haben einen Filter für diese 36 kHz um fremde Signale 
(z.B. von Energiesparlampen) besser ausblenden zu können).

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo Cihan,


hast du mal deine Schaltung (die mit der Fotodiode) zum Empfang deiner 
selbst erzeugten Impulse benutzt? Wenn die etwas anzeigt, dann müsste 
die Wellenlänge stimmen. Dir ist auch klar, dass bei einer 1 am 
Kollektor des BC547 die LED aus ist.


Tom

von Cihan K. (lazoboy61)


Lesenswert?

Hallo Thomas,

ja ich habe die Fotodiodenschaltung zum Empfangen meiner selbst 
erzeugten Impulse benutzt, Ergebnis ist wie erwartet.
Mit dem BC547 meinst du bestimmt an der Basis eine 1, statt dem 
Kollektor, denn da ist die IR-LED bei mir dran, die durch den Transistor 
zur Masse getrennt ist, nur wenn nun an der Basis ein HighSignal 
anliegt, schaltet die Led gegen Masse und kann leuchten.

Inzwischen habe ich die Modulation auch in das Signal (bzw. in den Code) 
in der VHDL Programmierung eingefügt und es hat auf Anhieb geklappt. Für 
alle Interessenten, ich habe in meinem Programm nur einen Frequenzteiler 
hinzugefügt der eben die Modulation mit 36 kHz intern erzeugt und durch 
eine IF ELSE Abfrage an die Basis des Transistors weitergegeben. 
Funktioniert super.

Nochmals danke an alle Beteiligten für die interessanten und effektiven 
Gedankenstöße

Gruß Cihan

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Cihan Kalayci schrieb:
> Inzwischen habe ich die Modulation auch in das Signal (bzw. in den Code)
> in der VHDL Programmierung eingefügt und es hat auf Anhieb geklappt.
Wobei mich sehr wundert, dass du diese Modulation mit der eingangs 
erwähnten Fotodiode nicht gesehen hast...
Oder war das gar keine simple Fotodiode, sondern ein kompletter 
IR-Empfänger, der gleich auch die Demodulation übernommen hat?

von Duke Scarring (Gast)


Lesenswert?

Lothar Miller schrieb:
> Oder war das gar keine simple Fotodiode, sondern ein kompletter
> IR-Empfänger, der gleich auch die Demodulation übernommen hat?

Oder es war das Oszi so eingestellt, das die 36 kHz nicht aufgefallen 
sind...

Duke

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wobei mich sehr wundert, dass du diese Modulation mit der eingangs
> erwähnten Fotodiode nicht gesehen hast...
> Oder war das gar keine simple Fotodiode, sondern ein kompletter
> IR-Empfänger, der gleich auch die Demodulation übernommen hat?

Er schreibt Receiver bzw TV und diese werden ganz sicher keine normale 
Fotodiode bzw Fototransistor verwenden. Der IR Empfänger soll ja 
möglichst vom Umgebungslicht unabhängig sein.

Hier mal ein Datenblatt:

http://www.vishay.com/docs/82090/tsop48xx.pdf

Wie man sieht steckt da einiges an analoger Verarbeitung drin.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lattice User schrieb:
> Er schreibt Receiver bzw TV und diese werden ganz sicher keine normale
> Fotodiode bzw Fototransistor verwenden.
Es war die Rede von einer Schaltung mit einer (namenlosen) Fotodiode, 
mit der das IR-Signal wieder nach Elektrisch umgewandelt wurde:
> das einzige was ich gemacht habe ist, die Fernbedienung
> mit einer Fotodiode über dem Oszilloskopen darzustellen
Und insbesondere das hier war dann doch irgendwie irreführend:
> ja ich habe die Fotodiodenschaltung zum Empfangen meiner selbst
> erzeugten Impulse benutzt, Ergebnis ist wie erwartet.
Wenn mit einer simplen Diode das Signal (von FB und vom FPGA) gleich 
aussieht, dann solte auch der Empfänger gleich reagieren...

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:
> Und insbesondere das hier war dann doch irgendwie irreführend:
>> ja ich habe die Fotodiodenschaltung zum Empfangen meiner selbst
>> erzeugten Impulse benutzt, Ergebnis ist wie erwartet.
> Wenn mit einer simplen Diode das Signal (von FB und vom FPGA) gleich
> aussieht, dann solte auch der Empfänger gleich reagieren...

Stimmt.

Entweder er hatte einen IR Empfänger (die sehen äusserlich aus wie 
Phototranistoren) oder die Beschaltung der Photodiode taugte nicht (ist 
auch nicht ganz trivial, da die zu messenden Ströme ziemlich klein 
sind).

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.