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
  Absturz Nano / com-port shrimps 5 160 18.05.2019 18:27
Letzter Beitrag: hotsystems
  Arduino nano auf 3,3Volt umbauen Bernd666 10 359 08.05.2019 14:52
Letzter Beitrag: Bernd666
  4x50W LEDs mittels ESP Bluetooth und einer APP ansteuern pezigan 13 1.613 28.03.2019 15:44
Letzter Beitrag: Tommy56
  Spannungsversorgung Nano AnFi 1 699 24.03.2019 14:02
Letzter Beitrag: hotsystems
  Nano CH340 - Software Reset Lite 16 2.135 17.03.2019 20:07
Letzter Beitrag: Tommy56
  Arduino Mega 2560 vs Arduino DUE Batucada 20 3.297 24.02.2019 16:38
Letzter Beitrag: Batucada
  Nano - gelöste USB-Buchse wieder anlöten? Arduinero 7 1.702 27.01.2019 17:05
Letzter Beitrag: Chopp
  Nano spielt verrückt! AnFi 6 1.101 16.01.2019 02:54
Letzter Beitrag: Chopp
  PWM-Signal reduzieren auf 5V und per Nano auswerten (PulseIn) dionys 13 2.210 21.12.2018 21:38
Letzter Beitrag: georg01
  Wemos TTGO XI 8F328P-I Nano V3.0 AnFi 8 2.532 20.12.2018 20:33
Letzter Beitrag: AnFi

Gehe zu:


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