Go Down

Topic: Servo in 4 Verschiedene Positionen fahren mit 3 Tastern (Read 1 time) previous topic - next topic

BeMarvelous

#15
Aug 23, 2018, 12:38 am Last Edit: Aug 23, 2018, 12:44 am by BeMarvelous
Huiuiuiiii

Das ist erstmal ein Brocken :O

Ich hab jetzt mal versucht mich ansatzweise zurechtzufinden...
Hat ehrlich gesagt mit meinem Wissen nicht so ganz funktioniert  :smiley-sweat:

Wo muss ich denn jetzt noch etwas ändern um das ganze über Taster ansteuern zu können?

Sorry, aber das ist mir noch zu hoch :P


So nebenbei, gibt es eine möglichkeit die positive Flanke abzufragen ohne dass man so viele Variablen machen muss?

Aber danke :)

BeMarvelous

#16
Aug 23, 2018, 12:55 am Last Edit: Aug 23, 2018, 12:57 am by BeMarvelous
Ich hab es bis jetzt so versucht :D

Hab zwar noch keine Statusabfrage oder sowas drin, aber ich wollte jetzt auch erst einmal ausprobieren einen auf und ab Zähler hinzubekommen den ich zurücksetzen kann...
auch erstmal mit LED`s
so funktionieren wie es soll tut das ganze irgendwie auch noch nicht ...



int up = 7;
int down = 5;
int reset = 6;
int Leerlauf = 8;
int EinsGang = 9;
int ZweiGang = 10;
int DreiGang = 11;

int count = 0;
int upstate = LOW;
int uplaststate = LOW;
int downstate = LOW;
int downlaststate = LOW;
int resetstate = LOW;
int resetlaststate = LOW;

void setup() {
 pinMode(up,INPUT);
 pinMode(down,INPUT);
 pinMode(reset,INPUT);
 pinMode(Leerlauf,OUTPUT);
 pinMode(EinsGang,OUTPUT);
 pinMode(ZweiGang,OUTPUT);
 pinMode(DreiGang,OUTPUT);

}

void loop() {
  upstate = digitalRead (up);
  if(uplaststate == LOW && upstate == HIGH) {
    //abhängig vom counter die funktion aufrufen
  switch(count) {
     case 0:     leer();
                 break;
     case 1:     eins();
                 break;
     case 2:     zwei();
                 break;
     case 3:     drei();
                 break;
 
}
//zähler erhöhen
count++;
if(reset == HIGH) count = 0;
}
uplaststate = upstate;

  downstate = digitalRead (down);
  if(downlaststate == LOW && downstate == HIGH) {
    //abhängig vom counter die funktion aufrufen
    switch(count) {
      case 0:    leer();
                 break;
     case 1:     eins();
                 break;
     case 2:     zwei();
                 break;
     case 3:     drei();
                 break;
    }
//zähler senken
count--;
if(reset == HIGH) count = 0;
  }
downlaststate = downstate;
}

void leer()
{
  digitalWrite(Leerlauf,HIGH);
}

void eins()
{
  digitalWrite(EinsGang,HIGH);
}

void zwei()
{
  digitalWrite(ZweiGang,HIGH);
}

void drei()
{
  digitalWrite(DreiGang,HIGH);
}


combie

Aber danke :)
Gerne doch!


Das ist erstmal ein Brocken :O
Naja....
Auffassungssache...
Eine Frage des Standpunktes.

Du wolltest ein Beispiel.
Du hast eins bekommen.



----------


PS: Zum schalten ohne Kupplung
Bin selber Treiber einer XJ900 31A

Eine Frucht der Selbstbeobachtung, ist die Feststellung, dass ich je nach Tagesform so ca 30% bis 80% aller Hochschaltvorgänge, ohne die Kupplung zu ziehen, durchführe.
Ohne jede Zusatzelektronik.

Mit Zündabschaltung würde es auch unter Vollgas gehen. Leider ist das per Straßenverkehrszulassungsverordnung verboten. Es würde unverbranntes Gemisch in den Abgaskanal gedrückt werden und später unter Geräuschentwicklung(Schaltknall) verbrennen.

Alle Motorräder mit (erlaubten) Schaltautomat schalten die Einspritzung zu dem Zweck ab, nicht die Zündung.
Im Rennen mag das egal sein....

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

BeMarvelous

Gerne doch!

Naja....
Auffassungssache...
Eine Frage des Standpunktes.

Du wolltest ein Beispiel.
Du hast eins bekommen.

Da hast du allerdings Recht... aber wie bekomm ich das ganze dann noch über Taster hin ? :D


PS: Zum schalten ohne Kupplung
Bin selber Treiber einer XJ900 31A

Eine Frucht der Selbstbeobachtung, ist die Feststellung, dass ich je nach Tagesform so ca 30% bis 80% aller Hochschaltvorgänge, ohne die Kupplung zu ziehen, durchführe.
Ohne jede Zusatzelektronik.

Mit Zündabschaltung würde es auch unter Vollgas gehen. Leider ist das per Straßenverkehrszulassungsverordnung verboten. Es würde unverbranntes Gemisch in den Abgaskanal gedrückt werden und später unter Geräuschentwicklung(Schaltknall) verbrennen.

Alle Motorräder mit (erlaubten) Schaltautomat schalten die Einspritzung zu dem Zweck ab, nicht die Zündung.
Im Rennen mag das egal sein....


Ja :D
Das sollte im Rennen relativ egal sein :)
Und so ein schaltknall hat ja auch was :D

combie

Quote
aber wie bekomm ich das ganze dann noch über Taster hin ?
Mit Magie!

Hier siehst du, wie ich mit Tastereingaben und und Flankenerkennungen umgehe.
Meine Befürchtung ist allerdings ..........
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

BeMarvelous

#20
Dec 20, 2018, 04:11 pm Last Edit: Dec 20, 2018, 04:58 pm by BeMarvelous
Alsoooo...
ich hab das ganze nochmal etwas überdacht, es macht glaube ich mehr Sinn 4 Taster zu nehmen, 3 immer schön erreichbar und der für den Leerlauf darf etwas abgelegen liegen...

Mein momentaner Standpunkt:


Code: [Select]
#include <Servo.h>

Servo S1;                         //Stellservo für Gänge
int T0 = 4;                       //Taster für Gang 0
int T1 = 2;                       //Taster für Gang 1
int T2 = 6;                       //Taster für Gang 2
int T3 = 7;                       //Taster für Gang 3

int potPin = 0;
int valPot = 0;
int ZuendungsWert=0;
int Zuendung = 13;

void setup() {
 Serial.begin(9600);
 pinMode(T0, INPUT);
 pinMode(T1, INPUT);
 pinMode(T2, INPUT);
 pinMode(T3, INPUT);
 pinMode(Zuendung, OUTPUT);
 S1.attach(9);
}

void loop() {
 valPot = analogRead(potPin);
 Serial.print("Wert: ");
 Serial.print(valPot);
 delay(500);

 ZuendungsWert = digitalRead(T0||T1||T2||T3);          //Ausschalten der Zuendung bei betätigen eines Tasters
 if(ZuendungsWert = HIGH) {
   digitalWrite(Zuendung,LOW);
 }


//Hier soll die Abfrage erfolgen ob der Servo auch wirklich richtig Steht, noch sind es nur ausgedachte Zahlenwerte und Winkel


 if(S1(9)&&(valPot>950)&&(valPot<1000)) {              //Wenn Servo die 9 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
   digitalWrite(Zuendung,HIGH);
 }
 if(S1(30)&&(valPot>780)&&(valPot<820)) {              //Wenn Servo die 30 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
   digitalWrite(Zuendung,HIGH);
 }
  if(S1(60)&&(valPot>480)&&(valPot<520)) {             //Wenn Servo die 60 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
   digitalWrite(Zuendung,HIGH);
 }
  if((S1(90))&&(valPot>10)&&(valPot<100)) {            //Wenn Servo die 90 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
   digitalWrite(Zuendung,HIGH);
 }
 if(digitalRead(T0) == HIGH) {                         //Servoposition für Leerlauf
   delay(20);
   S1.write(30);
 }
 if(digitalRead(T1) == HIGH) {                         //Servoposition für 1.Gang
   delay(20);
   S1.write(9);
 }
 if(digitalRead(T2) == HIGH) {                         //Servoposition für 2.Gang
   delay(20);
   S1.write(60);
 }
 if(digitalRead(T3) == HIGH) {                         //Servoposition für 3.Gang
   delay(20);
   S1.write(90);
 }
}




Das Problem ist momentan dass ich die Abfrage, wo der Servo wirklich Steht über einen Drehpoti mache, dass die Zündung beim überschalten von Gängen nicht zwischenzeitlich wieder an schaltet, wenn eine Position eines anderen Ganges überfahren wird, muss ich gleichzeitig wissen wo er stehen sollte und wo er wirklich steht, mein Problem liegt gerade darin die SOLL-Position abzufragen und diese dann mit einem UND zu verknüpfen...

Bitte steinigt mich nicht gleich für meine Unwissenheit :D

Tommy56

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *) und entferne die sinnlosen Leerzeilen. Dann wird der Sketch besser lesbar.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

BeMarvelous

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *) und entferne die sinnlosen Leerzeilen. Dann wird der Sketch besser lesbar.

Gruß Tommy

Danke, hab irgendwie übersehen wo das funktioniert...

Und ja, ich hab den code schon mal compiliert und weiß aber leider nicht was statt dem (S1(...)) schreiben soll...

Tommy56

Das hier ist schon mal Unsinn:
Code: [Select]
ZuendungsWert = digitalRead(T0||T1||T2||T3);
Das musst Du für jeden Tx einzeln bearbeiten.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

BeMarvelous

#24
Dec 20, 2018, 05:44 pm Last Edit: Dec 20, 2018, 05:46 pm by BeMarvelous
Das hier ist schon mal Unsinn:
Code: [Select]
ZuendungsWert = digitalRead(T0||T1||T2||T3);
Das musst Du für jeden Tx einzeln bearbeiten.

Gruß Tommy
Also so:

ZuendungsWert = digitalRead(T0);
ZuendugnsWert = digitalRead(T1);
.
.
?
Oder dann
ZuendungsWert0...
ZuendungsWert1...

Tommy56

Probier mal (ungetestet)
Code: [Select]

byte ZuendungsWert = 0;
ZuendungsWert += digitalRead(T1);          //Ausschalten der Zuendung bei betätigen eines Tasters
ZuendungsWert += digitalRead(T2);          //Ausschalten der Zuendung bei betätigen eines Tasters
ZuendungsWert += digitalRead(T3);          //Ausschalten der Zuendung bei betätigen eines Tasters
ZuendungsWert += digitalRead(T4);          //Ausschalten der Zuendung bei betätigen eines Tasters


 if(ZuendungsWert > 0) {  // mindestens einer war HIGH (1)
   digitalWrite(Zuendung,LOW);
 }


Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

BeMarvelous

Ich glaube ich habs sogar funktionierend hinbekommen :O
Hier das Ergebnis:

Code: [Select]
#include <Servo.h>

Servo S1;                         //Stellservo für Gänge
int T0 = 4;                       //Taster für Gang 0
int T1 = 2;                       //Taster für Gang 1
int T2 = 6;                       //Taster für Gang 2
int T3 = 7;                       //Taster für Gang 3

int potPin = 0;
int valPot = 0;
int ZuendungsWert = 0;
int Zuendung = 13;
int Merker = 0;

void setup() {
  Serial.begin(9600);
  pinMode(T0, INPUT);
  pinMode(T1, INPUT);
  pinMode(T2, INPUT);
  pinMode(T3, INPUT);
  pinMode(Zuendung, OUTPUT);
  S1.attach(9);
}

void loop() {
  valPot = analogRead(potPin);
  Serial.print("Wert: ");
  Serial.print(valPot);
  delay(500);

  ZuendungsWert = digitalRead(T0);                      //Ausschalten der Zuendung bei betätigen eines Tasters
  ZuendungsWert = digitalRead(T1);
  ZuendungsWert = digitalRead(T2);
  ZuendungsWert = digitalRead(T3);
  if(ZuendungsWert = HIGH) {
    digitalWrite(Zuendung,LOW);
  }

//Hier soll die Abfrage erfolgen ob der Servo auch wirklich richtig Steht, noch sind es nur ausgedachte Zahlenwerte und Winkel
 
  if((Merker = 1)&&(valPot>950)&&(valPot<1000)) {              //Wenn Servo die 9 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
    digitalWrite(Zuendung,HIGH);
  }
  if((Merker = 0)&&(valPot>780)&&(valPot<820)) {              //Wenn Servo die 30 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
    digitalWrite(Zuendung,HIGH);
  }
   if((Merker = 2)&&(valPot>480)&&(valPot<520)) {             //Wenn Servo die 60 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
    digitalWrite(Zuendung,HIGH);
  }
   if((Merker = 3)&&(valPot>10)&&(valPot<100)) {            //Wenn Servo die 90 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
    digitalWrite(Zuendung,HIGH);
  }

 
  if(digitalRead(T0) == HIGH) {                         //Servoposition für Leerlauf
    int Merker = 0;
    delay(20);
    S1.write(30);
  }
  if(digitalRead(T1) == HIGH) {                         //Servoposition für 1.Gang
    int Merker = 1;
    delay(20);
    S1.write(9);
  }
  if(digitalRead(T2) == HIGH) {                         //Servoposition für 2.Gang
    int Merker = 2;
    delay(20);
    S1.write(60);
  }
  if(digitalRead(T3) == HIGH) {                         //Servoposition für 3.Gang
    int Merker = 3;
    delay(20);
    S1.write(90);
  }
}



Danke für die Hilfe!!!

Gruß Felix

BeMarvelous

Ich glaube ich habs sogar funktionierend hinbekommen :O
Hier das Ergebnis:

Code: [Select]
#include <Servo.h>

Servo S1;                         //Stellservo für Gänge
int T0 = 4;                       //Taster für Gang 0
int T1 = 2;                       //Taster für Gang 1
int T2 = 6;                       //Taster für Gang 2
int T3 = 7;                       //Taster für Gang 3

int potPin = 0;
int valPot = 0;
int ZuendungsWert = 0;
int Zuendung = 13;
int Merker = 0;

void setup() {
  Serial.begin(9600);
  pinMode(T0, INPUT);
  pinMode(T1, INPUT);
  pinMode(T2, INPUT);
  pinMode(T3, INPUT);
  pinMode(Zuendung, OUTPUT);
  S1.attach(9);
}

void loop() {
  valPot = analogRead(potPin);
  Serial.print("Wert: ");
  Serial.print(valPot);
  delay(500);

  ZuendungsWert = digitalRead(T0);                      //Ausschalten der Zuendung bei betätigen eines Tasters
  ZuendungsWert = digitalRead(T1);
  ZuendungsWert = digitalRead(T2);
  ZuendungsWert = digitalRead(T3);
  if(ZuendungsWert = HIGH) {
    digitalWrite(Zuendung,LOW);
  }

//Hier soll die Abfrage erfolgen ob der Servo auch wirklich richtig Steht, noch sind es nur ausgedachte Zahlenwerte und Winkel
 
  if((Merker = 1)&&(valPot>950)&&(valPot<1000)) {              //Wenn Servo die 9 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
    digitalWrite(Zuendung,HIGH);
  }
  if((Merker = 0)&&(valPot>780)&&(valPot<820)) {              //Wenn Servo die 30 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
    digitalWrite(Zuendung,HIGH);
  }
   if((Merker = 2)&&(valPot>480)&&(valPot<520)) {             //Wenn Servo die 60 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
    digitalWrite(Zuendung,HIGH);
  }
   if((Merker = 3)&&(valPot>10)&&(valPot<100)) {            //Wenn Servo die 90 Grad Angabe hat und ein Wertebereich vom Poti erreicht wird, schaltet die Zündung an
    digitalWrite(Zuendung,HIGH);
  }

 
  if(digitalRead(T0) == HIGH) {                         //Servoposition für Leerlauf
    int Merker = 0;
    delay(20);
    S1.write(30);
  }
  if(digitalRead(T1) == HIGH) {                         //Servoposition für 1.Gang
    int Merker = 1;
    delay(20);
    S1.write(9);
  }
  if(digitalRead(T2) == HIGH) {                         //Servoposition für 2.Gang
    int Merker = 2;
    delay(20);
    S1.write(60);
  }
  if(digitalRead(T3) == HIGH) {                         //Servoposition für 3.Gang
    int Merker = 3;
    delay(20);
    S1.write(90);
  }
}



Danke für die Hilfe!!!

Gruß Felix
Ich nehm es zurück, der Merker beleibt immer auf 3, egal was kommt ...

Tommy56

Das glaube ich nicht.
Das finktioniert nur, wenn T3 = HIGH ist.
Code: [Select]
ZuendungsWert = digitalRead(T0);                      //Ausschalten der Zuendung bei betätigen eines Tasters
  ZuendungsWert = digitalRead(T1);
  ZuendungsWert = digitalRead(T2);
  ZuendungsWert = digitalRead(T3);
  if(ZuendungsWert = HIGH) {
    digitalWrite(Zuendung,LOW);
  }

//Hier soll die Abfrage erfolgen ob der Servo auch wirklich richtig Steht, noch sind es nur ausgedachte Zahlenwerte und Winkel
  


Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

BeMarvelous

#29
Dec 20, 2018, 06:29 pm Last Edit: Dec 20, 2018, 06:38 pm by BeMarvelous
ich glaub du hast recht, habs jetzt so umgeschrieben wie du meintest

Go Up