An outline of the top level design is shown below. 

The laptop program 1) accepts any user inputs, 2) controls the inglenook hardware over a WiFi link, 3) solves the inglenook puzzle, 4) Displays graphically the status as each move is executed, 5) Saves the sequence of moved to solve the inglenook puzzle.

The Adafruit ESP323 Feather, is used to add a WiFi link between the laptop and the Arduino Base Station. Additionally, the Feather controls the alphanumeric displays, indicating the location for boxcars to solve the puzzle.

The Arduino Mega controller, Motor Shield and custom shield combine to form a model RR Base Station, accepting DCC++ commands from the laptop and generating DCC commands controlling elements of the layout (loco and turnouts). Additionally, using DCC++ commands the Base Station controls the uncouplers and the lighted bumper. The Base Station also monitors the status of IR sensors that indicate the location of the rolling stock and asynchronously notifying the laptop of any changes in their status. 

The model RR layout consist of three sidings, a head shunt, two turnouts, and a locomotive under the DCC control. As part of the layout there are three train uncouplers, a lighted bumper and several IR sensors all controlled/monitored by the Base Station to report the location of the train couplings between peaces of rolling stock and the train location on the head shunt.

Graphic of top-level design

  • Laptop
    • Laptop graphics
    • Control Commands to the Base Station
    • Process status changes reported by the Base Station
    • User command input
    • Puzzle solving
    • Record moves solving the puzzle
    • WiFi to Base Station through the Feather

  • Feather
    • WiFi connection to the Laptop
    • Serial connection to Base Station
    • Control the alphanumeric Displays

  • Base Station
    • Receive commands from the laptop (through the Feather)
    • Send status changes to the laptop
    • Control the locomotive using DCC commands
    • Control the turnouts using DCC commands
    • Configure Arduino I/O pins to monitor status of the sensors
    • Configure Arduino I/O pins as outputs to control the uncouplers
    • Generate the required DCC control signals