Modellbahn-Basteleien Teil2

Ach ja, habe ich dich und mich verwirrt. Auf dem Testboard sind bei mir die beiden äußeren Plus :stuck_out_tongue_winking_eye:, nicht wie aufgezeichnet auf dem Board. Kommt von der MoBa, immer die Außenschiene ist plus, wegen Kreisverkehr...

Ich hatte dort gar keine Resetverbindung!!
Ich lasse das Testboard einfach weg. Habe versucht, deine Anweisungen umzusetzen. Reset über Widerstand und weiter zu MCP1 und2. An 2 Halls 1 kOhm beispielhaft.

Hast Du! Leider dauert es auch noch an :crazy_face:

Ich habe den Eindruck, Du weißt nicht, was ein PullUp-Widerstand ist. Kann das sein? Dein Bild unterscheidet sich grundlegend von meinem bezüglich Reset und Sensoren. Ein Widerstand, der zwei verbundene Kontakte verbindet, ergibt keinen Sinn.

Reset ist an MCP-Pin 18, nicht 19. Links ist es falsch, mitte und rechts richtig.

Weißt du, dass ich vom Lesen die Nase voll habe? Pull-up Widerstand wird auf 3 (!!) Varianten beschrieben. Ich mache es kurz

Darf ich dies anbieten? Nur bis vor "Berechnung des Pullup-Widerstandswertes":

Die Erklärung ist gut, habe ich sie elektrisch jetzt richtig?
Pull-up

Der Kandidat hat 99 Punkte!

Wenn Du den PullUp von Reset noch auf einen höheren Wert als 220 Ω änderst, werden es 100 Punkte!

Ich glaube es nicht, so habe ich es doch schon gehabt, nur viel umständlicher hier: #55. Dummheit ist doch grenzenlos.

LEDs träumen von Abwechslung:


Alle LEDs haben einen integrierten Vorwiderstand!

Du meinst, ich sollte erst mal mit Leds bestücken um dann loszulegen?

Nein, ich habe keine Bahnstrecke zum Testen und auch keine Relais. Du solltest schon mit Relais testen, wenn Weichen angeschlossen sind. Ich könnte mir einen Pendelzug vorstellen, um mal in Praxis einen Zug fahren zu sehen, beispielsweise von Bf1 nach Bf4, dann kann nichts passieren. Mir ist der Ablauf beim Halten eines Zuges noch gänzlich unklar. Das wäre m. E. zu Testen.

In manchen Deiner Zeichnungen sind LEDs ohne Vorwiderstand eingezeichnet. Verwendest Du so wie ich welche mit integriertem Vorwiderstand?

Ja.

Also: Immer wenn ein Hall vor dem Zielgleis ausgelöst wird, soll der Zug langsam zum stehen kommen, warten und für den nächsten Zug das Beschleunigen auslösen.
Hier ein Beispiel für 2 Motoren (noch mit ungeliebtem Delay):

/*
  DC-Motorsteuerung mit L298N zum Regeln
  von Anfahr- und Bremsverhalten mit 2 Hallsensoren
  von Schorsch für ZFI
  27.03.21
*/

// Definition Hallpins und Hallstatus
const int hallSensorPin = 2;
const int hallSensorPin2 =3;
int hallStatus = LOW;     // 1. Hall aktiv
int hallStatus2=HIGH;  // 2. Hall paasiv

// Gleichstrommotor 1
int GSM1 = 10;
int in1 = 9;
int in2 = 8;

// Gleichstrommotor 2
int GSM2 = 5; //IN B
int in3 = 7; // IN 3
int in4 = 6;  // IN 4
void setup()
{
  Serial.begin(9600);
  pinMode(GSM1, OUTPUT);    
  pinMode(GSM2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
pinMode(hallSensorPin, INPUT);
pinMode(hallSensorPin2, INPUT);
if (hallStatus ==LOW) {
// Beschleunigen
  for (int i = 0; i <=240; i += 20) { //in 40-iger Schritten bis Maximalgeschwindigkeit
    digitalWrite(in1, HIGH);  
    digitalWrite(in2, LOW);   // Motor 1 beginnt zu rotieren
    analogWrite(GSM1, i); // Motor 1 beschleunigt 
    delay(100);
  }
}
}
void HALL1A() 
{
  if (hallStatus ==LOW) {
// Bremsen M2
  for (int i = 240; i >=0; i -= 40) { //in 40-iger Schritten bis Maximalgeschwindigkeit
    digitalWrite(in3, LOW);  
    digitalWrite(in4, HIGH);   // Motor 2 beginnt zu rotieren
    analogWrite(GSM2, i); // Motor 2 bremst
    delay(500);
  }
  } 
  if (hallStatus ==LOW) {
// Beschleunigen M1
  for (int i = 0; i <=240; i += 20) { //in 40-iger Schritten bis Maximalgeschwindigkeit
    digitalWrite(in1, HIGH);  
    digitalWrite(in2, LOW);   // Motor 1 beginnt zu rotieren
    analogWrite(GSM1, i); // Motor 1 beschleunigt 
    delay(100);
  }
  }
}
void HALL1B()
{
 if (hallStatus2 ==LOW) {
// Bremsen M1
  for (int i = 240; i >=0; i -= 40) { //in 40-iger Schritten bis Maximalgeschwindigkeit
    digitalWrite(in1, HIGH);  
    digitalWrite(in2, LOW);   // Motor 1 beginnt zu rotieren
    analogWrite(GSM1, i); // Motor 1 bremst
    delay(500);
  }
  }
  if (hallStatus2 ==LOW) {
// Beschleunigen M2
  for (int i = 0; i <=240; i += 20) { //in 40-iger Schritten bis Maximalgeschwindigkeit
    digitalWrite(in3, LOW);  
    digitalWrite(in4, HIGH);   // Motor 2 beginnt zu rotieren
    analogWrite(GSM2, i); // Motor 2 beschleunigt 
    delay(100);
  }
  } 
  }
 //=============================
void loop(){
  hallStatus=digitalRead(hallSensorPin);
  hallStatus2=digitalRead(hallSensorPin2);
 HALL1A();
 HALL1B(); 
 }

mach dir ein Klasse "Fahrstrom".
Die bekommt 4 Methoden.
setSpeed()
setDirection()
emergencyOff()
run()

mit setSpeed setzt du 0 ..255 und lässt die Klasse dann den Fahrstrom gemütlich erhöhen oder veringern.
emergencyOff ist einfach ein schnelles abschalten ohne Verzögerung
run() ... rufst du so oft wie möglich im loop auf. Und dieses run kümmert sich dann auch um das anfahren/bremsen

dazu entweder ein Callback wenn 0 erreicht ist einen nächsten Event auszulösen oder ein getSpeed das zurück gibt, ob der Zug steht.

Wenn du das für zwei "Fahrströme" benötigst, dann mach dir eine "Fahrdienstleiter" der Vice versa die zwei Züge (besser die zwei Fahrströme) in Bewegung setzt.

Eigentlich eine nette Übung bevor es größer wird.

Für Mitleser sollte man darauf hinweisen, da diese LEDs zwar super praktisch, aber auch selten sind, damit ein Anfänger nicht LEDs direkt ohne Vorwiderstand anschließt. Ich habe bei meinen Beiträgen einen Hinweistext ergänzt.

Ein Beispiel:
grafik
Bf1 ist leer, W1 und W2 stehen gerade, der Zug 4 kommt von links. Dann soll Hallsensor 1 auslösen und den Zug in der gezeichneten Position zum Stehen bekommen. Richtig?

Da habe ich Bauchschmerzen bei verschiedenen Zügen auf unterschiedlichen Gleisen. Da brauchst Du ja verschiedene Versuchsreihen, um die Anhaltewege zu ermitteln. Das ist wie Augen zu und durch die Kurve fahren, wird schon irgendwie passen. Bei Dir im Bastelzimmer mag das funktionieren, aber bei der Ausstellung hast Du andere Verhältnisse.

Mein Vorschlag: H1 und H2 weiter innen positionieren und bei H2 anhalten, gerne mit Rampe. Mit H1 und H2 (unter der Lok, durch Bremsen überfahren) habe ich das mal angedeutet:

grafik

Das lässt sich sowieso nicht wirklich vermeiden. Jede Lok hat einen anderen Stromverbrauch. Die Zielgleise sind unterschiedlich lang. Und bei jeder Ausstellung sind andere Umgebungsbedingungen. Da heißt es immer nachjustieren. Ist aber auch bei anderen elektronischen Lösungen so. Ich habe die PSZ2 von TAMS elektronic verbaut. Geht einwandfrei, aber jedes mal anders. Ich glaube, da ist die 1. Variante besser, da brauch ich "nur" die Bremswege zu justieren.

Da soll es hin, aber du siehst, noch ist gedanklich Vorarbeit nötig.

Deshalb bekommt jede Lok ein individuelles PWM-Signal, die stromhungrige 100%, die genügsame nur 60%. Das ist OK.

Wäre bei meiner Variante egal, der Zug muß nur rechtzeitig vor der Weiche zum Stehen kommen.

Ich stelle mal die These auf: Das ist weitgehend überflüssig.

Auch wenn der Vergleich etwas hinkt, so haben sich nicht ohne Grund Heizkörperthermostate gegenüber einfachen Ventilen durchgesetzt.

Was brauchst du noch an Vorarbeiten?

Ich weiß, warum ich lieber telefoniere... Verstehe ich richtig, H1 löst Bremsvorgang aus und
H2 löst den endgültigen Stop aus??

nein H1 lässt du ganz normal überfahren.
bei H2 fängst an zu bremsen.

Macht betrieblich Sinn, denn bei H1 sind ja Wagons noch auf W1 und davor...

aber wennst magst, kannst natürlich bei H1 auch schon auf "Rangierfahrt" runter gehen
langsam weiterfahren bis H2
und bei H2 dann endgültig von Rangierfahrt auf 0 bremsen...

Das erschließt sich mir gar nicht. H2 müsste, wenn Magnet unter der Lok ist, sehr weit vorn sein, damit genug Bremsweg da ist. Sonst wird es ein "Prellbockhalten". Da kann ich doch gleich H1 nehmen??? Das längste Gleis ist 50, das kürzeste 35 cm. Es soll ja annähernd ein modellbahngerechtes Fahrverhalten sein. Das war meine Überlegung mit H1 als Bremser, da habe ich das gesamte Gleis zum Bremsen.