INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino als Weichenstellpult
14.09.2018, 13:46
Beitrag #1
Arduino als Weichenstellpult
Hallo Gemeinde!

Ich bin ein Anfänger mit dem ArduinoSmile

Wie oben im Betreff angedeutet, möchte ich ein Weichenstellpult mit dem Arduino Mega betrieben.

Erstmal ganz Simpel! ein paar Taster als Eingänge, Pins als Ausgänge kein Problem!

Jetzt habe ich aber 24 Taster und entsprechend 24 Magnetartikel die geschaltet werden sollen.

Immer noch kein Problem? Doch leider

Jede Weiche belegt 2 Ausgänge, da zwei Positionen angesteuert werden können.

Nun wollte ich meine Arduino mit Schieberegistern entsprechend erweitern.

Da fangen für mich die Schwierigkeiten an...

Hier einmal mein Simpeles Programm direkt am Arduino:
Code:
int buttonPin = 2;
int ledPin = 23;
int ledPin2 = 25;
int buttonState ;
int ledLesen;
int led2Lesen;
int knopflesen = LOW;
int knopflesen2 = HIGH;



void setup() {
  
pinMode (buttonPin, INPUT);
pinMode (ledPin, OUTPUT);
pinMode (ledPin2, OUTPUT);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, LOW);
}

void loop(){

buttonState = digitalRead(buttonPin);
ledLesen = digitalRead(ledPin);
led2Lesen = digitalRead(ledPin2);

if (buttonState != knopflesen && ledLesen == HIGH) {
  
  knopflesen = buttonState;
  
    if (knopflesen == HIGH){
      
    digitalWrite(ledPin, LOW);
    digitalWrite(ledPin2, HIGH);
    }
  }

if (buttonState != knopflesen2 && led2Lesen == HIGH) {
  
  knopflesen2 = buttonState;
  
    if (knopflesen2 == HIGH){
      
    digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin2, LOW);
    }
  }
}

ich habe es mal auf einen Taster reduziert.

Nun möchte ich dies aber mit einem Schieberegister machen und wollte dies so aufbauen
Code:
int buttonPin = 2;
int buttonState ;
int ledlesen1 = HIGH;
int ledlesen2 = LOW;
int knopflesen1 = LOW;
int knopflesen2 = HIGH;
int shiftPin = 8;
int storePin = 9;
int dataPin = 10;
int led1 = 1;
int led2 = 0;
int led3 = 1;
int led4 = 0;
int led5 = 1;
int led6 = 0;
int led7 = 1;
int led8 = 0;

int muster[8] = {led1,led2,led3,led4,led5,led6,led7,led8};



void setup() {
pinMode (buttonPin, INPUT);
pinMode(storePin, OUTPUT);
pinMode(shiftPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop() {
buttonState = digitalRead(buttonPin);

if (buttonState != knopflesen1 && ledlesen1 == HIGH) {
  
  knopflesen1 = buttonState;
  
    if (knopflesen1 == HIGH){
    ledlesen2 = HIGH;
    led1 = LOW;
    led2 = HIGH;
  }
}

if (buttonState != knopflesen2 && ledlesen2 == HIGH) {
  
  knopflesen2 = buttonState;
  
    if (knopflesen2 == HIGH){
    ledlesen1 = HIGH;
    led1 = HIGH;
    led2 = LOW ;
  }
}
digitalWrite(storePin, LOW);
for (int i=0; i<8; i++) {
  
digitalWrite(shiftPin, LOW);

digitalWrite(dataPin, muster[i]);

digitalWrite(shiftPin, HIGH);

digitalWrite(storePin, HIGH);
}
}
Anfangs will ich immer eine "Grundeinstellung" auf dem Schaltpult haben.
Am ende des Skripts sollte so auf das Schieberegister geschrieben werden. Das Klappt aber nicht wie ich es mir dachte. Also es Klappt garnicht.

Hilfe!! Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.09.2018, 15:51
Beitrag #2
RE: Arduino als Weichenstellpult
Ich habe es bisher noch nie mit Schieberegistern aufgebaut, daher verwende ich für derartige Schaltungen immer I2C-Portexpander. Z.B PCF8574 oder MCP23017. Da kannst du die Ausgänge jeweils gezielt schalten und diese auch als Eingänge verwenden.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.09.2018, 10:05
Beitrag #3
RE: Arduino als Weichenstellpult
Hallo,
dein Programm ist durch die falschen Einrückungen recht schlecht zu lesen. Probier mal die automatische Formatierung ( Ctrl-T oder Werkzeuge->Automatische Formatierung ). Ausserdem solltest Du dir von Anfang an angewöhnen, dein Programm sinnvoll zu kommentieren. Das hilft dir selbst, wenn Du dein Programm später nochmal anschaust, und uns, um festzustellen, was Du da eigentlich machen willst.
Bei der seriellen Ausgabe aufs Schieberegister musst Du aber auf jeden Fall diese Zeile:
Code:
digitalWrite(storePin, HIGH);
aus der for-Schleife herausnehmen und erst nach der kompletten for-Schleife ausführen. ( das würde man bei einer ordentlichen Formatierung auch leichter erkennen )

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.09.2018, 11:28
Beitrag #4
RE: Arduino als Weichenstellpult
Frage: mit welcher Hardware willst du die Weichen ansteuern? Sollen sie über den Arduino automatisch in einem Programm oder manuell über ein Schaltpult angesteuert werden?

Mit freundlichen Grüßen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.09.2018, 12:12 (Dieser Beitrag wurde zuletzt bearbeitet: 15.09.2018 12:26 von loepke.)
Beitrag #5
RE: Arduino als Weichenstellpult
Hallo Dieter,

ich habe mich eben einmal etwas mit den 2Cs beschäftigt und leider sind deutsche Tutorials rar gesäet.

Ich habe etwas auf englisch gefunden, vielleicht kannst du mir da ja ein bisschen zu helfen. Verstehen tue ich leider nur Bahnhof...wie sage ich welchen PIN ich ansprechen will? Wo wird der Arduino gesagt wo der I2C angeschlossen ist? Ansich klingt es wirklich besser als die Schieberegister! Hier das gefundene Skript
Code:
/*
Example 41.3 - Microchip MCP23017 with Arduino
http://tronixstuff.wordpress.com/tutorials > chapter 41
John Boxall | CC by-sa-nc
*/

// pins 15~17 to GND, I2C bus address is 0x20
#include "Wire.h"
byte inputs=0;

void setup()
{
  Serial.begin(9600);
  Wire.begin(); // wake up I2C bus

  Wire.beginTransmission(0x20);
  Wire.write(0x00); // IODIRA register
  Wire.write(0x00); // set all of bank A to outputs
  Wire.endTransmission();
}

void loop()
{
  // read the inputs of bank B
  Wire.beginTransmission(0x20);
  Wire.write(0x13);
  Wire.endTransmission();
  Wire.requestFrom(0x20, 1);
  inputs=Wire.read();

  // now send the input data to bank A
  Wire.beginTransmission(0x20);
  Wire.write(0x12); // GPIOA
  Wire.write(inputs);    // bank A
  Wire.endTransmission();
  delay(200); // for debounce
}
das stammt von https://tronixstuff.com/2011/08/26/tutor...-io-ports/

@MicroBahner: leider zuspät zum ändern. Nächstes mal Wink leider hat dein hinweis nichts am Programm geändert. Es wird nach wie vor nur das erste definierte Muster geladen.

ich will die Weichen mit Tastern ansteuern und einer Visualisierung mittels LEDs auf einem Schaltpult. Wenn ich etwas besser im Programmieren bin will ich vielleicht auch Automatische Fahrstrecken ermöglichen. Aber bei einer so kleinen Anlage wäre da kaum etwas möglich.

Danke für die bisherigen Antworten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.09.2018, 12:42
Beitrag #6
RE: Arduino als Weichenstellpult
Ich habe die Ansteuerung der Weichen über den Arduino und manuell über einen Taster mit einer sogenannten Toggleschaltung realisiert. Anzeige über LED im Gleisstellpult. Manuell mit einem Taster. Die Ansteuerung der Weichen erfolgt über eine H- Schaltung, allerdings für motorische Weichen bzw. LGB Weichen.
Alles funktioniert seit Jahren problemlos.


Angehängte Datei(en)
.pdf  Toogle schaltung mit H- Brücke.pdf (Größe: 134,38 KB / Downloads: 8)

Mit freundlichen Grüßen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.09.2018, 12:47
Beitrag #7
RE: Arduino als Weichenstellpult
@loepke
Zu beiden Expandern gibt es gut beschriebene Libraries.
Damit solltest du das auch hin bekommen.
Aktuell bin ich mobil unterwegs, kann also keine Links posten.
Werde es machen, sobald ich wieder am PC sitze.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.09.2018, 15:16
Beitrag #8
RE: Arduino als Weichenstellpult
Hier noch die versprochenen Libraries:

PCF8574 und MCP23017

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 2.303 29.04.2017 14:29
Letzter Beitrag: hotsystems
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 2.330 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 6.987 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste