Arduino, MoBa und wenig Ahnung

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Hallo JarJar,

      um Dir eventuell weiterhelfen zu können, noch ein paar Verständnisfragen:
      - sollen mit den Tastern die Befehle an das sx-System gegeben werden, die Weichen zu schalten?
      - sollen die LEDs die Stellung der Weichenzungen auf dem Schaltpult anzeigen?
      - sind die Weichen auch über ein Steuerungsprogramm (z.B. TC o.ä.) ansteuerbar?


      Grüße Michael Peters
    • Seid gegrüßt, Michael, edler Herrscher über die Elektronen,

      die Weichen werden über SDK8 und die Blöcke über die BM8 jeweils von Peter Engelmann gesteuert.
      Die Taster geben an die FCC die Kommandos, die LED zeigen entweder die Weichenstellung oder den Zustand der Blöcke an.
      Gruß vom Naboo und Dif-tor heh smusma!

      JarJar :spock:


      Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich geschwiegen, ich war ja kein Gewerkschafter. Als sie mich holten, gab es keinen mehr, der protestieren konnte.
      von Martin Niemöller
    • Hallo JarJar,

      wenn ich das recht verstehe, schaltest Du die Weichen quasi "analog", also Du stellst die Fahrstraßen und fährst auch die Züge per Handregler? Nix über Programm?

      Dann finde ich dieses Vorgehen doppelt gemoppelt: Du bräuchtest nicht den Umweg über Weichendecoder gehen, sondern direkt die Weichen über Taster schalten.
      Wenn das die originalen Kato-Einspulenantriebe sind, die über eine positive und negative Spannung gestellt werden, könntest Du das auch mit Wechselspannung und zwei Dioden machen - ich überlege nur noch, wie Du dann am einfachsten die LED-Anzeige hinbekommst (bistabiles Kleinleistungsrelais?).

      Grüße Michael Peters
    • Verzeiht,

      Ich vergass, dass ich auch teilweise durch R2D2 unterstützt werde, der mittels Traincontroller mit der Anlage kommuniziert.
      Somit will ich die Weichen sowohl automatisiert als auch manuell stellen können und die Belegung der Blocks (z.T. unterirdisch) erkennen können.
      Gruß vom Naboo und Dif-tor heh smusma!

      JarJar :spock:


      Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich geschwiegen, ich war ja kein Gewerkschafter. Als sie mich holten, gab es keinen mehr, der protestieren konnte.
      von Martin Niemöller
    • Seid gegrüßt,

      wissen die Meister der Halbleiter vielleicht, ob ein Arduino Nano direkt mit den 20 Volt des SX-Bus versorgt werden kann?
      Oder sind die 20 Volt eigentlich nur die Gleisspannung, die bei mir 17,4 Volt beträgt (laut Messgerät A. Hübsch).
      Gruß vom Naboo und Dif-tor heh smusma!

      JarJar :spock:


      Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich geschwiegen, ich war ja kein Gewerkschafter. Als sie mich holten, gab es keinen mehr, der protestieren konnte.
      von Martin Niemöller
    • JarJarBinks schrieb:

      20 Volt des SX-Bus
      Hallo JarJar,

      auf den sonstigen Bausteinen der SX-Komponentenherhersteller ist i.d.R. ein 5V-Regler drauf, der die ICs versorgt.
      Das solltest Du bei dem Arduino auch so machen.

      Grüße Michael Peters

      p.s. Ich habe bei meiner Zentrale mal nachgeprüft: wenn ich in den Schaltmodus gehe und eine Weiche schalte, wird auch in TC die Weichenstellung verändert. Mir ist noch keine Lösung eingefallen, wie Du einfacher die Weichenstellung auf dem Stellpult angezeigt bekommst (außer mit den teuren Bausteinen von z.B. Müt)
    • Seid gegrüßt Meister Sugus und andere Sprachversteher,

      wie kann ich die folgenden Zeilen durch eine Schleife darstellen?
      Ziel ist, das die jeweiligen Ports auf Output gestellt werden und ich aber jederzeit über die Variable LED88 oder LED89 auf die einzelnen LED zugreifen kann.
      LED88 hat den Wert 0 bis 7, LED89 0 bis 2 und stellen die Zustände des jeweiligen Blockes dar.
      Die Zahlen 5-12 bzw. 26-24 sind die jeweiligen Ausgänge des Arduino Nano.

      #define LED_88_0 5 // read sx channel 88 and switch on/off LEDs
      #define LED_88_1 6 // on pins 5 to 12
      #define LED_88_2 7
      #define LED_88_3 8
      #define LED_88_4 9
      #define LED_88_5 10
      #define LED_88_6 11
      #define LED_88_7 12

      #define LED_89_0 26 // read sx channel 88 and switch on/off LEDs
      #define LED_89_1 25 // on pins 24 to 26
      #define LED_89_2 24

      Später im Programm will ich dann ebenfalls über for Schleifen den Zustand der LED in Abhängigkeit des ausgelesenen Blockes ändern. 1 ist HIGH, 0 ist LOW.
      Gruß vom Naboo und Dif-tor heh smusma!

      JarJar :spock:


      Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich geschwiegen, ich war ja kein Gewerkschafter. Als sie mich holten, gab es keinen mehr, der protestieren konnte.
      von Martin Niemöller
    • Hallo JarJar,

      ich bin mir nicht ganz sicher, ob ich richtig verstehe, was du vor hast. Du hast bei dir nicht eine Variable LED_88, sondern 8 verschiedene define fortlaufend nummeriert. Ein define ist eine Konstante. Überall, wo du im Quellcode nach deinem Beispiel LED_88_0 schreibst, ersetzt der Compiler dies mit dem Wert 5. Sowas ist durchaus sinnvoll beim Initialisieren von Ein- und Ausgängen.

      Solltest du die Pins 5 bis 12 als Ausgang in einer Schleife definieren wollen, würde das beispielsweise wie folgt aussehen:

      for(int i=5; i<=12; i++){
      pinMode(i, OUTPUT);
      }

      Die Laufvariable i entspricht den Pins.
      Das Ändern des Ausgangs auf HIGH oder LOW sähe in einer Schleife recht ähnlich aus.

      for(int i=5; i<=12; i++){
      digitalWrite(i, deinWert);
      }

      Die Laufvariable i entspricht wieder den jeweiligen Pins. "deinWert" könnte eine Variable sein, in die du eine 0 oder 1 schreibst, um dann alle angesprochenen Ausgänge auf 0 oder 1 zu setzen.

      Ich hoffe, das beantwortet deine Frage etwas.

      Gruß
      Christian
    • Hallo Christian,

      danke für Deine Hilfe. Mein Problem ist, wie ich eine bestimmte LED, die einem Bit des SX Wertes der Adresse 88 oder 89 entspricht, gezielt anspreche.
      Mittlerweile bin ich auf die Idee mit der Matrix gekommen; werde heute ausprobieren, ob das klappt.
      Gruß vom Naboo und Dif-tor heh smusma!

      JarJar :spock:


      Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich geschwiegen, ich war ja kein Gewerkschafter. Als sie mich holten, gab es keinen mehr, der protestieren konnte.
      von Martin Niemöller
    • JarJarBinks schrieb:

      wissen die Meister der Halbleiter vielleicht, ob ein Arduino Nano direkt mit den 20 Volt des SX-Bus versorgt werden kann?
      Oder sind die 20 Volt eigentlich nur die Gleisspannung, die bei mir 17,4 Volt beträgt (laut Messgerät A. Hübsch).
      Hallo Jar Jar,

      diese 20V wurden bei Einführung des SX-Busses wegen des Störabstandes auf der Leitung festgelegt,
      sind aber nicht bindend.
      Alle SX-Module verfügen intern über einen 5V Regler, der aus den ca. +20V der SX-Busleitung, dann die Spannungsversorgung für die IC`s bereitstellt.

      Du kannst also die Module durchaus auch mit einer geringeren Spannung über den SX-Bus speisen.

      gruß
      Hans-Jochen
      - Modelleisenbahnbundesamt -
      Wissen ist Macht - Nichts Wissen macht nichts!
    • Hallo Hans-Jochen,

      bei mir sind die 20 V nur ca. 16,4 V (gemessen mit einem einfachen Digital MM). Wo kommen die 20 V eigentlich her? Aus der Zentrale (bei mir FCC?)?
      Warum dann nur 16,4 V? Hängt das mit der Versorgungsspannung der Zentrale zusammen?
      Meine Sorge gilt dem dem 7805, der auf dem Arduino in SMD ausgeführt ist und mit Vin 20 V ja am oberen Ende des erlaubteb Bereichs betrieben würde.
      Gruß vom Naboo und Dif-tor heh smusma!

      JarJar :spock:


      Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich geschwiegen, ich war ja kein Gewerkschafter. Als sie mich holten, gab es keinen mehr, der protestieren konnte.
      von Martin Niemöller
    • Habe fertig! fun2

      Hier der Code für einen Arduino Nano:

      /*
      * Vorlage ist: sx_interface.ino
      *
      * Created on: 10.11.2013
      * Changed on: 25.9.2015
      *
      * Author: Michael Blank
      *
      * Example program for the Selectrix(TM) Library
      * sends SX data to serial port (only when data change)
      * format: V 80 16 (data bit 5 set on sx channel 80)
      * and reads commands from the serial port, interprets
      * them and send them on SX Bus.
      * format: S <ch> <data> (or SET .. ..)
      * S 80 255 sets all bits for channel 80
      *
      */



      #include <SX22b.h> // this is the Selectrix library
      #include <SX22Command.h> // this is the Selectrix Command library


      #define LED_PIN 13 // on most Arduinos there is an LED at pin 13


      int led88[8] = {5,6,7,8,9,10,11,12}; // Array für die 8 LED zur Statusanzeige SX Port 88 (bei mir Blöcke)
      int led89[3] = {A0,A1,A2}; // Array für die 8 LED zur Statusanzeige SX Port 89 (bei mir Blöcke)


      SX22b sx; // library
      SX22Command sxcmd; // holds command data


      static int ledState = LOW;
      static byte oldSx[MAX_CHANNEL_NUMBER];


      String inputString = ""; // a string to hold incoming data
      boolean stringComplete = false; // whether the string is complete
      boolean cmdState = false;


      void printSXValue(int i,int data) {
      // send data for 1 SX Channel on serial port
      Serial.print("V ");
      Serial.print(i);
      Serial.print(" ");
      Serial.println(data);
      }


      void toggleLed() {
      // to notify a change
      if (ledState == LOW) {
      ledState = HIGH;
      } else {
      ledState = LOW;
      }
      digitalWrite(LED_PIN, ledState);
      }


      void sxisr(void) {
      // if you want to understand this, see:
      // arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1239522239
      sx.isr();
      }


      void setup() {
      inputString.reserve(80);


      // LED als Output definieren
      pinMode(LED_PIN,OUTPUT);

      for (int i=0; i<8; i++) {
      pinMode(led88,OUTPUT);
      }

      for (int i=0; i<3; i++) {
      pinMode(led89[i], OUTPUT);
      }

      // Ausgabe aller SX Ports mit dem Wert 0 auf dem seriellen Monitor (Strg+Shift+M)
      Serial.begin(115200); // open the serial port
      for (int i=0; i<112;i++) {
      oldSx[i]=0; // initialize to zero
      printSXValue(i,0);
      }
      Serial.println("Bit 0->8"); //Kosmetik zur besseren Erkennbarkeit
      Serial.println();

      // initialize interrupt routine
      sx.init();


      // RISING slope on INT0 triggers the interrupt routine sxisr (see above)
      attachInterrupt(0, sxisr, RISING);
      }


      void loop() {


      int bitstatus;
      int ledstat;

      // check selectrix channels for changes
      for (int i=88; i<90; i++) {
      byte d=sx.get(i);
      if (oldSx[i] != d) { // data have changed on SX bus
      oldSx[i] = d;
      printSXValue(i,d); // send new value to serial port


      for (int bitz=0; bitz<8; bitz++) { // einzelnen Bitstatus für Port 88 und 89 anzeigen
      bitstatus = bitRead(d,bitz);
      Serial.print(bitstatus);

      if (i == 88) { // LED für Port 88 setzen
      for (int i=0; i<8; i++) {
      if (bitRead(d,bitz) == 1) {
      ledstat = HIGH;
      } else {
      ledstat = LOW;
      }
      digitalWrite(led88[bitz], ledstat);
      }

      }

      if (i == 89) { // LED für Port 89 setzen
      for (int i=0; i<3; i++) {
      if (bitRead(d,bitz) == 1) {
      ledstat = HIGH;
      } else {
      ledstat = LOW;
      }
      digitalWrite(led89[bitz], ledstat);
      }

      }

      }
      Serial.println(); // Leerezeile wegen Lesbarkeit
      }
      toggleLed(); // onboard LED indicates change
      }
      }

      Ich freue mich über jeden Hinweis für Verbesserungen.

      Allerdings ist die Zeit, die zwischen Einfahren/Verlassen eines Blocks und die Anzeige per LED schon sehr lang. Da ich mit Dauerkontakten arbeite ist somit ein punktgenaues
      Einfahren schlecht möglich.
      Vielleicht liest einer von opensx.net mit und äußerst sich dazu in diesem Fred.

      Sollte ich durch einbinden diese Codes irgendwelche Urheberrechte verletzt haben bitte ich um Info; ich werde den Code gerne löschen.
      Falls es sinnvoll ist auh noch der Hinweis, dass der o.a. Code unter den Bedingungen verwendet werden darf, unter denen die sx22b Library genutzt werden darf.
      Gruß vom Naboo und Dif-tor heh smusma!

      JarJar :spock:


      Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich geschwiegen, ich war ja kein Gewerkschafter. Als sie mich holten, gab es keinen mehr, der protestieren konnte.
      von Martin Niemöller
    • Seid gegrüßt, Ralf,

      im Originalcode steht auch ...led88... . Und wenn ich auf bearbeiten klicke, steht auch oben ...led88[i]...
      Das ist wohl was für die Meister des intergelaktischen Informationsaustausches.
      Gruß vom Naboo und Dif-tor heh smusma!

      JarJar :spock:


      Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich geschwiegen, ich war ja kein Gewerkschafter. Als sie mich holten, gab es keinen mehr, der protestieren konnte.
      von Martin Niemöller
    • JarJarBinks schrieb:

      bei mir sind die 20 V nur ca. 16,4 V (gemessen mit einem einfachen Digital MM). Wo kommen die 20 V eigentlich her? Aus der Zentrale (bei mir FCC?)?
      Warum dann nur 16,4 V? Hängt das mit der Versorgungsspannung der Zentrale zusammen?
      Hallo Jar Jar,

      die Busspannung wird in der Zentrale bereit gestellt und ist direkt von der Versorgungsspannung abhängig.
      Es erfolgt keinerlei Pegeländerung - was rein kommt, kommt auch raus :D

      gruß
      Hans-Jochen
      - Modelleisenbahnbundesamt -
      Wissen ist Macht - Nichts Wissen macht nichts!