Serial.begin(1200); -ungewöhnlich niedriger Wert...
Hast du im Arduino-Monitor den Wert auf 1200 Baud geändert, bevor du Zeichen sendest?
Er sendet nicht auf den "Monitor", sondern direkt zum Display.
Hm, kann mehrere Ursachen haben nun: falscher Zeichensatz? Eventuell (die billgen Displays haben nen fest verbauten Zeichensatz, da kann man gewöhnlich nur acht eigene definieren) brauchst du ne Art Übersetzungstabelle.
Auch denkbar: einfach das falsche Format, also binär/hex oder sowas....
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
bin jetzt ein stückchen weiter gekommen...
habe jetzt die sketche vereinfacht, auch den timer und die interrupt routine entfernt, habe statt dessen "tone" eingesetzt - geht offensichtlich auch
ich sende die zahlen von 1 bis 99, speichere sie in einem array und drucke sie nach einer pause am seriellen monitor aus. So weit so gut, nur sind die empfangenen zahlen alles andere als 1 bis 99!
ich vermute, dass ich hier zeitprobleme, bzw. keine koordinierten aktionen zwischen sender und empfänger habe. Wie mache ich so einen "handshake?
der sender:
der empfänger:Code:// am pin8 ist der verstärker mit der IR-LED angeschlossen // am pin 9 ist die die grüne kontroll LED angeschlossen uint8_t i; void setup() { // pin 8 ist ein Ausgabe-Pin - IR -LED pinMode(8, OUTPUT); //pin 9 ist ein Ausgabe-Pin - grüne LED pinMode(9, OUTPUT); Serial1.begin(9600); Serial.begin(9600); } void loop() { // //zahlen von 1 bis 99 senden for(i=1; i<=99; i++) //for(i=99; i>=1; i--) { tone (8, 36000); digitalWrite(8, LOW); digitalWrite(9, LOW); delay(550);//550 Serial1.println(i); Serial.println(i); tone (8, 0); digitalWrite(8, HIGH); digitalWrite(9, HIGH); delay(230);//230 } //delay(1000); }
die daten, die ankommen, wenn der sender an ist, 7 wiederholungen, so gut wie keine unterschiede, nur am anfang ein paar ausreisser...Code://out-pin des TSOP angeschlossen an RX1 (serial1) int i; uint8_t my_data_ein[] = {0}; void setup() { Serial1.begin(9600); Serial.begin(9600); } void loop() { while(Serial1.available()) { for(i=1; i<=99; i++) //for(i=9; i>=1; i--) { my_data_ein[i] = Serial1.read(); } delay(2000); for(i=1; i<=99; i++) //for(i=9; i>=1; i--) { Serial.println(my_data_ein[i]); } } }
Code:
1 1 1 1 1 1 1 0 0 0 0 0 0 0 107 65 20 100 55 7 81 121 107 92 76 62 45 28 10 19 28 37 46 55 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 247 179 109 41 226 156 10 18 27 36 45 53 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 232 232 232 232 232 232 232 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 232 232 232 232 232 232 232 2 2 2 2 2 2 2 164 164 164 164 164 164 164 2 2 2 2 2 2 2 53 53 53 53 53 53 53 1 1 1 1 1 1 1 52 52 52 52 52 52 52 1 1 1 1 1 1 1 48 48 48 48 48 48 48 1 1 1 1 1 1 1 49 49 49 49 49 49 49 1 1 1 1 1 1 1 50 50 50 50 50 50 50 1 1 1 1 1 1 1 54 54 54 54 54 54 54 1 1 1 1 1 1 1 4 4 4 4 4 4 4 3 3 3 3 3 3 3 7 7 7 7 7 7 7 5 5 5 5 5 5 5 1 1 1 1 1 1 1 0 0 0 0 0 0 0 4 4 4 4 4 4 4 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 232 232 232 232 232 232 232 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 112 112 112 112 112 112 3 3 3 3 3 3 3 44 44 44 44 44 44 44 3 3 3 3 3 3 3 213 213 213 213 213 213 213 0 0 0 0 0 0 0 212 212 212 212 212 212 212 0 0 0 0 0 0 0 208 208 208 208 208 208 208 0 0 0 0 0 0 0 209 209 209 209 209 209 209 0 0 0 0 0 0 0 210 210 210 210 210 210 210 0 0 0 0 0 0 0 214 214 214 214 214 214 214 0 0 0 0 0 0 0 4 4 4 4 4 4 4 3 3 3 3 3 3 3 7 7 7 7 7 7 7 5 5 5 5 5 5 5 1 1 1 1 1 1 1 0 0 0 0 0 0 0 4 4 4 4 4 4 4 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 232 232 232 232 232 232 232 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 248 248 248 248 248 248 3 3 3 3 3 3 3 180 180 180 180 180 180 180 3 3 3 3 3 3 3 205 205 205 205 205 205 205 0 0 0 0 0 0 0 204 204 204 204 204 204 204 0 0 0 0 0 0 0
gruß inka
Guck dir das mal an: https://learn.sparkfun.com/tutorials/ir-communication .
Ziemlich gut erklärt.
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
Hmm, ich verwende HD44780 und KS0066 kompatible LCDs. Beide haben diese Zeichen nicht fest eingebaut. Ich jedenfalls müsste mir für meine Displays die Zeichen ± und den senkrechten Doppelstrich selbst basteln und =>>> erstmal in den lokalen Speicher laden ! !
Schau doch mal ins Datenblatt von Deinem LCD und vergleiche den Code der gesendeten Zeichen mit dem der angezeigten Zeichen. Vielleicht sieht man darin einen Unterschied, mit dem man näher an den Fehler kommt . . .
Ciao sagt der JoeamBerg
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
Lesezeichen