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?







Zitieren

Lesezeichen