Go Down

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

BeMarvelous

Hallo,
ich bin ziemlich neu was das ganze Arduinozeug betrifft, aber ich bräuchte mal eure hilfe, vielleicht einfach mal einen Beispielcode für mein Vorhaben :)

Und zwar möchte ich für ein Rennmofa die Ziehkeilschaltung über einen Servo betätigen um möglichst schnell und präziese schalten zu können.
Dazu muss ich die winkelpositionen für jeden gang noch herausfinden, aber die Winkel lassen sich im Programm ja leicht ändern.

Ein Taster soll dazu da sein, wenn man stehen bleibt den Leerlauf einzulegen, z.B. bei 30°
Die beiden anderen Taster sollen dann logischerweise zum hoch und runter schalten dienen und dabei den Leerlauf direkt überschalten.
1.Gang 0°
2.Gang 60°
3.Gang 90°

Beim drücken eines Tasters soll die Zündung kurz abschalten, den Killswitch der Zündung hätte ich dann über einen Varistor auf Masse geschalten dass der Kraftfluss im Getriebe kurzzeitig unterbrochen wird.
Wichtig ist dabei vielleicht noch, dass das Servo erst dreht wenn die Zündung unterbrochen ist und erst wieder aktiv wird wenn das Servo die Position erreicht hat.

Problem an der ganzen Sache ist jetzt dass ich absolut keine Ahnung habe wie ich quasi eine Schrittkette  hoch und runter zählen lassen kann, allgemein weiß ich nicht recht wie ich anfangen soll :-[

Deshalb wäre ich Euch sehr dankbar wenn Ihr mir irgendwie weiterhelfen könnt, egal ob ihr mir ein Beispiel vorlegen könnt das ansatzweise ähnlichkeit hat oder mir direkt etwas fertiges liefern könnt  :D

Vielen vielen Dank schon einmal!!!
Ich hoffe mir kann jemand helfen :smiley-lol:

themanfrommoon

#1
Aug 21, 2018, 09:52 am Last Edit: Aug 21, 2018, 09:54 am by themanfrommoon
Moin,

auf dem Bastlertisch sehe ich jetzt noch kein großartiges Problem.
Allerdings stell ich mir die Hardware dafür relativ aufwendig vor, wenn das überhaupt so einfach zu lösen ist.
Was hast du denn für eine Stromversorgung, Motortreiber und Motor?
Die üblichen Modellbauservos sind vermutlich zu langsam und zu schwach. Mit einem Schrittmotor wird das wohl nichts werden, wenn der mal ein paar Schritte verliert, dann steht die Schaltung irgendwo.
Und die Stromversorgung im Rennmofa stell ich mir auch sehr abenteuerlich vor (Spannungsspitzen bis zum Abwinken, da wird kein µC froh).

Hast du auch ans Gewicht gedacht?
Jeden "Renn-" irgendwas ist immer schneller wenn es leichter ist.

Lieben Gruß,
Chris

P.S.:
Quote
Problem an der ganzen Sache ist jetzt dass ich absolut keine Ahnung habe wie ich quasi eine Schrittkette  hoch und runter zählen lassen kann, allgemein weiß ich nicht recht wie ich anfangen soll :-[
Hihi, dann lass es sein und lerne lieber sauber und schnell zu schalten ;-)

Nee, also erstmal brauchen wir Infos über die Hardware die du hast, oder die du einsetzen willst.

BeMarvelous

Also einsetzten möchte ich wahrscheinlich einen Arduino Nano, erstmal zum Testen nehme ich aber den UNO.
Das Servo soll dann in diese Richtung gehen:
https://www.conrad.de/de/hacker-micro-servo-td0606m-digital-servo-getriebe-material-metall-1420623.html
https://www.conrad.de/de/graupner-standard-servo-hbs-790-bb-mg-brushless-servo-getriebe-material-metall-stecksystem-jr-209578.html

Beide relativ schnell und ich denke auch stark genug.

Was hast du denn für eine Stromversorgung, Motortreiber und Motor?
Die üblichen Modellbauservos sind vermutlich zu langsam und zu schwach.

Als Spannungsversorgung hab ich eher an einen LiPo wie den hier gedacht:
https://www.conrad.de/de/hacker-modellbau-akkupack-lipo-74-v-5000-mah-zellen-zahl-2-20-c-stick-ec5-239525.html
Ich weiß nicht ob der für ein 3h rennen absolut Über-/Unterdimensioniert ist, das wird sich dann aber irgendwann zeigen und ich kann dann noch anpassen

Allzuviel Kraft ist für das einlegen der Gänge nicht nötig, das Hochschalten erfolgt momentan nur über eine Zugfeder mit ca. 30N Zugkraft,gemessen an einem hebel von ca 2cm Länge
Vielleicht kennt ja jemand den Aufbau des Zündapp CS 25 Motors :)

Zu den Motortreibern hab ich mir noch keine Gedanken gemacht, direkt an den arduino werde ich den Servo wahrscheinlich nicht hängen können so wie den Kleinen im Lernpaket, oder?


Achja, zu dem Mehrgewicht das ich dann mit rum fahren darf...
Solange sich das ganze am ende unter 1kg beläuft ist das denke ich vollkommen in Ordnung, wenn ich es dadurch schaffe schneller und sauberer zu schalten :D

Und warum das ganze?- Beim schalten mit dem Drehgriff passiert leicht mal ein kleiner Fehler, oder man erwischt den Gang genau im 2-Kampf nicht und verliert diesen dann... und außerdem muss man ja immer irgendwas basteln :-D

themanfrommoon

Mit dem Hacker Servo hast du maximal 57.4 Ncm an 7,4V
Mit dem Graupner Servo hast du maximal 70 Ncm an 7,4V

Du gibts die Schaltkraft "mit ca. 30N Zugkraft,gemessen an einem hebel von ca 2cm Länge" an.
Da sind die ausgewählten Servos dann schon sehr hart an der Grenze. Das würde ich auf jeden Fall nicht machen.

Ich würde da eher in Richtung 250Ncm oder besser >300Ncm suchen.
Da so ein Zerknalltreibling ordentlich Vibrations macht würde ich ein Servo mit Metallgehäuse/Metallbefesitung suchen.
Ein wasserdichtes Gehäuse ist sicherlich auch sehr lebensdauerförderlich in dem Umfeld.
Und dann würde ich ein Kunststoffgetriebe einem metallgetriebe vorziehen. Ich befürchte allerdings dass es Kunststoffgetriebe in der Kraftklasse nicht mehr gibt.
Durch die starken Vibrationen arbeiten die kleinen Zahnräderchen immer schön gegenseitig aneinander. Bei Metallzahnrädern kann es dann dazu kommen, dass diese relativ schnell verschleißen. Das hatte ich vor Jahren mal bei einem Modellheli. Bei Kunststoffzahnrädern passiert das nicht. Aber ich hoffe sowas hat sich inzwischen erledigt. Damals waren es Messingzahnräder.

Conrad ist so die Einsteiger Apotheke in Sachen Modellbau. Wenn man Ahnung hat, dann geht man da nicht mehr hin.
Ich würde dir raten Servos aus der großen RC Car Szene anzuschauen.

Ich sach mal hier bist du gut aufgehoben: https://rc-car-online.de/de/123-servos.html
Vielleicht sowas hier: https://rc-car-online.de/de/products/y2007-y2007-digital-brushless-big-scale-servo-high-quality.html
Ließ dich da einfach mal n bischen durch.

Quote
Zu den Motortreibern hab ich mir noch keine Gedanken gemacht, direkt an den arduino werde ich den Servo wahrscheinlich nicht hängen können so wie den Kleinen im Lernpaket, oder?
Doch, das geht schon. Allerdings muss die Stromversorgung natürlich extra laufen, und nicht über den Arduino gehen

Lieben Gruß,
Chris

Rentner

Hallo,

na ja ich bezweifele ja das das was werden kann, aber versuchen kannst Du es ja mal und was lernen kannst Du auch damit.

Schrittkette ist schon mal gut , dazu kannst Du einen z.B Zähler aufbauen, der von 0-3 zählen kann.

Taser 1 mach einen Reset auf 0 = Leerlauf
Taster 2 zählt jedesmal 1 hoch bis max 3 wenn er gedrücht wird (pos Flanke )
Taster 3 zählt jedesmal 1 runter bis maximal 1 wenn er gedrückt wird ( pos Flanke)

mittels if und if else oder besser mit swich case fragst du die Zäherstände ab

Zundung aus
warten z.B100ms  mit millis() nicht delay nahmen
Servo fahren servo.write(pos)
warten 100ms
Zündung ein

das ist nur mal so eine Idee wie ham das anpacken könnte

Gruß Heinz

themanfrommoon

Nun kenn ich mich nicht mit Ziehkeilschaltungen aus.
Muss man da nicht kuppeln?
Wie ist denn der Ablauf (-> Ablaufsteuerung) von Motor an, über Rennen fahren bis Motor aus inklusiv allen Sachen die gemacht werden müssen? (Starten, Kuppeln, Zündung, Stoppen, Schalten, Abfliegen, Ausschalten, Sicherheit, Motor aus, Zündung an/aus, usw.)
Wenn du das in der richtigen Reihenfolge aufschreiben kannst, dann hilft dir das sehr bei der Programmierung der Ablaufsteuerung.
Ist das nicht n bisschen gefährlich, wenn man zufällig bei laufendem Motor den Taster drückt?
Aus dem Grund würde ich noch eine Scharfschaltung vorsehen.
Der ganze Kram muss ja auch noch vibrationsresistent sein.
Die Taster müssen entprellt werden.
Was die Zündung so in die Elektronik reininduziert ist bestimmt auch sehr ordentlich.
Da hilft dir ein Oszilloskop.

Aber ganz sicher ist das ein schönes Lernprojekt :-)

BeMarvelous

#6
Aug 21, 2018, 01:29 pm Last Edit: Aug 21, 2018, 02:03 pm by BeMarvelous
Zum anfahren muss man auf jeden fall kuppeln, aber beim Schalten während dem fahren wird durch das betätigen des Kupplungshebels nur der Kraftfluss unterbrochen, das sollte normalerweise auch durch abschalten der Zündung möglich sein :)
Die Steuerung des Getriebes wäre dann unabhängig davon ob der motor läuft oder nicht, aber ablaufen sollte es so:
Motor im Leerlauf Starten > Kuppeln > Taster zum hochschalten (1.Gang)[Sollte nicht weiter schlimm sein wenn auch hier die Zündung kurz unterbricht] > Kupplung kommen lassen und anfahren > Taster zum hoch schalten(2.Gang) > zündung aus > gangwechsel durch den Servo > zündung an > Taster zum hoch schalten(3.Gang) > zündung aus > gangwechsel durch den Servo > zündung an >Taster zum runter schalten(2.Gang) > zündung aus > gangwechsel durch den Servo > zündung an >Taster zum runter schalten(1.Gang) > zündung aus > gangwechsel durch den Servo > zündung an >Taster(Vielleicht als schalter ausführen um die Taster damit auch zu Sperren) zum leerlauf schalten(0.Gang) > zündung aus > gangwechsel durch den Servo > zündung an

Man könnte auch nur 2 Taster nehmen und so bis in den leerlauf schalten, aber ich möchte vermeiden beim Rennen ausversehen in den Leerlauf zu schalten.


Der Motor hat nur 50ccm, sooooo wild ist dass dann nicht :)
An sich hast du aber recht, deshalb die überlegung den Leerlauf als Schalter auszuführen

An die Vibrationen habe ich auch schon gedacht, das ganze muss auf jeden fall möglichst vibrationsarm montiert werden...
normalerweise müsste ich die Elektronik weit genug von der zündung weg verbauen können sodass diese nicht zu schlimme einflüsse hat (hoffe ich zumindest)
Und wegem dem Servo hast du wahrscheinlich recht, da wird der von dir die bessere lösung sein :)


Ölresistent wär der Servo am allergeilsten, dann könnte ich des Teil wenn alles funtionieren sollte mit unter den kupplungsdeckel packen in dem Getriebeöl umherfliegt, wenn er nicht sogar schon darin schwimmen sollte... halterungen fräsen ist kein problem :D


Danke schon mal für die mithilfe an euch beide :D

postmaster-ino

Hi

Quote
Halterung fräsen ist kein Problem
Neugierde geweckt - seid Ihr ein Verein? Fräse klingt nach Werkstatt - darf man fragen wo?
Mofa-Rennen wären mir hier keine bekannt, bin aber wohl auch schon etwas länger aus dem eigentlichem Mofa-Alter draußen.

Zuerst dachte ich, da wirbelt Einer an Seinem Mofa rum, cooler und so ;)
Aber schon Deine Links lassen erahnen, daß Das etwas mehr als 'normales Mofaschrauben' ist - Servo für nen Hunni hat schon was.

MfG

BeMarvelous

Servus

Wir sind nur ein Mofarennteam, eine konventionelle Fräsmaschine haben mein Vater und ich zusammen Zuhause stehen :)
Ich bin aus der Oberpfalz nähe Sulzbach-Rosenberg

Hier die Rennen die ich mitfahre:
mofamasters.de

"Normales Mofaschrauben" ist das wirklich nicht mehr, schon eher eine kleine Wissenschaft  ;D
Steuerzeiten Berechnen,Auspuff Berechnen und in CAD zeichnen, Getriebe umbauen um die Gangsprünge zu verkleinern usw. usw...
Man macht halt alles um tüfteln zu können und wieder ein bisschen besser und schneller zu werden :D

Außerdem hab ich endlich mal ein Projekt gebraucht um ein bisschen in die Programmierwelt einzutauchen :P
Bis jetzt sogar schwieriger als gedacht... ST Erfahrung hab ich nämlich garkeine, nur FUP :(

Mfg Felix

Klaus_ww

Quote
Beim drücken eines Tasters soll die Zündung kurz abschalten, den Killswitch der Zündung hätte ich dann über einen Varistor auf Masse geschalten dass der Kraftfluss im Getriebe kurzzeitig unterbrochen wird.
Ähh, Varistor? Meinst vermutlich einen Transistor?

Quote
Schalten während dem fahren wird durch das betätigen des Kupplungshebels nur der Kraftfluss unterbrochen, das sollte normalerweise auch durch abschalten der Zündung möglich sein
Ich bin ja auch alles außer Knalltreibling- und Mofafachmann, aber bist Du sicher dass Zündung abschalten und Gangwechsel thematisch zusammenpassen?

Außerdem solltest  Du überlegen, ob Du nicht eine Rückmeldung "Position erreicht" brauchst. Die Stellzeiten müssen ja nicht immer gleich lang sein, beim Rennen zählt auch jede ms. Wenn Du also zu lange wartest obwohl der Gang schon drin ist > zweiter Sieger
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

BeMarvelous

Jap... ich meinte tatsächlich einen Transistor
#facepalm

Sollte funktionieren, bei anderen Crossern wird auch nur die Zündung beim schalten unterbrochen, aber etwas anderes wie ausprobieren bleibt mir nicht übrig, bisher hab ich noch nichts dergleichen im Mofabereich gelesen :D

Und ja, da geb ich dir vollkommen recht, umso schneller der schaltvorgang vorbei ist und die zündung wieder läuft, umso besser :)


Jetzt darf ich noch anfangen alles vom arduino zu lernen  :smiley-roll-sweat:

Doc_Arduino

Hallo,

wegen der Servoauswahl. Lasse dich vielleicht bei Savöx beraten. Hersteller für hochwertige Servos usw.
https://www.savox-shop.com/

Ansonsten Ablaufdiagramm erstellen und immer weiter verfeinern. Am Ende in Code umsetzen.
Am Ende läuft das wieder auf eine "state machine" hinaus.
Die Verwendung von enum und switch case sollte dir dann dafür bekannt sein.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

BeMarvelous

Hallo,

wegen der Servoauswahl. Lasse dich vielleicht bei Savöx beraten. Hersteller für hochwertige Servos usw.
https://www.savox-shop.com/

Ansonsten Ablaufdiagramm erstellen und immer weiter verfeinern. Am Ende in Code umsetzen.
Am Ende läuft das wieder auf eine "state machine" hinaus.
Die Verwendung von enum und switch case sollte dir dann dafür bekannt sein.


Hey, da könnte ich mal vorbeischauen :)

bisher sind mir diese nicht bekannt, leider...

postmaster-ino

Hi

Kleine Hilfestellung:
mit enum kannst Du einer beliebig langen Liste von einzigartigen Worten Nummern zuordnen.
Entweder gezielt, oder 'frei Schnauze' - Letzteres macht enum von sich aus schon.
Hintergrund des Ganzen ist, daß Du schrieben kannst 'zuendung_an', statt '37'.
Die eigentliche Nummer ist nebensächlich und für den Arduino sind alle states verschiedene Nummern - Die von enum vergeben werden.
In Deinem Code benutzt Du die Klar-Namen, kannst Deinen Code selber wesentlich flüssiger lesen und für den µC sind's diese Nummern, mit Denen Er besser zurecht kommt.

switch/case ist eine Abfrage, wird gerne in State-Maschinen benutzt um mit dem aktuellen Status in die dafür gedachte Routine zu springen.
Code: [Select]
switch (state){
  case zuendung_an: <mache irgendwas>;break;  //wird nur ausgeführt, wenn Zustand 'zuendung_an' aktuell ist
  case vor_gang_hoch: <prüfe, ob Motor läuft und Taster für Gang hoch gedrückt wurde>
                                  <wenn, wechsel in state 'gang_hoch_step1>;
                                  break;
   case gang_hoch_step1: .....
.....
   default: <generiere Error-Meldung>, da wir einen unbenutzten Zustand erreicht haben
}


Schau Dir dazu die Beispiele in der IDE an.

MfG

combie

Quote
Ein Taster soll dazu da sein, wenn man stehen bleibt den Leerlauf einzulegen, z.B. bei 30°
Die beiden anderen Taster sollen dann logischerweise zum hoch und runter schalten dienen und dabei den Leerlauf direkt überschalten.
1.Gang 0°
2.Gang 60°
3.Gang 90°
Ich würde die Winkel in ein Array stopfen und einen einfachen Schaltautomaten bauen, welcher das Array reitet.

Irgendwie so:
Code: [Select]

using Getriebe = int[4+1]; // anzahl Gaenge plus Leerlauf

Getriebe getriebe {0,-10,20,30,40}; // servowinkel Neutral-1-2-3-4-5-6...

class Schaltung
{
  protected:
  Getriebe & getriebe;
  byte index;
  byte gaenge;
 
  public:
  Schaltung(Getriebe & getriebe):getriebe(getriebe),index(0)
  {
    gaenge = sizeof(getriebe)/sizeof(getriebe[0]) - 1;
  }

  int up()
  {
    if(index < gaenge) index++;
    return getriebe[index];
  }
 
  int down()
  {
    if(index > 1) index--;
    return getriebe[index];
  }
 
  int neutral()
  {
    index = 0;
    return getriebe[index];
  }

  operator int()
  {
     return getriebe[index];
  }
 
};

Schaltung ziehkeilSchaltung(getriebe);

void servo(int winkel)
{
  Serial.print("Winkel ");Serial.println(winkel);
  delay(1000);
}

void setup()
{
  Serial.begin(9600);
}

void loop()
{
   Serial.println("Rauf schalten");
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up());   
   servo(ziehkeilSchaltung.up()); 

   Serial.println("Runter schalten");
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down());   
   servo(ziehkeilSchaltung.down()); 
     
   Serial.println("In den Leerlauf schalten");
   servo(ziehkeilSchaltung.neutral()); 
   
   Serial.println("Ausgabe ohne schalten");
   servo(ziehkeilSchaltung);

   Serial.println("Halt");
   while(1); // halt

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

Quelle: Joseph Joubert

Go Up