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?
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
@Dirk,
den 2N2222...
ich habe jetzt diesbezüglich noch einen test gemacht. Nach diesem schaltplan (im bild selbst links)
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)
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...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); }
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
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
Hi Dirk,nein, den empfänger habe ich nicht verwendet, ich verwende den TSOP (angeschlossen an den drei anschlüssen) ohne zusätzliche bauteile...
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:
hier sehe ich keine möglichkeit für änderungen, es dreht sich alles mehr oder weniger nur um die einstellungen für die 36khz:Code:// Globale Variablen für den Timer-Interrupt volatile uint8_t pinZustand = HIGH; volatile uint8_t sendenAn = false;
(oder sollte der interrupt ausgelöst werden wenn " Stimmen OCR1A und Timer NICHT überein, wird der Interrupt ausgelöst"?)
hier habe ich die invertierung des pinzustandes wahlweise zwischen if und else geändert, bzw abgefragt ob gesendet wird "if(sendenAn)":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 in der hauptschleife sehe ich keine sinnvolle änderungsmöglichkeit: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(); }
in dieser sendefunktion könnte man die an- bzw. abschaltung des 36khz signals umkehren zwischen der if und else abfrage: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); }
---------------------------------------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
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..
ich weiss ja nicht was Du mit "standard"-programmen meinst, wenn sowas:
und: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); }
so verbunden: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); } }
dann ja, die 8x1 kommt an...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
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
kommen auch die buchstaben (im terminal), auf dem display (ohne das was dorthin gesendet wird) das hier: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); }
![]()
Geändert von inka (16.07.2015 um 14:52 Uhr)
gruß inka
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..
Lesezeichen