Umzug des Forums zu einem neuen Anbieter

Der Umzug des Forums zu einem neuen Anbieter rückt näher, beachtet daher die fortlaufenden Informationen in den Forennews zu dem Thema:
Ausführliche Infos (Stand 7.5.2021)

Wir weisen ausdrücklich darauf hin, dass eine Nutzung Eures Benutzerkontos im neuen Forum nur möglich ist, wenn eine gültige E-Mail-Adresse (d.h. eine E-Mail-Adresse, auf der ihr Mails empfangen und lesen könnte) hier im Forum für Euer Benutzerkonto hinterlegt ist!
Eine nachträgliche Korrektur im neuen Forum ist nicht mehr möglich und alle Mitglieder ohne gültige E-Mail-Adresse haben dann keinen Zugriff mehr auf ihr Benutzerkonto.


Der gesamte Kleinanzeigen-Bereich ist aktuell gesperrt, so dass nur noch laufende Angebote und Gesuche abgewickelt werden können und keine neuen Angebote mehr eingestellt werden können. Wir möchten verhindern, das rund um die Woche Ausfallzeit laufende Angebote oder Verkaufsabwicklungen offen sind.

Arduino MobaTools: Optimierung Drehscheibensteuerung

Bereich für alle Themen rund um Digitaltechnik und digitale Umbauten.
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Arduino MobaTools: Optimierung Drehscheibensteuerung

#1

Beitrag von fbstr »

Hallo,

seit gestern beschäftige ich mich mit Arduino, da ich für meine Regalanlage "TimeWaster" mit Servos die Weichen (9 Stück) und auch die Entkuppler (11 Stück) ansteuern will. Die Herzstückpolarisation übernehmen die "DCC80 Autofrog"-Teile von Gaugemaster.

Hier will ich primär über ein Taster-Stellpult das ganze schalten. Eine DCC-Anbindung evtl. später.

Ich habe inzwischen mehrere Arduinos in meinem Fundus:
- Mega (inkl. Starterkit zum lernen, die Grundlektionen habe ich März 2016 mal durchgespielt)
- Nano
- Uno aus China
- Uno R3 aus China
Gestern habe ich die Treiber installiert und kann nun alle 4 Arten ansprechen.

Heute habe ich dann mit der Weichensteuerung angefangen und bin damit auch soweit fertig.
- Die Weichen werden mittels 2 Tastern gesteuert
- 2 LED's werden dann auf dem Gleisbild anzeigen, welcher Taster zuletzt betätigt wurde
Dank den MobaTools (vielen Dank für die Arbeit!) konnte ich die schöne langsame Stellzeit des Servos realisieren.
Es gibt noch ein paar Punkte die man bestimmt verbessern kann, aber erstmal eins nach dem anderen...

Nachdem die Weichensteuerung so gut geklappt hat steht mein Entschluß fest, die 11 Entkupplungsteile auch mit Servos zu realisieren.
- Diese werden jeweils über einen Taster betätigt und sollen x Sekunden ausfahren und danach wieder in den Ruhezustand fahren.
Die delay-Funktion möchte ich nicht verwenden, da sonst das ganze Programm unterbrochen wird. Deshalb möchte ich den "EggTimer" verwenden.
Aber damit komme ich irgendwie nicht klar (ich bin nicht der Programmierer...)

Hier mal der bisherige Sketch:

Code: Alles auswählen

#include <MobaTools.h>
Servo8 servoW07; //Weiche07
Servo8 servoE08; //Entkuppler08
EggTimer myTimerE08; //Entkuppler sollen 5 sec. aktiv sein

const byte servoE08pin=A0;
const byte buttonE08pin=2; //entkuppeln
const byte servoW07pin=A1; 
const byte buttonW07Apin=A2; //geradeaus
const byte buttonW07Bpin=A3; //abbiegen
const byte ledW07Apin=A4; //geradeaus
const byte ledW07Bpin=A5; //abbiegen


byte buttonStatusW07A=0;
byte buttonStatusW07B=0;
byte buttonStatusE08=0;


void setup() {
pinMode(buttonW07Apin, INPUT);
pinMode(buttonW07Bpin, INPUT);
pinMode(ledW07Apin, OUTPUT);
pinMode(ledW07Bpin, OUTPUT);
servoW07.attach(servoW07pin);
servoW07.setSpeed(5);
pinMode(buttonE08pin, INPUT);
servoE08.attach(servoE08pin);
servoE08.setSpeed(20);
}

void loop() {
buttonStatusW07A=digitalRead(buttonW07Apin);
buttonStatusW07B=digitalRead(buttonW07Bpin);
if (buttonStatusW07A == HIGH)
  {
    digitalWrite(ledW07Apin, HIGH);
    digitalWrite(ledW07Bpin, LOW);
    servoW07.write(80);
  }
else
  {
   if (buttonStatusW07B == HIGH)
    {
      digitalWrite(ledW07Bpin, HIGH);
      digitalWrite(ledW07Apin, LOW);
      servoW07.write(110);
    }
  else
    {
      
    } 
  }
buttonStatusE08=digitalRead(buttonE08pin);

if (buttonStatusE08 == HIGH) //wenn der Entkuppler-Taster betätigt wird...
  {
    myTimerE08.setTime(5000); //sollte der Timer auf 5 Sekunden gestellt werden und starten...
   if (myTimerE08.running()==true) //...und solange der Timer läuft...
    {
      servoE08.write(110); //... soll das Servo auf 110 Grad (Entluppeln) gehen...
    }
    else
    {
      servoE08.write(75); //...ansonsten auf 75 Grad (Ruhezustand)
    }
   }
else
  {
  }
}
Das wäre erstmal das größte Problem... :roll:

Weitere Fragen habe ich schon, aber eins nach dem anderen...
Zuletzt geändert von fbstr am Fr 24. Apr 2020, 16:25, insgesamt 12-mal geändert.
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

MicroBahner
Metropolitan (MET)
Beiträge: 2656
Registriert: Mi 28. Nov 2012, 14:24
Nenngröße: H0
Stromart: analog DC
Steuerung: Microprozessor-Eigenbau
Gleise: Tillig
Wohnort: Mittelfranken
Alter: 71

Re: Arduino MobaTools: Hilfe beim EggTimer benötigt

#2

Beitrag von MicroBahner »

Hallo Frank,
fbstr hat geschrieben: Sa 14. Jan 2017, 23:49 Dank den MobaTools (vielen Dank für die Arbeit!)
Bitte schön :D :D - es freut mich immer ,wenn jemand was damit anfangen kann 8) .

Zum 'Eggtimer':
Nach einer ersten Sicht auf deinen Sketch scheint mir das Problem zu sein, dass Du den gesamten Ablauf in den Zweig 'wenn Taster gedrückt' gesteckt hast. Der Code, der den Eggtimer abfragt und den Servo wieder zurückfahren soll, wird also gar nicht ausgeführt wenn Du den Taster wieder losgelassen hast. Andererseits wird der Eggtimer ständig auf 5sec gestellt solange Du den Taster drückst, und kann deshalb währenddessen auch nie ablaufen.
So müsste es gehen:

Code: Alles auswählen

if (buttonStatusE08 == HIGH) //wenn der Entkuppler-Taster betätigt wird...
  {
    myTimerE08.setTime(5000); //sollte der Timer auf 5 Sekunden gestellt werden und starten...
    servoE08.write(110); //... und das Servo auf 110 Grad (Entluppeln) gehen...
   }
else    // wenn der Taster losgelassen wurde ...
  {
   if ( myTimerE08.running()==false) //...und wenn der Timer abgelaufen ist ...
    {
      servoE08.write(75); //...wieder auf 75 Grad (Ruhezustand)
    }
  }
}
Wobei in dem Fall die 5sec erst loslaufen, wenn der Taster wieder losgelassen wird. Solange Du mit dem Finger drauf bleibst, wird der Eggtimer ja immer wieder auf 5sec gesetzt und läuft nicht los.
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: weitere Fragen

#3

Beitrag von fbstr »

MicroBahner hat geschrieben: So 15. Jan 2017, 10:43 So müsste es gehen
:gfm:
Perfekt! Vielen Dank, es läuft nun wie ich es erhofft habe. Es ist auch so, dass schon beim Drücken des Tasters das Servo losläuft (Der Taster war bei dem Fundunio-Starterkit dabei. Ich werde mal meine geplanten Taster probieren, ob die sich gleich verhalten). Und auch weiteres Betätigen läßt die 5 Sekunden immer wieder verlängern! Genauso wollte ich es haben!


Dann hätte ich nun ein paar weitere Fragen: :oops:

1.
Da ich pro Weiche 2 Taster und 2 LED's fürs Gleispult verwenden möchte, benötige ich also pro Weiche 5 Pins bei Arduino, korrekt? Und für die Entkuppler 2 Pins.

2.
Für meinen "TimeWaster" werde ich demnach auf der linken Seite (6 Weichen, 9 Entkuppler) den Ardunio Mega verwenden und auf der rechten Seite einen UNO (3 Weichen, 2 Entkuppler). Geht das oder stoße ich an irgendwelche Grenzen (Anzahl der Timer...)?
Damit kommen wir zur 3ten Frage:

3.
Ich kann dafür auch die Analogen Pins missbrauchen, richtig? Ich mache das schon bei dem Testaufbau und es funktioniert. Ich frage mich nur ob ich damit evtl. ein Problem beschwöre...
Wenn ich die Analogen Pins verwenden kann, dann reichen der eine Mega und eine Uno vollkommen aus.

4.
Momentan kommt die Stromversorgung via Computer. Beim Upload zum Arduino habe ich dann einen etwas undefinierten Zustand der Weiche und Entkuppler. Beim ersten Betätigen einer Taste "rast" das Servo mit max. Geschwindigkeit zur gedrückten Position (falls diese sich geändert hat). danach läuft alles wieder gemütlich.
Gibt es eine Möglichkeit beim Einschalten oder Upload alle Weichen und Entkuppler in eine Grundstellung zu fahren?

5.
Arrays - damit hatte ich schon in der Schule Probleme...
Aber ich vermute, damit kann ich den Sketch wesentlich kürzer halten, anstatt nun den TestSketch oben für jede zusätzliche Weiche und Entkuppler zu duplizieren?
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

MicroBahner
Metropolitan (MET)
Beiträge: 2656
Registriert: Mi 28. Nov 2012, 14:24
Nenngröße: H0
Stromart: analog DC
Steuerung: Microprozessor-Eigenbau
Gleise: Tillig
Wohnort: Mittelfranken
Alter: 71

Re: Arduino MobaTools: Hilfe beim EggTimer benötigt

#4

Beitrag von MicroBahner »

Hallo Frank,
super, wenn's jetzt so funktioniert wie gewünscht :D :D

Nun zu deinen Fragen:
1) so wie Du das haben möchtest, wirst Du wohl auf diese Pin-Zahl kommen. Wenn bei den Leds immer eine von beiden leuchtet, kommst Du auch mit einem Pin aus. Du kannst sie so anschliessen, dass die eine bei LOW, und die andere bei HIGH angeht.

2) Beim Mega kommst Du da knapp an die Grenze der MobaTools ( es können maximal 16 Servos definiert werden ). Wenn ich mich recht erinnere, hatte ich das auch schonmal ausprobiert :roll: . ( Mit dem Mega habe ich noch nicht viel getestet. Es sollte aber eigentlich funktionieren, da es vom Prozessor her keine grundsätzlichen Unterschiede gibt, ausser dass er mehr Timer und Ports hat ).
Probleme mit der Zahl der Timer gibt's da keine, weil die MobaTools alles mit einerm Timer (Timer 1) machen. Die Eieruhren sollten auch kein Problem sein - da ist eigentlich nur die RAM-Größe die Grenze :wink: .

3) Beim Uno / Nano können die Pins A0 - A5 auch als digitale Pins genutzt werden. Das geht ganz offiziell, da bekommst Du auch keine Probleme. Nur A6/A7 ( gibt's nur beim Nano) sind reine analoge Eingänge. Beim Mega bin ich mir nicht ganz sicher, aber der hat doch eh genug digitale Pins.

4) Das ist ein prinzipielles Problem beim Einschalten. Um einen Servo langsam zu bewegen, muss man ihm alle Zwischenpositionen von der Ausgangs- bis zur Zielstellung in entsprechenden kleinen Häppchen vorgeben. Das bedingt dann naturgemäß, dass man auch die Ausgangsposition des Servos kennen muss. Das ist aber beim Einschalten des Systems erstmal nicht der Fall, denn man kann die Position des Servos ja nicht auslesen. Deshalb bewirkt der erste Servo.write() Befehl im Programm immer eine unmittelbare, schnelle Bewegung zur angegebenen Position.
Nur wenn die Zielposition beim ersten write-Befehl der tatsächlichen Position des Servos entspricht, bleibt es ruhig stehen. Um dieses 'Rasen' beim Einschalten zu verhindern, musst Du also die Servopositionen immer im EEPROM speichern, so dass Du sie auch nach Aus- Einschalten beim Initieren wieder dort auslesen kannst und dann den ersten write() mit diesem Wert ausführst. Eine andere Möglichkeit gibt es nicht. ( bei meinem DCC-Servodecoder ist das genau so realisiert ).

5) ja mit Arrays kannst Du den Sketch deutlich kürzer machen 8) :D :D . Du kannst nämlich auch die Servo- und Eggtimer- Objekte als Array anlegen. Du brauchst dann den Programmteil zur Weichen bzw. Entkuppleransteuerung nur einmal schreiben und kannst dann das Ganze in einer Schleife ausführen. Speziell bei Fehlerbeseitung oder Erweiterungen ist das ein riesen Vorteil, da Du das dann immer nur an einer Stelle machen musst.
Es lohnt sich also, sich mit Arrays zu beschäftigen :redzwinker: 8) .
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays...

#5

Beitrag von fbstr »

Viele Dank Franz-Peter! Ich habe das Gefühl ich werde noch viele Fragen hier stellen... :roll:

zu 4):
Mit dem schnellen Bewegen beim ersten Mal könnte ich leben. Hauptsache die Servos fahren in eine definierte Ausgangssituation und die LED leuchtet korrekt.
Ich denke hier fehlen mir nun ein paar Ardunio Basics:
Könnte man dafür den Großteil aus void loop() zu void setup() kopieren und damit beim Einschalten der Anlage die Servos und LED's initialisieren? Evtl. mit delay's damit nicht alle (zukünftigen) 20 Servos auf einen Schlag sich bewegen wollen und die Stromaufnahme evtl. in die Knie zwingt? (Ich muß mal schauen was so ein SG90-Servo an Strom zieht).

zu 5):
Das habe ich mir schon gedacht... Also vorhin mal probiert die 3 Weichen (für das rechte Regalteil) in ein Array zu bekommen.
Herausgekommen ist dies, da ich aber am Breadboard nur eine Weiche momentan angeschlossen habe (mir fehlen auch noch die restlichen Taster), kann ich noch nicht ganz garantieren, dass es 100% richtig ist. Zumindest die eine Weiche funktioniert noch wie gehabt und der Compiler liefert keine Fehlermeldungen mehr.

Code: Alles auswählen

#include <MobaTools.h>

#define ANZAHL_WEICHEN  3 //Anzahl der Weichen

Servo8 servoWeiche[ANZAHL_WEICHEN]; //Array Weichen 7 bis 9
Servo8 servoE08; //Entkuppler08
EggTimer myTimerE08; //Entkuppler sollen 5 sec. aktiv sein


const byte servoE08pin=A0;
const byte buttonE08pin=2; //entkuppeln
const byte servoW[ANZAHL_WEICHEN]={A1,12,6}; //Array Weichen Pins
const byte buttonGeradeW[ANZAHL_WEICHEN]={A2,11,5}; //Array Pins "Taster geradeaus"
const byte buttonAbbiegenW[ANZAHL_WEICHEN]={A3,10,4}; //Array Pins "Taster abbiegen"
const byte ledGeradeW[ANZAHL_WEICHEN]={A4,9,3}; //Array LEDs geradeaus
const byte ledAbbiegenW[ANZAHL_WEICHEN]={A5,8,2}; //Array LEDs abbiegen
const byte autoOff = 1; //damit die Servos nicht brummen...

byte buttonStatusGeradeW[ANZAHL_WEICHEN]={0,0,0};
byte buttonStatusAbbiegenW[ANZAHL_WEICHEN]={0,0,0};
byte buttonStatusE08=0;

byte i; //Zählvariable

void setup() {
  for (i=0; i<ANZAHL_WEICHEN; i++){
    pinMode(buttonGeradeW[i], INPUT);
    pinMode(buttonAbbiegenW[i], INPUT);
    pinMode(ledGeradeW[i], OUTPUT);
    pinMode(ledAbbiegenW[i], OUTPUT);
    servoWeiche[i].attach(servoW[i], autoOff );
    servoWeiche[i].setSpeed(5);
  }
pinMode(buttonE08pin, INPUT);
servoE08.attach(servoE08pin);
servoE08.setSpeed(20);
}

void loop() {
  for (i=0; i<ANZAHL_WEICHEN; i++){
    buttonStatusGeradeW[i]=digitalRead(buttonGeradeW[i]);
    buttonStatusAbbiegenW[i]=digitalRead(buttonAbbiegenW[i]);
    if (buttonStatusGeradeW[i] == HIGH)
      {
        digitalWrite(ledGeradeW[i], HIGH);
        digitalWrite(ledAbbiegenW[i], LOW);
        servoWeiche[i].write(80);
      }
    else
      {
       if (buttonStatusAbbiegenW[i] == HIGH)
        {
          digitalWrite(ledAbbiegenW[i], HIGH);
          digitalWrite(ledGeradeW[i], LOW);
          servoWeiche[i].write(110);
        }
      else
        {
          
        } 
      }
  }
      
buttonStatusE08=digitalRead(buttonE08pin);
if (buttonStatusE08 == HIGH) //wenn der Entkuppler-Taster betätigt wird...
  {
    myTimerE08.setTime(5000); //sollte der Timer auf 5 Sekunden gestellt werden und starten...
    servoE08.write(110); //... und das Servo auf 110 Grad (Entkuppeln) gehen...
   }
else    // wenn der Taster losgelassen wurde ...
  {
   if ( myTimerE08.running()==false) //...und wenn der Timer abgelaufen ist ...
    {
      servoE08.write(75); //...wieder auf 75 Grad (Ruhezustand)
    }
  }
}
Was ich dabei gemerkt habe: Nun werden alle 3 Servos gleich angesteuert (also 75 und 110 Grad).
Womöglich muß ich jedes Servo anders justieren und müßte also noch 2 Variablen als Arrays definieren.
Zuletzt geändert von fbstr am Di 24. Jan 2017, 21:12, insgesamt 1-mal geändert.
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

MicroBahner
Metropolitan (MET)
Beiträge: 2656
Registriert: Mi 28. Nov 2012, 14:24
Nenngröße: H0
Stromart: analog DC
Steuerung: Microprozessor-Eigenbau
Gleise: Tillig
Wohnort: Mittelfranken
Alter: 71

Re: Arduino MobaTools: Arrays...

#6

Beitrag von MicroBahner »

Hallo Frank,
das sieht doch schon gut aus 8)
fbstr hat geschrieben: Mo 16. Jan 2017, 20:33 Könnte man dafür den Großteil aus void loop() zu void setup() kopieren und damit beim Einschalten der Anlage die Servos und LED's initialisieren? Evtl. mit delay's damit nicht alle (zukünftigen) 20 Servos auf einen Schlag sich bewegen
Das solltest Du auf jeden Fall machen. D.h. der erste write-Befehl für jedes Servo steht im setup(), womit die Ausgangstellung der Servos sauber definiert ist. Das mit den delays kann man auch machen - viel delay braucht man ja nicht, wenn die Servos da gegebenenfalls mit 'full speed' fahren. Dazu musst Du ja nur in der Schleife, wo der attach und speed-Befehl steht auch noch den write-Befehl einsetzen. Und dann kannst Du dort auch noch die Led für die Grundstellung einschalten.
So schwer ist es aber auch nicht, sich die aktuelle Stellung immer im EPROM zu merken. Aber das kannst Du ja später immer noch machen. :wink:
fbstr hat geschrieben: Mo 16. Jan 2017, 20:33 Was ich dabei gemerkt habe: Nun werden alle 3 Servos gleich angesteuert (also 75 und 110 Grad).
Womöglich muß ich jedes Servo anders justieren und müßte also noch 2 Variablen als Arrays definieren.
Da wirst Du wohl nicht drumherum kommen :aetsch: :redzwinker: :D

Clooney
InterCity (IC)
Beiträge: 573
Registriert: Sa 2. Jan 2016, 20:23
Nenngröße: H0
Stromart: AC
Steuerung: CS3+ & MS2 & iTrain 5
Gleise: C-Gleis
Wohnort: Gammelshausen
Alter: 38
Deutschland

Re: Arduino MobaTools: Arrays...

#7

Beitrag von Clooney »

Hallo Frank,

schön, dass Du auch unter den Arduino Bastlern bist.
Du kommst ja gut voran. Klasse, weiter so.

Was mir aufgefallen ist, dass du viele arrays hast. Also ich würde da den überblick verlieren.
Da ich aber vor den selben Problem stand wie Du, habe ich mir dafür eine struct definiert.
Das würde ich Dir auch empfehlen.

1. Struct für eine Weiche:

Code: Alles auswählen

typedef struct {
  byte servo_pin;
  byte button_gerade;
  byte button_rund;
  byte led_gerade;
  byte led_rund;
  bool state_set=0;
  bool state_is=0;
  byte pos_rund   = 80;
  byte pos_gerade = 110;
  Servo8 servo;
} servoWeiche;
 
Darin ist alles enthalten was Du bisher in einzelnen Variablen hattest. Ist vielleicht nicht ganz optimal, aber für den Anfang tuts das.

selbes Spiel für einen Entkuppler:

Code: Alles auswählen

typedef struct {
  Servo8 servo;
  byte servo_pin;
  byte button;
  byte pos_an  = 110;
  byte pos_aus = 75;
  EggTimer timer;
} servoEntkupper;
Nun kannst Du ganz einfach dein "Master" Array aufbauen ;)

Code: Alles auswählen

servoWeiche my_weiche[ANZAHL_WEICHEN];    // weichen
servoEntkupper my_entkuppler[0];      // entkuppler
Dann würde ich die Entkuppler & Weiche im setup() konfigurieren.

Code: Alles auswählen

  my_weiche[0].servo_pin     = A1;
  my_weiche[0].button_gerade = A2;
  my_weiche[0].button_rund   = A3;
  my_weiche[0].led_gerade    = A4;
  my_weiche[0].led_rund      = A5;
  my_weiche[0].state_is      = EEPROM.read(eeprom_w_start);
  my_weiche[0].state_set     = my_weiche[0].state_is;
und anschließen auf ihre letzte position schicken.

Code: Alles auswählen

  for (int i=0; i<ANZAHL_WEICHEN; i++){
    pinMode (my_weiche[i].button_gerade, INPUT);
    pinMode (my_weiche[i].button_rund,   INPUT);
    pinMode (my_weiche[i].led_gerade,    OUTPUT);
    pinMode (my_weiche[i].led_rund,      OUTPUT);
    my_weiche[i].servo.attach(my_weiche[i].servo_pin, autoOff);
    my_weiche[i].servo.setSpeed(5);
    if (my_weiche[i].state_set == RUND) {
      digitalWrite(my_weiche[i].led_gerade, LOW);
      digitalWrite(my_weiche[i].led_rund,   HIGH);
      my_weiche[i].servo.write(my_weiche[i].pos_rund);
    } else if (my_weiche[i].state_set == GERADE) {
      digitalWrite(my_weiche[i].led_rund,   LOW);
      digitalWrite(my_weiche[i].led_gerade, HIGH);
      my_weiche[i].servo.write(my_weiche[i].pos_gerade);
    }
  }
Und im loop() ist mir aufgefallen, dass Du erst den button Status in eine Variable einliest und dann in einem IF auswertest.
Das kannst Du auch direkt im if machen.

Code: Alles auswählen

    if(digitalRead(my_weiche[i].button_gerade) == HIGH) {
Ich hoffe Du verstehst was ich damit meine, anstonsten schreib mir einfach eine PN und ich schick Dir den kompletten code, den ich vorhin auf die schnelle gebastelt habe.

Ach und schau Dir nochmal Deine PIN Belegung an, da stimmt etwas nicht (LED_PIN Weiche vs. BUTTON_PIN Entkuppler).

mit programmierenden Grüßen
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays versus struct

#8

Beitrag von fbstr »

Oha, langsam rauchen die Gehirnwindungen bei mir :lol:

@Jochen: So ganz klar ist mir der Vorteil von "struct" noch nicht, denn - wenn ich es richtig verstehe - ich muß dann für jede Weiche diesen Block im Sketch eintragen:

Code: Alles auswählen

 
  my_weiche[0].servo_pin     = A1;
  my_weiche[0].button_gerade = A2;
  my_weiche[0].button_rund   = A3;
  my_weiche[0].led_gerade    = A4;
  my_weiche[0].led_rund      = A5;
  my_weiche[0].state_is      = EEPROM.read(eeprom_w_start);
  my_weiche[0].state_set     = my_weiche[0].state_is;
 
wobei dann [0],[1],[2],... drin steht. Richtig? Ich habe da noch das Gefühl, dass das Array dann übersichtlicher wäre.

Und Du hast Recht mit Pin2. Den habe ich in meinem Sketch doppelt vergeben. Daraufhin habe ich Pin0 und Pin1 probiert, aber die scheinen nicht zu funktionieren. Gibt es einen Trick, damit diese auch verwendet werden können? Es ist nämlich so, dass mir dadurch genau 1 Pin auf dem UNO fehlt...
Falls es keinen Trick gibt, dann werde ich meinen einzigen NANO für das rechte Regal nehmen, denn der NANO hat erstaunlicherweise 2 (analoge) Pins mehr als der UNO (von dem ich 8 Stück aus China habe).
Aus heutiger Sicht würde ich nur noch NANO's kaufen. Die lassen sich sehr einfach auf Lochplatinen stecken. Beim MEGA und UNO hirnel ich noch herum wie ich die am besten verkabel...


Apropo Verkabeln:
Für das Gleisstellpult plane ich ja 2 Taster pro Weiche. Nicht zu kleine Print-Taster, damit auch größere Hände damit zurechtkommen. 1x rot und 1 grün für jede Weiche und einen gelben Taster für die Entkuppler. Printtaster, weil ich die auf eine Doppel-Europlatine löten möchte. Erst nachträglich kam der Gedanke mittels LED noch die aktive Ausrichtung darzustellen. Jetzt bekomme ich eigentlich ein Platzproblem auf dem Gleispult. Am schönsten wäre es, wenn diese Taster die LED's eingebaut hätten. Hat jemand eine Tip für Print-Taster die mittels LED bestückt werden können? Ursprünglich hatte ich vor diese zu kaufen: https://img.conrad.de/medias/global/ce/ ... FB.EPS.jpg
Allerdings gibt es die nur in schwarz, weiß und rot.
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

MicroBahner
Metropolitan (MET)
Beiträge: 2656
Registriert: Mi 28. Nov 2012, 14:24
Nenngröße: H0
Stromart: analog DC
Steuerung: Microprozessor-Eigenbau
Gleise: Tillig
Wohnort: Mittelfranken
Alter: 71

Re: Arduino MobaTools: Arrays versus struct

#9

Beitrag von MicroBahner »

Hallo Frank,
mit den 'structs' ist das so eine Sache. Es gibt Fälle, da sind sie eindeutig das Mittel der Wahl. Es gibt aber auch Fälle, da ist es eher Geschmackssache, was einem besser gefällt. Da bei dir viele Werte als Konstante vorbelegt werden sollten, würde ich da eher kein Struct nehmen. Diese Konstantenbelegungen kann man nämlich bei einfachen Arrays schön in Tabellenform aufbauen. Dann sollten aber die entsprechenden Werte ordentlich untereinander stehen, dann wird es übersichtlicher:

Code: Alles auswählen

//         Pins für Weiche Nr.   0   1  2
const byte servoW[]          = {A1, 12, 6}; // Servos  
const byte buttonGeradeW[]   = {A2, 11, 5}; // "Taster geradeaus"
const byte buttonAbbiegenW[] = {A3, 10, 4}; //  "Taster abbiegen"
const byte ledGeradeW[]      = {A4,  9, 3}; // LEDs geradeaus
const byte ledAbbiegenW[]    = {A5,  8, 2}; // LEDs abbiegen
ANZAHL_WEICHEN = sizeof( servoW );
Und wenn Du jetzt zusätzliche Spalten einfügst, bekommt ANZAHL_WEICHEN automatisch den richtigen Wert.
Natürlich kann man auch structs als Konstante definieren und initiieren, aber in deinem Fall finde ich es so einfacher, vor allem da ja auch nicht alle benötigten Werte Konstante sind. Ist aber, wie gesagt, auch Ansichtssache.

fbstr hat geschrieben: Di 17. Jan 2017, 21:16 Daraufhin habe ich Pin0 und Pin1 probiert, aber die scheinen nicht zu funktionieren.
Pin 0 und 1 sind die serielle Schnittstelle, über die Du auch die Programme lädst. Wenn's irgend geht, sollte man die nicht verwenden. Die braucht man auch beim Fehlersuchen,wenn mann Testausgaben in den Sketch einbaut. Kannst Du nicht dadurch Pin's einsparen, dass Du für die Led's nur einen Ausgang hernimmst? Oder kommt es wirklich vor, dass die beide gemeinsam an oder aus sind?

fbstr hat geschrieben: Di 17. Jan 2017, 21:16 denn der NANO hat erstaunlicherweise 2 (analoge) Pins mehr als der UNO
Das liegt daran, dass auf dem Nano von Anfang an die SMD-Variante des atMega verbaut war, und die hat mehr Pins als die DIL Variante. Wobei dies aber wirklich nur reine Analogeingänge sind. Aber grundsätzlich könntest Du die Taster natürlich auch mit Analogeingängen abfragen :wink: .

fbstr hat geschrieben: Di 17. Jan 2017, 21:16 Allerdings gibt es die nur in schwarz, weiß und rot.
Beim reichelt gibt's die auch in den von dir gewünschten Farben. Und Platz für eine 3mm Led müsste doch noch sein. Oder du nimmst eine 2-Farben Duo-Led. Taster mit eingebauter Led sind meist größer als die von dir vorgesehenen.
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays versus struct

#10

Beitrag von fbstr »

MicroBahner hat geschrieben: Di 17. Jan 2017, 23:31 Und wenn Du jetzt zusätzliche Spalten einfügst, bekommt ANZAHL_WEICHEN automatisch den richtigen Wert.
Das werde ich die nächsten Tage mal durchprobieren. Auch die Struct-Variante irgendwann einmal. Bei meinem Bahnpark-Projekt habe ich ja 12 Segmente, wo jedes mindestens einen Arduino bekommt. Also genügend Möglichkeiten das alles mal zu testen :)
MicroBahner hat geschrieben: Di 17. Jan 2017, 23:31 Kannst Du nicht dadurch Pin's einsparen, dass Du für die Led's nur einen Ausgang hernimmst? Oder kommt es wirklich vor, dass die beide gemeinsam an oder aus sind?
Das wäre möglich, aber ich weiß nicht auf die Schnelle wie ich das schaltungstechnisch realisieren kann. Meine Elektro-Kenntnisse sind etwas eingerostet... :oops:

Einsparen von Pins wäre auch gut für die Verkabelung zum Gleispult. Ich will über ein Flachbandkabel das Gleispult (Doppel-Europlatine in einem flachen mobilen Kasten) mit dem linken Regal verbinden. Momentan wäre mindestens 49Poliges nötig (also 50polig). Wenn ich jeweils 2 LEDs über einen Pin ansteuern könnte, dann wären es praktischerweise nur noch 40polig nötig...
MicroBahner hat geschrieben: Di 17. Jan 2017, 23:31Beim reichelt gibt's die auch in den von dir gewünschten Farben.
Ah, sehr gut - da hatte ich die Dinger mit den korrekten Farben gesehen. Merci.
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

Bodo
InterCityExpress (ICE)
Beiträge: 2379
Registriert: Do 28. Apr 2005, 08:59
Nenngröße: H0
Stromart: digital
Steuerung: IB1 & CS2
Gleise: C-Gleis
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays versus struct

#11

Beitrag von Bodo »

Hallo,
fbstr hat geschrieben: Mi 18. Jan 2017, 09:50
MicroBahner hat geschrieben: Di 17. Jan 2017, 23:31 Kannst Du nicht dadurch Pin's einsparen, dass Du für die Led's nur einen Ausgang hernimmst? Oder kommt es wirklich vor, dass die beide gemeinsam an oder aus sind?
Das wäre möglich, aber ich weiß nicht auf die Schnelle wie ich das schaltungstechnisch realisieren kann. Meine Elektro-Kenntnisse sind etwas eingerostet... :oops:
Google-Suche über "zwei LEDs ein port" liefert z.B.:
https://www.elv.de/elektronikwissen/2-l ... euern.html
http://www.mikrocontroller.net/topic/289187

Viele Grüße, Bodo
Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)

Meine Anlage - Meine Dauerbaustelle
Platinen für Modellbahn- und Arduino-Anwendungen
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays versus struct

#12

Beitrag von fbstr »

Bodo hat geschrieben: Mi 18. Jan 2017, 10:24 Google-Suche über "zwei LEDs ein port" liefert z.B.:
https://www.elv.de/elektronikwissen/2-l ... euern.html
http://www.mikrocontroller.net/topic/289187
:oops: Merci! Das werde ich heute abend gleich mal ausprobieren.
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

MicroBahner
Metropolitan (MET)
Beiträge: 2656
Registriert: Mi 28. Nov 2012, 14:24
Nenngröße: H0
Stromart: analog DC
Steuerung: Microprozessor-Eigenbau
Gleise: Tillig
Wohnort: Mittelfranken
Alter: 71

Re: Arduino MobaTools: Arrays versus struct

#13

Beitrag von MicroBahner »

Hallo Frank,
fbstr hat geschrieben: Mi 18. Jan 2017, 09:50 Das wäre möglich, aber ich weiß nicht auf die Schnelle wie ich das schaltungstechnisch realisieren kann.
Die einfachste Möglichkeit wäre so:
Bild
Die Arduino Ports können bei HIGH und LOW den gleichen Strom liefern, und mit LowCurrent Led's brauchst du auch nur ca 2mA.
fbstr hat geschrieben: Mi 18. Jan 2017, 09:50 Ich will über ein Flachbandkabel das Gleispult (Doppel-Europlatine in einem flachen mobilen Kasten) mit dem linken Regal verbinden. Momentan wäre mindestens 49Poliges nötig (also 50polig).
Wenn Du schon Microprozessoren einsetzt, ist das aber nicht unbeding 'State of the Art'. :redzwinker: Wie wär's mit einer Porterweiterung über I2C oder SPI. Dann kommst Du mit 4-5 Leitungen (einschl. Stromversorgung) aus, egal wieviele Led's und Taster Du am Gleispult hast 8)
Oder Du schaust dir mal die Greißelbach-Variante an.

P.S. Bodo war etwas schneller :wink:
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays versus struct

#14

Beitrag von fbstr »

MicroBahner hat geschrieben: Mi 18. Jan 2017, 10:28 Wenn Du schon Microprozessoren einsetzt, ist das aber nicht unbeding 'State of the Art'. :redzwinker: Wie wär's mit einer Porterweiterung über I2C oder SPI.
Warum habe ich so eine Antwort schon erwartet... :roll:

Klar wäre das toll, ich träume ja sogar davon das Gleisbild auf dem iPad zu haben und darüber das ganze zu schalten. Und ich habe auch schon kurz daran gedacht in das Gleispult so was wie den FREDI einzubauen. Damit hätte ich eine Art Konsole wo alles drauf ist um den TimeWaster zu bedienen. Habe das aber erstmal wieder verworfen...

Denn ich bin erstmal froh wenn das mit den Weichen und Entkupplern soweit funktioniert.

Danach gehts mit DCC weiter. Thomas (digi_thomas2003) hat mir freundlicherweise sein Eagle-Platinenlayout zur Verfügung gestellt und gestern habe ich in China 20 Platinen geordert. Denn beim Bahnpark will ich ja die Lokschuppentore und die 2 Drehscheiben über DCC/Arduinos steuern...
------

Die Schaltung mit 2 LED's mit einem Pin habe ich gerade getestet und funktioniert. Dank Euch beiden! :gfm:
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

MicroBahner
Metropolitan (MET)
Beiträge: 2656
Registriert: Mi 28. Nov 2012, 14:24
Nenngröße: H0
Stromart: analog DC
Steuerung: Microprozessor-Eigenbau
Gleise: Tillig
Wohnort: Mittelfranken
Alter: 71

Re: Arduino MobaTools: Arrays versus struct

#15

Beitrag von MicroBahner »

Hallo Frank,
fbstr hat geschrieben: Mi 18. Jan 2017, 21:11 Klar wäre das toll, ich träume ja sogar davon das Gleisbild auf dem iPad zu haben und darüber das ganze zu schalten. Und ich habe auch schon kurz daran gedacht in das Gleispult so was wie den FREDI einzubauen.
Na, zwischen diesen Gedanken und einer einfachen Porterweiterung liegen aber nochmal Welten :wink:
Mit so einer Porterweiterung sparst Du ja letztendlich 'nur' die vielen Strippen zwischen Anlage und Gleispult. Ansonsten liest Du weiter deine Taster ein und steuerst deine Leds wie gehabt. Nur die vielen Direktanschlüsse werden durch ein paar Schieberegister oder I2C-Portbausteine im Gleispult ersetzt.
War aber ja nur ein Vorschlag - ich will dir nichts aufdrängen :pflaster: :pflaster: :D
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays versus struct

#16

Beitrag von fbstr »

Bestellung bei Reichelt ist gestern abend raus, dann sollte ich nächste Woche mit dem "Oldschool-Gleispult" anfangen können. :D

Dieses Wochenende will dann die Sketche mit allen Tipps und Tricks von Euch (allerdings erstmal ohne "struct" - wobei mein supernetter Kollege mit VisualBasic arbeitet und sofort Feuer und Flamme mit "struct" war...) für den MEGA (6 Weichen, 9 Entkuppler linkes Regal) und UNO (3 Weichen, 2 Entkuppler rechtes Regal) fertig machen.

Und die Mechanik des Entkupplers mit Servo muß ich auch erst noch entwerfen und testen. :idea:
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Lötorgie

#17

Beitrag von fbstr »

fbstr hat geschrieben: Fr 20. Jan 2017, 12:48 Dieses Wochenende will dann die Sketche ... fertig machen.
Daraus ist nichts geworden. Donnerstag abend bestellt und am Samstag lieferte schon Reichelt :D
Also waren 2 Tage Löten angesagt - und ich bin noch nicht fertig. Es fehlen nun am Gleisstellpult noch die Leitungen von den Tastern und LED's zu dem 40poligen Wannenstecker. Das wird noch eine Viecherei... Für heute mache ich erstmal Schluß.

Der momentane Stand - nicht schön, aber sollte später funktionieren:

Bild

Für das Gleisstellpult plane ich eine Acrylplatte im Jugendhaus lasern zu lassen.

Bild

Die Arduino MEGA und UNO "hängen" unter der Platine, die unter das linke Regal kommt. Mittels dem 9pol Sub-D und kleiner Platine werden dann die 5 Servos auf der rechten Regalhälfte versorgt.
Bild
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays versus struct

#18

Beitrag von fbstr »

Grrrrr, ich stelle gerade fest, daß ich den Sketch nicht richtig gespeichert hatte :oops:

Bin also wieder auf dem Stand von Post #5... Nunja, dient alles nur zur Übung.
Oder gibt es eine Möglichkeit den Sketch aus dem Arduino auszulesen? Gefunden habe ich nichts im Programm.


Ich habe bei der Löterei auch übersehen, dass beim MEGA neben Pin23 5V ist (und nicht Pin21) und Pin53 GND ist. Da muß nochmals gelötet werden und dann fehlen auch noch der 40pol Wannenstecker. Werde wohl erst am Wochenende dazu kommen.
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

MicroBahner
Metropolitan (MET)
Beiträge: 2656
Registriert: Mi 28. Nov 2012, 14:24
Nenngröße: H0
Stromart: analog DC
Steuerung: Microprozessor-Eigenbau
Gleise: Tillig
Wohnort: Mittelfranken
Alter: 71

Re: Arduino MobaTools: Arrays versus struct

#19

Beitrag von MicroBahner »

fbstr hat geschrieben: Di 24. Jan 2017, 21:27Oder gibt es eine Möglichkeit den Sketch aus dem Arduino auszulesen?
Hallo Frank, leider nein. Der Sketch - so wie Du ihn in der IDE schreibst - steht ja gar nicht im Arduino. Wenn Du auf 'Upload' drückst, wird dein Sketch erstmal compiliert und ein reines Maschinenprogramm erstellt. Das enthält nur Befehle, die der Prozessor auf dem Arduino direkt ausführen kann. Der Sketch kann daraus nicht mehr rekonstruiert werden. Nur dieses Maschinenprogramm landet auf dem Arduino.

P.S. mit entsprechenden HIlfsmitteln ( die in der Arduino-Umgebung allerdings nicht enthalten sind ) könnte man das Maschinenprogramm schon auslesen. Aber wie gesagt - es würde DIr nicht helfen.
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Arrays versus struct

#20

Beitrag von fbstr »

Uff, meine IT-Welt ist wieder in Ordnung. Weiß der Geier wie sich der aktuelle Sketch versteckt hat und warum ich ihn nicht gefunden habe...

Dann will ich hier gleich mal ein Backup machen 8)

Code: Alles auswählen

#include <MobaTools.h>

#define ANZAHL_WEICHEN  3 //Anzahl der Weichen

Servo8 servoWeiche[ANZAHL_WEICHEN]; //Array Weichen 7 bis 9
Servo8 servoE08; //Entkuppler08
EggTimer myTimerE08; //Entkuppler sollen 5 sec. aktiv sein


const byte servoE08pin=A0;
const byte buttonE08pin=13; //entkuppeln
const byte servoW[ANZAHL_WEICHEN]={A1,12,6}; //Array Weichen Pins
const byte buttonGeradeW[ANZAHL_WEICHEN]={A2,11,5}; //Array Pins "Taster geradeaus"
const byte buttonAbbiegenW[ANZAHL_WEICHEN]={A3,10,4}; //Array Pins "Taster abbiegen"
const byte ledGeradeW[ANZAHL_WEICHEN]={A4,9,3}; //Array LEDs geradeaus
const byte autoOff = 1; //damit die Servos nicht brummen...

byte buttonStatusGeradeW[ANZAHL_WEICHEN]={0,0,0};
byte buttonStatusAbbiegenW[ANZAHL_WEICHEN]={0,0,0};
byte buttonStatusE08=0;

byte i; //Zählvariable

void setup() {
  for (i=0; i<ANZAHL_WEICHEN; i++){
    pinMode(buttonGeradeW[i], INPUT);
    pinMode(buttonAbbiegenW[i], INPUT);
    pinMode(ledGeradeW[i], OUTPUT);
    servoWeiche[i].attach(servoW[i], autoOff );
    servoWeiche[i].setSpeed(5);
  }
pinMode(buttonE08pin, INPUT);
servoE08.attach(servoE08pin);
servoE08.setSpeed(20);
}

void loop() {
  for (i=0; i<ANZAHL_WEICHEN; i++){
    buttonStatusGeradeW[i]=digitalRead(buttonGeradeW[i]);
    buttonStatusAbbiegenW[i]=digitalRead(buttonAbbiegenW[i]);
    if (buttonStatusGeradeW[i] == HIGH)
      {
        digitalWrite(ledGeradeW[i], HIGH);
        servoWeiche[i].write(80);
      }
    else
      {
       if (buttonStatusAbbiegenW[i] == HIGH)
        {
          digitalWrite(ledGeradeW[i], LOW);
          servoWeiche[i].write(110);
        }
      else
        {
          
        } 
      }
  }
      
buttonStatusE08=digitalRead(buttonE08pin);
if (buttonStatusE08 == HIGH) //wenn der Entkuppler-Taster betätigt wird...
  {
    myTimerE08.setTime(5000); //sollte der Timer auf 5 Sekunden gestellt werden und starten...
    servoE08.write(110); //... und das Servo auf 110 Grad (Entkuppeln) gehen...
   }
else    // wenn der Taster losgelassen wurde ...
  {
   if ( myTimerE08.running()==false) //...und wenn der Timer abgelaufen ist ...
    {
      servoE08.write(75); //...wieder auf 75 Grad (Ruhezustand)
    }
  }
}
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Fehlersuche

#21

Beitrag von fbstr »

Das Wochenende ist einfach zu kurz...

Eigentlich ist nun das rechte Regal soweit fertig, das Gleisstellpult verlötet - aber es tut net... :cry:

Hier der Sketch für den UNO (rechtes Regal), welcher 3 Weichen und 2 Entkuppler ansteuert (die Feinheiten wollte ich nach der Funktionsprüfung machen):

Code: Alles auswählen

#include <MobaTools.h>

#define ANZAHL_WEICHEN  3      //Anzahl der Weichen
#define ANZAHL_ENTKUPPLER  2   //Anzahl der Entkuppler

Servo8 servoWeiche[ANZAHL_WEICHEN];         //Array Weichen 7 bis 9
Servo8 servoEntkuppler[ANZAHL_ENTKUPPLER];  //Array Entkuppler 8 und 11
EggTimer myTimerE[ANZAHL_ENTKUPPLER];       //Entkuppler sollen 5 sec. aktiv sein

//                Gleisstellpultweiche Nr.:   7,   8,   9
const byte servoW[ANZAHL_WEICHEN]         ={ A2,  A1,  A3}; //Array Weichen Pins
const byte WAnschlagMIN[ANZAHL_WEICHEN]   ={ 80,  80,  80}; //Array Weichenauslenkung Minimum
const byte WAnschlagMAX[ANZAHL_WEICHEN]   ={110, 110, 110}; //Array Weichenauslenkung Maximum
const byte buttonGeradeW[ANZAHL_WEICHEN]  ={  5,   7,   2}; //Array Pins "Taster geradeaus"
const byte buttonAbbiegenW[ANZAHL_WEICHEN]={  4,   6,   3}; //Array Pins "Taster abbiegen"
const byte ledW[ANZAHL_WEICHEN]           ={ 11,   9,  10}; //Array LEDs 

//            Gleisstellpultentkuppler Nr.:      8,   11
const byte servoE[ANZAHL_ENTKUPPLER]         ={ A0,  A4}; //Array Entkuppler Pins
const byte EAnschlagMIN[ANZAHL_ENTKUPPLER]   ={ 75,  75}; //Array Entkupplerauslenkung Minimum
const byte EAnschlagMAX[ANZAHL_ENTKUPPLER]   ={110, 110}; //Array Entkupplerauslenkung Maximum
const byte buttonE[ANZAHL_ENTKUPPLER]        ={ 13,  12}; //Array Pins "Taster Entkuppler"


const byte autoOff = 1; //damit die Servos nicht brummen...

byte buttonStatusGeradeW[ANZAHL_WEICHEN]  ={0,0,0};
byte buttonStatusAbbiegenW[ANZAHL_WEICHEN]={0,0,0};
byte buttonStatusE[ANZAHL_ENTKUPPLER]     ={0,0};

byte i; //Zählvariable Weichen
byte j; //Zählvariable Entkuppler

void setup() {
  for (i=0; i<ANZAHL_WEICHEN; i++){
    pinMode(buttonGeradeW[i], INPUT);
    pinMode(buttonAbbiegenW[i], INPUT);
    pinMode(ledW[i], OUTPUT);
    servoWeiche[i].attach(servoW[i], autoOff );
    servoWeiche[i].setSpeed(5);
  }
  for (j=0; j<ANZAHL_ENTKUPPLER; j++){
    pinMode(buttonE[j], INPUT);
    servoWeiche[j].attach(servoW[j], autoOff );
    servoWeiche[j].setSpeed(20);
  }
}

void loop() {

// Schleife für Weichen

  for (i=0; i<ANZAHL_WEICHEN; i++){
    buttonStatusGeradeW[i]=digitalRead(buttonGeradeW[i]);
    buttonStatusAbbiegenW[i]=digitalRead(buttonAbbiegenW[i]);
    if (buttonStatusGeradeW[i] == HIGH)
      {
        digitalWrite(ledW[i], HIGH);
        servoWeiche[i].write(WAnschlagMIN[ANZAHL_WEICHEN]);
      }
    else
      {
       if (buttonStatusAbbiegenW[i] == HIGH)
        {
          digitalWrite(ledW[i], LOW);
          servoWeiche[i].write(WAnschlagMAX[ANZAHL_WEICHEN]);
        }
      else
        {
          
        } 
      }
  }

// Schleife für Entkuppler

for (j=0; j<ANZAHL_ENTKUPPLER; j++){
    buttonStatusE[j]=digitalRead(buttonE[j]);
    if (buttonStatusE[j] == HIGH)                           //wenn der Entkuppler-Taster betätigt wird...
      {
        myTimerE[j].setTime(5000);                          //sollte der Timer auf 5 Sekunden gestellt werden und starten...
        servoEntkuppler[j].write(EAnschlagMIN[ANZAHL_ENTKUPPLER]);   //... und das Servo auf 110 Grad (Entkuppeln) gehen...
      }
    else                                                    // wenn der Taster losgelassen wurde ...
      {
       if (myTimerE[j].running()==false)                    //...und wenn der Timer abgelaufen ist ...
        {
          servoEntkuppler[j].write(EAnschlagMAX[ANZAHL_ENTKUPPLER]); //...wieder auf 75 Grad (Ruhezustand)
        }
      } 
}
  

}

Die Servos zucken nur beim Strom einschalten, die LED's machen auch nicht was ich will. Alle 3 LED-Paare leuchten grün. Wenn ich z.B. Taste W9grün (Pin 2) drücke wechselt das Paar kurz auf Rot und geht dann wieder zurück auf Grün. Das Servo macht keinen Mucks.
Alleine schon das Wackeln am 1,5 Meter langem 40pol. Flachbandkabel bringt die LED's zum Tanzen.

Und wenn ich das Gleisstellpult abstecke und mal direkt am Arduino z.B. an Pin 13 (Taste Entkuppler 11) einen 10k Widerstand auf GND lege tut sich auch nichts...

Als nächstes würde ich den Arduino erstmal wieder ausbauen und wieder am Breadboard testen...
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Fehlersuche

#22

Beitrag von fbstr »

Was ich gestern abend noch gemacht habe:

1.
Der UNO wird nun ja über den 5V Spannungswandler versorgt (Vin). Zusätzlich war aber auch ein 5V Ausgangspin mit dem Brett verbunden. Sprich wenn über Moba und USB vom Computer versorgt ist das doppelt. Was macht denn der Arduino wenn beide Stromquellen verfügbar sind?
Vorsorglich habe ich diesen 5V Ausgangspin deaktiviert (weggebogen).

2.
Danach habe ich einen frischen UNO angestöpselt und programmiert. Aber das gleiche Verhalten.

Falls keine weiteren Vorschläge kommen, werde ich heute abend mal den Testsketch wieder laden, wo zumindest 1 Weiche und 1 Entkuppler auf dem Breadboard funktionierte. Dann das ganze über das Gleisstellpult gesteuert, ob die Tasten und LED's gehen.

Ich hatte ja gehofft, dass jemand sagt die Programmierung oben ist falsch, aber irgendwie glaube ich nicht an diese Richtung...
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

MicroBahner
Metropolitan (MET)
Beiträge: 2656
Registriert: Mi 28. Nov 2012, 14:24
Nenngröße: H0
Stromart: analog DC
Steuerung: Microprozessor-Eigenbau
Gleise: Tillig
Wohnort: Mittelfranken
Alter: 71

Re: Arduino MobaTools: Fehlersuche

#23

Beitrag von MicroBahner »

Hallo Frank,
fbstr hat geschrieben: So 29. Jan 2017, 19:06 Alleine schon das Wackeln am 1,5 Meter langem 40pol. Flachbandkabel bringt die LED's zum Tanzen.
Das ist aber schon sehr verdächtig :shock: . Das ist sicher kein Softwareproblem, da ist irgendwas mit der HW faul. Ich würde entweder auf Wackelkontakte tippen, oder auf Eingänge, die kein eindeutiges Potential haben.
Leider hast Du uns zur HW-Schaltung bisher nicht viel gezeigt.
fbstr hat geschrieben: Mo 30. Jan 2017, 08:47 Der UNO wird nun ja über den 5V Spannungswandler versorgt (Vin).
Meinst Du den internen Spannungswandler oder speist Du extern bei Vin 5V ein? An Vin müssen 7-12V anliegen. Der +5V Anschluß ist als Ausgang gedacht und es wird nicht empfohlen, dort 5V einzuspeisen.
fbstr hat geschrieben: Mo 30. Jan 2017, 08:47 Ich hatte ja gehofft, dass jemand sagt die Programmierung oben ist falsch, aber irgendwie glaube ich nicht an diese Richtung...
Kann es sein, dass Du etwas ungeduldig bist :redzwinker: - ich werd's mir heute im Laufe des Tages mal anschauen. Deine Fehlerbeschreibungen deuten allerdings in der Tat mehr auf ein HW Problem hin. Zeig uns dochmal einen Schaltplan...
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Fehlersuche

#24

Beitrag von fbstr »

MicroBahner hat geschrieben: Mo 30. Jan 2017, 10:31 ... oder speist Du extern bei Vin 5V ein? An Vin müssen 7-12V anliegen. Der +5V Anschluß ist als Ausgang gedacht und es wird nicht empfohlen, dort 5V einzuspeisen.
:bigeek:

Oh mein Gott. Zum ersten Mal lese ich hier die techn. Daten:
Operating Voltage 5V
Input Voltage (recommended) 7-12V
Input Voltage (limit) 6-20V
Ich habe auf der Europlatine einen 5V Spannungsregler (2A) der alles versorgen soll. Ich habe also an Vin nur 5 Volt eingespeist. Da ich bei den Tests bisher immer alles über den USB-Stecker alles (Arduino, 2 Servos, 2 LED's) versorgt hatte, bin ich davon ausgegangen, daß dann 5V bei Vin ausreicht.

Muß schnell mal was testen...
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Benutzeravatar

Threadersteller
fbstr
EuroCity (EC)
Beiträge: 1252
Registriert: So 28. Aug 2016, 21:04
Nenngröße: H0
Stromart: digital
Steuerung: DR5000, Lenz LZV100, MLL
Gleise: Peco Code 75, Trix C
Wohnort: Stuttgart
Kontaktdaten:
Deutschland

Re: Arduino MobaTools: Fehlersuche

#25

Beitrag von fbstr »

fbstr hat geschrieben: Mo 30. Jan 2017, 18:15 Muß schnell mal was testen...
Hat leider nichts gebracht den Arduino mit 9V zu versorgen.
MicroBahner hat geschrieben: Mo 30. Jan 2017, 10:31 Leider hast Du uns zur HW-Schaltung bisher nicht viel gezeigt.
Also als Schaltung würde ich das nicht bezeichnen. Es ist ja mehr ein "wie kriege ich das Signal vom Taster, LED und Servo an den Arduino."
- Bis vorhin sollte ein 5V Spannungsregler alles versorgen (Servos, LED's, Arduinos). Nun werden die 2 Arduinos dann extra versorgt werden.
- Alle Taster sind an GND angeschlossen und dann über einen 10k Widerstand am Arduino Pin.
- Jeweils eine grüne und rote Low Current LED sind mittels 1k Widerstände geschaltet, wie in Deinem Bild:
Bild
Mehr ist da nicht drin...
Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: normalerweise jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen
Antworten

Zurück zu „Digital“