Attiny mit RC Anlage steuern

Hallo zusammen,

ich würde gerne über einen Attiny mit der Fernsteuerung 3 Kanäle schalten.
Ich habe mir das so vorgestellt :

Fernsteuerung für 1 bis 2 Sekunden stellen Pin 0 auf HIGH
erneut für 1 bis 2 Sekunden stellen Pin 0 wieder auf LOW
Fernsteuerung für 2 bis 3 Sekunden stellen Pin 1 auf HIGH
erneut für 2 bis 3 Sekunden stellen Pin 1 wieder auf LOW

usw.
Ich muss sagen das ich immer Codefetzen zusammensuche und daraus etwas bastel.

Folgendes habe ich mal probiert aber das funktioniert leider nicht.

int duration;
void setup()
{
  pinMode(2, INPUT);      // Setzt den Pin 2 als Eingang
  pinMode(0, OUTPUT);        // Setzt den Pin 0 als Ausgang
  pinMode(1, OUTPUT);      // Setzt den Pin 1 als Ausgang

 }
 
void loop()
{
duration = pulseIn(2, HIGH);
  if ((duration > 1000 ) && (duration < 2000 )){
      analogWrite (0, HIGH);
}
}

Bin ich komplett auf dem Holzweg ?
Danke für euere Hilfe

PS ich habe das ganze zum testen anstelle von der RC Anlage mit einem Taster aufgebaut.

Wie bitte sollen wir helfen, wenn du nicht mitteilst, was das für eine Fernsteuerung ist.

Was kommt da für ein Signal raus ?

PatrickD78:
PS ich habe das ganze zum testen anstelle von der RC Anlage mit einem Taster aufgebaut.

PullUp- oder PullDown-Widerstände vergessen?

Das ganze wird soll mit einer Spektrum 2.4ghz Anlage betrieben werden.

Den Widerstand habe ich eingebaut aber leider funktioniert das ganze nicht.

Sollte der Code für den Anfang so passen?

Gruß

Du bist auf dem falschen Holzweg.
So ein Projekt gab es vor kurzem hier im Forum glaube ich.
Ich gehe davon aus, dass du den Prozessor an einen Servoausgang vom Empfänger anschließt.

Dann bekommst du Signale im Bereich von 1000-2000 µs. Davon kannst du Bereiche bilden, die dann die entsprechenden Pins schalten.

Allerdings musst du im Sender auch entsprechende Hardware einbauen, die bei Tastendruck ein Signal im entsprechenden Bereich ausgibt.
Früher gab es mal sowas, das nennt sich Nautic Modul

Ja, das Nautic-Modul...
Ist aber bei Spektrum 2,4GHz Anlagen nicht immer ganz einfach, den Sepktrum ist nicht gleich Spektrum. und Bei Spektrum sind Schalt-Kanäle nicht immer auch Proportional Kanäle. Je nach vorhandener Steuerung und vor allem, je nach vorhandenem, zur Übertragung der Zusatz-Schalter zur Verfügung stehenden Kanals muss ein geeignetes Protokol (Zusammenfassung der Schalter in ein Paket) gewählt werden.

Frage1: Wird AUSSER den Schaltfunktionen, auch noch Servos und/oder Fartregler in diesem "Modell wo die Schalteinheit rein kommt) gesteuert? Oder anders ausgedrückt: wird gleichzeitig irgend ein Fahrzeug oder sowas gesteuert und die Schalter sind für Sonderfunktionen?

Frage 2: Welche Spektrumsteuerung genau! Ist ganz wichtig, gibt Spektrumsender, bei denen kann man sowas Konstruktionsbedingt fast von vornherein ganz vergessen.
(Glaub mir, ich hab in dem bereich langjährige Erfahrung , ich habs probiert (Sender untersucht) - keine Chance - es sei denn, Du schaffst es, das Mainboard und die Sendersoftware zu ändern.
Andere Spektrum-Sender gehen ganz gut, mit mehr, oder weniger Aufwand.

Oder willst Du einfach nur mit der Spektrum und nem Arduino am Empfänger ein paar Schaltfunktionen machen. Also, knüppel 1-2 sek. betätigen funktion 1 Ein. knüppel wieder 1-2 sek. betätigen funktion 1 aus. bei Küppel 2-3 sek dasselbe mit Funktion 2 usw?
Weil, wenn du den sender nur zum schalten einsetzt (nix weiter steuern, oder nen freien knüppel hast) ist es einfacher, den Knüpelweg in 3 - 4 Bereiche auzuteilen und jedem Bereich eine Schalt-Funktion zuweisen.

Beantworte mir bitte die Fragen, die ich dir gestellt habe, dann können wir Dir weiterhelfen.
LG Stefan

Deltaflyer:
Oder willst Du einfach nur mit der Spektrum und nem Arduino am Empfänger ein paar Schaltfunktionen machen. Also, knüppel 1-2 sek. betätigen funktion 1 Ein. knüppel wieder 1-2 sek. betätigen funktion 1 aus. bei Küppel 2-3 sek dasselbe mit Funktion 2 usw?
Weil, wenn du den sender nur zum schalten einsetzt (nix weiter steuern, oder nen freien knüppel hast) ist es einfacher, den Knüpelweg in 3 - 4 Bereiche auzuteilen und jedem Bereich eine Schalt-Funktion zuweisen.

Genau das will ich machen :slight_smile:

Ich fang am besten nochmal an :

Ich habe ein RC Boot das ich mit einer Spektrum DX6i (DSM2/DSMX) steuere.
Zusätzlich will ich mit der Fernsteuerung in diesem Boot 4 LED´s unabhängig voneinader über den Empfänger ein bzw ausschalten.
Wie Du oben schon beschrieben hast :

Knüppel 1-2 Sekunden betätigen LED 1 geht an; Knüppel wieder 1-2 Sekunden betätigen LED 1 geht aus
Knüppel 2-3 Sekunden betätigen LED 2 geht an; Knüppel wieder 2-3 Sekunden betätigen LED 2 geht aus

usw.

An der Funke selbst will ich nichts umbauen

Danke und Gruß

PatrickD78:
An der Funke selbst will ich nichts umbauen

Dann bist du seeehr beschränkt, und mit 4 Leds wird schon grenzwertig.

Soweit ich weiss, hat die Spektrum einen Lehrer-Schüler-Eingang mit Einzelkanalübergabe. Dann könntest du die eine Schalterbox bauen und die dort anschliessen. Ohne hardwaremässig was am Sender zu frickeln. Dann bekommst du locker 10 Schaltfunktionen unter.

Mit 2 LEDs könnte das funktionieren.

Knüppel in Mittelstellung: am Servoausgang 1500µs Pulse
Knüppel links: 1000µs
Knüppel rechts: 2000µs

Das gäbe dann den Code z.B.:

void loop()
{
  duration = pulseIn(2, HIGH);
  if (duration > 1800) {
    led1 = !led1;
    digitalWrite (0, led1);
  }
  if (duration < 1200) {
    led2 = !led2;
    digitalWrite (1, led2);
  }
  delay(1000);
}

(die genauen Pulsdauern mußt du noch ausmessen)

Allerdings ist an dem Code noch sehr unschön, dass, wenn du den Knüppel längere Zeit auf die Seite drückst, die LED getoggelt wird. Und wenn du nur kurz drückst reagiert er gar nicht.

Um das zu ändern muss das delay() raus. Und du musst dir merken, ob die Pulslänge gewechselt wird, und nur beim Wechsel reagieren.
Aber das bekommst du bestimmt selbst hin. :slight_smile: :wink:

Das von Gunther kannst du noch um 2 Bereiche erweitern:
Knüppel Halb Links (>= 1250µs && <= 1400µs) 3. LED
Knüppel Halb Rechts (>= 1600µs && <= 1750µs) 4. LED

Damit hast Du um die Mitte rum immer noch genügend 'Totpunkt' das die LED's nicht schon bei der leisesten Berürung wild schalten.

LG Stefan

dann muss man aber noch Totzeiten einbauen, weil beim Bewegen nach links, der "halblinks" Bereich durchfahren wird.

Aber es geht.

PatrickD78:
Sollte der Code für den Anfang so passen?

Ich sehe folgende mögliche Problemstellen:

int duration;

sollte unsigned long sein.

"timeout (optional): the number of microseconds to wait for the pulse to be completed: the function returns 0 if no complete pulse was received within the timeout. Default is one second (unsigned long)." (Referenz)

Wenn Du zwischen 1 und 2 Sekunden wartest, mußt Du den Timeout erhöhen.

Ich hab irgendwo schon nen fertigen Sketch für sowas.... dient zur Steuerung von Bremslicht beim Gaswegnehmen, Blinken bei Kurvenfahrt und geringem Tempo, Fernlicht, Abblendlicht, Rückfahrscheinwerfer... :slight_smile:

Würdest Du mir den Sketch mal zeigen bzw zukommen lassen ? :slight_smile:

Eigentlich habe ich mir das genze etwas einfacher vorgestellt muss ich ganz ehrlich sagen. Auf die Idee bin ich gekommen, weil ich im Netz eine Anleitung gefunden habe wie man einen alten Servo als Schalter benutzen kann. Ich habe dann einen defekten Servo auseinandergebaut und anstelle von dem Motor eine LED angeschlossen. Sobald ich den Knüppel in eine Richtung bewegt habe lagen an der LED 5 Volt an.
Nun wollte ich dieses Signal nutzen um dem Attiny zu bedienen.

Ich drücke den Knüppel für 2 bis 3 Sekunden nach oben und am PB0 liegt Spannung an PB2 wird eingeschaltet.

ich drücke den Knüppel für 1 bis 2 Sekunden nach oben und am PB0 liegt Spannung an PB1 wird eingeschaltet.

usw.

Vom Prinzip ist das doch so wie wenn ich das ganze mit einem Taster realisiere.
Drücke ich den Taster eine Zeit x mache das drücke ich den Taster eine zeit Z mache was anderes.

So habe ich mir das vorgestellt, nur weiß ich nicht ob das so geht :o

ich such heut abend mal :wink:

Oh Mann, (Kopf gegen die Wand hau) , ja hab ich auch, hab das für nen Police-Car geschrieben um Blaulicht-Balken und Sirene unabhängig voneinander schalten zu können.

@Guntherb
Ja klar müssen die Zwischenbereiche mit leichter Verzögerung resp. nur wenn der Knüppel z.B 0.5 - 0.75 sec im zZischenbereich verweilt, ansprechen.
würde ich auch in den Endbereichen so machen, es sei denn, ich brauch enen Ausgang als Hupe/Horn. Aber da würde ich dann eh kein Memory (toggle) nehmen, sondern Memory. Aber das wird ja eh alles in der Software gemacht und ist damit ja flexibel.

Früher (ende 70er) hab ich sowas mal mit nem servo mit schaltfinger und Transistoren/Relais gelöst, allerdings hab ich da am Sender ein Zusätzliches Schalterkästchen mit Tasten angebaut. Also mit Eingriff in den Sender. War für ne Motorjacht und ich hab da immerhin 2x8 stromkreise gehabt. Ja ich weiss, die Nauticmodule gab es schon damals, aber die waren sau teuer.

LG Stefan

PatrickD78:
So habe ich mir das vorgestellt, nur weiß ich nicht ob das so geht :o

ja, das geht. Aber es geht viel einfacher: du kannst direkt die für das Servo bestimmten Pulse des Empfängers auswerten. Dazu schliesst du den Arduino direkt an den Empfänger an. (mindestens GND und Signal, kannst aber auch gleich die 5V als Versorgung nehmen)
Per Software liest du die Pulslänge ein und entscheidest dabei, welche Stellung der Knüppel hat, und schaltest entsprechend die LEDs.

Hier, ausnahmsweise, mal ein Code:
(ungetested)

// ******  globale Variable und Konstante   *****************
boolean led1, led2;       // Status der LEDs

byte Stick, Stick_last;   // Stellung des Knüppels und letzte Stellung des Knüppels
const byte  links = 1;    // Zur Besseren lesbarkeit des Codes...
const byte  mitte = 2;    // ...werden den variablen links, mitte, rechts..
const byte rechts = 3;     // ...Werte zugewiesen


// *****   Defintion der Pins  ********
const int LED1_Pin = 4;   
const int LED2_Pin = 6;
const int IN_pin   = 8;


void setup(){
  pinMode(IN_pin, INPUT);           
  pinMode(LED1_Pin, OUTPUT);       
  pinMode(LED2_Pin, OUTPUT);      

  Serial.begin(9600);        // aktivieren des Seriellen Monitors, um sehen zu können, was der Code macht
}

void loop(){
  unsigned int duration = pulseIn(IN_pin, HIGH, 5000);// Pulslänge messen  
  if      (duration > 1800) Stick = links;       // ermitteln der Knüppelstellung aus Pulslänge
  else if (duration < 1200) Stick = rechts; 
  else                      Stick = mitte;

  if (Stick == rechts && Stick_last != rechts){  // Stick wurde nach rechts gedrückt (ist jetzt rechts und war vorher nicht rechts)
    led1 = !led1;                                  // den Wert von led1 wechseln
    digitalWrite (LED1_Pin, led1);                 // und den Ausgang setzen
  }
  if (Stick == links && Stick_last != links){    // Stick wurde nach links gedrückt
    led2 = !led2;                                  // den Wert von led1 umschalten
    digitalWrite (LED2_Pin, led2);                 // und den Ausgang setzen
  }
  Stick_last = Stick;                            // merken der Stickposition


  // ***** Ausgabe diverser Größen zum debuggen ******  
  Serial.print("Pulsdauer=");Serial.print(duration);
  Serial.print("us\tPosition: ");Serial.print(Stick);
  if (Stick == links) Serial.print("=links\t");
  if (Stick == rechts) Serial.print("=rechts\t");
  if (Stick == mitte) Serial.print("=mitte\t");
  Serial.print("LED1: ");Serial.print(led1);
  Serial.print("\tLED2: ");Serial.print(led2);
  Serial.println();
  delay(100); // zum verlangsamen der Ausgabe während debug

} // end loop

Ich würde dir auch dringend empfehlen, den Code erst mal mit einem Arduino zu testen, bevor du auf einen ATtiny gehst. Das Debuggen über den Seriellen Monitor ist extrem hilfreich.

Ich würde mir den Umweg über den Servo ersparen, denn den Attiny kannst du direkt mit dem empfänger verbinden.
Oder: du nimmst die Servoelektronik und schliesst die beiden Motoranschlüsse der Elektronik an A0 und A1 des ATTiny an, falls der 2 Analogeingänge hat. dann noch drauf achten dass Du den Minus vom Attiny mit mius vom empfänger odder der Servoelektronik verbindest. Nun Kannst du an den Analogeingängen je nach Knüppelstellung Spannungen messen, die du auswerten kannst. Je nachdem ob du den Knüppel vor oder zurück bewegst, steigt der wert an A0 oder A1. Eventuel brauchst du noch nen Kleinen Spannungsteiler aus 2 Widerständen an jedem Eingang.
Möglicherweise liegen die Spannungen in Ruhestellung auf halber Betriebsspannung, müsstest du Messen
Jeweils Motorausgang gegen Masse. Dies könnte auch ein Problem sein, wenn du den Motorausgang an PB0 anschliesst. da dieser dan dauernd ein HIGH erkennt.
Du darfst auch den 2. Motoranschluss der Servoelektronik auf keinen Fall mit GND (Minus) verbinden, sonst kann die Servoelektronik hopps gehen, wenn du den Knüppel mal statt nach oben, nach unten ziehst. (gibt kurzschluss der Servo-Motorendstufe)

LG Stefan

Erstmal Danke an alle, aber ich muss zugeben das Übersteigt jetzt meine Kompetenz.
Ich habe bis jetzt lediglich kleinere Sachen für meine Modellbahn gemacht : Blaulicht Steuerung für Autos, Andreaskreuz blinken, Ampelschaltung usw. und habe dieses auf einen Attiny gespielt.
Wie man an meinen Anwendnungen sieht waren das jetzt keine großen Herausforderungen.
Und leider habe ich mir das mit dem Mehrkanalschalter auch so leicht vorgestellt :

5 Volt für zeit X am Attiny Pin0 macht Aktion Y am Pin1

Auch was Debuggen bedeutet oder was das macht habe ich keine Ahnung :frowning:

Ich werde trotzdem mal versuchen über das Debuggen nachzulesen.

PatrickD78:
Ich werde trotzdem mal versuchen über das Debuggen nachzulesen.

Sorry,

Debuggen meint einfach nur: Sehen, was der Code grade tut.
daür die Serial.print ausgaben am Schluss.

Wenn du den Code in den attiny geladen hat, siehst du nur: tut er das was er soll oder nicht?

mit dem Arduino Serial monitor kannst du dir die Variablen ausgeben lassen, und siehst, was er gerade tut.

Vorschlag: Probier doch mal den Code oben. dann siehst du was ich meine.