go-dcc
NRMA Digital Command Control (DCC) implementation in Go.
This module implements the DCC protocol for controlling model trains.
It includes a Raspberry Pi driver and a dccpi
command line application for easy use on this platform, although it is
easily extensible to other systems.
The implementation is based on the:
Index
Features
You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.
Joe Armstrong
go-dcc
is aims to to provide a minimal feature set to control DCC-based locomotives. Although the original aim is to support Raspberry Pi as a Command Station, it can easily incorporate drivers for other platforms and be integrated in projects with larger scope. It is not a support-all, complex, multi-protocol, ui-included, buy-my-hardware solution. For this, there are better solutions like RocRail, JMRI, SPROG, GertBot etc.
go-dcc
is inspired in dccpi
(https://github.com/hsanjuan/dccpi), a Python library of similar characteristics. Go has the advantage that it requires no C dependencies, it is faster and less prone to errors. Some of the features supported are:
- Easy to build and install (using
go get
or simply downloading the binaries) - Easy to adapt to new platforms
- Well tested and documented
- Supports Raspberry Pi Model B+ and newer
- Control DCC locomotives using a simple command line interface or Go
- Set speed (28 speed steps) and direction
- Set FL (lights), F1-F4 functions
Note go-dcc
does not yet implement any advanced features like decoder registry operations (i.e. set address).
Hardware requirements
- A Raspberry Pi (developed/tested on model B+ v1.2). It should work with newer, more powerful models.
- DCC-decoder-equipped locomotives
- Train tracks
- Booster circuit: needed to provide the signal to the tracks. See below.
- A power adapter with ~12-24V DC output. I use an AC-DC adapter with an output of 18V, 2A.
go-dcc
should work on any common scale. DCC decoders take a wide range of voltage outputs (up to 24v). This has been tested on N-scale with a 18v booster circuit.
Booster circuit
Here is an example booster using LMD18200 H-Bridge from TI:
These are the parts:
Here is an image of a dccpi
printed PCB plugged to a Raspberry Pi:
Software requirements
- Go:
https://golang.org/dl/
Installation
dccpi
To build/install:
> git clone https:
> cd go-dcc/dccpi
> go install
and the dccpi
application will be installed in your $GOPATH/bin
folder.
Running
Raspberry Pi driver
The Raspberry Pi driver is a submodule located at drivers/dccpi/dccpi.go
.
By default, The Raspberry Pi will output the signal (which goes from 0v-Low to 3.3v-High) on BCM GPIO pin 17, which is Physical Pin 11 (Model B+). The booster is in charge of converting this signal into the DCC signal ranges (i.e. 18v to -18v).
The Raspberry Pi will also output a brake signal (HIGH) when the controller is stopped on BCM GPIO pin 27, which is Pysical Pin 13 (Model B+). This can be used to stop the signal on the tracks if your booster supports it (see booster schematics). Otherwise locos will receive DC current directly and probably turn into analog DC mode and start going at full speed.
The pins mentioned above are configurable.
dccpi
usage
The dccpi
application allows to control locomotives and other DCC devices. Execute it and you will be taken to the dccpi
console.
This is a summary of the available commands:
dccpi> help
Available commands (use "help <command>" for information):
direction - Control locomotive direction
fl - Control the headlight of a locomotive
exit - Exit from dccpi
help - Show this help
power - Control track power
speed - Control locomotive speed
status - Show information about devices
register - Add DCC device
unregister - Remove DCC device
save - Save current devices in configuration file
The dccpi
application tries to read a JSON configuration file which specifies the configuration of the DCC decoders in the system. The configuration file default path is ~/.dccpi
and looks like:
{
"locomotives": [
{
"name": "loco1",
"address": 6,
},
{
"name": "loco2",
"address": 7,
"fl": true
},
{
"name": "DCCThing",
"address": 8,
"f1": true,
"f2": true,
"f3": true,
"f4": false,
}
]
}
This will allow to send packets to the three defined DCC devices directly without the need to register
them when running the application.
Go Library Documentation
The Go documentation is maintained with GoDoc. See: https://godoc.org/github.com/hsanjuan/go-dcc .
Additional drivers
Additional drivers for go-dcc
must implement the dcc.Driver
interface.
Questions and contributions
PRs accepted. Please open an issue if you have any questions.
License
MIT. Copyright 2017 Hector Sanjuan. See LICENSE
.