Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

41

Sonntag, 3. Dezember 2017, 21:30

Hallo,

Zitat

....verarbeiten eines Empfängersignals......

Was meinst du damit ?
Könnte z.B. das Einlesen eines kompl. CPPM-Signals sein....
oder das Einlesen eines Empfänger-Ausgangs-Signals ("Servo-Signal")....
oder das Einlesen mehrerer Empfänger-Ausgänge....
oder....
der Leser darf raten.

Alle "includes" stehen immer ganz am Anfang eines sketches. Sie gehören zu den sog. Compiler-Anweisungen, daher auch das vorgestellte "#".
includes sagen dem Compiler, wo er bestimmte Routinen findet, falls er sie braucht (wenn sie irgendwo im sketch vorkommen)

Du könntest auch mal z.B. unter "arduino rc receiver.h" googeln; da gibt's eine Menge zu lesen.

Wenn's nicht nur um das einfache Einlesen eines einzelnen Empfänger-Ausgangs geht, dann hast du dir (für den Einstieg) schon ziemlich viel vorgenommen. Zusätzlich musst du ja mit dem eingelesenen Signal ja auch noch was anfangen....

Gruß,
Helmut

42

Sonntag, 3. Dezember 2017, 21:33

Hi Helmut

Ich will bei meiner Steuerung einen Schalter umlegen und damit mein Programm starten, also "Einlesen eines Empfänger-Ausgangs-Signals ("Servo-Signal")".

Gruss Waspy

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

43

Sonntag, 3. Dezember 2017, 22:31

Dann wäre die Verwendung von "pulseIn()" erheblich einfacher. Dazu brauchst du keine include-files.
Schau mal in die "Language Referenz" der Standard-Funktionen vom Arduino, da ist "pulseIn()" beschrieben.
In Abhängigkeit vom Wert des eingelesenen Signals (in µs) setzt du dann einen Ausgang auf Hi oder Low.

Du kannst dir den eingelesenen Wert z.B. auch mit dem "Serial Monitor" ansehen. Einfach im loop mit "Serial.println(Impulslänge)" ausgeben. Aber im Setup die Initialisierung von "Serial" nicht vergessen; "Serial.begin(baudrate)". 9600 oder 19200 sind Standardwerte dafür. Das steht aber alles ausführlich in der "Reference".

Gruß,
Helmut

44

Montag, 4. Dezember 2017, 12:42

Hallo Helmut

Ja vom pulseIn() habe ich schon gelesen, jedoch stand da auch dass es zum "Empfänger auslesen" nicht so geeignet ist. Warum weiss ich jetzt nicht mehr. Aber wenn du meinst, dass es auch so klappen würde dann behalte ich das mal im Hinterkopf. Dann habe ich einen Plan B, falls das was ich jetzt habe nicht klappen würde.
Das mit dem Serial Monitor wollte ich auch noch ausprobieren, da ersparrst du mir jetzt das suchen.

Danke und Gruss
Waspy

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

45

Montag, 4. Dezember 2017, 13:39

Waspy,
"pulseIn" funktioniert nur dann nicht, wenn man 2 direkt aufeinander folgende Kanäle auslesen will. Das liegt daran, daß die vordere Flanke des zweiten Kanals zeitlich (fast) direkt mit hinteren Flanke des ersten Impulses zusammen fällt; das gibt dann einen Konflikt. In allen anderen Fällen geht pulseIn einwandfrei. Deswegen hatte ich gefragt, was du machen willst. Du würdest dich wundern, wie einfach pulseIn geht....
Aber es ist deine Entscheidung- wenn du's gerne kompliziert haben willst, dann mach' mal.

Gruß,
Helmut

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »haschenk« (4. Dezember 2017, 13:49)


Flat

RCLine User

Wohnort: Raum Hannover und zunehmend Raum Hamburg

Beruf: Angestellter auf Lebenszeit bei der Deutschen Rentenversicherung

  • Nachricht senden

46

Mittwoch, 6. Dezember 2017, 13:20

Jetzt habe ich mal zwei Fragen:

1. Ich möchte mehrere Ausgänge abhängig von einen Eingang gleichzeitig schalten. Momentan habe ich für jeden Ausgang eine Zeile, das geht doch bestimmt einfacher, aber ich finde nichts darüber.

2. Eine Reihe von LEDs soll mit 3 verschiedenen Sequenzen angesteuert werden. Alle 3 Sequenzen laufen einzeln einwandfrei. Aber wie kann ich innerhalb eines Programms alle Sequenzen abhängig von diversen Eingängen anwählen?
viele Grüsse

Bernd

Das Ganze ist mehr als die Summe seiner Teile (Aristoteles)

Die Anrede "Jungs" gilt im Rahmen der Vereinfachung für Personen beiderlei Geschlechts. :D

BOcnc

RCLine Team

Wohnort: 26349 Jade

  • Nachricht senden

47

Mittwoch, 6. Dezember 2017, 13:30

Sind die Ausgänge alle am gleichen Port. Dann kannst du ein Byte an dem Port Ausgeben.
Wenn nicht bleiben nur mehrere Befehle.
Ich habe nicht genug Geld um billig einzukaufen.

48

Mittwoch, 6. Dezember 2017, 13:31

Hi

Wenn ich das richtig verstanden habe benötigst du wohl für Punkt zwei eine if/else - Abfrage oder eine switch case - Abfrage.
Punkt 1 kannst du vermutlich mit einer for-Schleife machen indem du alle Ausgänge in ein Array packst und dann dass Array durchgehst.

Aber mal sehen was andere dazu meinen.

Gruss Waspy

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Waspy« (6. Dezember 2017, 13:37)


Flat

RCLine User

Wohnort: Raum Hannover und zunehmend Raum Hamburg

Beruf: Angestellter auf Lebenszeit bei der Deutschen Rentenversicherung

  • Nachricht senden

49

Mittwoch, 6. Dezember 2017, 13:59

Sind die Ausgänge alle am gleichen Port. Dann kannst du ein Byte an dem Port Ausgeben.
Wenn nicht bleiben nur mehrere Befehle.

Gute Idee, ich kann die alle auf den Port D legen. Zum programmieren habe ich hier was gefunden: http://www.netzmafia.de/skripten/hardwar…nipulation.html
viele Grüsse

Bernd

Das Ganze ist mehr als die Summe seiner Teile (Aristoteles)

Die Anrede "Jungs" gilt im Rahmen der Vereinfachung für Personen beiderlei Geschlechts. :D

Flat

RCLine User

Wohnort: Raum Hannover und zunehmend Raum Hamburg

Beruf: Angestellter auf Lebenszeit bei der Deutschen Rentenversicherung

  • Nachricht senden

50

Mittwoch, 6. Dezember 2017, 14:13

Wenn ich das richtig verstanden habe benötigst du wohl für Punkt zwei eine if/else - Abfrage oder eine switch case - Abfrage.

If/else ist klar, aber bei BASIC gibt es da den GOTO Befehl. Den entsprechenden finde ich für den Arduino nicht. Gibt ja auch keine Zeilennummern.
In Basic wäre es einfach:
10 If A=1 then goto 200 else goto 20
20 if B=1 Then goto 300 else goto30
30 if C=1 Then goto 400 else goto10
200 Subprogramm 1
210 goto 10
300 Subprogramm 2
310 goto 10
400 Subprogramm 3
410 goto 10
viele Grüsse

Bernd

Das Ganze ist mehr als die Summe seiner Teile (Aristoteles)

Die Anrede "Jungs" gilt im Rahmen der Vereinfachung für Personen beiderlei Geschlechts. :D

a_rueckert

RCLine User

Wohnort: Kaiserslautern / Germany

Beruf: Software Engineer

  • Nachricht senden

51

Mittwoch, 6. Dezember 2017, 14:21

Es gibt in C u.a. Funktionspointer. Du kannst damit auch ein Array von Funktionen anlegen und abhängig von einem Wert eine Funktion in dem Array aufrufen.
Heli: Twister CP V2,Carbooon CP,T-Rex 450 S-CF,CopterX,T-Rex 600 CF,T-Rex 600 ESP,DF64C
Fläche: Jede Menge Flächenmodelle aus alten Tagen
Futaba FX 18 V2, Robbe Terra Top

BOcnc

RCLine Team

Wohnort: 26349 Jade

  • Nachricht senden

52

Mittwoch, 6. Dezember 2017, 14:39

Man kann auch einen Label und goto benutzen. Macht man aber nicht.

z.B

if (A == 1) goto hierher;
hierher:

oder so ähnlich.

A = 1 bedeutet das A den Wert 1 bekommt.
Ein vergleich geht so A == 1

Oder so

if (A == 1) Subprogramm1();
else
{
if (B == 1) Subprogramm2();
else
{
if (C == 1) Subprogramm3();
}
}


Wobei ich denke das man die else weglassen kann. Dafür müsste man aber genau wissen was programmiert werden soll
Ich habe nicht genug Geld um billig einzukaufen.

Flat

RCLine User

Wohnort: Raum Hannover und zunehmend Raum Hamburg

Beruf: Angestellter auf Lebenszeit bei der Deutschen Rentenversicherung

  • Nachricht senden

53

Mittwoch, 6. Dezember 2017, 15:22

Ich verstehe, einfach das Subprogramm direkt hinter der Abfrage.
Trift die nicht zu geht es weiter zur nächsten Abfrage usw.
viele Grüsse

Bernd

Das Ganze ist mehr als die Summe seiner Teile (Aristoteles)

Die Anrede "Jungs" gilt im Rahmen der Vereinfachung für Personen beiderlei Geschlechts. :D

BOcnc

RCLine Team

Wohnort: 26349 Jade

  • Nachricht senden

54

Mittwoch, 6. Dezember 2017, 17:09

Und wenn du von BASIC kommst musst du aufpassen das C zwischen kleinen und großen Buchstaben unterscheidet. BASIC nicht glaube ich.

b ist als was anderes als B
Ich habe nicht genug Geld um billig einzukaufen.

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

55

Mittwoch, 6. Dezember 2017, 18:04

Hallo Bernd,

eigentlich müsste ich jetzt eine Unmenge schreiben, um deine Frage(n) erschöpfend zu beantworten. Mach' ich aber nicht; in der Arduino-"Reference" sind alle Befehle aufgeführt, und bei deren Anklicken wird jeder Befehl ausführlich beschrieben, meistens noch mit Beispiel.
Wenn du damit nicht klarkommst, bitte hier immer nur eine Frage stellen, die ich dann gerne beantworte.

Kurz gesagt:
Die I/Os, die man benützen will, müssen zuerst im "setup" definiert werden (mit "pinMode", OUTPUT oder INPUT). Die Pins haben in "Arduino" alle eine Nummer, bei den "digitalen" von 0 bis 13, bei den "analogen" von A0 bis A5. Man kann -aber sollte nicht- jede Nummer verwenden, weil ein Teil der zugehörigen Pins auch noch alternative Funktionen hat, die dann natürlich wegfallen. Auf den digitalen 0 und 1 liegt z.B. auch seriell Tx und Rx, auf 2 und 3 liegen die Hardware-Interrupts INT0 und INT1. Auf 13 liegt die "onboard-LED". Alle andern sind zunächst frei verwendbar, solange man nicht I2C oder SPI braucht.
Auch die "analogen" können als "digitale" verwendet werden (eigentlich ist die Analog-Eingangs-Funktion sogar auch so eine "Nebenfunktion" ( s. Datenblatt vom Mega328 o.ä.); das sagen die Arduino-Entwickler nur nicht, um die "Einfachheit" nicht zu gefährden). Manche Programmierer geben den I/Os ganz zu Programmbeginn (vor dem setup) mit #define noch Namen (z.B. #define Licht1 4 oder #define Licht2 A3), dann kann man im weitere Verlauf immer diese Bezeichnungen statt der Nummern verwenden.

Ich nehme jetzt mal an, daß "pulseIn( ) bei dir in der "loop" schon läuft. Das liefert dir die Impulsdauer in µs, nominell irgendwo zwischen 1000 bis 2000.
Danach machst du Abfragen der Impulsdauer mit der "if-Bedingung" ("then" gibt's in C nicht, da unnötig, "else" ist machmal zweckmäßig, aber meistens auch unnötig, weil das Programm einfach weiter abgearbeitet wird, wenn die if-Bedingung nicht erfüllt ist)

Nach der if-Bedingung (in runden Klammern !) dann eine "geschweifte Klammer auf"; danach folgt alles, was bei erfüllter if-Bedingung geschehen soll (können auch mehrerer Zeilen sein), und zum Schluß dann "geschweifte Klammer zu". So etwas nennt man einen "Anweisungs-Block".
Danach kann dann eine weitere Bedingung mit Block folgen, usw.
"Eleganter" geht's mit "switch", aber das beschreibe ich jetzt nicht....

Die I/Os setzt du in den o.e. Blöcken am einfachsten einzeln mit digitalWrite (Nummer, HIGH oder LOW). Von den in den anderen posts erwähnten "PORT"-Befehlen und "Bit-Manipulation" dabei rate ich dir erstmal ab; das ist zwar professioneller, aber man kann dabei leicht Fehler machen. Mit dieser Methode kannn man auch erreichen, daß alle I/O's exakt zum gleichen Zeitpunkt geschaltet werden (braucht man manchmal), das brauchst du aber wahrscheinlich nicht. Mit den einfachen "digitalWrite"s werden dann die einzelnen I/Os (bei dir LEDs) ein paar µs nacheinander beeinflußt.

Noch kurz zu "pulseIn( ): Dazu wird im Internet oft Mist geschrieben (Programm kann "hängen" o.ä.). Es stimmt, pulseIn macht "polling" (ständige Abfrage). Aber pulseIn kann man mit 2 oder 3 Parametern Aufrufen: pulseIn(PInNr, Impuls HIGH oder LOW), oder mit 3 Parametern pulseIn(PinNr, Impuls HIGH oder LOW, timeout). Mit "timeout" kann man (in µs) angeben, wie lange pulseIn versucht, einen Impuls einzulesen. Wenn dann keiner bzw. keine Flanke mehr kommt, dann bricht pulseIn die Abfrage ab, liefert ein "0" als Ergebnis (kann man auswerten) und das Programm läuft weiter.

Wenn jetzt noch Detail-Fragen sind, meldest du dich wieder.

Noch ein Buchtip:
Michael Margolis, "Arduino Cookbook", O'Reilly Media Inc, 700 Seiten, ca. 45 USD
Man kann es auch kostenlos runterladen und ausdrucken, aber bei 700 Seiten ist das keine Option...
In diesem Buch werden Aufgaben wie oben genannt ausführlich dargestellt und erklärt. Mehr wie immer mit Google oder Amazon.

Gruß,
Helmut

BOcnc

RCLine Team

Wohnort: 26349 Jade

  • Nachricht senden

56

Mittwoch, 6. Dezember 2017, 18:42

Hallo Helmut,

das mit switch hatte ich schon geschrieben und wieder gelöscht.

switch geht nur mit einer variablen oder? Hier sind es aber 3. A B C
Oder habe ich da eine Wissenslücke?

Ja die Beschreibungen.
Es ist bestimmt schon 15 - 20 Jahre her als ich versucht habe unter Windows zu programmieren. Dafür habe ich mir Bücher ohne ende gekauft.
Verstanden habe ich aber nichts. Erst als ich wusste wie es geht habe ich auch die Bücher verstanden.

Gruß
Werner
Ich habe nicht genug Geld um billig einzukaufen.

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

57

Mittwoch, 6. Dezember 2017, 19:53

Hallo Werner,

da hast du mich jetzt "kalt erwischt". Ich muß gleich für ein paar Stunden außer Haus, daher nur schnell:
Ich werde später dann mal den "K-R" (Kernighan/Ritchie, "Programmieren in C", die absolute Referenz für C) rausholen.
Antwort -evtl. mit Beispiel- kommt noch, vielleicht erst morgen.

Gruß,
Helmut

Flat

RCLine User

Wohnort: Raum Hannover und zunehmend Raum Hamburg

Beruf: Angestellter auf Lebenszeit bei der Deutschen Rentenversicherung

  • Nachricht senden

58

Mittwoch, 6. Dezember 2017, 20:46

Danke für eure Hilfe. :ok:
Durch die Portausgabe kann ich die Programme drastisch verkleinern.
Alle drei laufen einzeln einwandfrei.
Momentan sind beim Start alle 6 LEDs aus und beim Tastendruck läuft die LED-Sequenz.
Ohne Tastenbetätigung gehen wie geplant sofort alle LEDs aus.
Nur durch diese ganzen Versuche verstehe ich langsam die Logik vom Arduino.
Das zusammenführen der drei Sequenzen kommt dann auch noch irgendwann. :)
Ist etwas gewöhnungsbedürftig wenn man von der BASIC Seite kommt.
Aber das wird schon, schließlich habe ich vor knapp 30 Jahren als S5 Anfänger auch meine Rolladensteuerung mit einer S100U irgendwann hingekriegt.
viele Grüsse

Bernd

Das Ganze ist mehr als die Summe seiner Teile (Aristoteles)

Die Anrede "Jungs" gilt im Rahmen der Vereinfachung für Personen beiderlei Geschlechts. :D

BOcnc

RCLine Team

Wohnort: 26349 Jade

  • Nachricht senden

59

Mittwoch, 6. Dezember 2017, 20:55

Vielleicht erklärst du uns was du unter zusammenführen versteht. Bis jetzt weis ich noch nicht was du willst.

Auf Tastendruck läuft eine Sequenz. Ich denke du möchtest mehrere Tasten gleichzeitig drücken können oder?
Ich habe nicht genug Geld um billig einzukaufen.

Flat

RCLine User

Wohnort: Raum Hannover und zunehmend Raum Hamburg

Beruf: Angestellter auf Lebenszeit bei der Deutschen Rentenversicherung

  • Nachricht senden

60

Mittwoch, 6. Dezember 2017, 21:17

Moin Werner,
ich habe 6 LEDs die in 3 verschiedene Sequenzen leuchten sollen.
Also habe ich 6 Ausgänge (Port D) und drei Eingänge.
Mit einen Taster wird das ganze gestartet, und nur solange die Taste gedrückt wird läuft die Seq.
Mit 2 Dipschaltern wird vorher ausgewählt welche Sequenz laufen soll:
Alle Schalter auf Low = Seq. A
Schalter 1 auf High = Seq. B
Schalter 2 auf High = Seq. C
Es läuft also immer nur eine Seq. abhängig vom "Mäuseklavier".
Das ist mein Ziel, alle drei Seq. laufen einzeln bereits
viele Grüsse

Bernd

Das Ganze ist mehr als die Summe seiner Teile (Aristoteles)

Die Anrede "Jungs" gilt im Rahmen der Vereinfachung für Personen beiderlei Geschlechts. :D

Ähnliche Themen