Switch Case, LEDs bleiben an, Bedingung aber falsch
|
15.11.2014, 17:59
Beitrag #1
|
|||
|
|||
Switch Case, LEDs bleiben an, Bedingung aber falsch
Hey Leute
![]() ich hab leider beim Programmieren irgendwie einen Fehler begangen... Ziel meines Programms ist es, mit einem Mega 2560 und LED's über verschiedene Outputs, einen Prototypen für ein späteres Automatik Getriebe im Modellbau zu erstellen. Die LED's sollen quasi eine sichtbare HIGH/LOW Stellung der späteren Hubmagnete darstellen (Wenn die eine LED angeht, dann weiß ich, dass später dort das Hubmagnet auch spielen wird) Soviel zur Intro, ich hoffe ihr kommt nach, ansonsten könnt ihr gerne fragen ![]() Von der Schaltung her ist es denke ich in Ordnung, ein Output, die LED, ein Widerstand und das Ganze geht zum GND. Der Code ist von der Syntax her denke ich auch okay, der Compiler von Arduino hat jedenfalls keine Fehlermeldung gebracht. Nun aber zum Problem (Code folgt): Eigentlich sollte, je nachdem wie lange der eine Schalter betätigt wird (Zeit wird über "PulseIn" gemessen), die eine oder andere LED angehen. Die Zeit wo PulseIn auf HIGH ist, wird mal 4 multipliziert und ergibt einen bestimmten Wert (Das ist dann in der Praxis die benötigte Zeit für eine Umdrehung von der Abtriebswelle, diese Zahl soll dann eben einem bestimmten Gang bzw. bestimmtem Hubmagnet entsprechen). Der Wert ("4*zeitproviertelumdrehung") wird gemappt, damit ich eine gemütliche Switch Case Anweisung benutzen kann, sprich: -Liegt die benötigte Zeit für eine Umdrehung bei einem bestimmten Wert, dann soll auch die entsprechende LED (später Hubmagnet) angehen. Wider Erwartungen gehen die LEDs nicht wieder aus sondern bleiben auf HIGH... betätige ich den Schalter mit der Zeit a, geht meine LED a an. Da aber mein PulseIn wieder auf LOW ist, sollte ja die LED wieder ausgehen. Betätige ich den Schalter mit der Zeit b, geht die LED b an, die LED a ist aber auch noch an. Ich vermute, dass meine Variable irgendwie nicht zurückgesetzt wird, ich weiß aber nicht wie man im konkreten sowas angibt. Ich bitte um Hilfe ![]() Code: int pin11 = 11; void setup() { pinMode(pin11, INPUT); pinMode(pin12, INPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); } void loop() { unsigned long zeitproviertelumdrehung; //Zeit pro Viertelumdrehung unsigned long tproRot; //Zeit pro Umdrehung unsigned long Gangart; //Drehzahlbereich für welchen Gang zeitproviertelumdrehung = pulseIn(pin11, HIGH, 200000); tproRot = 4 * zeitproviertelumdrehung; Gangart = map(tproRot, 0, 800000, 1, 12); switch(Gangart) { case 1 : digitalWrite(2, HIGH); break; case 2 : digitalWrite(2, HIGH); break; case 3 : digitalWrite(3, HIGH); break; case 4 : digitalWrite(3, HIGH); break; case 5 : digitalWrite(4, HIGH); break; case 6 : digitalWrite(4, HIGH); break; case 7 : digitalWrite(5, HIGH); break; case 8 : digitalWrite(5, HIGH); break; case 9 : digitalWrite(6, HIGH); break; case 10 : digitalWrite(6, HIGH); break; case 11 : digitalWrite(7, HIGH); break; case 12 : digitalWrite(7, HIGH); break; } } |
|||
15.11.2014, 19:16
(Dieser Beitrag wurde zuletzt bearbeitet: 15.11.2014 20:50 von Bitklopfer.)
Beitrag #2
|
|||
|
|||
RE: Switch Case, LEDs bleiben an, Bedingung aber falsch
öhm ganz einfach, wo hast du z.B.:
case 14 : digitalWrite(3, LOW); stehen ? Nur einschalten schaltet eben nie ab... lg bk 1+1 = 10 ![]() ![]() |
|||
15.11.2014, 19:46
Beitrag #3
|
|||
|
|||
RE: Switch Case, LEDs bleiben an, Bedingung aber falsch
(15.11.2014 17:59)luto92 schrieb: Das ist glaube ich das was du meinst. Passierst du alle zustände im Sitch case also kann es passieren das du ein Case überspringst das er einen nicht ausschaltet. ansonsten eine zusätzlich funktion dazu das erst mal alle LED ausmacht und deine die du brauchst an Wenn ich so nachdenke muss ja dann immer ein Gang einglegt sein. dann braüchtest du weniger "Gangaarten" Code: { So was in der Art. Beschreibe mal genauer was du willst. (Drehzahlabhänige Gangvorwahl?) Gruß DerDani |
|||
15.11.2014, 20:34
Beitrag #4
|
|||
|
|||
RE: Switch Case, LEDs bleiben an, Bedingung aber falsch
Hallo,
ich meine, im Setup() solte man die Ausgänge auf LOW setzen, also ordentlich initialisieren. Der Rest hängt davon ab, was passieren soll. Bitte mal genauer beschreiben. Gruß Joe Unser Projekt ![]() |
|||
16.11.2014, 16:52
(Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2014 16:54 von luto92.)
Beitrag #5
|
|||
|
|||
RE: Switch Case, LEDs bleiben an, Bedingung aber falsch
Erst mal danke für die rasche Antworten.
Dass man die wieder auf LOW setzen muss, wusste ich gar nicht :/ ich dachte, sobald der Loop beendet wird geht alles aus und fängt von vorne wieder an. Jedenfalls weiß ich wo jetzt das Problem liegt und werde es beseitigen. In meinem Hobby (Modellbau) fokussiere ich mich in letzter Zeit auf den Antriebsstrang. Mein 6-Gang Getriebe ist im Maßstab 1:6 und soll während dem RC Steuern selbstständig schalten. Ich werde aber nicht mit Hydraulik arbeiten sondern mit Magneten und Schubstangen-Schaltung wie man es vom klassischen manuellen PKW Getriebe kennt, das ist sauber und erfordert weniger Arbeit. Nun aber zum Konkreten: Je höher die Drehzahl der Abtriebswelle am Getriebe, desto höher der eingelegte Gang. Die Schaltstrategie soll im Prinzip sich ähnlich verhalten wie eine Vollgas-Beschleunigung mit voller Drehzahl-Ausnutzung. Es wird also Gang für Gang geschaltet, sprich wenn die Abtriebswelle die Drehzahl erreicht, bei dessen der Elektromotor an seiner Höchstdrehzahl ist (oder kurz davor), wird der nächste Gang eingelegt. (Ein Verbrenner hat für mich zuviel Power, außerdem möchte ich später eventuell ein Sound-Modul entwickeln, da ist der E-Motor wesentlich diskreter) Auf der elektronischen Seite sieht das so aus: Auf der Abtriebswelle ist eine Art Nocke, die 25% bzw. 90° einer Umdrehung einen Schalter betätigt (Ähnlich einer Nockenwelle beim Verbrenner mit Ventilen). Die Zeit, die der Schalter im ON-Modus ist, wird über PulseIn(pinnummer, HIGH, 200000) gemessen. Der delay ist dabei für das Verständnis erstmal irrelevant. Die Zeit wird mit 4 multipliziert und man erhält somit die benötigte Zeit für eine volle Umdrehung. Mit diesem Wert arbeitet das Programm. Der ist nämlich im Zusammenhang mit der Drehzahl. Ob ich nun die Drehzahl oder eben die benötigte Zeit für eine Umdrehung als entscheidender Faktor für meine Schaltstrategie benutze ist im Prinzip egal, Hauptsache die Berechnungen sind richtig... Im Drehzahlbereich 1 (z.B. U/min = 0 bis U/min = 200) soll digitalWrite im Pin 2 auf HIGH schalten und somit ein Hubmagnet tätigen, welches den ersten Gang einlegt. Der Pin 1 wird für diesen Zweck nicht benutzt. Sobald die Drehzahl die 200 U/min überschreiten sollte und sich im Drehzahlbereich 2 befindet (angenommen 201 bis 800 U/min) muss Pin 2 auf LOW sein und dann Pin 3 auf HIGH geschaltet werden. An Pin 3 ist dann ein weiteres Hubmagnet getätigt und legt den zweiten Gang ein. Insgesamt sind also 6 Hubmagnete nötig. Für die anderen Gänge geht es logischerweise so weiter. Sollte ich meine Fahrzeuggeschwindigkeit reduzieren und somit die Drehzahl runtergehen lasse, soll das Programm selbstverständlich runterschalten. (Immerhin will ich keinen Dragster bauen indem immer von 0 auf Vmax beschleunigt wird sonder eher ein Sportwagen oder Cruiser). Ich hoffe meine Erklärung war verständlich ![]() Meine Überlegung war auch, bei Teillast oder für die Fahrzeugtechnik-Laien, wenn man halt nicht gerade viel Gas gibt, ein Gang runterzuschalten und somit ein authentischeres Schaltverhalten darstellen. Man stelle sich vor, in der Stadt mit 50 km/h nicht mehr im ersten Gang zu fahren sondern eben den Dritten oder Vierten (ich weiß beim 9 Gang von Mercedes wäre evtl. der 6te Gang drin aber sei es drum ![]() Für diese Funktion habe ich gedacht, ich zapfe die PWM-Signale vom Empfänger zum Fahrtregler ab und weiß dann quasi wie viel Gas ich gerade an der Fernbedienung gebe. Sollte die Periodendauer einer Belastung von < 50 % entsprechen, geht der Programmablauf über einen anderen Zweig der analog wie der oben erklärte Algorithmus arbeitet aber halt mit anderen Drehzahlbereichen. Salopp gesagt: Bin ich mit Vollgas im ersten Gang bei 50 km/h so könnte ich auch vom Gas runtergehen und den vierten reinlegen. Mfg Lucas |
|||
|
|
|
Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste