Arduino UNO RC Empfänger Libraries Probleme

Hallo.

Ich bin neu hier und möchte mich mal kurz vorstellen: Ich heiße Markus und mein Hobby ist der Funktionsmodellbau.

Wie das so in einem Hobby ist: Man gibt viel Geld auch für den möglich geringsten Nutzen.
Somit habe ich schon sehr viel Geld in mein Hobby investiert bis mich ein Bekannter auf den Arduino gebracht hat um bewegungen am Modell zu verwirklichen.

Ich baue zwar nicht viele Modelle, aber dafür große mit ausgefeielter Technik, grade zum beispiel an einer Tirpitz in 1:100.

Jetzt aber mal zu meinem Problem, bis jetzt habe ich immer so gearbeitet das ich bestimmte bewegungen per knopfdruck habe ablaufen lassen, nun wollte ich aber die Geschütze auf meinem Riesen selber steuern können.

Das soll ungefähr so laufen.
An meiner Fernbedienung habe ich 3 Potis die das Signal an dem Empfänger übertragen.
Jetzt wollte ich das so machen das ich 2 Geschütze sich per Servo drehen wenn ich an einem Poti drehe. Das vordere sollte etwas verzögerter sich drehen wie das zweite und ab einem bestimmten winkel sollten sich dann die Geschützrohre heben. Spricht insgesammt sollen 4 Servos angesteuert werden mit nur einem Kanal. Drehwinkel X 2 und heben/senken X 2 mit verzögerung und verlangsamen.

Jetzt aber zu meinem Problem:

Im Internet habe ich eine Libraries gefunden die sich RCReceiver nennt. Wenn ich diese aber importiere bekomme ich aber nur eine Leerzeile, bei der Servo libraries kommte dann ja die Kommandozeile mit #include <Servo.h> aber bei der anderen nicht.

Wenn ich aber ein Beispiel nehme habe ich den Text aber er kann die .h datei nicht finden.

Woran kann das liegen das die Libraries nicht instaliert werden?
Gibt es andere Libraries die dafür gut sind und mir da beispiele geben?
Was brauche ich den genau um das zu verwirklichen?

MFG Markus

Hallo,

herzlich willkommen.

Welche Librarys hast herunterladen? Link?

Hallo,

die Libraries habe ich von http://www.rcarduino.tk/ geladen. Hoffentlich hilf euch das mein Problem mit mir zu lösen

MFG Markus

Hallo,

tut mir leid, aber ich finde dort keine Librarys. Haste einen direkten Link?

Hallo,

http://wkla.no-ip.biz/downloader/download.php?ID=55
ich hoffe das geht.

und einmal als installdatei:
http://wkla.no-ip.biz/downloader/download.php?ID=50

Danke schon einmal das du dich der Sache annimmst

MFG Markus

Hallo,

also das mit den libraries habe ich jetzt glaube geschafft, die .h Dateien findet er jetzt,.

Jetzt gilt es nur noch das Problem mit der Programierung zu beseitigen.

Da hoffe ich noch auf euree Hilfe.

MFG Markus

Lies bitte auf Willies Seiten einfach mal alles.
Der grösste Teil deiner Fragen (auch kommende) wird dort schon beantwortet, denke ich.
Als Anfänger ists etwas viel, gleich mit sowas anzufangen, aber Willies Seiten sind eine recht gute Einführung. Also: gut studieren.
Wenn du dort was nicht verstehen kannst fehlen dir allerdings Grundlagen.

Ansonsten: frag einfach, aber geh nicht davon aus, dass dir hier jemand einfach den fertigen Code hinwirft..:slight_smile:

Und: Klasse dass mal jemand die Tirpitz baut-ich kann "Bismarck" schon kaum mehr hören, auch wenns ein tolles Schiff ist.

Hallo,

genau das ist mein eigentliches Problem, mir fehlen ganz einfach die Grundlagen, ich versuche mir das grade seit ein paar Tagen rein zu prügeln, nur so langsam stehe ich echt am Ende mit meinem Talent.

Ein Video wo evtl beschrieben wird wie ich das Signal vom Empfänger in den Arduino bekomme und dann unverändert oder halt mit Servo verlangsamung wieder ausgeben könnte, das würde mir schon sehr viel weiter helfen.

Mein problem an sich liegt ja schon darin das mein englisch echt misserabel ist.

MFG Markus

Hallo,

gut, dass mit der Library wäre geklärt. Ich glaube, ohne Grundlagenkenntnisse fängst Du eine Nummer zu weit vorn an. Du möchtest am Ende Servos steuern. Dann beginne vielleicht damit ein Servo ganz normal mit einem Poti zu regeln. Eine Servo.h gibt es mit 2 Beispielen. Damit lernst Du die Funktionsweise von PWM kennen. Die ein Servo benötigt. Ich glaube das ist sonst zu viel auf einmal. Wenn das klappt, versuchst Du die Werte von Deiner Fernbedienung einzulesen. Wenn das klappt kombinierst Du beides usw. Stück für Stück. Hat den großen Vorteil, Du lernst Dein eigenes Projekt von Grund auf kennen und weist genau was Du machst bzw. was Dein Sketch macht.

Für das große ganze Projekt wird Dir sicherlich niemand aus dem Stehgreif helfen können. Außer hier gibt es jemanden der das schon genau so gemacht hat. Aber bei den vielen kleinen Teilaufgaben, aus denen so ein Sketch besteht, da kann und wird Dir sicherlich vom mehreren Leuten geholfen.

Hallo,

also mit dem Arduino habe ich schon ein bischen rumgespielt und habe ihn angesteuert, aber halt nur über Schalter. Die Grundlagen in sachen PWM und RC anlagen sind ja da, sorry, das habe ich dann ein bischen falsch verstanden, ich dachte es geht um Grundlagen von der Programirerrei her.

Wie ich es schaffe, einen Servo, von Punkt A nach Punkt B und sich dann wieder zurück bewegt das haben ich im Grundlegenden drin.
Ich habe vor einem jahr mit dem Arduino schon experiementiert und Simple Sachen hinbekommen. Nur meine Alten Sachen habe ich leider nicht gespeichert. Das ganze ist schon ein Jahr her.

Ein beispiel wie ich dem Empfänger auselese habe ich schon gefunden, nur ich weiß jetzt nicht wie ich den so einbinde.
Auslesedaten:
pwm vom Empfänger 7 822 - 1805

pwm vom Empfänge 6 827 - 1797

pwm vom Empfänge 5 825 - 1805

Wobei die Zahlen vom PWM nicht auf dem Arduino sondern die kommenden Signale vom Empfänger sich beziehen.

Mal ein Beispiel:

Servo ist an Pin 9
Empänger an Pin 3 (Muss der Empänger an einen PWM Kanal)

/*
"RX-Siganal-Auswertung + Relais schalten"
*/

// Beginn Def der Variablen ->
int RX_Signal;
int pin_RX_Signal = 3; // Digitalpin 3 (PWM)
int pin_Relais = 5;
// <- Ende Def der Variablen

// Beginn Setup ->
void setup()
{
pinMode(pin_RX_Signal, INPUT); // Def der Pins
pinMode(pin_Relais, OUTPUT);
Serial.begin(9600); // initalisierung der seriellen Schnittstelle
digitalWrite(pin_Relais, LOW);
}
// <- End

// Beginn der Hauptroutine ->
void loop()
{
RX_Signal = pulseIn(pin_RX_Signal, HIGH, 24000);

if (RX_Signal > 1900)
{
digitalWrite(pin_Relais, HIGH);
}
if (RX_Signal < 1100)
{
digitalWrite(pin_Relais, LOW);
}
// nur zu Kontrolle über den seriellen Monitor
Serial.print("RX-Impuls (ms): ");
Serial.println(RX_Signal);
delay(1000);
}
// <- End

Jetzt möchte ich aber kein Relai steuern sondern einen Servo.

MFG Markus

Hallo,

dann guck Dir mal bitte die Bsp. der Servo Lib an. Darin wird eine Funktion genutzt zum Wertebereich mappen/skalieren. Der analoge Ausgang vom Arduino ist ja kein echter analoger Ausgang, sondern der macht das mittels PWM Signal. Genau damit steuert man ein Servo. Weist Du ja sicherlich. Jetzt kann man aber nur Werte ausgeben zwischen 0 und 255. Du hast aber Werte bis knapp 2000. Mittels der Mapfunktion kannste den Wertebereich proportional verschieben. Die Servo Lib mußte eh verwenden um das Taktsignal der PWM einzustellen. Wegen den 2ms. Mußt nur frühzeitig anfangen keine festen delays einzubauen. Sonst stockt die Sketchabarbeitung.

Du kennst doch bestimmt das Forum: http://www.rc-modellbau-schiffe.de
Dort hatten wir mal mehr oder weniger lose nen kleinen Arduino-Workshop gemacht, so mit nem bisschen Grundwissen.
Such den mal und zieh ihn dir rein-da gab es auch noch einiges mehr zum Thema.
Ohne solches Grundwissen schaffst du es nicht.
Unter Arbeitsschiffe da ist auch einiges zu meinem Seeteufel, der ebenfalls über nen Arduino (Mega 2560, aus guten Gründen) verfügt, der nahezu alle Zusatzfunktionen rechnerisch verwurstet- und nebenbei auch noch Akkus überwacht, Lichter sinngemäss schaltet usw. Um die Beleuchtung an dem Ding kümmere ich mich praktisch gar nicht mehr, das geht von selber. 8) Auch die Schleppfunktionen bedien ich da nur noch in Form von Vorgaben, logisch aufgeteilt wird das alles im Bordrechner.
Das wichtigste ist, dass du nen richtigen Plan hast- das war bei mir auch das Schwierigste: wie kann ich dieses oder jenes wirklich so bedienen, dass ich nach nen paar Wochen noch weiss, wie das war-jeden Tag fahr ich ja nun auch nicht, und die beliebten Klebezettel am Sender kann ich nicht leiden, da ich den Sender für alles mögliche benutze.

Zu deinem konkreten Beispiel: die map() -Funktion wurde bereits genannt. Du musst nur rausfinden (dazu schreibt man sich einfach nen kleines Testprogramm mit nem Poti) welche Wege deine Servos im Modell wirklich laufen sollen, und dann passt man das in map() einfach an. So kann man ganz easy Servowege begrenzen, Endlagen einstellen usw.
Was den Empfängeranschluss angeht:
Je nachdem, was du für eine Methode benutzt. Per Interruptmethode kannst du nur einige, wenige Pins zum einlesen benutzen, beim Polling ist man da flexibler. Dafür ist die Interruptmethode im allgemeinen die bessere- wenns denn geht (nen Uno kann da, glaub ich, nur zwei Kanäle einlesen, ein Mega 2560 dagegen sechs).
All das ist aber auf Willies Seiten auch gut beschrieben.

Hallo,

danke für den Link, nur leider finde ich das da nicht, könntest du mir bitte einen direkten Link dazu zukommen lassen?

Könntest du mal bitte ein Beispiel posten wie das geht, der Empfänger gibt ein Signal aus, der Arduino es liest und gibt dies an einen Servo weiter gibt?

MFG Markus

Das Board hat ne Suchfunktion. 8)
Ist irgendwo unter Sonstige Elektronik oder so ähnlich.....

Nen komplettes Template hab ich nicht da, und die Seeteufel-Software kann (zu gross, ausserdem wirst du da nicht viel blicken) und möcht ich hier nicht posten aber es ist ganz einfach:
Wie man RC-Signale einliest, ist bei Willie sehr gut beschrieben.
Den Wert (soweit hattest dus ja schon) speicherst du in ner Variablen, passt sie mit map() auf deinen Servoausschlag an, und dann übergibst du den neuen Wert einfach ans Servo.
Map() ist hier beschrieben: http://arduino.cc/en/pmwiki.php?n=Reference/Map
Den Rest erledigt dann die Servo-Bibliothek: http://arduino.cc/en/pmwiki.php?n=Reference/Servo
Sind auch Beispiele da-die solltest du auch in der IDE bereits finden.
Kann dir jetzt auch nicht fix ein Template zusammenschustern, da grade nix zum testen frei ist.

Konkrete Beispiele nutzen dir auch nicht viel, da es ja durchaus mehrere Methoden gibt, um RC-Signale auszulesen, und auch mehrere Möglichkeiten, nen Servo anzusteuern (in der Servobibliothek beispielsweise, indem man entweder ne Gradzahl angibe (nicht empfehlenswert) oder direkt die Pulszeit), aber man kann es auch ohne die Bibliothek machen-würd ich dir vorerst allerdings nicht empfehlen.

Hallo,

ich habe da jetzt etwas gefunden was mir warscheinlich hilft.

Wäre jemand so freundlich und würde mir das mal durchsehen?

#include <Servo.h>
//#define debug
#include <debug.h>
#include <makros.h>
#include <RCReceive.h>

/*
Servoverlangsamung.
Der Empfänger wird vom Pin 2 gelesen,
der Servo ausgang ist auf Pin 9. Zum Einstellen der Werte dienen 2 Poties an den analogen Eingängen 0 und 1.

Progbrammablauf:
Der Nullpunkt wird zunächst durch Interpolation der ersten 10 Werte vom Empfänger festgestellt.
Fehlerhafte Werte, also Werte ausserhalb von 900-2100 werden ignoriert. Werden mehr als 3 fehlerhafte Werte hintereinander gefunden,
wird der Servo in die Min Position gefahren. (Failsafe)
*/

const byte PIN_RC = 2;

// Ausgänge
const byte SERVO = 9; // PWM Kanal
const byte LED = 13; // LED auf dem Board

// Eingänge
const byte PIN_MODE = 0;

// Eingänge (analogen Eingänge)
const byte PIN_MIN = 0;
const byte PIN_MAX = 1;

// Stellgeschwindigkeit
const byte DELTA = 10;
const byte DELAY = 0;

// ********** Variablen **********
RCReceive rcReciver;
Servo servo;

// Zwischenspeicher
int myRcValue;
byte maxServo;
byte minServo;

void setup() {
pinMode(SERVO, OUTPUT);
pinMode(PIN_MODE, INPUT_PULLUP);

analogReference(DEFAULT);

// Eingang für RC
rcReciver.attach(PIN_RC);
}

void loop() {
// Lesen der aktuellen Impuls-Einstellungen von den Kanälen
myRcValue = analogRead(PIN_MIN);
minServo = map(myRcValue,0, 1024,0,180);

myRcValue = analogRead(PIN_MAX);
maxServo = map(myRcValue,0, 1024,0,180);

// Aktuellen RC-Wert lesen
rcReciver.poll();

// Fehlerfall
if (rcReciver.hasError()) {
// failsafe ...
servo.write(minServo);
}
else if (rcReciver.hasNP()) {
doWork();
}
else {
if (!servo.attached()) {
servo.attach(SERVO);
}
servo.write(minServo);
}
}
Mein Problem liegt genau in dem bereich: Es wird mir immer gesagt das er nicht weiß wa void doWork ist
void doWork() {
byte sValue = rcReciver.getValue();
sValue = map(sValue, 0, 255, minServo ,maxServo);

byte aValue = servo.read();
if (sValue != aValue) {
int hValue = aValue + DELTA;
if (hValue > maxServo) {
hValue = maxServo;
}
int lValue = aValue - DELTA;
if (lValue < minServo) {
lValue = minServo;
}
byte dValue = constrain(sValue, lValue, hValue);
servo.write(dValue);
if (DELAY > 0) {
delay(DELAY);
}
}

Da ich für dies schaltung noch 2 Potis mit 5Kohm benötige ( "habe ich zumindet so vertanden") ist mir bewust

Wenn das dann klappt kommen wir dann zu dem Teil den ich dann für mich umschreiben muss. Das dann aber ert wenn das funktioniert

MFG Markus

Es fehlt ne geschweifte Klammer in doWork().

Mach mal ganz zum Schluss noch die rein: } dann lässt sich das Programm compilieren.

Hallo,

danke, ich seh den Wald vor lauter Bäumen nicht mehr. Jetzt geht das auch.

Kann man da jetzt die Potis weg nehmen und sagen das der Servo nur in einzelnen schritten (mit Angabe wie groß die Schritte sein sollen) verfahren soll bis er die Poition erreicht hat, wie das in dem sweep Beispiel?

Dann wäre ich ja schon einen Riesen schritt weiter

MFG Markus

Prinzipiell schon.
Muss natürlich alles raus, was mit den Potis zu tun hat.
Ausserdem müsste man ne Möglichkeit finden, die Servo"schritte" zu berechnen.
Aber das ist sehr spezifisch, je nachdem, was das konkret geben soll.