Go Down

Topic: Attiny mit RC Anlage steuern (Read 470 times) previous topic - next topic

Deltaflyer

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

guntherb

#16
Aug 16, 2017, 03:40 pm Last Edit: Aug 16, 2017, 04:43 pm by guntherb
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)

Code: [Select]
// ******  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.
Grüße
Gunther

Deltaflyer

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

PatrickD78

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 :-(

Ich werde trotzdem mal versuchen über das Debuggen nachzulesen.



guntherb

#19
Aug 16, 2017, 04:31 pm Last Edit: Aug 16, 2017, 04:44 pm by guntherb
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.
Grüße
Gunther

PatrickD78

Hallo zusammen,

ich habe mir das mit debuggen mal genauer angeschaut und auch soweit verstanden.
Ich habe das mit dem Code geteset und gleich glaube das ist nicht ganz das was ich meinte.


Die Idee war eigentlich folgende :
Ich will je nachdem wie lange ein Taster gedrückt wird eine Funktion schalten, somit könnte ich mit einem Schalter beliebig viele Funktionen schalten.

also 1 bis 2 Sekunden drücken LED1 an
2 bis 3 Sekunden drücken LED2 an
2 bis 3 Sekunden drücken LED2 aus.

Leider fehlt mir der Ansatz dafür.

Vielleicht habt ihr noch ein Denkanstoss für mich.

guntherb

ok, Denkanstoß:


1. Taster / Pulslänge abfragen
2. erkennen, wenn der Taster gedrückt wird und Zeitpunkt merken "t_taste = millis()"(so ähnlich wie oben im Beispiel: den Status des Tasters / Signals merken. Wenn er sich ändert, wurde der Taster gedrückt)
3. erkennen, wenn der Taster losgelassen wurde und Drückdauer ermitteln "t_pressed = millis()-t_taste"
5. Zeit auswerten
    if (t_pressed < 1000) // kleiner 1 sek: Aktion1 ausführen.
    else if (t_pressed < 2000) // kleiner 2 sek: Aktion2 ausführen.
    else if (t_pressed < 3000) ....
       

Grüße
Gunther

agmue

#22
Aug 22, 2017, 10:39 am Last Edit: Aug 22, 2017, 10:41 am by agmue
PS ich habe das ganze zum testen anstelle von der RC Anlage mit einem Taster aufgebaut.
Aus meiner Sicht liegt in diesem Ansinnen ein grundsätzliches Problem.

Ich habe mal mit dem Sketch aus #16 probiert und dabei festgestellt, daß sich pulseIn für prellende Tasten nicht eignet. Außerdem liefert es einen Wert in Mikrosekunden (nicht Millisekunden) zurück, weshalb "5000" als Parameter von pulseIn 5 Millisekunden entspricht, sollte aber 5 Sekunden sein.

Damit teilt sich das Thema in "Attiny mit der Fernsteuerung" oder "mit Tasten", beides zusammen gibt Durcheinander. Möchtest Du "mit Tasten" weitermachen, dann ist #21 geeignet. Solltest Du eine Simulation wollen, dann eignen sich zwei Arduinos dazu, einer als Sender, einer als Empfänger, dann im Mikrosekunden-Bereich. Ein Logicanalyser kann dabei hilfreich sein.

PatrickD78

Also wie gesagt, ich habe mir das ganze so vorgestellt:

Ich nutze einen alten Servo und baue den Motor aus. Die Servoelektronik gibt 5 Volt aus sobald ich den Hebel an der RC-Anlage betätige.
Diese 5 Volt sollen an einem Attiny je nachdem wie lange die 5 Volt anstehen, die entsprechende LED schalten.
In Prinzip übernimmt der Servo für mich die Tastfunktion.
So war die Idee, nur weiß ich leider nicht ob das so funktiniert :-)

Lange Rede kurzer Sinn:
Ich möchte mit Tasten weiter machen.
Ich werde versuchen mal etwas an Code zusammenzustellen und hier zu zeigen.
Werde dann bestimmt noch Hilfe brauchen  :o

Gruß 

agmue

Ich möchte mit Tasten weiter machen.
Dann braucht #21 nur noch in Code verwandelt zu werden. Als Anregung:

Code: [Select]
const int LED1_Pin = 4;
const int LED2_Pin = 6;
const int IN_pin   = 8;
uint32_t akt_millis, tasten_millis;
bool akt_taste, alt_taste;

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

void loop() {
  akt_millis = millis();
  alt_taste = akt_taste;
  akt_taste = digitalRead(IN_pin);
  if (!alt_taste && akt_taste) {
    tasten_millis = akt_millis;
  }
  if (alt_taste && !akt_taste) {
    uint32_t gedrueckt_millis = akt_millis - tasten_millis;
    if (gedrueckt_millis > 30) {    // Entprellen
      if (gedrueckt_millis < 1000) {
        digitalWrite (LED1_Pin, HIGH);
      } else if (gedrueckt_millis < 2000) {
        digitalWrite (LED2_Pin, HIGH);
      } else if (gedrueckt_millis < 3000) {
        digitalWrite (LED1_Pin, LOW);
        digitalWrite (LED2_Pin, LOW);
      }
    }
  }
}

Go Up