Files
2026-06-17 14:00:51 +02:00

372 lines
15 KiB
Plaintext

<!DOCTYPE html>
<html lang="en">
<head>
<title>Hardware Support: LocoIO</title><!--#include virtual="/help/en/parts/Style.shtml" -->
</head>
<body>
<!--#include virtual="/help/en/parts/Header.shtml" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<h1>Hardware Support: LocoIO</h1>
<p>A LocoIO board is a DIY stationary interface to LocoNet for up to 16 input/output pins.
More on the available configuration options <a href="#portOptions">below</a>.<br>
The original <a href=
"http://www.locobuffer.com/LocoIO/LocoIO.htm">LocoIO</a> design by John Jabour was further
developed by <a href="https://locohdl.synology.me/">Hans Deloof</a>.</p>
<p>To access a list of all active LocoIO modules (and select one to program), turn on the layout and power up the
LocoIO hardware. No jumpers or buttons on the LocoIO need touching in order to proceed.<br>
Select <a href="../../../package/jmri/jmrix/loconet/lnsvf1/Sv1DiscoverPane.shtml">Manage LocoIO (LNSV1)
Modules</a> from the LocoNet menu to open the tool. Click [Probe All] if the list is empty.</p>
<h2>Programming a LocoIO family board</h2>
<span class="since">Since <a href="https://www.jmri.org/releasenotes/jmri4.21.2.shtml" target=
"_blank">JMRI 4.21.2</a></span>
<p>The <a href=
"../../../../../xml/decoders/Public_Domain_HDL_LocoIO.xml">Public_Domain_HDL_LocoIO</a>
Decoder Definition in the "Public Domain and DIY" category supports set-up of a wide range of
LocoIO devices up to LocoIO/LocoBooster/LocoRCD/LocoServo rev 1.54 hardware since 2020.</p>
<p>To program a LocoIO module, follow these steps:</p>
<ol>
<li>Turn on the layout and power up the LocoIO hardware. No jumpers or buttons on the
LocoIO need touching in order to proceed.</li>
<li>Open DecoderPro main roster view or the Roster menu option in PanelPro.</li>
<li>Click on the [Program] button in the last cell of a row in the LocoIO Tool.<br>
Create a new entry if the board shows up in the list but the button reads [No Entry in Roster] by
clicking the [Add New Loco] button at top left of the main Roster.</li>
<li>In the Decoder Installed box, navigate to "Public-domain and DIY" &gt; "Hans Deloof
LocoIO".</li>
<li>Looking at your hardware, select the correct PIC programmer firmware version from the
list. It is often labeled on the biggest IC chip. If your version is not in the list,
select the first higher one. In this example we pick "LocoIO v1.53":<br>
<a href="images/LocoIo/Create1_New.png"><img src=
"images/LocoIo/Create1_New.png" width="370" height="235" alt=
"Screenshot LocoIO Config step 1"></a>
</li>
<li>On the right of the Create New Loco pane, enter a name for this module, eg. "LocoIO
81/1 rev 1.53", and fix the ultra-long decoder DCC address suggested. We chose 81, the
factory default board address:<br>
<a href="images/LocoIo/Create2_Correct.png"><img src=
"images/LocoIo/Create2_Correct.png" width="370" height="235" alt=
"Screenshot LocoIO Config step 2"></a><br>
Click [Save] and close the Create New Loco pane.
</li>
<li>You will see the new entry appear in the Roster.<br>
Select it, make sure to select Programming on Main, and click [Program]:<br>
<a href="images/LocoIo/Create3_POM.png"><img src=
"images/LocoIo/Create3_POM.png" width="294" height="230" alt=
"Screenshot LocoIO Config step 3"></a>
</li>
<li>On the Basic tab, enter the actual LocoIO Main Address and Sub-address, "81" and "1"
respectively in our example:<br>
<a href="images/LocoIo/Create4_CheckAddress.png"><img src=
"images/LocoIo/Create4_CheckAddress.png" width="343" height="261" alt=
"Screenshot LocoIO Config step 4"></a>
</li>
<li>Next, go to the Roster Entry pane, click [Save to Roster] and close & reopen the LocoIO
definition from the Roster to update the actual decoder address:<br>
<a href="images/LocoIo/Create5_SaveClose.png"><img src=
"images/LocoIo/Create5_SaveClose.png" width="343" height="261" alt=
"Screenshot LocoIO Config step 5"></a>
</li>
<li>Returning to the Basic tab, click [Read full sheet]. If a LocoIO is found at the
address, its firmware version is displayed (the Monitor LocoNet window will show more
precise information regarding the firmware).</li>
<li><strong>Warning:</strong> If you wish to change the address of a LocoIO board, you
<strong>MUST first ensure that ONLY a single LocoIO-based board is connected to the
LocoNet</strong>, as the address is set via a broadcast message.<br>
If you Write CV2 and CV3 on the CVs tab or press [Write All] from the Basic tab,
<strong>ALL</strong> LocoIO's on your LocoNet will be reprogrammed with the same new
address.</li>
<li>
<br>
<a href="images/LocoIo/Create6_Locotab.png"><img src=
"images/LocoIo/Create6_Locotab.png" width="343" height="262" alt=
"Screenshot LocoIO Config step 6"></a>
</li>
<li>
<br>
<a href="images/LocoIo/Create7_LocotabRead.png"><img src=
"images/LocoIo/Create7_LocotabRead.png" width="343" height="262" alt=
"Screenshot LocoIO Config step 7"></a>
</li>
<li>
<br>
<a href="images/LocoIo/Create8a_InitialPortstab.png"><img src=
"images/LocoIo/Create8a_InitialPortstab.png" width="579" height="199" alt=
"Screenshot LocoIO Config step 8a"></a>
</li>
<li>
<br>
<a href="images/LocoIo/Create8b_After1stReadAll.png"><img src=
"images/LocoIo/Create8b_After1stReadAll.png" width="592" height="442" alt=
"Screenshot LocoIO Config step 8b"></a>
</li>
<li>After Read All, many ports will show a Mode selected. Due to the complexity of the
LocoIO memory DecoderPro can't figure out some choices, so you will have to assist at this
point for those ports that still show "Port not in Use". At least you will notice the
numbers already changed. For example on Port 4 the number in the Config field reads
"95":<br>
<a href="images/LocoIo/Create9a_Port4Combo.png"><img src=
"images/LocoIo/Create9a_Port4Combo.png" width="405" height="130" alt=
"Screenshot LocoIO Config step 9a"></a>
</li>
<li>Turn to the Cheat Sheet tab reference, in the Config column look up "95". It's a
Block Detector - Active High:<br>
<a href="images/LocoIo/Create9b_CheatSheet.png"><img src=
"images/LocoIo/Create9b_CheatSheet.png" width="274" height="195" alt=
"Screenshot LocoIO Config step 9b"></a>
</li>
<li>Return to the Ports tab and in the Port 4 Mode combo, pick "Block Detector - Active
High" (either odd or even address, will correct automatically later on):<br>
<a href="images/LocoIo/Create9c_Port4ComboOpen.png"><img src=
"images/LocoIo/Create9c_Port4ComboOpen.png" width="425" height="130" alt=
"Screenshot LocoIO Config step 9c"></a>
</li>
<li>After clicking [Read changes on sheet]:<br>
<a href="images/LocoIo/Create9d_Port4ModeSet.png"><img src=
"images/LocoIo/Create9d_Port4ModeSet.png" width="427" height="126" alt=
"Screenshot LocoIO Config step 9d"></a>
</li>
<li>After fixing all mode combo's that are not "0", once again click [Read full sheet] to
update all fields and inspect the LocoIO configuration. Scroll down to see more ports:<br>
<a href="images/LocoIo/Create10_Ready.png"><img src=
"images/LocoIo/Create10_Ready.png" width="564" height="442" alt=
"Screenshot LocoIO Config step 10"></a>
</li>
<li>Inputs allow setting up to two more actions carried out when the pin goes to ON. You
can set the action type and the address on the right hand side of the LocoIO programmer
pane as shown here. See the HDL documentation for examples and further information:<br>
<a href="images/LocoIo/Create11_Opcode.png"><img src=
"images/LocoIo/Create11_Opcode.png" width="275" height="116" alt=
"Screenshot LocoIO Opcode Config"></a>
</li>
<li>A LocoBooster module will show several special options:<br>
<a href="images/LocoIo/Create12_Lbooster.png"><img src=
"images/LocoIo/Create12_Lbooster.png" width="400" height="541" alt=
"Screenshot LocoBooster Config pane"></a>
</li>
</ol>
<h2 id="portOptions">LocoIO Port Configuration</h2>
<p>A typical LocoIO board contains 16 signal pins, also called channels or ports. Each port can be
individually programmed as input (fascia pushbuttons, turnout feedback or occupancy sensors) or
as output (fascia indicator LEDs, signal LED's, turnout motors etc.) and perform a number of
different things (depending on the module's hardware and firmware version):</p>
<p>Options for LocoIO Inputs:</p>
<ul>
<li>Block Detector - Active Low</li>
<li>Block Detector - Active High</li>
<li>Block Detector - Active Low - Delayed</li>
<li>Block Detector - Active High - Delayed</li>
<li>Push Button - Active Low</li>
<li>Push Button - Active Low - Indirect</li>
<li>Switch Point Feedback - Normal</li>
<li>Switch Point Feedback - Contact 2</li>
<li>Switch Point Feedback - Contact 1</li>
<li>Push Button - Active High - Indirect</li>
<li>Push Button - Active High</li>
<li>Toggle Switch</li>
<li>Toggle Switch - Indirect</li>
</ul>
<p>Options for LocoIO Outputs</p>
<ul>
<li>Fixed - 1 - Off</li>
<li>Fixed - 2 - Off</li>
<li>Fixed - 1 - On</li>
<li>Fixed - 2 - On</li>
<li>Pulse - 2 - Soft Reset</li>
<li>Pulse - 1 - Soft Reset</li>
<li>Pulse - 2 - Hard Reset</li>
<li>Pulse - 1 - Hard Reset</li>
<li>Fixed - 1 - Off - Blink</li>
<li>Fixed - 2 - Off - Blink</li>
<li>Fixed - 1 - On - Blink</li>
<li>Fixed - 2 - On - Blink</li>
<li>Fixed - 1 - Off - 4-Way</li>
<li>Fixed - 1 - Off - 4-Way - Blink</li>
<li>Fixed - 2 - Off - 4-Way</li>
<li>Fixed - 2 - Off - 4-Way - Blink</li>
<li>Fixed - 1 - On - 4-Way</li>
<li>Fixed - 1 - On - 4-Way - Blink</li>
<li>Fixed - 2 - On - 4-Way</li>
<li>Fixed - 2 - On - 4-Way - Blink</li>
<li>Block (Occupancy) Detector</li>
<li>Block Detector - Blink</li>
<li>Servo (LocoServo ports 5-12 only)</li>
</ul>
<p>Since LocoIO rev 1.49</p>
<ul>
<li>Port Not In Use</li>
<li>On older boards, you are advised to configure unused ports as Output Fixed to prevent
accidental signals</li>
</ul>
<p>See the Cheat Sheet included in the DecoderPro LocoIO Programmer for further details.</p>
<p>The ports are configured via LocoNet LNSV1 messages, but the DecoderPro Programming interface
takes care of many technical details. Documentation is included below and in the decoder
definition file.</p>
<h3>Third Party info</h3>
<ul>
<li><span class="since">Since <a href="https://www.jmri.org/releasenotes/jmri5.11.3.shtml"
target="_blank">JMRI 5.11.3</a></span>There is an Arduino Nano based DIY LocoIO, see <a href=
"https://github.com/ClubNCaldes/SVLocoIO/blob/master/SVLocoIO/SVLocoIO.ino">GCA50a</a>. Based on this design, a
dual RFID reader <a href="https://github.com/silverailscolo/Arduino-GCA51">GCA51</a> is also supported in JMRI.
</li>
<li>For more information on the HDL LocoIO and how to use the boards, see <a href=
"https://locohdl.synology.me/">LocoHDL</a>.
</li>
<li>A copy of the original LocoIO DIY project description is available courtesy of <a href=
"https://www.rr-cirkits.com/locobuffer/LocoIO/">www.rr-cirkits.com</a></li>
</ul>
<h2 id="older">LocoIO History</h2>
<p>The initial LocoIO provided the following pin options:</p>
<div class="list">
<dl>
<dt class="left"><dfn>"Toggle switch controls turnout"</dfn>
</dt>
<dd class="first">
<p>Generate a OPC_SW_REQ to close/throw a turnout when a toggle switch changes state.
When the input goes high, a "close" command is sent; when the input goes low, a "throw"
command is sent. The channel configuration value is 0x0F.</p>
</dd>
<dt class="left"><dfn>"Input low flips turnout"</dfn>
</dt>
<dd>
<p>Generate a OPC_SW_REQ LocoNet message when the input goes low. This is intended for
use with a momentary pushbutton. The command sent will alternate the position of the
addressed turnout or signal; if "close" was last sent, a "throw" will be sent now and
vice-versa. The channel configuration value is 0x2F.</p>
</dd>
<dt class="left"><dfn>"Input high flips turnout"</dfn>
</dt>
<dd>
<p>Generate a OPC_SW_REQ LocoNet message when the input goes high. This is intended for
use with a momentary pushbutton. The command sent will alternate the position of the
addressed turnout or signal; if "close" was last sent, a "throw" will be sent now and
vice-versa. The channel configuration value is 0x6F.</p>
</dd>
<dt class="left"><dfn>"Status message sets output"</dfn>
</dt>
<dd>
<p>Drive an output from OPC_INPUT_REP input status messages on the LocoNet. The output
goes high when an "input high" message is received, and goes low when an "input low"
message is received. These messages are also used for block occupancy status; the
output will go high when the block is occupied, and low when its empty. The channel
configuration value is 0XC0.</p>
</dd>
<dt class="left"><dfn>"Turnout close cmd sets output"</dfn>
</dt>
<dd>
<p>Drive an output on the LocoIO board from received OPC_SW_REQ commands. The channel
configuration value is 0x80. This adjusts the address field to look for a command that
sets the turnout "closed".</p>
</dd>
<dt class="left"><dfn>"Turnout throw cmd sets output"</dfn>
</dt>
<dd>
<p>Drive an output on the LocoIO board from received OPC_SW_REQ commands. The channel
configuration value is 0x80. This adjusts the address field to look for a command that
sets the turnout "thrown".</p>
</dd>
</dl>
</div>
<!--#include virtual="/help/en/parts/Footer.shtml" -->
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
<script src="/js/help.js"></script>
</body>
</html>