Moin Moin,
ich tüftel gerade an einem Messemodell herum. Darauf lasse ich eine Eisenbahn kreisen und an festen Punkten (Haltestelle A, B, C, D, E"Bahnhof") im Bedarfsfall halten. Ausgelöst wird dieser Bedarf über Drucktaster. Messebesucher drückt z.B. Taster B und dann C → LED geht an Haltestelle B und C an → Zug hält an B → Wartet einen Augenblick → Zug fährt wieder an → Das gleiche dann an C. Der Zug merkt, dass er an A/B/C/D/E ist, weil er mit einem im Anhänger befindlichen Magneten über einen Reed-Kontakt unter den Schinen fährt.
Problem:
Alle LEDs Blinken auf einmal. An “1Sek”–> Aus"1Sek"–>… Das so lange, bis ich den E.ON Reset mache (Stecker ziehen). Ich habe pro LED am Pin 3mA gemessen. Das Labornetzteil zeigt mir unter Vollast 0,88A an.
Zu meinem Aufbau:
1x Arduino Mega
1x Arduino Motor-Shield
1x Labornetzteil mit eingestellten 11,5V
5x TIP120 zur Ansteuerung der LEDs (12V)
6x Standard Drucktaster
Optokoppler zur Ansteuerung eines Raspberry PI (Momentan nicht angeschlossen)
Anbei noch der Quellcode. Tut mir leid, wenn das ganze ein bisschen Konfus erscheint, ich Programmiere erst seit einem Jahr und das auch immer nur alle paar Wochen Wochen. Die Verkabelung wurde von einem befreundeten Elektroniker/Elektrotechniker vor in Betriebnahme überprüft. Hat irgendwer das selbe Problem vielleicht schonmal gehabt? Ist das zu viel Leistung für den Arduino?
//---Buttons auf dem Schaltpult
int starttaster = 24;
int buttonApin = 26;
int buttonBpin = 28;
int buttonCpin = 30;
int buttonDpin = 32;
//---Pins Raspberry
int buttonRBpin = 23;
int buttonRDpin = 25;
int inputR1 = 27;
int inputR2 = 29;
int haltestelleRB = 41;
int haltestelleRD = 43;
int outputR1 = 45;
int outputR2 = 47;
//---LEDs auf dem Modell
int haltestelleA = 44;
int haltestelleB = 46;
int haltestelleC = 48;
int haltestelleD = 50;
int haltestelleE = 52;
//---Reedkontakte unter dem Modell
int reedhaltestelleA = 31;
int reedhaltestelleB = 33;
int reedhaltestelleC = 35;
int reedhaltestelleD = 37;
int reedhaltestelleE = 39;
//---Variable aktueller Bedarf
int bedarfanA = 0;
int bedarfanB = 0;
int bedarfanC= 0;
int bedarfanD = 0;
int bahnhoferreicht = 0;
//---Variable nächste Runde Bedarf
int bedarfanA_N = 0;
int bedarfanB_N = 0;
int bedarfanC_N = 0;
int bedarfanD_N = 0;
//---Variable zufallsbedarf
int bedarfanA_Z = 0;
int bedarfanB_Z = 0;
int bedarfanC_Z = 0;
int bedarfanD_Z = 0;
//---Variablen Autostart
int autostart=0;
int zufall[4];
int zufallcounter = 100;
//---Haltezeiten
int haltezeit = 500;
int counter = 0;
void setup()
{
Serial.begin(9600);
Serial.println("Programm gestartet:\n");
//---Raspberry
pinMode(haltestelleRB, OUTPUT);
pinMode(haltestelleRD, OUTPUT);
pinMode(outputR1, OUTPUT);
pinMode(outputR2, OUTPUT);
pinMode(buttonRBpin, INPUT_PULLUP);
pinMode(buttonRDpin, INPUT_PULLUP);
pinMode(inputR1, INPUT_PULLUP);
pinMode(inputR2, INPUT_PULLUP);
//---Modell
pinMode(haltestelleA, OUTPUT);
pinMode(haltestelleB, OUTPUT);
pinMode(haltestelleC, OUTPUT);
pinMode(haltestelleD, OUTPUT);
pinMode(haltestelleE, OUTPUT);
pinMode(starttaster, INPUT_PULLUP);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
pinMode(buttonCpin, INPUT_PULLUP);
pinMode(buttonDpin, INPUT_PULLUP);
pinMode(starttaster, INPUT_PULLUP);
pinMode(reedhaltestelleA, INPUT_PULLUP);
pinMode(reedhaltestelleB, INPUT_PULLUP);
pinMode(reedhaltestelleC, INPUT_PULLUP);
pinMode(reedhaltestelleD, INPUT_PULLUP);
pinMode(reedhaltestelleE, INPUT_PULLUP);
Serial.println("Inputs und Outputs initialisiert\n");
//---Initialisierung des Motor-Kanals A
pinMode(12, OUTPUT); //Initiates Motor Channel A pin
pinMode(9, OUTPUT); //Initiates Brake Channel A pin
Serial.println("Motor initialisiert\n");
Serial.println("LED-Test\n");
digitalWrite(haltestelleA, HIGH);
digitalWrite(haltestelleB, HIGH);
digitalWrite(haltestelleC, HIGH);
digitalWrite(haltestelleD, HIGH);
digitalWrite(haltestelleE, HIGH);
delay(3000);
Serial.println("LED-Test abgeschlossen\n");
digitalWrite(haltestelleA, LOW);
digitalWrite(haltestelleB, LOW);
digitalWrite(haltestelleC, LOW);
digitalWrite(haltestelleD, LOW);
digitalWrite(haltestelleE, HIGH);
Serial.println("Raspberry-Pins auf LOW");
digitalWrite(haltestelleRB, LOW);
digitalWrite(haltestelleRD, LOW);
digitalWrite(outputR1, LOW);
digitalWrite(outputR2, LOW);
}
void loop()
{
//---------------------------autostart-----------------
if(autostart==zufallcounter){
bedarfanA = bedarfanA_Z;
if(bedarfanA==HIGH){
digitalWrite(haltestelleA, HIGH);
//Serial.println("Bedarf an Punkt A");
}
else {
//Serial.println("Kein Bedarf an Punkt A");
digitalWrite(haltestelleB, LOW);
}
bedarfanB = bedarfanB_Z;
if(bedarfanB==HIGH){
digitalWrite(haltestelleB, HIGH);
//Serial.println("Bedarf an Punkt B");
}
else {
//Serial.println("Kein Bedarf an Punkt B");
digitalWrite(haltestelleB, LOW);
}
bedarfanC = bedarfanC_Z;
if(bedarfanC==HIGH){
digitalWrite(haltestelleC, HIGH);
//Serial.println("Bedarf an Punkt C");
}
else {
//Serial.println("Kein Bedarf an Punkt C");
digitalWrite(haltestelleC, LOW);
}
bedarfanD = bedarfanD_Z;
if(bedarfanD==HIGH){
digitalWrite(haltestelleD, HIGH);
//Serial.println("Bedarf an Punkt D");
}
else {
//Serial.println("Kein Bedarf an Punkt D");
digitalWrite(haltestelleD, LOW);
}
}
//---------------------------nächste Runde-----------------
else if ((bedarfanA_N == 1) || (bedarfanB_N == 1) || (bedarfanC_N == 1) || (bedarfanD_N == 1)){
bedarfanA = bedarfanA_N;
Serial.println("Bedarf an Punkt A nächste Runde =");
Serial.println(bedarfanA);
bedarfanA_N = 0;
bedarfanB = bedarfanB_N;
Serial.println("Bedarf an Punkt B nächste Runde =");
Serial.println(bedarfanB);
bedarfanB_N = 0;
bedarfanC = bedarfanC_N;
Serial.println("Bedarf an Punkt C nächste Runde =");
Serial.println(bedarfanC);
bedarfanC_N = 0;
bedarfanD = bedarfanD_N;
Serial.println("Bedarf an Punkt D nächste Runde =");
Serial.println(bedarfanD);
bedarfanD_N = 0;
}
bahnhoferreicht = 0;
if(autostart<zufallcounter){
Serial.println("Autostart-Counter gestartet");
}
while ((digitalRead(starttaster) == HIGH) && (autostart<zufallcounter)){
if (digitalRead(buttonApin) == LOW)
{
digitalWrite(haltestelleA, HIGH);
Serial.println("Bedarf an Punkt A\n");
bedarfanA = 1;
//delay(500);
}
if ((digitalRead(buttonBpin) == LOW)||(digitalRead(buttonRBpin)== LOW))
{
digitalWrite(haltestelleB, HIGH);
Serial.println("Bedarf an Punkt B\n");
bedarfanB = 1;
//delay(500);
}
if (digitalRead(buttonCpin) == LOW)
{
digitalWrite(haltestelleC, HIGH);
Serial.println("Bedarf an Punkt C\n");
bedarfanC = 1;
//delay(500);
}
if ((digitalRead(buttonDpin) == LOW)||(digitalRead(buttonRDpin)== LOW))
{
digitalWrite(haltestelleD, HIGH);
Serial.println("Bedarf an Punkt D\n");
bedarfanD = 1;
//delay(500);
}
autostart ++;
Serial.println(autostart);
if (autostart==zufallcounter){
Serial.println("Autostart-Counter erreicht");
}
}
delay(500);
if ((bedarfanA == 1) || (bedarfanB == 1) || (bedarfanC == 1) || (bedarfanD == 1)) {
if(bedarfanA==HIGH){
Serial.println("Bedarf an Punkt A");
}
else {
Serial.println("Kein Bedarf an Punkt A");
}
if(bedarfanB==HIGH){
Serial.println("Bedarf an Punkt B");
}
else {
Serial.println("Kein Bedarf an Punkt B");
}
if(bedarfanC==HIGH){
Serial.println("Bedarf an Punkt C");
}
else {
Serial.println("Kein Bedarf an Punkt C");
}
if(bedarfanD==HIGH){
Serial.println("Bedarf an Punkt D");
}
else {
Serial.println("Kein Bedarf an Punkt D");
}
anfahren();
vollgas();