Go Down

Topic: PWM-Signal auswerten (Read 10333 times) previous topic - next topic

Eisebaer

hi,

togglen heißt hin- und herschalten;

Code: [Select]

bool test;

void setup() {
  Serial.begin(9600);
  test = false;
}

void loop() {
  Serial.println(test);
  test = !test;
  delay(1000);
}


gruß stefan
nimm abblockkondensatoren!  100nF.  glaub mir, nimm abblockkondensatoren!

MaFu


2) zum Blinken ohne delay:
Code: [Select]
if (millis() - previousMillis > interval) {
Wieso ein ">", und nicht ein "="? Funktionierten tut letzeres ja auch!?

"=" wäre zu unsicher, gar nicht angewöhnen. Wenn der Code mal länger als eine Millisekunde dauern sollte, kann Dir passieren, dass die Bedingung nie eintritt weil millis() schon drüber ist.
Ich schreibs meistens so:
Code: [Select]
if (millis() - previousMillis >= interval)
_______
Manfred

Doc_Arduino

Hallo,

so mach ich das, TOOGLE ist bei mir die Hilfsvariable.

Code: [Select]

byte TOGGLE = 0;

-----------------------------------------------

if ...
  {
    TOGGLE ^= 1;
    digitalWrite(ledPin, TOGGLE);
   }
Tschau
Doc Arduino

Bluetruck

#48
Feb 25, 2013, 06:27 pm Last Edit: Feb 25, 2013, 08:33 pm by Bluetruck Reason: 1
@MaFu: Ok, hab ich mir fast so gedacht  XD

@Doc_Arduino:

Hm, versteh ich nicht ganz.
Code: [Select]
TOGGLE ^=1;
Was bewirkt das und was bedeutet das "^" ? Ist das das bitweise XOR?
Und muss ich da unbedingt mit bytes arbeiten? Weil da blick ich nicht durch  :smiley-mr-green:

Wat anderes: Hab jetzt mal Doc_Arduinos Rat befolgt. Allerdings wird die Hilfsvariable nicht bei jeder gültigen if-Bedingung zurückgesetzt, sondern alle erst in einer seperaten if-bedinung (Eingangssingal muss in in "Mittelstellung" sein) am Schluss. Da der loop-teil ja nahe zu in keiner Zeit durchläuft, reicht das ja auch.
Mein Problem ist: An sich funktioniert es, aber das Signal wird nicht eindeutig verarbeitet. Dh, wenn ich den Taster in meiner Fernbedingung drücke, geht die LED an, aber sofort wieder aus. Ich muss zB. längere Zeit drücken. Ist aber nicht immer. Manchmal geht sie auch wieder aus, wenn ich lange drücke. Beim ausschalten genau das gleiche.
Ich zeig euch mal meiner Code (noch ohne Toggle), vllt. sieht ja jemand was ?

Code: [Select]
void setup ()
{
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (3, INPUT);
}

void loop (){
 int a = pulseIn(3,HIGH,24000);//Ließt Eingangssignal
 boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf "true" gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der "Mittelstellung" ist, alle Hilfsvariablen wieder auf "false" gesetzt. Somit kann die LED wieder umgeschaltet werden.
 boolean vLED2 = false;//
 int iLED1 = digitalRead(5);//Ließt Status von LED1
 int iLED2 = digitalRead(6);

 //if-Bedinung für LED1
 if (a>1228 && a<1242 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
   digitalWrite (5,HIGH);//schalte Ausgang an
   vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in "Mittelstellung" und die LED bleibt an.
 }
 if (a>1228 && a<1242 && iLED1==HIGH &&  vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
  digitalWrite (5,LOW);
  vLED1 = true;
 }
   //if-Bedinung für LED2
 if (a>919 && a<930 && iLED2==LOW && vLED2 == false){
   digitalWrite (6,HIGH);
   vLED1 = true;
 }
 if (a>919 && a<930 && iLED2==HIGH &&  vLED2 == false){
  digitalWrite (6,LOW);
  vLED1 = true;
 }
     //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
 if (a>1490 && a<1505){
   vLED1 = false;
   vLED2 = false;
 }

}


Es liegt aber nicht am Empfang. Denn als ich es das erste mal mit delay() als verzögerung gemacht habe, hat es ja hinsichtlich dieses Problems super funktioniert.

Was mich verwundert hat: Warum muss ich die Variablen im loop-teil deklarieren, und kann sie nicht ganz am Anfang des Sketches hinschreiben? Denn da funktioniert es nicht.

EDIT Und noch ein Problem. Ich kann die LEDs nur schalten, wenn ich das USB-kabel verbunden habe !?
Mal meine Pin-belegungen:

5V+: 5V
Ground: ?
7V+: VI
Leds sind mit + am Arduino Ausgang und mit - an Ground angeschlossen.

Das Arduino ist schon angeschlossen, wenn ich das USB-kabel entferne, leuchtet die Blaue LED noch.

Warscheinlich ist die Lösung total einfach, bloß komm ich nicht drauf  :0

michael_x

#49
Feb 25, 2013, 11:28 pm Last Edit: Feb 25, 2013, 11:43 pm by michael_x Reason: 1
Quote
Was bewirkt das und was bedeutet das "^" ? Ist das das bitweise XOR?

Der Kandidat hat 100 Punkte. Und einen Extra-Bonus, weil er nicht nachgelesen, sondern geraten hat. Glückwunsch.

Quote
Und muss ich da unbedingt mit bytes arbeiten

Bytes sind die natürlichste Datengröße für einen 8-Bit Prozessor, und sie passen erstaunlich oft.

Aber du hast insofern recht, dass es hier eigentlich um LOW / HIGH geht.
In Arduino - C ist LOW = false = 0 und HIGH = true = 1.
Und boolean wird in Arduino-C in einem byte untergebracht.

Rein logisch gesehen ist ! der richtige toggle - Operator, und Doc_Arduino's  ^=1 mogelt, weil er weiss, dass in dem Byte nie was anderes als 0 oder 1 drinsteht.
( Ob das tatsächlich einen Zyklus schneller oder ein paar Byte kürzer ist, als was ein ordentlicher Compiler aus dem ! Operator macht, lassen wir mal offen )

Quote
Was mich verwundert hat: Warum muss ich die Variablen im loop-teil deklarieren, und kann sie nicht ganz am Anfang des Sketches hinschreiben? Denn da funktioniert es nicht.

Vielleicht solltest du doch mal ein bisschen Einführung in C lesen, sonst rätst du wieder richtig, was der Unterschied zwischen einer lokalen und einer globalen Variable ist...
Warum - Fragen wollen nicht wirklich eine Antwort, hab ich aus Erfahrung gelernt. Weil die Antwort nicht hilft, sondern eher zeigt, dass alles nicht so einfach ist.
Das Problem ist eher dein geheimnisvolles "Denn da funktioniert es nicht", was man nur mit "Sollte es aber" beantworten kann.

Quote
Und noch ein Problem. Ich kann die LEDs nur schalten, wenn ich das USB-kabel verbunden habe
... Leds sind mit + am Arduino Ausgang und mit - an Ground angeschlossen.

... und haben sicher einen Vorwiderstand , oder ?
Ein Arduino sollte auch mit 7V an Vin funktionieren. Da solltest du mal durch Eingrenzen/Vereinfachen klären, ob das an Stromversorgung / LED / Fernsteuerung oder was sonst liegt.



@michael_x:
Versteh ich nicht ganz. In der zweiten If-schleife schaltest du dann doch die LED automatisch wieder aus!? Was bringt mir das jetzt  XD

Ich weiß, dass ein goto nicht gern gesehen wird, aber sofern ich keine andere Möglichkeit habe, werde ich es wohl verwenden müssen.



Quote
Ich möchte die delay()-Schleife raus haben.

Du meinst dein pulseIn() ?


?? Ich versteh jetzt nicht, was die miteinander zu tun haben, bzw. wieso das pulseIn() gleich delay() sein soll

Tut mir leid, wenn ich mich ein wenig blöd anstelle....  =( XD


Ich habe kein delay in deinem Post gesehen, das einzige was eine Verzögerung reinbringt, ist das pulseIn, weil es wartet, bis ein neuer Puls von deiner Steuerung kommt.
Das zweite if in meinem Beispiel wird erst viele Zyklen später true, wenn das im ersten if gesetzte    
  start=millis();  
so alt ist, dass
  millis() - start > LED_DAUER
erfüllt ist.

( start kann für diesen Zweck übrigens keine einfache lokale Variable sein, um nochmal was verwirrendes zu deinem "Warum" beizutragen)


P.S. Kannst du bitte deinen Kommentar im vorigen Post in der Zeilenlänge kürzen, mein Bildschirm ist zwar 16:9 Full-HD, aber doch ein bisschen zu schmal um Text und scroll-Balken gleichzeitig zu zeigen.
PPS: War nur bei meiner Antwort störend, hat sich erledigt...

Doc_Arduino

Hallo,

ich tipp auch noch paar Worte zum Thema.

Genau, mit XOR kann man toggeln. Manchmal darf man übern Tellerrand schauen.   :)
Zum Bsp. hier:  http://www.mikrocontroller.net/articles/Bitmanipulation
Vieles davon steht auch im Manual zu unserem µC. Ist ja auch von AVR.

Byte deshalb, weil man für 0 oder 1 keinen größeren Speicherbereich deklarieren muß. Kannst auch long verwenden, geht auch, verschwendet nur kostbaren Speicher im µC. In ein Byte passen Werte bis 255 rein. Kannste nachlesen hier in der Referenz.

Wegen Dein Tastereffekten? Das könnte Tasterprellen sein und die delay Verzögerung hatte das zufällig unterbunden. Ist meine Vermutung. Was ich noch nicht ganz verstanden habe, nimmst Du nun einen analogen Knüppel oder digitale Taster?

Wegen Deiner Variablendefinition, ich vermute Du hast das ; vergessen? Oder unter setup reingeschrieben?
Dein Code geändert das am Anfang alle Variablen deklariert werden wird fehlerfrei übersetzt.

Code: [Select]

int a;
boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf "true" gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der "Mittelstellung" ist, alle Hilfsvariablen wieder auf "false" gesetzt. Somit kann die LED wieder umgeschaltet werden.
boolean vLED2 = false;//
int iLED1;
int iLED2;
 
void setup ()
{
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (3, INPUT);
}

void loop (){
  a = pulseIn(3,HIGH,24000);//Ließt Eingangssignal
 
  iLED1 = digitalRead(5);//Ließt Status von LED1
  iLED2 = digitalRead(6);

  //if-Bedinung für LED1
  if (a>1228 && a<1242 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
    digitalWrite (5,HIGH);//schalte Ausgang an
    vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in "Mittelstellung" und die LED bleibt an.
  }
  if (a>1228 && a<1242 && iLED1==HIGH &&  vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
   digitalWrite (5,LOW);
   vLED1 = true;
  }
    //if-Bedinung für LED2
  if (a>919 && a<930 && iLED2==LOW && vLED2 == false){
    digitalWrite (6,HIGH);
    vLED1 = true;
  }
  if (a>919 && a<930 && iLED2==HIGH &&  vLED2 == false){
   digitalWrite (6,LOW);
   vLED1 = true;
  }
      //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
  if (a>1490 && a<1505){
    vLED1 = false;
    vLED2 = false;
  }

}




Tschau
Doc Arduino

Bluetruck

#51
Feb 26, 2013, 08:07 pm Last Edit: Feb 26, 2013, 09:34 pm by Bluetruck Reason: 1
Zitate bring ich nicht, weil ich da irgendwie zu blöd dazu bin... XD

@michael_x:

Wieso, weshalb, warum ... XD

"^" Ich habe allerdings schon nachgelesen, und zwar unter den Referenzen. Aber ich verstehe nicht, wie das zusammen mit dem "=" funktioniert !? http://torrentula.to.funpic.de/dokumentation/bitweisesund/
Bedeutet das dann nichts anderes als "alles außer 1"?
Aber irgendwie versteh ichs nicht

Variable "TOGGLE" wird als 0 deklariert.
if...then: Setzte TOGGLE alles andere als 1 !? Gibt irgendwie keinen Sinn.
Schalte Ausgang: TOGGLE, also alles andere als 1 !? Gibt noch weniger Sinn.

Code: [Select]
byte TOGGLE = 0;

-----------------------------------------------

if ...
 {
   TOGGLE ^= 1;
   digitalWrite(ledPin, TOGGLE);
  }


Google sagt irgendwie auch nichts dazu. Deswegen muss ich hier so blöd fragen. Tut mir echt leid. Wenns irgendwo schon beschrieben ist, könnt ihr mir ja vlt. einen Link geben.


Zu den Variablen: Ich bin mir bewusst, dass, wenn ich sie ganz am Anfang hinschreibe, für setup und loop teil gilt, und wenn ich sie im loop teil definiere, der setup teil nicht zugreifen kann. Als erstes hab ich sie ganz am Anfang (noch vor setup) definiert. LEDs haben nicht geleuchtet. Dann in den loop-teil - LEDs konnte ich schalten.
Und psychologische Antworten bringen mir bei meinem Problem auch nicht viel XD

Zu dem USB-Problem:
An der Stromversorgung liegt's nicht. Da kommt überall die richtige Spannung.
Was mir gerade aufgefallen ist: Das USB kabel ist zum Schalten der LED wichtig. Ist sie einmal an, kann ich das Kabel abstecken und der Ausgang bleibt an.
Ich denke, ich hab irgendwo einen total einfachen Fehler, komm aber nicht drauf.

Weil du kein delay() gesehen haben möchtest: http://arduino.cc/forum/index.php/topic,148970.msg1120028.html#msg1120028 XD

Zum Beispiel: Aber das bringt mir doch immer noch nichts. Ich will die LED ja selber wieder ausschalten und nicht nach einer bestimmten Zeitspanne.

@doc_arduino:

Es sind digitale Taster. Jeder Taster (ich arbeitet zZt. mit 4 Stück) hat einen Wiederstand (Werte weiß ich jetzt nicht ganz genau) vorgeschalten. Je nachdem, wie groß der Wiederstand ist, desto länger/kürzer wird das Signal, was von der Funke zum Modell geschickt wird und schließlich auch vom Empfänger zum Servo, bzw. hier zum Arduino übertragen wird.

Alle Fehlerquellen, die mit schlechtem Kontakt, schlechten Schaltern und Wiederständen oder schlechter Funkübertragung bzw. dem pulseIn() zu tun haben, kann man getrost ausschließen. Denn das problem wäre dann auch bei der "delay-version" aufgetreten. Habs grade nochmal ausprobiert. Ein kurzer Tasterdruck(wirklich kurz), und die LED schaltet zuverlässig an/aus.
Ich gehe davon aus, dass in der Programmierung der Fehler liegt.

Wegen den Variablen: Siehe oben. Ich hab sie eins zu eins kopiert. Zweitens käm sonst beim kompillieren ja auch eine Fehlermeldung.

Doc_Arduino

Hallo,

okay, bevor ich Dir jetzt Toogle bzw. XOR erkläre muß ich wissen ob Du Dich mit Digitaltechnik überhaupt schon einmal befasst hast? Also genau weist wie AND, OR, NAND, NOR funktioniert? Das sind die Grundfunktionen. Alles andere baut darauf nur auf. Klingt vielleicht erstmal einfach, man muß es aber verstanden haben. Ich meine, man muß wissen was einem eine Wahrheitstabelle sagt.
Oder es hängt bei Dir nur an dem Zeichen ^=  ?
Das ist einfach nur das Zeichen für die logische XOR Verknüpfung. Ich meine wenn 2 * 2 = 4 da steht fragt auch niemand was * bedeutet. Irgendwas mußten sich die Programmierer der Compiler ausdenken, meine ich, wie man XOR ausdrücken kann. Ich muß auch hin wieder nachlesen wie man was schreibt, also was der Syntax in C-Sprache ist.
Tschau
Doc Arduino

michael_x

#53
Feb 26, 2013, 10:20 pm Last Edit: Feb 26, 2013, 10:43 pm by michael_x Reason: 1
Quote
Aber ich verstehe nicht, wie das zusammen mit dem "="

Das ist ein C - Trick, der es evtl. auch den ersten nicht so gut optimierenden Compilern einfacher machen sollte.

Statt a = a+10; kann man auch a+=10; schreiben : addiere 10 zur Variablen a.
Dies geht mit den meisten Prozessoren einfacher als wenn links und rechts des = verschiedene Variablen stehen. ( y = x+10 )

Das funktioniert nun nicht nur mit +, sondern mit allen ähnlichen Operatoren, unter anderem auch dem "bitweisen xor"  ^

toggle ^= 1; // invertiere in "toggle" das Bit mit der Wertigkeit 1  
d.h. aus 1 wird 0 und aus 0 wird 1 ,  aus true wird false und umgekehrt.
 
Aber aus 2 wird 3 und aus 3 wird wieder 2, und -noch verrückter-  aus -1 ( 0xFF ) würde -2 ( 0xFE oder 254 )
und alle diese 4 Werte würden als true und damit HIGH interpretiert werden, also Vorsicht, Doc.


Entschuldige, dass du so viel Mühe hast, mir deine zwei delays zu zeigen. Ja, ich habe mir den Link genau genug angesehen, um die 2 Sekunden-Pausen zu sehen.
Ich habe allerdings auf   Reply #38 on: February 16, 2013, 02:39:17 PM »  geantwortet. ;)



Quote
Psychologische Antworten bringen mir bei meinem Problem auch nicht viel

;) Du musst auch ein bisschen an die anderen denken ;)

Wenn man sich diesen Thread mal ansieht, hat sich seit
      if (a>1450 && a<1500 && LED2v=LOW)
doch schon einiges getan.

Aber dass der Arduino sich bei ausreichender Stromversorgung mit 7V an Vin sich total anders verhält als bei USB - Versorgung, ist sehr seltsam.
Vor allem, dass alles weiter geht, nur der LED Zustand sich nicht mehr verändert.

Was total blödes, ist gut möglich, aber was, kann ich so auch nicht raten.
Daher mein Vorschlag: vereinfachen, Teile einzeln testen.

Wenn du den Effekt (LED bleibt an wenn der sketch mit Vin-Stromversorgung läuft, LED lässt sich mit dem gleichen sketch steuern, wenn der Arduino an USB hängt)
in einer möglichst einfachen Umgebung reproduzieren kannst ( und dann nicht selbst verstehst ;)  ) mach einen neuen Thread auf, mit Hardware-Beschreibung (Schaltung) und dem Einfach-Sketch.

 

Doc_Arduino

Hallo,



toggle ^= 1; // invertiere in "toggle" das Bit mit der Wertigkeit 1  
d.h. aus 1 wird 0 und aus 0 wird 1 ,  aus true wird false und umgekehrt.
 
Aber aus 2 wird 3 und aus 3 wird wieder 2, und -noch verrückter-  aus -1 ( 0xFF ) würde -2 ( 0xFE oder 254 )
und alle diese 4 Werte würden als true und damit HIGH interpretiert werden, also Vorsicht, Doc.


Die Erklärung ist vielleicht etwas zu kurz gefasst. Aus 2 wird nur 3 und umgekehrt wenn die zu toggelnde Variable vorher den Wert 2 oder 3 hatte und man mit der Wertigkeit 1 toggelt.
Wie Du allerdings auf negative Werte kommst verstehe ich auch nicht. 0xFF ist immer noch 255 und nicht -1.   :~ 

@ Bluetruck:
Wenn Du mal rumspielen willst mit dem toggeln, egal mit welcher Methode, dann lade Dir mal den Simulator runter
http://www.arduino.com.au/Simulator-for-Arduino.php

und nimm erstmal folgenden Code und schaue Dir im Input/Output Fenster an was ausgegeben wird. Dann änderst Du den Wert von der Variablen WERTIGKEIT und später den Wert der Variablen WERT und guckst was passiert. Alles zwischen 0 ... 255. Gut wäre es wenn Du Dir vorher überlegst was passieren müßte und dann überprüfst ob das stimmt.

Du kannst das natürlich auch immer in Deinen µC flashen und in der IDE anschauen. Allerdings nicht wundern im IDE, hier werden nur die untersten Bits ausgegeben bis zu letzten enthaltenen 1. Den Rest der Nullen der höherwertigen lässt er weg. Also wenn 00001111 ausgegeben wird, erscheint nur 1111. Deshalb habe ich als Startwert 255 gewählt, dann bleibt erstmal die binäre Optik erhalten.

Code: [Select]

byte WERT = 255;
byte WERTIGKEIT = 1;       // welches Bit oder Bits werden getoggelt

void setup()
{     
     Serial.begin(9600);     
}

void loop()
{

  WERT = WERT ^ WERTIGKEIT;            // toggeln mit Wertigkeit x
  Serial.println(WERT, BIN);                 // BIN = binäre Ausgabe

  delay(1000); 
}


und Entschuldigung wegen der Schreibweise ^=. Dass das die Kurzform ist, daran hatte ich in dem Moment nicht gedacht.  TOGGLE = TOGGLE ^ 1 ist das gleiche wie TOGGLE ^= 1
Tschau
Doc Arduino

Bluetruck

So,
Problem 1, also das Prob. mit dem USB, konnte ich lösen. Lag daran, dass der pulseIn() Bereich zu klein war.
2. Problem, toggle, ist jetzt vorerst nicht so wichtig. Irgendwie muss ich mich da mal länger damit beschäftigen.

Mein größtes Problem (motivierender: Hinderniss   :smiley-mr-green:), ist, dass wie gesagt die LED nicht korrekt schaltet.
Mit einem anderen Bereich des pulseIn() konnte ich es nicht lösen, auch andere Variablen haben nichts erbracht.
Hat da jemand eine Idee?


Bluetruck

Nach einer langen Pause hab ich mich mal wieder mit dem Thema auseinandergesetz. Mit meinem Dad hab ich folgende Grundidee entwickelt: Wenn ich einen mechanischen Schalter betätige, entsteht anfangs nie ein exakt genaues Signal (Funke). Erst mit der Zeit (ein paar millisekunden). Das erste falsche Ergebnis reicht aber aus, um meine bisherige Schaltung zu manipulieren. Also: die if-gleichung wird erst dann in Kraft gesetzt, wenn das eingangssignal (pulseIn) seit ein paar ms konstant ist.



Wie ihr seht, hab ich hier einige Probleme. zum einen, wie ich die erste if-gleichung verwirkliche. Also das mit der maximalen Abweichung von p1. Das zweite Problem ist das "goto". Das goto funktioniert ja nur innerhalb einer Funktion, also nicht übergreifend. Ich weiß, das wird nicht gern gesehen, aber ich sehe hier keine andere Lösung.

Das Bild ist jetzt ein ganz einfacher Gedankenentwurf, bitte schimpft nicht, wenn ich das nicht so formal korrekt habe.

Serenifly

#58
Jul 21, 2013, 04:00 pm Last Edit: Jul 21, 2013, 06:59 pm by Serenifly Reason: 1
Code: [Select]

bool func()
{
    if( (p2 > p1 - p1/10.0) && (p2 < p1 + p1/10.0) )
    {
    }
    else
    {
          return false;
    }


    if(z == 5)
    {
    }
    else
    {
        return true;
    }

    return true;
}


Code: [Select]

if(func() == true)
{
}
else
{
}



So ähnlich. Wichtig dabei ist dass jeder Weg im Code einen return-Wert zurückgegeben muss. Deshalb das "return true" am Ende wenn b beide Bedingungen "true" sind. Wenn mehr als zwei Rückgabe-Zustände gebraucht werden kann man auch ein Byte zurückgeben und dann auf eine Zahl abfragen.

Wenn du solange etwas machen willst bis eine bestimmte Bedingung eintritt geht das aber auch einfach mit einer while-Schleife. z.B. kannst du solange die Funktion aufrufen bis sie "true" zurückgibt (while(func() == false {}). Das machst du wenn "z == 5". Ansonsten gibst du "false" zurück.

Aber ist das nicht unnötig? Wenn du einen Taster entprellen willst kannst du einfach nach der ersten Abfrage mit digitalRead() ein kurzes Delay machen. 10-20ms reichen da. So super genau muss das nicht sein. Es gibt auch eine Library dafür:
http://playground.arduino.cc//Code/Bounce

TERWI

#59
Jul 21, 2013, 04:59 pm Last Edit: Jul 21, 2013, 06:31 pm by TERWI Reason: 1
Sehr interessant hier mitzulesen !

Ich bin auch Hobby-RC-ist (Heli) und beschäftige mich seiner geraumer Zeit wieder damit.
Nachdem ich den Arduino hier sehr positiv kennen gelernt habe und seine Eigenschaften sehr zu schätzen weiß, soll der logo auch am Hubi ran.
Neben 1000 Ideen u.a. zum Ersatz des alten Gyro's mit neuen Teilen (6050,5883,BMP180) soll auch wie hier gefordert die gute alte Fernsteuerung (Robbe FX18, 8-Kanal) ein bischen gepimt werden und z.b. wie Bluetruck es möchte durch mehere Schaltkanäle ergänzt werden.

Dafür gibts es zwar von Robbe (alt !) entsprechende Module wie z.b. den Multi-Switch 16 Decoder Memory, aber so ein Teil kostet heute immer noch locker deutlich mehr als 100 Taler-Euronen .... Also: selber machen !

Extrem genial wäre z.b.  einen noch freien Kanal (ich hab hier 8, 5 werden zwingend benötigt, einer wird als "10er-Schalter" missbraucht  und einer als "Werte-Kanal" für alles Mögliche -> 1 ist noch frei) durch die "Schalter" das PWM-Signal an verschiedene Ausgänge zu leiten und somit noch mehr Servos steuern zu können als eigentlich möglich. Natürlich nicht zeitkritisch für das Modell !
(Ja, auch das gabs es früher schon von Robbe & Co. - allerdings ebenfalls nicht grade preiswert !

Neben den erforderelichen Korrekturen der Steuersignale für meinen Heli (hier Roll, Pitch, Nick, Tail und Motor) durch zu implementierende Gyro, Kompass und Narometer müssen neben den o.g. Dingen halt alle 8 Signale der Fernsteuerung zunächst eingelesen und dann ggf. "behandelt weitergegeben werden.
(.... ja, so was wie MultWii für Arme / normale Heli-Flieger - ich werde draus abkupfern ...  :.)

Mit "pulseIn" kommt man da aber anscheinend nicht sehr weit - ich hab mal rumgeguckt und das hier für dass richtige entschieden:
http://playground.arduino.cc//Code/ReadReceiver (Auslesen aller Kanäle einer RC-Fernbedienung mit PWM am Empfänger-Ausgang)
In Kombination mit der Servo-Lib (Arduino-Intern) und modifiziertem Timer dazu sollte das schon sehr gut funzen ....

Die Idee, anstatt eines 'Knüppels" mit gleitendem PWM durch einen Schalter mit festen PWM-Zeiten zu ersetzen finde ich schon sehr genial !
Natürlich muss man da eine wie hier beschriebene "Toggle"-Variable haben, um zu definieren, ob der Zustand bereits gesetzt wurde oder nicht oder zurück.
... ich würde das ehrlich gesagt auch schon 2x nacheinander Prüfen - zur Sicherheit.
... logo schliesst das ein sicheres Ausschließen von Tastenprellen nicht aus (senderseitig)


To young to die - never to old for rock'n roll

Go Up