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
RC-Fernsteuerung - Schaltunktionen halten
18.08.2014, 18:47
Beitrag #1
RC-Fernsteuerung - Schaltunktionen halten
Hallo Gemeinde,

ich bin mit meinem RC-Fahrzeug soweit dass mir lediglich die Anpassung meines Sketch für die Funktionen Warnblinker und Rundumkennleuchte fehlen, bzw.sie sind vorhanden, funktionieren aber nicht nach meiner Vorstellung.

So sist der derzeitige Status:
- der Warnblinker funktioniert nur sol lange wie ich den Kreuzknüppel der Fernsteuerung betätige

- die Funktion der Rundumkennleuchte funktioniert nach dem Zufallsprinzip: wenn ich den Kreuzknüppel betätige geht sie an. Beim nächsten Betätigen geht sie dann vielleicht aus, vielleicht flackert die Ansteuerung, vielleicht bleibt sie aber auch an.
Lege ich Spannung an die Schaltung ist das RKL sofort aktiv.

Hier der Sketch:

// Lichtsteuerung für THW VW Touareg

Ein Empfängerkanal Signalader an PB1 (PIN 7) Für Warnblinken.
2 LED in Reihe für Blinker links über Vorwiderstand an bl = PIN 7
2 LED in Reihe für Blinker rechts über Vorwiderstand an br = PIN 13

RC-Kanal 1 - Kreuzknüppel rechte Seite auf- und abwärts

RC-Kanal 5 - Geber Taster 1-0-1 oder Schalter 1-0-1
Ground / Minus an PIN 4
Vcc 5 Volt an PIN 8
*/


int pwin = 7; // weist Pin 7 als Eingang für RC-Kanal 1 zu - Warnblinker und Rundumkennleuchte zu - Kanal 1 RC-Empfänger - KK rechte Seite rauf/runter

int bl = 3; // weist Pin 3 als Ausgang für LEDs Blinker Links zu
int br = 4; // weist Pin 4 als Ausgang für LEDs Blinker Rechts zu
int rk = 13; // weist Pin 13 als Ausgang für Rundumkennleuchte zu

byte val = 75; // Blinkervariable Links und Rechts
byte valw = 75; // Warnblinker
byte rkon = 0; // Rundumlicht

unsigned long duration;
unsigned long durationw;

void setup()

{

pinMode(pwin, INPUT);

pinMode(bl, OUTPUT);
pinMode(br, OUTPUT);
pinMode(rk, OUTPUT);
}
void loop()
{
// val Blinker - pbin

val = map(duration, 1090, 1929, 0, 150); // teilt den Wertebereich von 1929-1090=839 in den Bereich von 0 bis 150 auf

// valw Warblinker -pwin
durationw = pulseIn(pwin, HIGH, 20000);
valw = map(durationw, 1090, 1929, 0, 150);

/* Schleifen für den Warnblinker und das Rundumkennlicht */
if(valw > 120)
{
warnblinken(); // Loop für Warnblinker - KK nach oben
}
if(valw < 30) //
{
rundumlicht(); // Loop für Rundumkennlicht - KK nach unten
}
}
void blinkerlinks() // Schleife Blinker Links val > 120
{
digitalWrite(bl, HIGH);
delay(500);
digitalWrite(bl, LOW);
delay(500);
}
void blinkerrechts() // Schleife Blinker Rechts val < 30
{
digitalWrite(br, HIGH);
delay(500);
digitalWrite(br, LOW);
delay(500);
}



void warnblinken() // Schleife Warnblinker
{
digitalWrite(bl, HIGH);
digitalWrite(br, HIGH);
delay(500);
digitalWrite(bl, LOW);
digitalWrite(br, LOW);
delay(500);
}
void rundumlicht() // Schleife Rundumkennlicht
{
if(rkon == 0)
{
digitalWrite(rk, HIGH);
rkon = 1;

}
else
{
digitalWrite(rk, LOW);
rkon = 0;

}
}

Was muss ich ändern damit die Schaltvorgänge statisch bleiben und das eigenartige Prellverhalten für die RKL unterbunden wird?

Vielen Dank im voraus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.08.2014, 19:47
Beitrag #2
RE: RC-Fernsteuerung - Schaltunktionen halten
Hi,
damit die Schaltvorgänge statisch bleiben brauchst Du eine statische/globale Variable, die mit dem Fernsteuersignal "getoggelt" wird. D.h. beim ersten mal an, beim zweiten mal aus etc.
Um Deine Schaltvorgänge weniger zufällig zu machen musst Du erstmal alle delay() loswerden. Ich denke mal, dass Dein Programm meistens in einem Delay steckt und dann halt auch einmal ein Schaltvorgang der Fernsteuerung nicht mitbekommt.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.08.2014, 20:08
Beitrag #3
RE: RC-Fernsteuerung - Schaltunktionen halten
(18.08.2014 18:47)do1xxy schrieb:  Hallo Gemeinde,

ich bin mit meinem RC-Fahrzeug soweit dass mir lediglich die Anpassung meines Sketch für die Funktionen Warnblinker und Rundumkennleuchte fehlen, bzw.sie sind vorhanden, funktionieren aber nicht nach meiner Vorstellung.

So sist der derzeitige Status:
- der Warnblinker funktioniert nur sol lange wie ich den Kreuzknüppel der Fernsteuerung betätige

- die Funktion der Rundumkennleuchte funktioniert nach dem Zufallsprinzip: wenn ich den Kreuzknüppel betätige geht sie an. Beim nächsten Betätigen geht sie dann vielleicht aus, vielleicht flackert die Ansteuerung, vielleicht bleibt sie aber auch an.
Lege ich Spannung an die Schaltung ist das RKL sofort aktiv.

Hier der Sketch:
Code:
// Lichtsteuerung für THW VW Touareg
/*  
    Ein Empfängerkanal Signalader an PB1 (PIN 7) Für Warnblinken.
    2 LED in Reihe für Blinker links über Vorwiderstand an bl = PIN 7
    2 LED in Reihe für Blinker rechts über Vorwiderstand an br = PIN 13
    
    RC-Kanal 1 - Kreuzknüppel rechte Seite auf- und abwärts
    
    RC-Kanal 5 - Geber Taster 1-0-1 oder Schalter 1-0-1
    Ground / Minus an PIN 4
    Vcc 5 Volt an PIN 8
*/


int pwin = 7;    // weist Pin 7 als Eingang für RC-Kanal 1 zu - Warnblinker und Rundumkennleuchte zu - Kanal 1 RC-Empfänger - KK rechte Seite rauf/runter

int bl = 3;      // weist Pin 3 als Ausgang für LEDs Blinker Links zu
int br = 4;      // weist Pin 4 als Ausgang für LEDs Blinker Rechts zu
int rk = 13;     // weist Pin 13 als Ausgang für Rundumkennleuchte zu

byte val  = 75;  // Blinkervariable Links und Rechts
byte valw = 75;  // Warnblinker
byte rkon = 0;   // Rundumlicht

unsigned long duration;
unsigned long durationw;

void setup()

{

pinMode(pwin, INPUT);

pinMode(bl, OUTPUT);
pinMode(br, OUTPUT);
pinMode(rk, OUTPUT);
}
void loop()
{
  // val Blinker  - pbin

val = map(duration, 1090, 1929, 0, 150); // teilt den Wertebereich von 1929-1090=839 in den Bereich von 0 bis 150 auf

  // valw Warblinker -pwin
durationw = pulseIn(pwin, HIGH, 20000);
valw = map(durationw, 1090, 1929, 0, 150);

/* Schleifen für den Warnblinker und das Rundumkennlicht */
  if(valw > 120)
  {
    warnblinken(); // Loop für Warnblinker - KK nach oben
  }
  if(valw < 30) //
  {
    rundumlicht(); // Loop für Rundumkennlicht - KK nach unten
  }
}
void blinkerlinks() // Schleife Blinker Links val > 120
{
  digitalWrite(bl, HIGH);
  delay(500);
  digitalWrite(bl, LOW);
  delay(500);
}
void blinkerrechts() // Schleife Blinker Rechts val < 30
{
  digitalWrite(br, HIGH);
  delay(500);
  digitalWrite(br, LOW);
  delay(500);
}



void warnblinken() // Schleife Warnblinker
{
  digitalWrite(bl, HIGH);
  digitalWrite(br, HIGH);
  delay(500);
  digitalWrite(bl, LOW);
  digitalWrite(br, LOW);
  delay(500);
}
void rundumlicht() // Schleife Rundumkennlicht
{
  if(rkon == 0)
  {
    digitalWrite(rk, HIGH);
    rkon = 1;
  
  }
  else
  {
digitalWrite(rk, LOW);
  rkon = 0;
  
  }
}
Was muss ich ändern damit die Schaltvorgänge statisch bleiben und das eigenartige Prellverhalten für die RKL unterbunden wird?

Vielen Dank im voraus

Hallo,
also die alte Leier hier im Forum....das hier ist der typische Fall wo man das blinken etc. so wie in dem Beispiel "Blinken ohne Delay" lösen sollte.
Bei der Entscheidung was nun ausgelöst werden soll würde ich nur ein Flag setzen und dann davon abhängig dann in einem anderen Abschnitt dann die Lampen ansteuern. Das zum einen, zum anderen fällt mir auf das du das Timeout bei pulseIn() auf 20000 gesetzt hast was etwas knapp sein kann da nicht immer die 20 mS Wiederholrate auch eingehalten werden. An der Ecke habe ich es bei einer eigenen Anwendung auf 30000 gesetzt weil wenn in der Zeit dann kein Impuls kommt dann muß ich mir eh eine Ersatzstrategie zurechtlegen wie z.B. alles aus oder so. Gleiches gilt wenn die Impulsdauer unter 1000 uS fällt.
Da die Impulsdauererkennung auch Schwankungen enthält sollte man auch daran denken einen Wertebereich bei der Auswahl zu der Funktionen zu berücksichtigen.
Also z.B. Wenn der Wert kleiner 30 ist einschalten und dann erst wieder ausschalten wenn der Wert größer 40 ist...dann flackert das nicht so sehr.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.08.2014, 10:30
Beitrag #4
RE: RC-Fernsteuerung - Schaltunktionen halten
Hallo Thorsten und Bitklopfer,

das hilft mir schon weiter. Allerdings, blinken ohne Delay - über eine Zählschleife nach dem Motto Variable = Variable + 1?

Mal schauen wie ich das umsetze.

LG
Armin de DO1XXY
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.08.2014, 10:41
Beitrag #5
RE: RC-Fernsteuerung - Schaltunktionen halten
Hi,
ich weiß nicht genau, was Du meinst. Du musst halt den momentanen Status immer komplett statisch/global speichern. Zum Beispiel so:
Code:
void blinkerlinks() // Schleife Blinker Links val > 120
{
  static unsigned long lastChange = 0;
  unsigned long now = millis();
  if(now - lastChange < 500) return;
  lastChange = now;
  digitalWrite(bl, !digitalRead(bl));
}

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.08.2014, 13:26
Beitrag #6
RE: RC-Fernsteuerung - Schaltunktionen halten
Hallo Thorsten,

ich meinte das Delay (delay(500) für die Einhaltung der Blinkfrequenz, bzw. diese mit for(j=1;j<=500;j++)
digitalWrite(j,HIGH);
zu bewerkstelligen.

Ich habe mir die Anwendung von millis() angesehen und werde damit die Blinkfrequenz einstellen.

Und wieder etwas dazugelernt.

Gruß
Armin de DO1XXY



(19.08.2014 10:41)Thorsten Pferdekämper schrieb:  Hi,
ich weiß nicht genau, was Du meinst. Du musst halt den momentanen Status immer komplett statisch/global speichern. Zum Beispiel so:
Code:
void blinkerlinks() // Schleife Blinker Links val > 120
{
  static unsigned long lastChange = 0;
  unsigned long now = millis();
  if(now - lastChange < 500) return;
  lastChange = now;
  digitalWrite(bl, !digitalRead(bl));
}

Gruß,
Thorsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fernsteuerung mit RFM 12 B Tellen 9 2.037 06.09.2015 14:25
Letzter Beitrag: HaWe
  Zähler über RC-Fernsteuerung do1xxy 14 1.970 14.04.2015 20:44
Letzter Beitrag: do1xxy

Gehe zu:


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