Das war alles so geplant, die Testplatine mit LTV 844 und Ansteuern über den Spannungsabfall von je 2 antiparallelen Dioden zur Besetztmeldung hatte ich schon fertig, als ich im Rocrail Forum den fast Identischen Schaltplan von Holländern gefunden hab. Die haben nur statt Dioden einen Gleichrichter verwendet.
Ich hätte die ganzen Gleisabschnitte von vorn bis hinten mittels Relais abgeschaltet.
Da mein Freund nicht die Gnd Schiene unterbrochen hat, sondern die Plus-Seite, hätte ich beim Relais von Fahr- auf Detektionsspannung umschalten müssen, damit die Besetztmeldung auch bei abgeschaltetem Gleis funktioniert.
Also alles Schnee von gestern, jetzt wird hoffentlich bald jeder Zug per Hand in ein freies Gleis geschickt, wenn der Zufallsgenerator eingestellt ist.
Da hoffen wir mal, dass der Fahrdienstleiter auch immer gut aufpasst ![]()
Das bringt mich auf die Idee, dass das gestellte Gleis in die Blockstellensteuetung integriert wird und so die Einfahrt frei schalten könnte, wenn es frei ist.
Das wäre ein Bonus! Da bin ich froh, dass ich den Thread eröffnet hab! Danke!
Morgen probier ich Dein Programm aus, wenn ich dazu komme.
du könntest ja fragen was unklar ist.
Klar sollte sein, dass das nur ein Gerüst ist wie man so was machen kann.
Da gehört dann noch der eigentliche Hardwarezugriff rein.
Daher warte ich ja noch auf dein Beispiel für eine Weiche.
Kommt da noch was oder hast du gar nichts?
Hallo noiasca,
ich komme mit dem Sketch leider nicht weiter und hab jede Menge Fragen:
ich lese aus dem sketch, dass 2 Weichen mit je 2 Spulen angesteuert werden.
Wie weiß der Portexpander welche Weiche wo angeschlossen ist? Hin auf A0 A1 und Rück dementsprechend auf B0 B1?
Es gibt im Sketch keine Initialisierung der MCP library und keine Adresse des MCP?
An welchem Port müssen die Taster angeschlossen werden?
...
LG Schanderl (ich muss gleich mal weg, vlt komm ich heut abend wieder dazu.)
so wäre das mal der Plan zum Anfangen, damit du siehst wie es aussehen könnte.
das hätte ich mir mal gem. deiner Beschreibung so gedacht.
oder eben 0..7 als Port A und 8..15 als Port B verwenden ... weis ich noch nicht was einfacher ist.
Mal nachsehen wie die Adafruit Lib damit umgeht.
Ja - ich dachte ich könnte das jetzt von dir kopieren ![]()
Aber du kannst zwischenzeitlich wieder mal den Link ansehen - da ensteht vieleicht etwas ...
Mehrere Fragen von mir:
Du hast weiter oben gesagt du hättest die MCP23S17 - also mit SPI - nicht I2C. Richtig?
Hast du die schon mal angeschlossen und mal mit einfache LEDs durchgeblinkt um zu sehen wie das funktioniert?
Oder auch mal einen einfachen Schalter ausgelesen?
Welchen Chip Select Pin nutzt du am Arduino für den ersten MCP23S17?
Nein, noch nicht, mir fehlt es erst mal am Grundlegenden, z.B. den MCP anzusprechen, aber da komm ich schon dahinter!
Welchen Chip Select Pin nutzt du am Arduino für den ersten MCP23S17?
[/quote]
Ich benutze die Pins, die beim Mega2560 für SPI angegeben sind:
MISO 50
MOSI 51
SCK 52
SS 53
Bei meinem Testboard habe ich 2 MCP23S17 drauf, bei denen ich die Adresse mit Steckbrücke codieren (der 6er Stecker links neben der Bus-Leitung zum Shield), aber auch jeden von beiden von der Spannungsversorgung trennen und somit ausschalten kann (ganz oben rote 5V Leitung)
(Bitte um Nachsicht mit der Ausführung, die Besetztmeldungen zum MCP sind auf der Unterseite mit lackisoliertem Draht direkt verbunden)
Der linke MCP ist auf 111 und der rechte auf 110 gesetzt (A0-A2 Pullup auf +5V und Stecker zum Pulldown oben in der Mitte).
fang mit den Beispielen der Library an.
Das solltest du schaffen.
Wenn auf deinem Board die ersten LED gesteuert blinken und du Tasten auslesen kannst, poste einfach den Sktech den du hast, dann kann ich den Wokwi Sketch adaptieren.
Meiner Meinung nach machst Du den 2.Schritt vor dem ersten. Wie man die Komponenten deiner HW anspricht solltest Du zuerst auf einem Breadboard ausgetestet haben, bevor Du die endgültige Schaltung festlegst und aufbaust. HW und SW sind da nicht unbedingt unabhängig voneinander.
Hallo Gents
Ich würde ganz anders anfangen.
Für den Anfang würde ich einen Schattenbahnhof für 5 Gleise mit allen notwendigen Hardwarekomponenten für einen Arduino Mega bauen.
Dies ist ein sehr guter Weg, um zu lernen, wie viele Eingangs- und Ausgangssignale benötigt werden, die bei Bedarf leicht mit Port-Erweiterungen skaliert werden können.
Ich würde für jeden Schattenbahnhof jeweils einen Arduino Mega einplanen.
OK, mag für einen Anfänger einfacher sein, vorausgesetzt die sind wirklich absolut unabhängig voneinander.
Ist aber an sich vollkommener Overkill. Mein Sbf wurde von einem einzigen ATmega128 gesteuert, und der hat wesentlich mehr gemacht als hier insgesamt geplant ist. Und wirklich ausgelastet war der noch nicht.
Hallo,
du kannst die Lib von Rob Tillaart nehmen und dazu das Datenblatt vom MCP.
Das Datenblatt wenigstens einmal durchlesen damit du weißt was du mit der Lib eigentlich anstellst.
Deine gesteckten Adressen 0 und 1 sind bei SPI eigentlich nicht üblich, hier beim MCP vorhanden. Damit kann man ähnlich wie bei I2C bis zu 4 MCPs auf einem gemeinsamen SPI Bus mit gemeinsamer CS Leitung betreiben. Die Unterscheidung welcher MCP angesprochen wird, wird mit der Adresse für das entsprechende Register durchgeführt. Übernimmt für dich die Lib. Man muss diese nur dafür konfigurieren.
Die Alternative wäre jeder MCP bekommt seine eigene CS Leitung. Welcher Pin das ist, ist vollkommen egal. SS ist eben beim Controller SPI Port schon vorgesehen.
Und lass dich nicht von den Namen verrückt machen.
CS ... Chip-Select
SS ... Slave-Select
CE ... Chip Enabler
meinen alle den gleichen Pin zur Auswahl des IC welcher angesprochen werden soll.
Zum probieren wäre es gut wenn man paar Leds anklemmen könnte und paar Led Effekte programmiert. Dann versteht man die Handhabung besser. Vorher noch die Bsp. der Lib ausprobieren.
Da die 2 Schattenbahnhöfe identisch aufgebaut sind, hatte ich das ursprünglich auch mit 2 Megas geplant. Da sollte alles andere aber auch noch gesteuert werden. Ich hatte schon angefangen, einen kleinen Beispiel Sbf in N aufzubauen, mit 4 Gleisen, jeweils 2 Abstellabschnitte und 2 Blöcke in der "Strecke", wobei die Blocklänge nur für 1 Lok + Güterwagen (mit leitenden Achsen) gereicht hätte. Das wären 8 Weichen (ich habe keine aufschneidbaren Weichen in N), 10 Besetzmelder (wie beschrieben), 10 Relais zum Stromabschalten und 10 IR Reflexlichtschranken gewesen (auf eigems gefrästen Platinen, anstelle der SRKs um die Endposition zu detektieren, die für SRKs nötigen Magnete haben bei mir in N alle Wagen entgleisen lassen). Dann kam ein Umzug dazwischen und ich habe alles abbauen müssen.
Um zu einem Ergebnis zu kommen jetzt die Minimallösung.
Meiner Meinung nach machst Du den 2.Schritt vor dem ersten. Wie man die Komponenten deiner HW anspricht solltest Du zuerst auf einem Breadboard ausgetestet haben, bevor Du die endgültige Schaltung festlegst und aufbaust. HW und SW sind da nicht unbedingt unabhängig voneinander.
Ich habe sehr wohl die Hardware vom ULN2803 und LTV844 am Breadboard ausprobiert, bevor ich die Platinen gelötet habe. Die Schaltungen waren ja auch selbst entwickelt, halt nur nicht den MCP.
Mega2560 abgeraucht! Shit happens
So, jetzt habe ich versucht, die Kommunikation über den SPI zwischen Mega2560 und dem MCP23S17 auszuprobieren und dazu den Sketch von Rob Tillaard "test_led_bar" mit dem MCP, 8 LEDs mit 470Ohm auf dem Breadboard gesteckt und mittels Shield angeschlossen, wobei ich die 5V Stromversorgung zum Breadboard über die Kontakte neben den SPI Pins verbunden habe. Am USB ließ sich der Mega nicht programmieren, das hätte schon eine Warnung sein sollen, mit 9V am ext. Eingang, ohne USB Verbindung, ist der nagelneue Mega im wahrsten Sinne des Wortes abgeraucht, so schnell konnte ich gar nicht abschalten. Da das Shield drüber war, konnte ich den Ursprung des Qualms nicht exakt orten, es war aber links unten, nahe dem Stecker. IC1 oder D1 (bei meinem Board steht da E1). Die beiden Kondensatoren hat es eher nicht erwischt, die wären explodiert.
Die Schaltung am Breadboard hab ich kontrolliert, da gibt es keinen Kurzschluss.
Braucht der MCP so viel Strom, dass der Mega überlastet ist?
Hätte es Sinn gemacht, ihn bei den Power Buchsen anzuschließen?
Ups... Schade
mit 9V am ext. Eingang,
Was meinst du damit?
Welscher Pin wurde benutzt?
Die beiden Kondensatoren hat es eher nicht erwischt, die wären explodiert.
Normal sin die für 35V ausgelegt.
Mach mall Foto vom dem Defekten Mega.
mein Fehler, hab am Breadbord 5v und GND verkehrt angeschlossen. So braucht das dann 140mA, das war zuviel. Richtig gepolt liegt der der MCP ohne Aktivität unter 10mA. Anscheinend hat das der Arduino nicht gepackt.
Die Frage mit dem 5V Pin hat sich auch geklärt. Das Prototype Shield hat neben den Pins 50-53 für den SPI zusätzliche 5V und GND Pins, die ich der Einfachheit halber verwendet hab. Diese Pins sind mit denen bei "Power" direkt verbunden.
An den Bausteinen lässt sich äusserlich nichts erkennen. Bei dem Baustein E1 (D1) links unten sind die Kontakte etwas dunkler, wahrscheinlich hat es die Diode erwischt.
Bei meinem nicht originalen Mega haben sie gespart. die Kondensatoren sind nur bis 25V, nicht 35V belastbar.
Jetzt habe ich mal einen 5er Pack Mega mit Prototype shield bestellt, schauen wir mal, ob und wann ich endlich weiterkomme.
Die Lehre aus dem ganzen: nicht nur die Schaltung kontrollieren, sondern sich selbst auch!
Hallo,
ich komme nicht weiter und bitte um Hilfe. Die Hardware ist über ein Shield mit dem Breadbord verbunden. Ich habe 8 LEDs mit Vorwiderständen (mehr hatte ich nicht) am Breadboard mit A0-A3 und B0-B3 vom MCP verbunden und gegen Masse geschaltet.
Inzwischen hab ich geschafft, dass ein MCP mit dem Mega Kontakt hat, zumindest bekomme ich sinnvolle Rückmeldungen amserial Monitor.
wie adressiere ich die Pins am mcp? Es blinkt keine LED. Siehe Testprogramm unten.
Wenn ich A0 (s.u) eingebe, leitet Arduino dies auf den Analogport am Mega um. Auch die Pin Nr. des MCP funktioniert nicht. Irgendwo hab ich einen (Verständnis)-Fehler.
#include "SPI.h"
#include "MCP23S17.h"
// Adressen des MCP23S17 Port Expanders (Achtung: Je nach Verdrahtung können sich die Adressen ändern)
#define MCP23S17_ADDRESS 0x20
// Erstelle ein Objekt der Klasse MCP23s17
MCP23S17 mcp(MCP23S17_ADDRESS);
// Definiere den Pin für die LED
const uint8_t ledPin = A0;
void
setup()
{
// Initialisiere die serielle Kommunikation
Serial.begin(115200);
//spi.begin();
// Initialisiere den MCP23S17
mcp.begin();
// Setze den Pin-Modus für die LED als Ausgang
mcp.pinMode1(ledPin, OUTPUT);
}
void
loop()
{
// Schalte die LED ein
mcp.write1(ledPin, HIGH);
Serial.println("LED eingeschaltet");
// Warte für 1 Sekunde
delay(1000);
// Schalte die LED aus
mcp.write1(ledPin, LOW);
Serial.println("LED ausgeschaltet");
// Warte für 1 Sekunde
delay(1000);
}
Andere Fragen:
- Wozu brauche ich UINT_8? Die benötigten Variablen brauchen nur 1 Bit (low oder high), kein Byte.
- Warum können nur 4, nicht 8 MCPs über Arduino am SPI betrieben werden? Bei der Adafruit MCP23X17 Lib steht bis zu 8.
Vielen Dank im Voraus.
MCP23S17.h
Habe mit dem noch nicht rumgespielt jedoch inm Beispiel wird das so gemacht
MCP inputchip(1, 10); // Instantiate an object called "inputchip" on an MCP23S17 device at address 1
// and slave-select on Arduino pin 10
MCP outputchip(2, 10); // Instantiate an object called "outputchip" on an MCP23S17 device at address
// and slave-select on Arduino pin 10
Schau mal die Beispiele dir an.
ZB.
/*
MCP23S17 Class Example
Version 0.2
Cort Buffington 2013
This example will use the methods in "bit mode", that is, writing/reading/setting
bit at a time. Also note that on the inputs, we use the internal pull-up
resistors and an SPST button to ground when the button is pushed. While this uses
simpler (less expensive) pushbuttons, it does invert the logic. This is a perfect
example of one of the more advanced features of the MCP23S17 where we can invert
the logic state of the input pins. So, when a button is closed, we read a logic
low state, but the chip will report it as a logic high.
In the example, we'll set up two chips, one as an input and one as an output. We
will read the input chip, then write the input pin states to the output chip. This
is a completely useless program in the real world, but it demonstrates the
abilities of this class well, and makes a simple example.
A few things are done less efficiently than possible to make the sketch easier to
follow. In the hardware setup I used to write this example, I set up 2 x 8 position
DIP switches on the input chip, and 16 LEDs on the output chip.
Be sure to see the companion example that demonstrates the same funcionality with
the methods being used in "word mode", which is significantly more efficient if you
need to read or write an entire word at one time.
*/
#include <SPI.h> // We use this library, so it must be called here.
#include <MCP23S17.h> // Here is the new class to make using the MCP23S17 easy.
MCP inputchip(1, 10); // Instantiate an object called "inputchip" on an MCP23S17 device at address 1
// and slave-select on Arduino pin 10
MCP outputchip(2, 10); // Instantiate an object called "outputchip" on an MCP23S17 device at address
// and slave-select on Arduino pin 10
void setup() {
inputchip.begin();
outputchip.begin();
for (int i = 1; i <= 16; i++) { // Since we are only workign with one bit at a time, use a loop to take action each pin (0-15)
inputchip.pinMode(i, HIGH); // Use bit-write mode to set all of the current pin on inputchip to be inputs
inputchip.pullupMode(i, HIGH); // Use bit-write mode to Turn on the internal pull-up resistor for the current pin
inputchip.inputInvert(i, HIGH); // Use bit-write mode to invert the input so that logic 0 is read as HIGH
outputchip.pinMode(i, LOW); // Use bit-write mode to Set all of the current pin on outputchip to be an output
}
}
void loop() {
for (int i = 1; i <=16; i++) { // Step through each of the 16 pins on the I/O chips
int value; // declare an integer to hold the value temporarily.
value = inputchip.digitalRead(i); // read the input chip in bit-mode, storing the result for bit "i" in "value"
outputchip.digitalWrite(i, value); // write the output chip in bit-mode, using our variable "value" as the argument for bit "i"
// outputchip.digitalWrite(i, inputchip.digitalRead(i)) // this one line replaces everything above except the for loop, and is more efficient
}
}

