- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 15

Thema: IR-sender und empfänger, probleme mit dem empfang

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,
    noch ne Idee:
    Der Sender Code geht ja von einer nicht invertierendenTreiberschaltung mit NPN Transistor aus.
    Was hast du als Treiber für die Sende-LED?
    Gruß
    Dirk

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    @Dirk,
    Zitat Zitat von Dirk Beitrag anzeigen
    Was hast du als Treiber für die Sende-LED?
    den 2N2222...

    ich habe jetzt diesbezüglich noch einen test gemacht. Nach diesem schaltplan (im bild selbst links)
    Klicke auf die Grafik für eine größere Ansicht

Name:	Schaltplan_2-stufiger-IR-sender_und_empfänger.jpg
Hits:	15
Größe:	33,1 KB
ID:	30400


    einen zweiten 2N2222 hinzugefügt. Nach dem was ich irgendwo gelesen habe sollte der zweiter transistor die invertierung wieder umkehren. Stimmt das?

    Der Q2 verändert nichts an den "wirren" zeichen auf dem arduino LCD, verringert die leistung und die reichweite der schaltung aber erheblich. Das könnte aber auch die nicht angepasste ansteuerung des Q2 verursacht haben...

    @rabenauge:
    an den anderen möglichkeiten bin ich dran. Die veränderung der loop-schleife des senders (habe das senden der zeichen auskommentiert)

    Code:
    void loop() 
    
    {
      sendenAn = false;
      delayMicroseconds(550);
      sendenAn = true;
      delayMicroseconds(2330);
      sendenAn = false;
      /*
       for(int i=1; i<=16; i++)
       {
      sendIR(i);
       }
       */
      //delay(500);
      digitalWrite(IRLED, LOW);
      digitalWrite(LEDpin, LOW);
      delay(500); // blinkfrequenz
      Serial1.print(1, DEC);
      digitalWrite(IRLED, HIGH);
      digitalWrite(LEDpin, HIGH);
    
    }
    bewirkt, das auf dem LCD nun beim jedem durchlauf der schleife zwei senkrechte striche "||" ausgegeben werden. Jetzt muss ich "nur noch" rausfinden warum das so ist...

    einerseits ist für das weitermachen das problem der reichweite gelöst, der kontakt zum RP6 funktioniert auch, alleine für die später geplante kommunikation zwischen den beiden per IR ist das bis jetzt erreichte nicht ausreichend...
    gruß inka

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,

    in dem Schaltplan erfolgt die Ansteuerung invertierend (Port HIGH, LED OFF). Der von dir verwendete Sender-Code geht von einem nicht invertierenden Treiber (Port HIGH, LED ON) aus.
    Optionen: Treiber ändern ODER Sender-Code ändern.

    Nebenbei: Die rechts abgebildete Empfängerschaltung (die du hoffentlich nicht verwendest!) dürfte einen dauerhaften LOW-Pegel ausgeben (Rx mit GND verbunden).
    Gruß
    Dirk

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Hi Dirk,
    Zitat Zitat von Dirk Beitrag anzeigen
    Nebenbei: Die rechts abgebildete Empfängerschaltung (die du hoffentlich nicht verwendest!) dürfte einen dauerhaften LOW-Pegel ausgeben (Rx mit GND verbunden).
    nein, den empfänger habe ich nicht verwendet, ich verwende den TSOP (angeschlossen an den drei anschlüssen) ohne zusätzliche bauteile...


    Zitat Zitat von Dirk Beitrag anzeigen
    in dem Schaltplan erfolgt die Ansteuerung invertierend (Port HIGH, LED OFF). Der von dir verwendete Sender-Code geht von einem nicht invertierenden Treiber (Port HIGH, LED ON) aus. Optionen: Treiber ändern ODER Sender-Code ändern.
    hier wäre noch die frage ob die invertierung des signals durch eine zweite transistorstufe wieder rückgängig gemacht werden kann, aber das großgeschriebene ODER suggeriert, dass die softwareänderun die einfachere lösung und daher vorzuziehen ist. Also habe ich mir viel zeit genommen und ausgiebig experimentiert , allerdings ohne den durchschlagenden erfolg:


    hier habe ich den anfangszustand der globalen variablen wahlweise geändert:
    Code:
    // Globale Variablen für den Timer-Interrupt
    volatile uint8_t pinZustand = HIGH;
    volatile uint8_t sendenAn = false;
    hier sehe ich keine möglichkeit für änderungen, es dreht sich alles mehr oder weniger nur um die einstellungen für die 36khz:
    (oder sollte der interrupt ausgelöst werden wenn " Stimmen OCR1A und Timer NICHT überein, wird der Interrupt ausgelöst"?)
    Code:
    void setup() 
    {
    
      pinMode(8, OUTPUT);
      // IRLED ist ein Ausgabe-Pin
      pinModeFast(IRLED, OUTPUT);
    
      pinMode(9, OUTPUT);
    
      noInterrupts(); // Jetzt keine Interrupts
      TIMSK1 |= (1<<OCIE1A);  // Timer 1 Output Compare A Match Interrupt Enable
    
      TCCR1A = 0; // "Normaler" Modus
    
      // WGM12: CTC-Modus einschalten (Clear Timer on Compare match) 
      //        Stimmen OCR1A und Timer überein, wird der Interrupt
      //        ausgelöst
      // Bit CS12 und CS10 setzen = Vorteiler: 8
      TCCR1B = (1<<WGM12) | (1<<CS11);
    
      // Frequenz = 16000000 / 8 / 28 = rd. 71,428kHz, da jeweils an- und aus-
      // geschaltet wird, ergeben sich rund 36kHz Blinkfrequenz
      OCR1A = 28; 
    
      interrupts(); // Interrupts wieder erlauben
    }
    hier habe ich die invertierung des pinzustandes wahlweise zwischen if und else geändert, bzw abgefragt ob gesendet wird "if(sendenAn)":
    Code:
    ISR(TIMER1_COMPA_vect) 
    {
      noInterrupts();
      if(! sendenAn) // = if(sendenAn==false)
      {
        // IR-LED ausschalten
        digitalWriteFast(IRLED, LOW);
        // Zustand der IR-LED merken
        pinZustand = LOW;
        interrupts();
        return;
      } 
      else 
      {
        // IR-LED-Pin auf pinZustand schalten
        digitalWriteFast(IRLED, pinZustand);
        // pinZustand invertieren
        pinZustand = (pinZustand == HIGH) ? LOW : HIGH;
      }
      interrupts();
    }
    hier in der hauptschleife sehe ich keine sinnvolle änderungsmöglichkeit:
    Code:
    void loop() 
    {
    
      // Sender für 5ms ausschalten  
      sendenAn = false;
      delay(5);
      //digitalWrite(9, LOW);
    
      // Das komplette Alphabet in Großbuchstaben senden
      for(int i='A'; i<='Z'; i++) 
      //for(int i=1; i<=9; i++) 
      {
        sendIR(i);
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        delay(250); // Kann entfallen, hier nur, damit man auf
        // dem Empfänger Zeit hat, die Buchstaben
        // zu verfolgen
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
      }
      //digitalWrite(9, HIGH);
    }
    in dieser sendefunktion könnte man die an- bzw. abschaltung des 36khz signals umkehren zwischen der if und else abfrage:
    Code:
    void sendIR(uint8_t dataByte) 
    {
    
      // Start-Bit
      sendenAn = false;
      delayMicroseconds(550);
      sendenAn = true;
      delayMicroseconds(230);
    
      // 8 Datenbits
      for(int i=0; i<8; i++) 
      {
        // Falls LSB gesetzt...
        if(dataByte & B00000001 == 1) 
        {
          // ... 36kHz-Signal aus (Seriell = Invertierte Logik)...
          sendenAn = false;
          delayMicroseconds(550);
        } 
        else 
        { // ... andernfalls 36kHz-Signal an
          sendenAn = true;
          delayMicroseconds(230);
        }
        // Das nächste Bit bitte 
        dataByte >>= 1;
      }
    
      // Stopp-Bit
      sendenAn = true;
      delayMicroseconds(550);
      sendenAn = false;
    
      // kurze Pause
      delay(2);
    }
    ---------------------------------------

    wie bereits oben geschrieben habe ich die verschidensten änderungen (und ihre kombinationen) mit gar keinen bzw. negativen konsequenzen ausprobiert, die einzige "positive" verhaltensänderung war die, dass die IR-LED sendet, blinkt und die "||" zeichen sendet...

    bin also wieder mit meinem latein am ende...
    gruß inka

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Hast du mal überprüft ob die Zeichen denn korrekt gesendet werden, z.B. über die Serielle Schnitstelle?
    Hab eben mal ins Datenblatt geschaut, das ||-Symbol hat die Zeichenfolge B10100000.

    Es gibt doch nen paar "Standard"-Programme für IR-Kommunikation, hast du es damit mal versucht?
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Es gibt doch nen paar "Standard"-Programme für IR-Kommunikation, hast du es damit mal versucht?
    ich weiss ja nicht was Du mit "standard"-programmen meinst , wenn sowas:

    Code:
    //sender:
    // http://forum.arduino.cc/index.php?topic=156140.0
    
    void setup()
    {
     Serial.begin(9600);
    }
    
    void loop()
    {
     // send data
     Serial.write(0b11111111);
     delay(1000);
    }
    und:

    Code:
    //empfänger:
    //http://forum.arduino.cc/index.php?topic=156140.0
    
    byte val;
    
    void setup()
    {
     Serial.begin(9600);
     Serial1.begin(9600);
    }
    
    void loop()
    {
    if (Serial1.available())
    {
      val = Serial1.read();
      Serial.println(val,BIN);
    }
    }
    so verbunden:
    Code:
    mega_1 RX (Pin 0)  geht auf TX1 (Pin 18) vom Mega_2
    mega_1 TX (Pin 1) geht auf RX1 (Pin 19) vom Mega_2
    dann ja, die 8x1 kommt an...

    eine andere interessante beobachtung:

    in den beiden arduinos die zwei sketche vom anfang geladen, IR-LED wie auch der TSOP deaktiviert, die beiden mega's über TX1 - RX1 / RX1 - TX1 / GND - GND verbunden, dann kommen auch diese "||" im LCD an. Wie erkläre ich mir das?

    ich habe vorhin nach der zweiten transistorstufe als "neutralisierung" der invertierung in der emiterschaltung meines senders gefragt: da niemand antwortet - wollt Ihr mir nich wehtun (weil absoluter blödsin), oder ist es etwas "was man nicht macht" - oder warum die funkstille?


    EDIT:
    ---------------------------------------

    ich muss mich etwas korrigirren:

    die gesendeten daten kommen am terminal. mit dieser loopschleife

    Code:
    void loop()
    {
     // send data
     //Serial.write(0b11111111);
     
      for(int i='A'; i<='Z'; i++) 
      //for(int i=1; i<=9; i++) 
      
      {
      Serial.write(i);
      }
     
     delay(1000);
    }
    kommen auch die buchstaben (im terminal), auf dem display (ohne das was dorthin gesendet wird) das hier:

    Klicke auf die Grafik für eine größere Ansicht

Name:	2015_07_16_wirre zeichen_LCD.jpg
Hits:	9
Größe:	48,5 KB
ID:	30480
    Geändert von inka (16.07.2015 um 14:52 Uhr)
    gruß inka

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Ich hab den grade nicht parat-aber findest du mit bissel wühlen:
    bei Sainsmart gibts irgendwo das grosse Tutorial für den Arduino Mega zum runterladen. Dort ist ein Beispielprogramm dabei, in dem eine stinknormale IR-Fernbedienung eingelesen wird.
    Das funktioniert einwandfrei, ist aber nen bissel schwer zu finden- irgendwie bei den Startersets und Mega- und da irgendwo kann man es runterladen.
    Das hab ich mir sogar mal ausgedruckt, so als kleines Handbüchlein recht gut.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

Ähnliche Themen

  1. DB Pitch: Bahn modernisiert sich mit Sensor-, Lampen- und AR-Startups
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 25.06.2015, 10:10
  2. Suche Sender und Empfänger
    Von Daniong im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 0
    Letzter Beitrag: 16.10.2012, 19:48
  3. IR-Sender und Empfänger
    Von volvo im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 16.02.2010, 13:30
  4. RMF 01 und RMF 02 Sender + Empfänger
    Von baubau im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 27
    Letzter Beitrag: 08.04.2009, 13:00
  5. DMX-Empfänger/Sender
    Von guenter1604 im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 0
    Letzter Beitrag: 13.01.2009, 20:55

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress