IR-sender und empfänger, probleme mit dem empfang
hallo allerseits,
ich bastle immer noch an meiner IR-bake 2.0...
im netz habe ich zwei interessante sketche gefunden.
sender:
den code habe ich wegen einer zusätzlichen grünen LED (die nur mitblinkt) ein bischen modifiziert:
Code:
// Damit die Pins schnell geschaltet werden können
#include <digitalWriteFast.h>
// Hier ist der Verstärker mit der IR-LED angeschlossen
#define IRLED 8
#define LEDpin 9
// Globale Variablen für den Timer-Interrupt
volatile uint8_t pinZustand = HIGH;
volatile uint8_t sendenAn = false;
/*************************************************************
*
* void setup()
*
* Wird einmal beim Programmstart ausgeführt
*
*************************************************************/
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
}
/*************************************************************
*
* Interrupt Service Routine
*
* Wird aufgerufen, wenn der entsprechende Interrupt
* ausgelöst wird
*
*************************************************************/
ISR(TIMER1_COMPA_vect)
{
noInterrupts();
if(! sendenAn)
{
// 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();
}
/*************************************************************
*
* void loop()
*
* Wird immer wieder durchlaufen
*
*************************************************************/
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);
}
/*************************************************************
*
* void sendIR(uint8_t dataByte)
*
* Sendet ein Byte seriell mit 1200bps über die IR-LED
*
* dataByte = Das Byte, das gesendet wird
*
*************************************************************/
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);
}
der sender funktioniert was die signalübertragung betrifft, das konnte ich mit dem RP6 verifizieren, es wird dort aber nur mit einer blinkenden LED signalisiert signal ja oder nein...
empfänger:
der OUT-pin des TSOP 34836 ist am pin RX0 eines mega 2560 angeschlossen, die ansteuerung der LCD anzeige habe ich so modifiziert, wie sie in anderen sketches schon mal funktioniert hat. Am LCD erscheint nach dem einschalten "TSOP-Empfang" , sonst passiert aber nichts...
Code:
// Includes für das Display
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// 7-Bit Adresse des Displays
// #define I2C_ADDR 0x27 >> 1 // I2C-Addresse
// Die Pin-Belegung des Displays
#define BACKLIGHT_PIN 7
#define En_pin 6
#define Rw_pin 5
#define Rs_pin 4
#define D4_pin 0
#define D5_pin 1
#define D6_pin 2
#define D7_pin 3
#define LED_OFF 1
#define LED_ON 0
// Prototypen
//LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
//#define BACKLIGHT_PIN 7
//#define LED_OFF 1
//#define LED_ON 0
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
/********************************************************************
*
* Nötige Initialisierungen
*
********************************************************************/
void setup()
{
lcd.begin (16,2); // Display initialisieren
// Hintergrundbeleuchtung einschalten
lcd.setBacklightPin(BACKLIGHT_PIN,NEGATIVE);
lcd.setBacklight(LED_ON);
// Display bereit machen
lcd.clear();
lcd.home();
lcd.backlight(); // Beleuchtung einschalten
lcd.setCursor(0,0); // Zeichen 1, Zeile 1
lcd.print("TSOP-Empfang");
lcd.setCursor(0,1); // Zeichen 1, Zeile 2
Serial.begin(1200);
}
/********************************************************************
*
* Hauptschleife, wird immer wieder durchlaufen
*
********************************************************************/
void loop()
{
int counter = 0;
char dataEin = 0;
while(true)
{
if(Serial.available() > 0)
{
dataEin = Serial.read();
lcd.print(dataEin);
// Nach 16 Zeichen Cursor wieder nach vorne
counter++;
if(counter >= 16)
{
// lcd.clear();
counter = 0;
lcd.setCursor(0,1);
}
}
}
}
der empfang am RP6 ist schon mal ein zeichen dafür, dass der sender funktioniert, ich weiss aber nicht, wo ich im code des empfängers was verändern könnte damit sich auf dem LCD auch was tut :-(
Könnte bitte jemand drüberschauen und mir einen schubs geben - von wegen der suchrichtung?
Liste der Anhänge anzeigen (Anzahl: 1)
hi Rabenauge,
danke für den tipp mit der seriellen schnittstelle, jetzt kommen am empfänger auch zeichen an, statt des (gedacht) gesendeten alphabets allerdings solche:
Anhang 30372
empfänger oder senderproblem?
Liste der Anhänge anzeigen (Anzahl: 1)
@Dirk,
Zitat:
Zitat von
Dirk
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)
Anhang 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...