INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Kann ein Arduino Nano mittels delayMicroseconds(13) ein 38kHz-Signal erzeugen
11.03.2019, 02:12 (Dieser Beitrag wurde zuletzt bearbeitet: 11.03.2019 11:47 von Bitklopfer.)
Beitrag #1
Kann ein Arduino Nano mittels delayMicroseconds(13) ein 38kHz-Signal erzeugen
Hallo, ich möchte das 38kHz-Infrarot-Signal einer Virtual Wall (für den Staubsaugerroboter Roomba E5) kopieren.

Ich konnte mit einem Empfänger-IC für 38kHz-IR-Signale einer Wellenlänge von 940 nm ein Signal aufnehmen:
80µs Signal -1150µs Pause - 80µs Signal - 1150µs Pause -80µs Signal - 21000µs Pause -von vorne,
aber wenn ich es wieder abspiele, mit einer 940 nm LED, dann tut sich nichts.

Ist eine normale Infrarot-LED vielleicht zu langsam? Oder kann mein Arduino vielleicht nicht schnell genug schalten?
Ich bin für alle Fehlersuche-Tipps dankbar!

...ein Thread für das gleiche Thema reicht.
lgbk Moderator
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2019, 02:28 (Dieser Beitrag wurde zuletzt bearbeitet: 11.03.2019 02:36 von SchwuppSchwupp.)
Beitrag #2
Eine Virtuel Wall für einen Roomba E5 programmieren
Ich möchte meinen Staubsaugerroboter einzäunen. Im Grunde sendet die Virtuel Wall ein Signal auf der Infrarotwellenlänge von 940nm mit einer Trägerfrequenz von 38 kHZ. Dieses Signal möchte ich aufnehmen und mit dem Arduino wieder abspielen, und zwar ohne eine Bibliothek einzubinden.
Leider klappt es noch nicht, und ich weiss nicht wie ich den Fehler am vernünftigsten eingrenze :-(

Theorien:
- Das Trägersignal darf kein Rechtecksignal sein
- die delayfunktion ist zu ungenau bei diesen kurzen Zeiten
- die IR-LED, der Arduino oder der IR-Empfänger arbeiten zu langsam


Signal abhören:
Code:
void setup() {
  Serial.begin(230400);            //wichtig, sonst ist die Kommunikation zum seriellen Monitorl zu langsam
  pinMode (7, OUTPUT); digitalWrite(7, LOW);      //GND des IR-Empfängers
  pinMode (8, OUTPUT); digitalWrite(8, HIGH);     //5V  des IR-Empfängers
  pinMode (6, INPUT_PULLUP);                      //Signal des IR-Empfängers
}

void loop() {
  for (int i = 0; i <= 6000; i++) {
    delayMicroseconds(10);
    Serial.print(digitalRead(6));
  }

  delayMicroseconds(10);
  Serial.println(digitalRead(6));
}

Ergebnis: 80µs Signal -1150µs Pause - 80µs Signal - 1150µs Pause -80µs Signal - 21000µs Pause -von vorne

oder als Rohdaten aus dem seriellen Monitor:
(alle 10 µs ein Signal - 0 für an, 1 für aus)
00000001111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111000000001111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11000000001111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111111111111111111111111111111111111111111111111111111111111111111111111111​11111111 und wieder von vorne

Die Länge der Blöcke variiert ein wenig


Signal wieder abspielen:
38kHz bedeutet eine Welle alle 26 µs, also alle 13 µs muss die IR-LED (940nm) aus-bzw angeschaltet werden.

Code:
void setup() {
  pinMode (3,OUTPUT);digitalWrite(3,LOW);
}

void Signal (){         // 3 x ein Signal (3*26=78µs)
  digitalWrite(3,HIGH);delayMicroseconds(13);
  digitalWrite(3,LOW);delayMicroseconds(13);  
  digitalWrite(3,HIGH);delayMicroseconds(13);
  digitalWrite(3,LOW);delayMicroseconds(13);
  digitalWrite(3,HIGH);delayMicroseconds(13);
  digitalWrite(3,LOW);delayMicroseconds(13);
}

void loop() {
  Signal();
  delayMicroseconds(1150);
  Signal();
  delayMicroseconds(1150);
  Signal();
  delayMicroseconds(20500);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.03.2019, 17:06 (Dieser Beitrag wurde zuletzt bearbeitet: 12.03.2019 17:08 von Chopp.)
Beitrag #3
RE: Kann ein Arduino Nano mittels delayMicroseconds(13) ein 38kHz-Signal erzeugen
Hallo,

Da wir nicht wissen, in wie weit du dich mit solchen Themen,
und auch mit Programmieren auskennst.......

Also 1) der Arduino sollte das schaffen.
2) Ist IR sehr Zeitkritisch, daher kannst du keine delays nehmen.

Bitte nach delays und millis mal Googlen, und versuchen zu verstehen, / nachfragen.

3) das Trägersignal ist schon ein Rechtecksignal.
Deine Nutzdaten werden praktisch aufmoduliert.

4) Deine Diode wird schon schnell genug sein.
Es kann jedoch sein, das die nicht die richtige Wellenlänge hat.

Ich habe mal hier
und hier etwas auf die schnelle gefunden.
Schau dir das mal an.

Gruß, Markus

Immer in Stress
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2019, 09:41 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2019 09:41 von SchwuppSchwupp.)
Beitrag #4
RE: Kann ein Arduino Nano mittels delayMicroseconds(13) ein 38kHz-Signal erzeugen
Hallo Markus, vielen Dank, jetzt habe ich einen Faden, den ich weiterverfolgen kann Smile Vorher wusste ich nicht wo, bzw. welche Option ich als erstes recherchieren sollte.

Nächstes Update: letzte Märzwoche
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.03.2019, 10:09
Beitrag #5
RE: Kann ein Arduino Nano mittels delayMicroseconds(13) ein 38kHz-Signal erzeugen
Zwischenupdate:
ich habe nun eine Sekunde lang gemessen, pro 38kHz-Schwingung zwei mal -> alle 13 µs, mittels millis(). Der Monitor sollte nun in dieser Sekunde ca. 76.923 Werte ausgeben (=ca 1sec / 13µs)

Tut er aber nicht. Das aber sehr präzise Wink jeweils 4x wurde gemessen, und die Zahl der an den serial Monitor übermittelten Messungen war immer exakt gleich.

Wenn alle 4 print-Befehle ausgeführt werden: 1090 Messungen werden übermittelt
Wenn 1x der Serial.println() print-Befehle ausgeführt werden: 3943 Messungen werden übermittelt
Wenn 1x der Serial.println() print-Befehle ausgeführt werden: 11766 Messungen werden übermittelt

die Ausgabe über den Serial Monitor scheint also zu langsam zu sein

Code:
void auslesen () {
  Absatz = micros(); pmicros = micros();
  while ((micros()-Absatz) <=1000000)  {   //solange nicht 1.000.000 µs vergangen sind
    if ((micros() - pmicros) >= 13)         //wird alle 13 µs
    { Serial.print(!digitalRead(6));        //der Ausgabepin gemessen und ausgegeben,
      Serial.print(";");
      Serial.print(micros()-Absatz);       //und die Zeit seit diese Messreihe gestartet ist berechnet und ausgegeben
      Serial.println(";");    
      pmicros = micros();
    } else;
  }
}
(pin 6 ist der Ausgabepin des 38kHz-Empfängers,
der Serial Monitor lief mit 115200 baud = 115kHz)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.03.2019, 12:35
Beitrag #6
RE: Kann ein Arduino Nano mittels delayMicroseconds(13) ein 38kHz-Signal erzeugen
Du kannst deine Ausgaben nicht mit dem Serial Monitor verfolgen. Dazu brauchst Du ein Oszilloskop oder einen Logikanalysator (LA).
Die Baudrate, die Du einstellst ist die Zeit für ein Bit auf der seriellen Schnittstelle. Zur Übertragung eines Zeichens werden auf der Schnittstelle mindestens 10 Bit benötigt. D.h. selbst bei 115200 Baud dauert die Übertragung eines einzigen Zeichens ca. 87µs. Du bremst deine Signalerzeugung damit komplett aus.
Auch ein digitalWrite bzw digitalRead benötigt ca 5µs. Wenn es schneller gehen soll, musst Du die Port direkt ansteuern, und darfst nicht die IDE-Funktionen verwenden.
So ein Signal sollte man mit einem Timer erzeugen, das geht wesentlich zuverlässiger.

N.B. einen einfachen LA, um den Signalausgang zu überprüfen gibt's schon für wenig Geld. Such mal auf ebay nach 'USB Logik Analyser'.
Bei deutschem Händlern für ca. 10€, aus China noch billiger.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2019, 11:06
Beitrag #7
RE: Kann ein Arduino Nano mittels delayMicroseconds(13) ein 38kHz-Signal erzeugen
Noch zwei gute Links zum Thema:
https://www.heise.de/developer/artikel/T...73309.html
https://www.mikrocontroller.net/articles/Interrupt

Wenn etwas sehr zeitkritisch ist, dann macht es Sinn, es damit zu machen. Man muss aber darauf achten, dass die ISR, die ja mit jedem Interrupt aufgerufen wird, sehr schlank gehalten wird. Also sowas wie ein Serial.print() ist da auf jeden Fall fehl am Platze, da dies ein vergleichsweise langsamer Vorgang ist.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Sinusgenerator bis zu 10 kHz erzeugen dirtybass 23 639 Gestern 23:57
Letzter Beitrag: GuaAck
  Arduino Nano keine Verbindung zu nRF24L01 Modul Jonaz2 9 545 26.11.2019 21:38
Letzter Beitrag: hotsystems
  Arduino Nano + W5500 Server Problem Plammi 8 590 23.11.2019 19:40
Letzter Beitrag: ardu_arne
  Wie kann ich den Hallsensor TLE4935L Verwenden? Triax16 9 1.178 11.11.2019 22:22
Letzter Beitrag: hotsystems
Question Relaisboard resettet Arduino Nano tramspotters 44 4.631 01.11.2019 22:23
Letzter Beitrag: hotsystems
  Nano läuft nicht nach Einschalten Gritte 30 10.538 20.09.2019 10:32
Letzter Beitrag: Gritte
  PWM Signal am Eingang? AndyHoe 2 1.172 24.07.2019 08:01
Letzter Beitrag: AndyHoe
  Analoge Modulation digital erzeugen Backtobasics 20 4.146 10.06.2019 19:08
Letzter Beitrag: Backtobasics
  TX/RX Signal zu schwach TeimeN 8 2.089 28.05.2019 19:40
Letzter Beitrag: TeimeN
  Absturz Nano / com-port shrimps 5 1.238 18.05.2019 18:27
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste