== work in progress ! ==
Because the Selectrix-Bus is not a 100% stable for large bus-lengths (~20m), I looked into alternatives which can easily be interfaced with the old SX-Bus.
What should not be given up, is
1) the simplicity of the overall system: 112 channel 8 bit each, thats it!
2) Arduino-based modules for driving turnouts and signals
In more detail I tried to get more understanding of both LocoNet and (MERG) CBUS. (the DCC system in general does not really match the requirements because it is not bidirectional, you cannot hook up TOTIs to DCC without having a second bus system like S88 or Lenz RS)
It turned out, that Arduino modules for the loconet are quite easy to develop, all the software is available in a very nice library „LocoNet“ ! (for details and projects see https://github.com/michael71/LocoNetProjects ) A major advantage of LocoNet is (for me) the existance of a very nice modular panel for LocoNet, manufactured by Uhlenbrock. This panel is easy to use and doesn‘t require any computer programming, just some graphical configuration. However,
1) it is a bit on the expensive side
2) and the LocoNet logic does not have much in common with Selectrix, it is „DCC centric“ (of course)
3) LocoNet is not really on open system – there is a lot of documentation available, but reading the licence terms (even the one of the open source project „Arduino LocoNet library“) discouraged me.
(? 4) LocoNet projects with Arduino require additional analog hardware. )
CBUS uses the CAN-BUS for transmitting its data, which is an excellent choice given the robustness of the CAN-BUS. There are the cheap interface chips available as well as interface boards and libraries for both the Aduino and the RaspberryPI. I’m a member of “MERG”, the (mainly) UK group who invented CBUS, therefor I had a look onto this system for some years now and have built some of the MERG modules. But I was always overwhelmed by the complexity of the system (including two modes of operation, SLIM and FLIM) – or maybe I just had not enough patience to really dive into this complexity – although I made my own Arduino “CBUS monitor”, see (oscale.net/cbus).
On the plus side there are really a lot of inexpensive CBUS modules available through MERG and excellent support is available in the MERG forum (+ tutorials and workshops (in UK)). But the configuration of my test system was quite some work – lots of events need to be created and some modules are not easy to configure. And, last but not least, for an “Arduino guy” the start into CBUS was hard, because all the MERG modules are based on PIC controllers …
In the meantime “amaurial” has made a nice Arduino lib, which makes building arduino based modules easier, but (just like the CBUS features) the library is pretty complex.
Therefore in the end I decided to build a simple “Selectrix type” system (i.e. address based, 8bit based) which can use both Selectrix hardware (i.e. the old modules on our club layout) and newer CAN-bus connected modules. It is meant for small to medium size layouts (with a limited number of addresses).
SimpleCAN principles of operation
Selectrix uses 112 channels with 8 bit information each => mapped to Simple-CAN addresses and data bytes (can be extended to 128…254 = pure CAN channels)
These 8 bits are always grouped together – which makes configuration easy. There is no need to generate 8 different events because you normally use such a channel for either 8 turnouts, a loco, or a few signals. (the “consumers”)
For each channel there are also “producers” like loco throttles or encoders connected to push button groups or a panel.
SimpleCAN OP-Codes and Message – DRAFT
|OPC_SX_LOCO||0x33||SX-Channel SX-Data||high||higher prio for loco control|
Setting/Reading module variables
|OPC_NV_REQ||0x41||module#||low||module# must be unique|
|OPC_NV_ACT||0x42||module# Var1 (opt. Var2 Var3 …. Var7)||low||feedback from module|
|OPC_NV_SET||0x43||module# Var1 (opt. Var2 Var3 …. Var7)||low||sent to module (=write)|
standard module variables (1 byte each, 0..255)
|1||CAN id||0..127||used for transmission (PC/canID = 0)|
|2||SX-channel of module||1..112|
|3||module type||1..254||module hardware identifier|
|4||mod. specific variable||0..255||for example software revision|
|5||mod. specific variable||0..255||for example toti delay time|
|6||mod. specific variable||0..255||…|
|7||mod. specific variable||0..255||…|
- Module# = 255 for new modules, i.e. “EEPROM not set”)
- as usual (with Selectrix), Power (0=off or 80=on) is sent in channel 127 (dec)
from the datasheet of the MCP 2551 (CAN Transceiver, used in most arduino can-bus projects
MAXIMUM NUMBER OF NODES The MCP2551 CAN outputs will drive a minimum load of 45 Ω, allowing a maximum of 112 nodes to be connected (given a minimum differential input resistance of 20 kΩ and a nominal termination resistor value of 120 Ω).
112 – identical to the number of Selectrix channels …. what a remarkable conincidence -:)
For the standard Arduino there are several CAN-Bus shields available – enough for making the first test setups. However, I wanted to have a test board similar to the Selectrix “Basis” boards (which utilize a compact Arduino Pro Mini) and found a nice CAN-Arduino at the hobbytronics shop in the UK. It is not much larger than the Arduino Pro Mini.
… more to come …