Hier möchte nich ein scheinbar simples Projekt vorstellen und Hilfe dazu suchen und finden.
Idee: Ein Kreis mit 2 Weichen (Ausweichgleis), Motorsteuerung mit L298N, Auslöser sind Hallsensoren, Anfahr-/Bremsverhalten über Nano steuern, Loks fahren gegenläufig.
Gleisplan:
Schaltplan mit 2 Motoren als "Gleisersatz" zum Testen der Funktionen
Der Sketch
[code]
/*
DC-Motorsteuerung mit L298N zum Regeln
von Anfahr- und Bremsverhalten für 2 Motoren mit 2 Hallsensoren,
Schalten von 2 Weichen und 2 Kontroll-LEDs
von Schorsch von ZFI
10.05.25
*/
// Definition Hallpins und Hallstatus
const int hallSensorPin = 2;
const int hallSensorPin2 = 3;
#define PIN_RELAY1 11
#define PIN_RELAY2 12
int hallStatus = LOW; // 1. Hall aktiv
int hallStatus2 = HIGH; // 2. Hall passiv
int LED1 = A0; //Kontroll_Leds für Richtungsanzeige
int LED2 = A2;
unsigned long anfang = 0;
const unsigned long warte = 3000; // Dauer des haltens vor Wechsel in andere Richtung
int v = 80; //max. Geschwindigkeit
int z = 2; //Zähler für Beschleunigen/Bremsen, je kleiner, umso langsamer
int i = 0;
// 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); //Definition der Pins als Aus-/eingabe
pinMode(GSM2, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(PIN_RELAY1, OUTPUT);
pinMode(PIN_RELAY2, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(hallSensorPin, INPUT);
pinMode(hallSensorPin2, INPUT);
if (hallStatus == LOW) {
// Beschleunigen
digitalWrite(LED1, HIGH);
for (int i = 0; i <= v; i += z)
{ //in z-iger Schritten bis Maximalgeschwindigkeit
digitalWrite(in1, HIGH); // Umpolen von in1, in2 bei in3,in4 sorgt für Richtungswechsel
digitalWrite(in2, LOW); // Motor 1 beginnt zu rotieren
analogWrite(GSM1, i); // Motor 1 beschleunigt
delay(50);
}
}
}
void HALL1A()
{
if (hallStatus == LOW) {
digitalWrite(LED2, LOW);
// Bremsen M2
for (int i = v; i >= 0; i -= z) { //in 40-iger Schritten bis Maximalgeschwindigkeit
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH); // Motor 2 beginnt zu rotieren
analogWrite(GSM2, i); // Motor 2 bremst
delay(100);
}
}
if (hallStatus == LOW) { //wenn 1. Hallsensor deaktiviert
digitalWrite(PIN_RELAY1, LOW); // Relaiskontakt 1 schließen, nur kurzer
}//else { // Schließvorgang
delay(100);
digitalWrite(PIN_RELAY1, HIGH); // sonst öffnen
//}
if (hallStatus == LOW) {
digitalWrite(LED1, HIGH);
// Beschleunigen M1
anfang = millis(); //Pause zwischen Richtungswechsel
while (millis() - anfang < warte);
for (int i = 0; i <= v; i += z) { //in z-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) {
digitalWrite(LED1, LOW);
// Bremsen M1
for (int i = v; i >= 0; i -= z) { //in z-iger Schritten bis Maximalgeschwindigkeit
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW); // Motor 1 beginnt zu rotieren
analogWrite(GSM1, i); // Motor 1 bremst
delay(50);
}
}
if (hallStatus2 == LOW) { //wenn 1. Hallsensor deaktiviert
digitalWrite(PIN_RELAY2, LOW); // Relaiskontakt 1 schließen
} //else {
delay(100);
digitalWrite(PIN_RELAY2, HIGH); // sonst öffnen
//}
if (hallStatus2 == LOW) {
digitalWrite(LED2, HIGH);
anfang = millis(); // Pause zwischen Richtungswechsel
while (millis() - anfang < warte);
// Beschleunigen M2
for (int i = 0; i <= v; i += z) { //in z-iger Schritten bis Maximalgeschwindigkeit
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH); // Motor 2 beginnt zu rotieren
analogWrite(GSM2, i); // Motor 2 beschleunigt
delay(50);
}
}
}
//=============================
void loop() {
hallStatus = digitalRead(hallSensorPin);
hallStatus2 = digitalRead(hallSensorPin2);
HALL1A();
HALL1B();
}
[/code]
Soweit, so gut. Mit 2 einfachen Motoren funktioniert das einwandfrei. Kompliziert wird es, wenn ich versuche statt der Testmotoren die Gleise die Gleise real anzuschließen.
Diese Idee ist offensichtlicher Mist:
Damit werden die Gleisabschnitte zwischen den Weichen ausgehebelt.
Meine Idee: noch 2 Relais, die die Gleisleitungen (gelb und grün) im Bedarsfall zuschalten, quasi mit dem Auslösen der Halls.
Hat jemand eine andere Idee?
Schon mal danke.





