Hallo Uwe,
ein fertiges Shield zu nehmen ist keine schlechte Idee...werde ich mir nochmal anschauen, wenn ich genau weiß, was ich HW-mäßig anschließe.
Hallo Franz-Peter,
Stiftleisten habe ich jetzt...Danke für das Stichwort, und die Servostecker passen sogar drauf...
Nachdem ich erstmal etwas rumprobiert habe mit LED Schaltungen und Tastern, habe ich nun mit dem ersten "sinnvollen" Sketch angefangen.
HWseitig für den Test des Sketches: 1 Taster, 1 LED und ein Servo.
Und tatsächlich passiert das, was beabsichtigt ist. Auf Tastendruck fährt der Servo jeweils in die andere Position.
Die rote LED leuchtet bei Abzweig.
Der von mir verwendete Servo hat allerdings keinen Bewegungsbereich von 180 Grad. Mit Werten außerhalb von ca 45-120 Grad brummte der Servo (wohl weil er die ganze Zeit versuchte in eine Position zu kommen, die er nicht erreichen kann. Mit obigen Werten ist er nach erreichen der Endposition ruhig.
Klar geworden ist mir noch nicht, wie ich die Endpositionen des Servos im eingebautem Zustand programmiere oder festlege und dann auf dem Arduino dauerhaft speichere. Muß mal nach Sketches suchen, die eine Programmierung über DCC machen...
Im Betrieb später am Modul, soll es pro Weiche einen Taster geben und eine rote und eine grüne LED, die die Position anzeigen.
Die Teile für die DCC Eingangsplatine sind noch nicht alle da, aber sobald das Teil fertig ist, sollen die Weichen alternativ über DCC geschaltet werden können, die LEDs sollen weiterhin die aktuelle Position anzeigen.
Die Eieruhr muß ich noch einbauen...
Da auf dem Modul nur zwei Weichen sein werden, werde ich noch einige Ausgänge frei haben, z.B. um Beleuchtung zu schalten etc...mal sehen.
Hier der aktuelle Stand:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <NmraDcc.h>
#include <MobaTools.h>
//
// Test mit einem Servo
//
// Hardware:
// 1 Taster mit 10K Pulldown -- Anschluß 2
// 1 LED, rot -- Anschluß 11
// 1 Servo -- Anschluß 12
//
// Ablauf:
// Nach Start des Arduino wird der Servo in Mittelstellung gefahren (somit ist der Einbau einfach möglich)
//
const int servoCount=1; // falls mehr Servos dazu kommen, kann hier erhöht werden
Servo8 servo[servoCount];
const int servoPin[servoCount] = {12}; // pro servoCount muß ein Pin Wert erhöht ergänzt werden
int servoSpeed[5] = {0, 5, 10, 20, 40}; // Test der Servogeschwindigkeit
int pos [3] = {45,90,125}; // die drei Positionen des Servos, Anschlag1, Mitte, Anschlag2 (die Anschläge sollten später programmiert werden und gespeichert
int actSpeed[servoCount] = {0}; // für jeden Servo die aktuelle Geschwindigkeit
int servoPos[servoCount] = {1};
boolean servoMoves[servoCount];
const int servoStraight = 0; // Indexwert in pos
const int servoMiddle = 1;
const int servoCurve = 2;
// Button mit 10K Widerstand als pull-down
//
int ledRed = 11; // assign the car lights
int button[servoCount] = {2}; // button pins (jeder Servo -> ein Taster
int buttonState[servoCount];
void setup() {
Serial.begin(9600); // Seriellen Monitor aktivieren, um beim "debugging" Werte anzeigen zu können.
Serial.flush(); // flushen der Meldungen
Serial.println(" Welcome to Servo test ");
pinMode(ledRed, OUTPUT); // led PIN als Output definieren
pinMode(button, INPUT); // button on pin 2
digitalWrite(ledRed, LOW); // rote LED ausschalten
for (int i=0; i< servoCount; i++) { // Servos initialisieren: attachen und Geschwindigkeit setzen
servo[i].attach(servoPin[i]);
servo[i].setSpeed(servoSpeed[i]);
servo[i].write(pos[servoPos[i]]); // Servos in positionieren (am Anfang in Mittelstellung für den Einbau
}
}
void loop() {
for (int i=0;i<servoCount;i++) {
buttonState[i] = digitalRead(button[i]); // Button status abfragen
if (buttonState[i] == HIGH) { //button wurde gedrückt
if (servoPos[i] == servoMiddle) {
servo[i].write(pos[servoStraight]);
servoPos[i] = servoStraight;
digitalWrite(ledRed, LOW);
}
else if (servoPos[i] == servoStraight) {
servo[i].write(pos[servoCurve]);
servoPos[i] = servoCurve;
digitalWrite(ledRed, LOW);
// digitalWrite(ledgreen[i], HIGH);
// digitalWrite(ledred[i], LOW);
}
else if (servoPos[i] == servoCurve) {
servo[i].write(pos[servoStraight]);
servoPos[i] = servoStraight;
digitalWrite(ledRed, HIGH);
}
} // button pressed
delay(200); //damit ein Tastendruck nur einmal registiert wird. Ziel -> Eieruhr
}// for-loop
}
Das macht richtig Spaß mit dem Teil...