nachdem ich bei Google oder Youtube nichts Konkretes gefunden habe, stelle ich hier mal meine Frage. Vielleicht ist es ja ganz einfach, aber ich bin erstens 77 und zweitens absoluter Anfänger im Thema ARDUINO Ich will (mehrere) Servos für eine Weichensteuerung unabhängig mit einem MEGA ansteuern. Die Servos bewegen sich ca. 30 Grad, die Spannung wird in den Endstellungen abgeschaltet. Das kriege ich auch hin. Jetzt hätte ich gerne die jeweilige Position des Servos durch LEDs angezeigt. Hierzu finde ich nichts. Geht das ohne zusätzlichen Aufwand? Kann man das im Sketch einbinden ohne zusätzliche Pins zu belegen? Am Servo liegt jetzt ja keine Spannung mehr an. Über eure Tipps freut und bedankt sich Rudi
Möchtest du die LEDs in dein Stellwerk einbauen, oder wosu brauchst du die? Wenn kein Strom fließt, kann leider auch nichts leuchten.
ja, ins Stellpult einbauen. ich kann mir vorstellen, dass das schon so mancher Modellbahner gemacht hat. Meine eigene Idee wäre evtl. 2 MEGAs parallel ansteuern, an einem die Moment-Ausgänge für die Servos, am anderen die Dauer-Ausgänge für die LEDs programmieren. jeder Vorschlag hilft mir bei meinem Verständnis für Arduino weiter Rudi
Hm, warum nicht mit Magneten und Reedkontakten die echte Weichenstellung abgreifen. Da hätte man auch gleich eine Kontrolle, ob der Stellvorgang funktioniert hat
das ist natürlich die herkömmliche Lösung, die auch sicher und zuverlässig funktioniert. Allerdings würde ich anstelle der Reedkontakte Hallsensoren verwenden. Die sind wesentlich kleiner und unauffälliger zu kaschieren. Eine elektronisch/digitale Lösung im Eigenbau würde mich aber mehr reizen Rudi
Rudi M. schrieb: > Meine eigene Idee wäre evtl. 2 MEGAs parallel ansteuern, Was spricht dagegen? Wie steuerst du den Arduino jetzt an?
Rudi M. schrieb: > Jetzt hätte ich gerne die jeweilige Position des Servos durch LEDs > angezeigt. Hierzu finde ich nichts. Ich verstehe dich so, dass du einen Arduino vorliegen hast, der deine Servos ansteuert. Zusätzlich sollen nun LEDs die Positionen der Servos anzeigen. Im Prinzip sollte der Arduino stets wissen können, in welcher Position sich die Servos befinden. Dann kann er also auch entsprechende LEDs anzeigen. Wo siehst du da die Schwierigkeit? Vielleicht: a) Du weißt nicht, wie man LEDs ansteuert b) Zu wenig Pins frei c) Der Status nach dem Einschalten der Stromversorgung ist unklar d) Du willst die tatsächliche Postion der Servos erfassen und anzeigen, nicht die Soll-Position. Beschreibe dein Vorhaben nochmal genauer und gebe auch an, was das für Servos sind bzw. welche Eigenschaften sie haben (Anschlüsse, Spannung, DC/AC, Stromstärke, Timing) - nicht das wir uns in die Ansteuerung von völlig anderen Produkten verrennen. Den Teil den du bereits hinbekommst, solltest du zeigen, damit wir darauf aufbauen können.
:
Bearbeitet durch User
erstmal danke für eure Antworten zu a) LEDs ansteuern ist ja die erste Übung beim Arduino. Allerdings liegen dabei ständig 5 Volt an. In meinem Programm wird die Spannung am Servo nach Erreichen der Position abgeschaltet. zu b) es werden 10 - 12 Weichen geschaltet, damit sind beim MEGA nicht genügend Pins frei. Ich bräuchte pro Weiche noch zusätzlich 1 Pin für den Eingang und 2 Pins für die beiden LEDs. Zumindest verstehe ich das so. zu c) der Status beim Einschalten ist momentan noch nicht wichtig zu d) die tatsächliche Position wäre ideal. Allerdings denke ich, dass die Servos vom Arduino exakt angesteuert werden und könnte deshalb auch die Anzeige der Soll-Position akzeptieren. es sind die üblichen 5 Volt China-Servos für Modellbau. hier mein Test-Sketch für 3 Servos, wobei die Pin-Belegung der Eingänge und Ausgänge zum Testen willkürlich festgelegt wurde: #include <Servo.h> Servo W1; Servo W2; Servo W3; int T1 = 52; int T2 = 53; int T3 = 40; int T4 = 41; int T5 = 46; int T6 = 47; void setup() { pinMode(T1, INPUT); pinMode(T2, INPUT); pinMode(T3, INPUT); pinMode(T4, INPUT); pinMode(T5, INPUT); pinMode(T6, INPUT); } void loop() { if(digitalRead(T1) == HIGH) { //Servo W1 an Pin 9 W1.attach(9); W1.write(0); delay(500); W1.detach(); } if(digitalRead(T2) == HIGH) { W1.attach(9); W1.write(20); delay(500); W1.detach(); } if(digitalRead(T3) == HIGH) { //Servo W2 an Pin A2 W2.attach(A2); W2.write(0); delay(500); W2.detach(); } if(digitalRead(T4) == HIGH) { W2.attach(A2); W2.write(60); delay(500); W2.detach(); } if(digitalRead(T5) == HIGH) { //Servo W3 an Pin 3 W3.attach(3); W3.write(0); delay(500); W3.detach(); } if(digitalRead(T6) == HIGH) { W3.attach(3); W3.write(60); delay(500); W3.detach(); } }
Zu wenig Pins kannst du relativ leicht durch Schieberegister (74HC595) umgehen - davon kann man theoretisch beliebig viele hintereinander schalten. Dir ist also bewusst, dass man zur Erfassung der tatsächlichen Position zusätzliche Sensoren braucht, die du in diesem Fall einsparen möchtest. Also wirst du nur die Soll-Position anzeigen, die der Mikrocontroller zuvor an den jeweiligen Servo gesendet hat.
Ich würde das so machen: die Servos werden ja mit PWM angesteuert, 2 Weichenstellungen -> 2 PWM-Zeiten (zb 13 ms Richtung 1, 18 ms Richtung 2) PWM = 13 ms Pin X low, PWM =18 ms Pin X High. Porterweiterung mittels Schieberegister
Stefanus F. schrieb: > Zu wenig Pins kannst du relativ leicht durch Schieberegister (74HC595) > umgehen - davon kann man theoretisch beliebig viele hintereinander > schalten. > > Dir ist also bewusst, dass man zur Erfassung der tatsächlichen Position > zusätzliche Sensoren braucht, die du in diesem Fall einsparen möchtest. > Also wirst du nur die Soll-Position anzeigen, die der Mikrocontroller > zuvor an den jeweiligen Servo gesendet hat. hallo Stefanus, wie bereits geschrieben, könnte ich mit der Soll-Position leben. Das Thema Schieberegister ist für mich neu und muss ich mal danach googeln. Rudi
Also ein Arduino Mega hat (nicht nachgezählt) etwa 60 I/O. Pro Weiche brauchst du drei I/O.
Hubert G. schrieb: > Also ein Arduino Mega hat (nicht nachgezählt) etwa 60 I/O. > Pro Weiche brauchst du drei I/O. Schieberegister haben allerdings den Charme, nur wenige Cent zu kosten. Sie beschützen das Arduino Board vor so mancher Dummheit.
es sind laut Datenblatt 54 I/O Pins. 12 Weichen belegen 36 Pins 24 LEDs belegen 24 Pins somit wären mindestens 60 Pins nötig und damit am MEGA nicht ausreichend. Oder verstehe ich was falsch ? Rudi
Wieso brauchst du für die Weichen je 3Pin und die Led je 2?
mein laienhaftes Verständnis: pro Weiche 1 x Input, 2 x Output pro LED 1 x Input, 1 x Output (pro Weiche 2 LEDs Rudi
Rudi M. schrieb: > pro Weiche 1 x Input, 2 x Output > > pro LED 1 x Input, 1 x Output (pro Weiche 2 LEDs > > Rudi Für dem Input brauchst du nur einen Pin und für die Led auch nur einen. Ich weiss nicht wie du das Servo abschaltest. Wenn du da einen eigenen Pin benötigst, dann sind es nur 48 I/O. Der Mega hat 54 digitale I/O und 16 analoge I/O. Die analogen lassen sich aber auch als digitale verwenden.
Rudi M. schrieb: > mein laienhaftes Verständnis: > > pro Weiche 1 x Input, 2 x Output > > pro LED 1 x Input, 1 x Output (pro Weiche 2 LEDs > > Rudi Mal mal eine Skizze, wie du das meinst. Ich verstehe nicht (bin auch kein Modellbahner), wozu der Input bei der Weiche, wozu der Input bei der LED. Die LEDs sollen vermutlich den Zustand der Weiche anzeigen? Dann reicht auch ein Pin für zwei LEDs, wenn es eine Weiche mit nur zwei Zuständen ist:
1 | VCC |
2 | + |
3 | | |
4 | | |
5 | V -> LED |
6 | - |
7 | | |
8 | | |
9 | .-. |
10 | | | |
11 | | | |
12 | '-' |
13 | | |
14 | Output µC---o |
15 | | |
16 | .-. |
17 | | | |
18 | | | |
19 | '-' |
20 | | |
21 | | |
22 | V -> LED |
23 | - |
24 | | |
25 | | |
26 | === |
27 | GND |
28 | (created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de) |
Wenn du den Output des µC auf HIGH stellst, leuchtet du untere LED, bei LOW die obere.
Hubert schrieb: "Für dem Input brauchst du nur einen Pin und für die Led auch nur einen. Ich weiss nicht wie du das Servo abschaltest. Wenn du da einen eigenen Pin benötigst, dann sind es nur 48 I/O." ich verstehe das jetzt so, dass für das Servo und die LEDs ein gemeinsamer Input-Pin verwendet wird. Richtig? Die Abschaltung der Servos erfolgt wie in dem Sketch ( weiter oben) gezeigt mit Wx.detach(); Rudi
Ich hab jetzt nicht alles gelesen... Aber wenn ich das richtig verstanden hab, hast du Endlagenschalter an deinen Servos? Kannst du nicht einfach deren Signal abgreifen?
Rudi M. schrieb: > ich verstehe das jetzt so, dass für das Servo und die LEDs ein > gemeinsamer Input-Pin verwendet wird. Richtig? Richtig. > > Die Abschaltung der Servos erfolgt wie in dem Sketch ( weiter oben) > gezeigt mit > > Wx.detach(); Mir sagt das Wx.detach();nichts, kenne die Funktion nicht. Aber selbst wenn du für diese Funktion einen eigenen Pin benötigst, sind es erst 48 I/O.
keine Endlagenschalter vorhanden. Natürlich könnte ich Microschalter anbringen und damit die Ist-Position anzeigen. Das will ich aber nicht unbedingt, Soll-Position würde reichen Rudi
Rudi M. schrieb: > keine Endlagenschalter vorhanden. Denn hab ich da was in falschen Hals bekommen... Sorry ich stell grad fest, dass mir heut irgendwie die Ruhe fehlt.
Rudi M. schrieb: > Meine eigene Idee wäre evtl. 2 MEGAs parallel ansteuern, Fuer 16 Servos + 32 LEDs (+ 16 Hallsensoren): 1 x PCA9685 Board (i2c, 16 PVMs aka Servos) 4 x 74HC595 (je 8 x Out Shift fuer LEDs) ev. 2 x 74HC4051 (analog in Multiplexer f. Hallsensoren) Damit hast du noch zig Pins frei f. die Modellanlagen der Nachbarn ;-) leo
@ Hubert "detach" habe ich aus einem Video bei Youtube zur Weichensteuerung um die Spannung am Servo wieder abzuschalten. Das funktioniert ja gut. Wo habe ich meinen Denkfehler zur Anzahl der Pins? Meine Denke: ich brauche pro Servo 1 x Input, 2 x Output = 3 Pins pro LED 1 x Input, 1 x Output = 2 Pins meine Rechnung: 12 Servos 12 x 3 = 36 Pins 24 LEDs 24 x 2 = 48 Pins wenn für Servo und LED derselbe Input genommen werden kann komme ich auf 12 Input-Pins gemeinsam 24 Output-Pins für die Servos 24 Output-Pins für die LEDs also insgesamt 60 Pins. Wie kommst Du auf nur 48 Pins ? Wo denke ich falsch ? Rudi
Rudi M. schrieb: > wenn für Servo und LED derselbe Input genommen werden kann komme ich auf > 12 Input-Pins gemeinsam > 24 Output-Pins für die Servos > 24 Output-Pins für die LEDs > > also insgesamt 60 Pins. > > Wie kommst Du auf nur 48 Pins ? Ich weiss jetzt nicht wie du das Servo abschaltest und daher 2 Pin brauchst. Aber für die Leds brauchst du nur je einen Pin. Wie das geht hat HildeK ja schon aufgezeichnet.
leo schrieb: > Rudi M. schrieb: >> Meine eigene Idee wäre evtl. 2 MEGAs parallel ansteuern, > > Fuer 16 Servos + 32 LEDs (+ 16 Hallsensoren): > > 1 x PCA9685 Board (i2c, 16 PVMs aka Servos) > 4 x 74HC595 (je 8 x Out Shift fuer LEDs) > ev. 2 x 74HC4051 (analog in Multiplexer f. Hallsensoren) > > Damit hast du noch zig Pins frei f. die Modellanlagen der Nachbarn ;-) > > leo danke an Leo, das ist mir als Arduino Anfänger noch zu hoch. Werde aber mal googeln, vielleicht hilt´s weiter. Trotzdem Dank für Deine Antwort
ist ja toll wie das hier läuft. Ich komme mit dem Lesen eurer Antworten und Tipps kaum nach. Für heute will ich euch allen danken und euch und mir noch einen geruhsamen Sonntagabend gönnen. Ich werde dann alles nachvollziehen und mich mit Sicherheit und weiteren Fragen wieder an euch wenden. a guat´s Nächtle wünscht aus dem Ländle Rudi
Rudi M. schrieb: > zu a) LEDs ansteuern ist ja die erste Übung beim Arduino. Allerdings > liegen > dabei ständig 5 Volt an. In meinem Programm wird die Spannung am > Servo nach Erreichen der Position abgeschaltet. > > void loop() { > > if(digitalRead(T1) == HIGH) { //Servo W1 an Pin 9 > W1.attach(9); > W1.write(0); > delay(500); > W1.detach(); > } Wenn du annimmst, daß mit detach() die Spannung am Servo abgeschaltet wird, dann liegst du falsch. Diese Funktion löscht nur eine Pin-Zuordung. Siehe https://www.arduino.cc/en/Reference/ServoDetach detach(): Detach the Servo variable from its pin. If all Servo variables are detached, then pins 9 and 10 can be used for PWM output with analogWrite(). Deine Servos hängen nachher alle parallel an der Versorgung, zumindest wenn du nicht zusätzliche Hardware vorsiehst, um sie abzuschalten.
Rudi M. schrieb: > pro LED 1 x Input, 1 x Output = 2 Pins Wozu brauchst du denn für die LEDs einen Input???
Allgemeiner Vorschlag für Projekte mit vielen LEDs am Mikrocontroller: WS2812 (u.ä.)! Dazu installiert man die NeoPixel-Lib von Adafruit und danach benötigt man für nahezu beliebig viele RGB-LEDs nur noch eine (!!!) Datenleitung am Arduino. Die RGB-LEDs gibts als ca. 1cm breiten Klebestreifen, der beliebig auseinander geschnitten werden kann. Verbinden muss man die Teile nur mit 3 Leitungen (Plus, Masse, Daten). Man benötigt keine Vorwiderstände ... Sofern man die LEDs nicht zur Beleuchtung in full power Weiss, sondern nur zum Signalisieren in R, G, B verwendet, hält sich auch der Stromverbrauch in Grenzen. Die Lib bietet auch Befehle zur Helligkeitsbegrenzung. Die - deutlich weniger romantische Variante - wäre es, anstelle realer LEDs ein virtuelles Stellwerk auf einem Monitor zu restellen ...
:
Bearbeitet durch User
Ist natürlich auch eine Möglichkeit, muss man auch erst mal drauf kommen.
chris schrieb: > Wozu brauchst du denn für die LEDs einen Input??? Wenn Du den Thread liest, fällt auf: Rudi M. schrieb: > Allerdings würde ich anstelle der Reedkontakte Hallsensoren verwenden. Übersetzt: Rudi will den tatsächlichen Istzustand abfragen. Da frage ich jetzt, ob der µC damit überhaupt beschäftigt werden muss, Endschalter und LED gehen in reiner Hardware. Aktuelle LEDs in weiß, blau und grün sind schon unter einem mA eindeutig ablesbar.
jede LED braucht doch einen eigenen Input, damit LED "xyz" weiss, dass der Taster "xyz" gedrückt wurde. Soweit meine Logik. Wie geschrieben ist die Abfrage des Ist-Zustandes nicht unbedingt erforderlich. Auch die Anzeige des Soll-Zustandes wäre für mich o.k., da es sich um eine relativ kleine Anlage handelt. Ausserdem weniger Verdrahtungsaufwand. @Roller: ich hab´s nachgemessen, Du hast Recht. 5 Volt liegen ständig an. An + und GND natürlich sowieso, ebenfalls an + und Steuerleitung. In besagtem Video spricht der Autor allerdings von deaktivieren der Servos. Das habe ich falsch interpretiert. Seiner Aussage nach wird mit "detach" das Zittern der Servos verhindert. Rudi
Rudi M. schrieb: > jede LED braucht doch einen eigenen Input, damit LED "xyz" weiss, dass > der Taster "xyz" gedrückt wurde. Soweit meine Logik. Dann schreibe das doch so auf, dann verstehen wir es alle: Pro Weiche wird benötigt: 2 Eingänge für 2 Taster 1 Ausgang für zwei LEDs 1 Ausgang für das PWM Signal zum Servo Ich finde den Vorschlag mit dem PCA9685 sehr gut, das ist mit Sicherheit die einfachste Lösung, viele Servos anzusteuern. Dazu gibt es fertige Arduino Libraries. Für den Rest hast du dann wahrscheinlich schon genug Pins übrig. Ansonsten benutze Schieberegister (74HC595 für Ausgänge und 74HC165 für Eingänge) oder PCF8574 Chips mit I²C Bus. Auch dafür gibt es fertige Arduino Libraries. Alles über I²C laufen zu lassen hat den Vorteil, dass du den Mikrocontroller besonders leicht durch jeden beliebigen anderen ersetzen kannst. Sicher wird für Dich irgendwann WLAN interessant. Mit dem Arduino Framework und einem ESP8266 Modul (z.B. NodeMCU oder Wemos D1) dürfte dieser Wechsel ziemlich einfach sein.
:
Bearbeitet durch User
Wenn du für die Weichenschaltung zwei Taster und nicht (wie von mir angenommen)einen Schalter hast, dann brauchst du je Weichenservo 4 I/O. Da reicht ein Arduino Mega ja leicht aus und es bleiben noch mindestens 12 I/O in Reserve. Wenn du nicht vorhast das ganze wesentlich größer zu machen, würde ich mir das mit Portexpander und dergleichen nicht antun. Das lässt sich bei Bedarf immer noch problemlos nachrüsten wenn man die I2C-Leitungen freilässt. Anschauen oder besser nachmessen sollte man, was mit dem PWM-Pin beim "detach" tatsächlich passiert. Ist der Pin dann hochohmig oder liegt er auf einem festen Potential.
Hallo Rudi, Servo 3 Pin? Klar einem Servo und 2 Taster zum stellen. Eine Lösung wäre, pro Servo nur ein Taster und im Programm die Position merken, denn wenn Rechts dann nach Links bei Tastendruck und wenn Links dann nach Rechts. Somit nur ein Taster für jedes Servo, und schon ist der Pin für die zwei LED frei. Eine Led wie oben mit R an Gnd und die andere am selben Pin des Kontrollers mit R auf +5V. somit nur 3 Pin: 1x Servo 1x Taster 1x 2 LED Cool oder.. und Taster entprellen, und detach() ist gut dann Summen die Servo nicht mehr, benötigen aber immer noch Strom. Gruß Oliver char SW1; if(digitalRead(T1) == HIGH) { if (SW1 == 'R') { W1.attach(9); W1.write(0); SW1 = 'L'; // bin Links delay(500); W1.detach(); } else { W1.attach(9); W1.write(20); SW1 = 'R'; // bin Rechts delay(500); W1.detach(); } }
Beitrag #5848969 wurde vom Autor gelöscht.
hallo Oliver, ja das wäre cool ! Aber - beim Compilieren Deines Sketchs bekomme ich die Fehlermeldung "expected unqualified-id before "if" Ich kann da nichts falsches erkennen. Kannst Du einem Anfänger weiterhelfen ? Rudi
bei mir gehts...
1 | #include <Servo.h> |
2 | |
3 | |
4 | Servo W1; |
5 | Servo W2; |
6 | Servo W3; |
7 | |
8 | int T1 = 52; |
9 | int T2 = 53; |
10 | int T3 = 40; |
11 | int T4 = 41; |
12 | int T5 = 46; |
13 | int T6 = 47; |
14 | char SW1 = '0'; |
15 | |
16 | |
17 | void setup() { |
18 | |
19 | pinMode(T1, INPUT); |
20 | pinMode(T2, OUTPUT); //jetzt Ausgang für die LEDs |
21 | pinMode(T3, INPUT); |
22 | pinMode(T4, INPUT); |
23 | pinMode(T5, INPUT); |
24 | pinMode(T6, INPUT); |
25 | } |
26 | |
27 | void loop() { |
28 | |
29 | if(digitalRead(T1) == HIGH) { |
30 | if (SW1 == 'R') |
31 | { |
32 | W1.attach(9); |
33 | W1.write(0); |
34 | digitalWrite(T2, HIGH); // LED nach GND an |
35 | SW1 = 'L'; // bin Links |
36 | delay(500); |
37 | W1.detach(); |
38 | } |
39 | else |
40 | { |
41 | W1.attach(9); |
42 | W1.write(20); |
43 | digitalWrite(T2, LOW); // LED nach +5V an |
44 | SW1 = 'R'; // bin Rechts |
45 | delay(500); |
46 | W1.detach(); |
47 | } |
48 | } |
49 | |
50 | if(digitalRead(T3) == HIGH) { //Servo W2 an Pin A2 |
51 | W2.attach(A2); |
52 | W2.write(0); |
53 | delay(500); |
54 | W2.detach(); |
55 | } |
56 | if(digitalRead(T4) == HIGH) { |
57 | W2.attach(A2); |
58 | W2.write(60); |
59 | delay(500); |
60 | W2.detach(); |
61 | } |
62 | if(digitalRead(T5) == HIGH) { //Servo W3 an Pin 3 |
63 | W3.attach(3); |
64 | W3.write(0); |
65 | delay(500); |
66 | W3.detach(); |
67 | } |
68 | if(digitalRead(T6) == HIGH) { |
69 | W3.attach(3); |
70 | W3.write(60); |
71 | delay(500); |
72 | W3.detach(); |
73 | } |
74 | } |
ja klar... vorher war ja nur ein Teil vom Sketch, habe ich zu spät bemerkt. Ich werde das jetzt mal ausprobieren wenn das so klappt, wäre das die geniale Lösung Rudi
ja nur die Taster, bitte noch entprellen sonst ist es eine glück Sache mit den schalten... einfach aber schlecht...
1 | ... Schnipp ... |
2 | |
3 | if(digitalRead(T1) == HIGH) { //Taste gedrückt? |
4 | delay (50); |
5 | if(digitalRead(T1) == HIGH) { // immer noch gedrückt?? |
6 | if (SW1 == 'R') |
7 | { |
8 | W1.attach(9); |
9 | W1.write(0); |
10 | digitalWrite(T2, HIGH); |
11 | SW1 = 'L'; // bin Links |
12 | delay(500); |
13 | W1.detach(); |
14 | } |
15 | else |
16 | { |
17 | W1.attach(9); |
18 | W1.write(20); |
19 | SW1 = 'R'; // bin Rechts |
20 | digitalWrite(T2, LOW); |
21 | delay(500); |
22 | W1.detach(); |
23 | } |
24 | } |
25 | } |
26 | |
27 | ... schnapp ... |
hallo Oliver, das verwirrt mich jetzt alles ein bisschen. Könntest Du mir Deinen Sketch für nur ein Servo mit 2 LEDs abändern? Evtl. für eine Arduino UNO. Einfach mal zum Ausprobieren. So ist mir das unübersichtlich. Die Ansteuerung mit nur 1 Taster wäre super. Wenn ich selber ändere bzw. reduzieren will, bekomme ich Fehlermeldungen die ich nicht ganz verstehe. Meine Bitte ist vielleicht etwas unverschämt, aber mit 77 Jahren muss ich mich da erst langsam einarbeiten Rudi
Oliver R. schrieb: > ja nur die Taster, bitte noch entprellen sonst ist es eine glück Sache > mit den schalten... > > einfach aber schlecht... > >
1 | > ... Schnipp ... |
2 | > |
3 | > if(digitalRead(T1) == HIGH) { //Taste gedrückt? |
4 | > delay (50); |
5 | > if(digitalRead(T1) == HIGH) { // immer noch gedrückt?? |
6 | > if (SW1 == 'R') |
7 | > { |
8 | > W1.attach(9); |
9 | > W1.write(0); |
10 | > digitalWrite(T2, HIGH); |
11 | > SW1 = 'L'; // bin Links |
12 | > delay(500); |
13 | > W1.detach(); |
14 | > } |
15 | > else |
16 | > { |
17 | > W1.attach(9); |
18 | > W1.write(20); |
19 | > SW1 = 'R'; // bin Rechts |
20 | > digitalWrite(T2, LOW); |
21 | > delay(500); |
22 | > W1.detach(); |
23 | > } |
24 | > } |
25 | > } |
26 | > |
27 | > ... schnapp ... |
28 | > |
Entprellen von Tastern ist natürlich immer gut, aber die Ergänzung in deinem letzten Beispiel ist unnötig. Dein Beispiel davor funktioniert genauso gut, da nach Tastendruck und erkannter Aktion erst mal 500 msec (wegen delay(500)) nichts mehr abgefragt wird. Der Nachteil der 1-Taster Lösung ist, wenn man zu lange auf die Taste drückt, wechselt das Servo alle 500 msec die Position. @Rudi Weshalb müssen es Taster sein? Willst du mit Taster und LEDs einen visuellen Streckenplan (Stellpult) bauen? Mit einem simplen Ein/Aus Kippschalter wäre es etwas einfacher. Es reicht eine Eingangsleitung und es muss nur der aktuelle Schaltzustand abgefragt werden. Vor allem hast du damit automatisch den letzten Zustand von Weichen und LEDs 'gespeichert', und kannst in beim Einschalten des Prozessors wiederherstellen. Bei einer Tasterlösung mußt du entweder immer den gleichen Anfangszustand herstellen, oder die letzte Einstellung anderweitig über einen Powerfail hinweg retten.
Hallo Rudi, hier bitte:
1 | #include <Servo.h> |
2 | |
3 | |
4 | Servo W1; |
5 | |
6 | int T1 = A0; |
7 | int L1 = 8; |
8 | int S1 = 7; |
9 | |
10 | char SW1 = '0'; |
11 | |
12 | |
13 | void setup() { |
14 | |
15 | pinMode(A0, INPUT); |
16 | pinMode(8, OUTPUT); |
17 | } |
18 | |
19 | void loop() { |
20 | |
21 | if(digitalRead(T1) == HIGH) { |
22 | delay (20); |
23 | if(digitalRead(T1) == HIGH) { |
24 | if (SW1 == 'R') |
25 | { |
26 | W1.attach(S1); |
27 | W1.write(00); |
28 | digitalWrite(L1, HIGH); |
29 | SW1 = 'L'; // bin Links |
30 | delay(500); |
31 | W1.detach(); |
32 | } |
33 | else |
34 | { |
35 | W1.attach(S1); |
36 | W1.write(200); |
37 | SW1 = 'R'; // bin Rechts |
38 | digitalWrite(L1, LOW); |
39 | delay(500); |
40 | W1.detach(); |
41 | } |
42 | } |
43 | } |
44 | } |
Gruß Oliver
Rudi M. schrieb: > jede LED braucht doch einen eigenen Input, damit LED "xyz" weiss, dass > der Taster "xyz" gedrückt wurde. Soweit meine Logik. Nein. Es reicht doch, wenn dein Prozessor weiß, dass Taster "xyz" gedrückt wird und dann die LED "xyz" zusätzlich einschaltet - und die andere aus. Hast du meinen letzten Post angesehen? Und mit obigem Vorschlag, nur einen Taster zum Umschalten zu verwenden, sind es nur zwei Pins pro Weiche. HildeK schrieb:
1 | > VCC |
2 | > + |
3 | > | |
4 | > | |
5 | > V -> LED |
6 | > - |
7 | > | |
8 | > | |
9 | > .-. |
10 | > | | |
11 | > | | |
12 | > '-' |
13 | > | |
14 | > Output µC---o |
15 | > | |
16 | > .-. |
17 | > | | |
18 | > | | |
19 | > '-' |
20 | > | |
21 | > | |
22 | > V -> LED |
23 | > - |
24 | > | |
25 | > | |
26 | > === |
27 | > GND |
28 | > (created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de) |
hallo Oliver, zunächst vielen Dank für Deine Mühe. Heute werde ich nicht mehr dazu kommen, das aufzubauen und zu probieren. Trotzdem hoffe ich , dass ich baldmöglichst eine Erfolgsmeldung geben kann. bis dahin und auch danke an HildeK. die Schaltung mit 2 LEDs an einem Output habe ich probiert, funzt prima !! Grüssle aus dem Ländle Rudi
Wenn ich mir die Bilder ansehe, wird mir schwindelig. Erscheinen die bei euch auch seltsam verzerrt?
Stefanus F. schrieb: > Wenn ich mir die Bilder ansehe, wird mir schwindelig. > Erscheinen die bei euch auch seltsam verzerrt? Ja, kommt immer wieder vor. Mir ist die Ursache unklar. Ev. mit dem falschen Bildbearbeiter gedreht? Tipp: Klick auf den Filenamen des Bildes, es erscheint dann korrekt (zumindest im Firefox).
Rudi M. schrieb: > jede LED braucht doch einen eigenen Input, damit LED "xyz" weiss, dass > der Taster "xyz" gedrückt wurde. Soweit meine Logik. braucht die LED einen eigenen Input, auch an der Ampel? oder weiß die Grüne nicht das sie nur an sein darf wenn die Rote NICHT leuchtet. > Wie geschrieben ist die Abfrage des Ist-Zustandes nicht unbedingt > erforderlich. > Auch die Anzeige des Soll-Zustandes wäre für mich o.k., da es sich um > eine relativ kleine Anlage handelt. Ausserdem weniger > Verdrahtungsaufwand. du weisst doch wann dein Servo startet und stoppt, das wären die Endlagen und da könntest du dir einen Merker setzen und die LED einschalten
hallo Oliver, bin jetzt mal auf die Schnelle Deinen Sketch gedanklich durchgegangen. Ein paar Zeilen verstehe ich nicht: a) was bedeutet die Zeile vor dem Setup char SW1 = '0'; b) was bedeuten die Zeilen if(digitalRead(T1) == HIGH) { delay (20); if(digitalRead(T1) == HIGH) { if (SW1 == 'R') c) W1.write(00); W1.write(200); ich lese das so: 00 ist linke Position 200 ist rechte Position ist dann jeder Zwischenwert möglich? Ich benötige ca. 30 Grad Drehwinkel. Ich hatte jetzt noch keine Zeit zum Probieren und wäre für Deine Aufklärung dankbar. Rudi
Hallo, 1. nur zur Initialisierung: char SW1 = '0'; kann auch durch char SW1 = 'L'; ersetzt werden. 2. ist zur Entprellung des Taster, da aber nach der Servo Steuerung so und so 500ms gewartet wird ist das nicht nötig. 3. waren werte für mein Servo damit der sich im Video auch deutlich bewegt, sollte durch deine Werte ersetzt werden. die 30° musste man durch ändern der Werte ermittel. Gruß Oliver
:
Bearbeitet durch User
sodele, Testaufbau am Breadboard mit Sketch von Oliver ist gemacht und läuft wie gewünscht beim ersten Tastendruck dreht das Servo nach links beim zweiten Tastendruck dreht das Servo nach rechts gleichzeitig wechseln sich die LEDs ab und es werden nur 3 Pins am Arduino benötigt. Einziger Schönheitsfehler ist, dass bei längerem Tastendruck das Servo ständig hin- und her läuft. Kann man das im Sketch evtl. noch ändern? Ist jedoch auch so akzeptabel, da zur Weichenstellung ein kurzer Tastendruck genügt. Ein weiterer Wunsch wäre, die Servobewegung zu verlangsamen . Aber das wird evtl. zu aufwändig und ist auch nicht unbedingt erforderlich. Das war jetzt also der Testaufbau am UNO. Wenn ich das am MEGA für 12 Weichen auch so hinkriege, bin ich happy. Rudi
Rudi M. schrieb: > Einziger Schönheitsfehler ist, dass bei längerem Tastendruck das Servo > ständig hin- und her läuft. dann lasse doch keinen weiteren Durchlauf zu bis nicht wenigstens der Taster einmal losgelassen wurde.
hallo Joachim, da hast Du sicherlich recht und klingt auch logisch. Aber erkläre doch bitte einem Dummi, wie man das macht bzw. in den Sketch einbringt. Danke schon mal Rudi
1 | if(digitalRead(T1) == HIGH) { /// drin lassen um es zu Kapseln |
2 | if(digitalRead(T1) == HIGH) { |
3 | if (SW1 == 'R') |
4 | { |
5 | W1.attach(S1); |
6 | W1.write(00); |
7 | digitalWrite(L1, HIGH); |
8 | SW1 = 'L'; // bin Links |
9 | delay(500); |
10 | W1.detach(); |
11 | } |
12 | else |
13 | { |
14 | W1.attach(S1); |
15 | W1.write(200); |
16 | SW1 = 'R'; // bin Rechts |
17 | digitalWrite(L1, LOW); |
18 | delay(500); |
19 | W1.detach(); |
20 | } |
21 | } |
22 | while ( digitalRead(T1) == HIGH ) // warte auf loss lassen |
23 | { |
24 | delay(1) |
25 | } |
26 | } |
Rudi M. schrieb: > Aber erkläre doch bitte einem Dummi, wie man das macht bzw. in den > Sketch einbringt. Ich kann zwar die Sketchsprache nicht, aber im Pseudocode geht das etwa so:
1 | if (Taste == HIGH) // Taste wurde gedrückt |
2 | { |
3 | delay (20); // einfachste Art der Entprellung, nach 20ms nochmals abfragen, ob noch der selbe Zustand herrscht. |
4 | if (Taste == HIGH) |
5 | { |
6 | // tu etwas: Weiche umschalten, LED umschalten |
7 | // |
8 | // anschließend warten, bis der Taster wieder auf LOW ist (hier: losgelassen wurde): |
9 | while (Taste == HIGH); // einfach warten und nichts tun, solange Taste auf HIGH steht |
10 | } |
11 | // hier ist Taste dann auf jeden Fall wieder auf LOW |
12 | } |
hallo Oliver, ich lösche den "alten" Inhalt von void loop und kopiere Deine neue Zeilen da rein. Bekomme dann aber Fehlermeldungen kannst Du das bitte mal prüfen ? Rudi
Sag mal Rudi: Ich dachte du wolltest das selber programmieren, nicht programmieren lassen. Dies ist eine gute Gelegenheit, es zu lernen.
Da kann man echt neidisch werden, wie jung Rudis Hände geblieben sind (auf dem Video). War wohl Schreibtischtäter und Nivea-Großkunde :-)
OssiFant schrieb: > Da kann man echt neidisch werden, wie jung Rudis Hände geblieben sind > (auf dem Video). War wohl Schreibtischtäter und Nivea-Großkunde :-) hallo neidischer Ossi ohne Namen - vielleicht schaust Du nochmals nach, von wem das Video ist.... wir Schwaben sagen in solchen Fälle "saudomms´´s G´schwätz" jetzt hoffe ich trotzdem noch auf sachdienliche Posts Rudi
Hallo Rudi, hier noch mal, aber ab jetzt selbst probieren, ist jetzt auch mit Servo langsamer Bewegung... Gruß Oliver
Servos werden per ppm angesteuert und daraus lässt sich die Position ableiten. So einfach ist das
danke Oliver, für Deinen letzten Sketch und die Mühe, die Du Dir gemacht hast um mir auf die Sprünge zu helfen. Das ist jetzt genau das, was ich wollte - und es funktioniert SUPER !!! Jetzt werde ich versuchen, das für die 12 Weichenantriebe auf dem MEGA umzusetzen. Dank Deiner Unterstützung denke ich, dass ich das jetzt alleine schaffe. Danke auch an alle Anderen, die mir geholfen haben, Arduino besser zu verstehen. Grüssle Rudi
Rudi M. schrieb: > hallo neidischer Ossi ohne Namen - > vielleicht schaust Du nochmals nach, von wem das Video ist.... > > wir Schwaben sagen in solchen Fälle "saudomms´´s G´schwätz" Lieber Rudi, warum denn so unfreundlich? Deine Aussage passt doch eher auf Deine Reaktionen :-)
OssiFant schrieb: > Da kann man echt neidisch werden, wie jung Rudis Hände geblieben sind > (auf dem Video). ja Alk tötet Zellen :) Rudi M. schrieb: > vielleicht schaust Du nochmals nach, von wem das Video ist.... der Hinweis war doch deutlich! OssiFant schrieb: > warum denn so unfreundlich? irgendwie verständlich wenn eener aus dem Mus-topp kommt! der Thread mit der Frage war vom Autor: Rudi M. (ykabel) Das Video von Autor: Oliver R. (roliver75) OK man hätte es auf dem Silbertablett mit Kreidestimme servieren können, aber bei dem Unterton: OssiFant schrieb: > Da kann man echt neidisch werden, wie jung Rudis Hände geblieben sind > (auf dem Video). schwang auch für mich unterschwellig "Lüge" mit, bezogen auf: Rudi M. schrieb: > ich bin erstens 77
:
Bearbeitet durch User
HildeK schrieb: > Ich kann zwar die Sketchsprache nicht, aber im Pseudocode geht das etwa > so: Sketchsprache aha... willst Du sagen dass du kein C/C++ kannst? Warum verwendest Du geschweifte Klammern? (C-shell? Java? JavaScript? ...?)
danke an alle, die mir mit sachdienlichen Antworten geholfen haben. Nachdem die letzten Beiträge mit meinem Problem nichts mehr zu tun haben, kann hier dicht gemacht werden Gruss Rudi
Hallo Vielleicht kann mir bitte jemand helfen, ich habe die Weichensteuerung für 5 Weichen programiert, leider funktioniert nur W1, kann sich jemand bitte mal den Sketch anschauen ? Was mache ich falsch ??
1 | #include <Servo.h> |
2 | |
3 | |
4 | |
5 | Servo W1; |
6 | Servo W2; |
7 | Servo W3; |
8 | Servo W4; |
9 | Servo W5; |
10 | |
11 | |
12 | int T1 = A0; |
13 | int T2 = A1; |
14 | int T3 = A2; |
15 | int T4 = A3; |
16 | int T5 = A4; |
17 | int S1 = 22; |
18 | int S2 = 23; |
19 | int S3 = 24; |
20 | int S4 = 25; |
21 | int S5 = 26; |
22 | int L1 = 27; |
23 | int L2 = 28; |
24 | int L3 = 29; |
25 | int L4 = 30; |
26 | int L5 = 31; |
27 | |
28 | char SW1 = '0'; |
29 | |
30 | void setup() { |
31 | pinMode(A0, INPUT); |
32 | pinMode(A1, INPUT); |
33 | pinMode(A2, INPUT); |
34 | pinMode(A3, INPUT); |
35 | pinMode(A4, INPUT); |
36 | pinMode(A5, INPUT); |
37 | pinMode(L1, OUTPUT); |
38 | pinMode(L2, OUTPUT); |
39 | pinMode(L3, OUTPUT); |
40 | pinMode(L4, OUTPUT); |
41 | pinMode(L5, OUTPUT); |
42 | }
|
43 | |
44 | void loop() { |
45 | |
46 | if(digitalRead(T1) == HIGH) { |
47 | delay (20); |
48 | if(digitalRead(T1) == HIGH) { |
49 | if (SW1 == 'R') |
50 | {
|
51 | W1.attach(S1); |
52 | W1.write(90); |
53 | digitalWrite(L1, HIGH); |
54 | SW1 = 'L'; |
55 | delay(500); |
56 | W1.detach(); |
57 | }
|
58 | else
|
59 | {
|
60 | W1.attach(S1); |
61 | W1.write(82); |
62 | SW1 = 'R'; |
63 | digitalWrite(L1, LOW); |
64 | delay(500); |
65 | W1.detach(); |
66 | {
|
67 | if(digitalRead(T2) == HIGH) { |
68 | delay (20); |
69 | if(digitalRead(T2) == HIGH) { |
70 | if (SW1 == 'R') |
71 | {
|
72 | W2.attach(S2); |
73 | W2.write(90); |
74 | digitalWrite(L2, HIGH); |
75 | SW1 = 'L'; |
76 | delay(500); |
77 | W2.detach(); |
78 | }
|
79 | else
|
80 | {
|
81 | W2.attach(S2); |
82 | W2.write(82); |
83 | SW1 = 'R'; |
84 | digitalWrite(L2, LOW); |
85 | delay(500); |
86 | W2.detach(); |
87 | {
|
88 | if(digitalRead(T3) == HIGH) { |
89 | delay (20); |
90 | if(digitalRead(T3) == HIGH) { |
91 | if (SW1 == 'R') |
92 | {
|
93 | W3.attach(S3); |
94 | W3.write(90); |
95 | digitalWrite(L3, HIGH); |
96 | SW1 = 'L'; |
97 | delay(500); |
98 | W3.detach(); |
99 | }
|
100 | else
|
101 | {
|
102 | W3.attach(S3); |
103 | W3.write(82); |
104 | SW1 = 'R'; |
105 | digitalWrite(L3, LOW); |
106 | delay(500); |
107 | W3.detach(); |
108 | }
|
109 | if(digitalRead(T4) == HIGH) { |
110 | delay (20); |
111 | if(digitalRead(T4) == HIGH) { |
112 | if (SW1 == 'R') |
113 | {
|
114 | W4.attach(S4); |
115 | W4.write(90); |
116 | digitalWrite(L4, HIGH); |
117 | SW1 = 'L'; |
118 | delay(500); |
119 | W4.detach(); |
120 | }
|
121 | else
|
122 | {
|
123 | W5.attach(S5); |
124 | W5.write(82); |
125 | SW1 = 'R'; |
126 | digitalWrite(L5, LOW); |
127 | delay(500); |
128 | W4.detach(); |
129 | }
|
130 | if(digitalRead(T5) == HIGH) { |
131 | delay (20); |
132 | if(digitalRead(T5) == HIGH) { |
133 | if (SW1 == 'R') |
134 | {
|
135 | W5.attach(S5); |
136 | W5.write(90); |
137 | digitalWrite(L5, HIGH); |
138 | SW1 = 'L'; |
139 | delay(500); |
140 | W5.detach(); |
141 | }
|
142 | else
|
143 | {
|
144 | W5.attach(S5); |
145 | W5.write(82); |
146 | SW1 = 'R'; |
147 | digitalWrite(L5, LOW); |
148 | delay(500); |
149 | W5.detach(); |
150 | }
|
151 | }
|
152 | }
|
153 | }
|
154 | }
|
155 | }
|
156 | }
|
157 | }
|
158 | }
|
159 | }
|
160 | }
|
161 | }
|
162 | }
|
163 | }
|
164 | }
|
165 | }
|
Vielen Dank
:
Bearbeitet durch Moderator
Steve S. schrieb: > leider funktioniert nur W1 Beschreibe, was das Programm tun sollte und was es stattdessen tut. Beschriebe schritt für Schritt, wie jemand dein Problem reproduzieren kann, der nicht auf deinem Schoß sitzt. Welcher Zusammenhang besteht zwischen deinem Fall und dieser Diskussion? Wenn du schon die fette rote Meldung ignorierst, dann solltest du einen guten Grund haben. Der wäre? Hast du dich vergewissert, dass die gewählten Pins für PWM geeignet sind? Welche Hardware verwendest du überhaupt? Gibt es keinen Schaltplan, oder wenigstens ein Blockschaltbild? Benutze bitte Code Tags, wenn du Quelltext einfügst. Die entsprechende Anleitung steht direkt über dem Eingabefeld. Achte darüber hinaus, dass der Quelltext vernünftig eingerückt ist. Das da oben ist so nicht vernünftig lesbar. Ich verweigere, mich damit auseinander zu setzen. Mach das erstmal schön!
:
Bearbeitet durch User
Steve S. schrieb: > ich habe die Weichensteuerung > für 5 Weichen programiert, leider funktioniert nur W1, kann sich jemand > bitte mal den Sketch anschauen ? Hab jetzt nur ganz kurz mal drübergeschaut, aber wenn Deine Einrückungen einigermaßen zur Programmstruktur passen, dann dürfte der Code für die Weichen 2-5 innerhalb von irgendeinem if/else Block von Weiche 1 stehen und deshalb nur ausgeführt werden, wenn Weiche 1 gerade irgendwas macht.
Steve S. schrieb: > Was mache ich falsch ?? 1. Du beachtest fette rote Hinweise nicht:
1 | Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. |
2 | Bitte hier nur auf die ursprüngliche Frage antworten, |
3 | für neue Fragen einen neuen Beitrag erstellen. |
2. Du beachtest die Bedienungsanleitung nicht, die über jeder Texteingabebox steht:
1 | Antwort schreiben |
2 | Wichtige Regeln - erst lesen, dann posten! |
3 | |
4 | Groß- und Kleinschreibung verwenden |
5 | Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang |
6 | |
7 | Formatierung (mehr Informationen...) |
8 | |
9 | [c]C-Code[/c] |
3. Du plenkst. Satzzeichen haben aber keine eigene Zeile verdient.
:
Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.