This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
traincontrol [2021/10/13 21:47] dpisuperadmin [Software] |
traincontrol [2021/10/15 02:47] (current) dpisuperadmin [Hardware and Wiring] |
||
|---|---|---|---|
| Line 33: | Line 33: | ||
| Engine and track switch control use a dual H-bridge card and a quad open-drain driver card. The dual DC motor controller peripheral (DC2) and the dual H-bridge card (D7HB) can easily control the engine speed and direction. | Engine and track switch control use a dual H-bridge card and a quad open-drain driver card. The dual DC motor controller peripheral (DC2) and the dual H-bridge card (D7HB) can easily control the engine speed and direction. | ||
| - | The track switches are left and right hand three-wire switches from Atlas. | + | The track switches are left and right hand three-wire switches from Atlas. |
| One problem with our chosen hardware is that at power up the open-drain driver outputs are at ground. | One problem with our chosen hardware is that at power up the open-drain driver outputs are at ground. | ||
| Line 43: | Line 43: | ||
| A wireviz generated wiring diagram for the system is shown below. | A wireviz generated wiring diagram for the system is shown below. | ||
| {{ wiki: | {{ wiki: | ||
| + | /* Wiringviz source file for the above | ||
| + | connectors: | ||
| + | Switch-Left: | ||
| + | type: Soldered wires | ||
| + | pinlabels: [Coil-Left, Common, Coil-Straight] | ||
| + | show_name: false | ||
| + | notes: Track Switch Left | ||
| + | Switch-Right: | ||
| + | type: Soldered wires | ||
| + | pinlabels: [Coil-Right, | ||
| + | show_name: false | ||
| + | notes: Track Switch Right | ||
| + | DC-IN: | ||
| + | type: Barrel | ||
| + | subtype: female | ||
| + | pinlabels: [V+, GND] | ||
| + | show_name: false | ||
| + | notes: Power Adapter | ||
| + | SMR-5: | ||
| + | type: screw terminal | ||
| + | pinlabels: [V+, GND, V5.0, GND] | ||
| + | show_name: false | ||
| + | notes: SMR-5 regulator | ||
| + | DRV4: | ||
| + | type: screw terminal | ||
| + | pinlabels: [V+, GND, O1, O2, O3, O4] | ||
| + | show_name: false | ||
| + | notes: DRV4 Open-Drain Driver | ||
| + | D7HB: | ||
| + | type: screw terminal | ||
| + | pinlabels: [V+, GND, A1, A2, B1, B2] | ||
| + | show_name: false | ||
| + | notes: D7HB H-bridge | ||
| + | SBC: | ||
| + | type: Soldered wires | ||
| + | pinlabels: [V5.0, GND] | ||
| + | show_name: false | ||
| + | notes: Single Board Computer | ||
| + | Track: | ||
| + | type: screw terminal | ||
| + | pinlabels: [Rail-1, Rail-2] | ||
| + | show_name: false | ||
| + | notes: Track | ||
| + | |||
| + | cables: | ||
| + | W1: | ||
| + | colors: [RD,BK] | ||
| + | W2: | ||
| + | colors: [RD,BK] | ||
| + | W3: | ||
| + | colors: [RD,WH] | ||
| + | W4: | ||
| + | colors: [RD,WH] | ||
| + | W5: | ||
| + | colors: [GN,YE,RD] | ||
| + | W6: | ||
| + | colors: [GN,YE,RD] | ||
| + | W7: | ||
| + | colors: [RD,WH] | ||
| + | |||
| + | connections: | ||
| + | - | ||
| + | - DRV4: [4,1,3] | ||
| + | - W5: [1,2,3] | ||
| + | - Switch-Left: | ||
| + | - | ||
| + | - DRV4: [5,1,6] | ||
| + | - W6: [1,2,3] | ||
| + | - Switch-Right: | ||
| + | - | ||
| + | - DRV4: [1,2] | ||
| + | - W7: [1,2] | ||
| + | - D7HB: [5,2] | ||
| + | - | ||
| + | - DC-IN: [1-2] | ||
| + | - W1: [1-2] | ||
| + | - SMR-5: [1-2] | ||
| + | - | ||
| + | - D7HB: [1-2] | ||
| + | - W2: [1-2] | ||
| + | - SMR-5: [1-2] | ||
| + | - | ||
| + | - SMR-5: [3,4] | ||
| + | - W3: [1-2] | ||
| + | - SBC: [1-2] | ||
| + | - | ||
| + | - D7HB: [3,4] | ||
| + | - W4: [1,2] | ||
| + | - Track: [1,2] | ||
| + | */ | ||
| ==== Peripherals ==== | ==== Peripherals ==== | ||
| - | The four daughter | + | The four //cards// in the system are the D7HB dual H-bridge, the DRV4 quad open-drain driver, the SW4 quad slide switch, and the SLIDE4 quad slide pot. The Linux (and FPGA) // |
| We used the Demand Peripherals support page "Build your FPGA Image" | We used the Demand Peripherals support page "Build your FPGA Image" | ||
| Line 74: | Line 164: | ||
| < | < | ||
| Test one switch with the commands: \\ | Test one switch with the commands: \\ | ||
| - | < | + | < |
| Once the program starts we can read the state of the switches and the position of the slide pots using dpget commands. | Once the program starts we can read the state of the switches and the position of the slide pots using dpget commands. | ||
| Line 134: | Line 224: | ||
| # be set unless the speed is set to zero. | # be set unless the speed is set to zero. | ||
| + | def send_cmd(socket , str ) : | ||
| + | "Send Command to FPGA deamon" | ||
| + | socket.send(str) | ||
| + | response = '' | ||
| + | while True : | ||
| + | c = sock_cmd.recv(1).decode() | ||
| + | if c ==' | ||
| + | break | ||
| + | response += c | ||
| + | if ((len(response) > 0) and (response[0] == ' | ||
| + | # Error if first character of response is an E | ||
| + | print(" | ||
| + | print(" | ||
| + | # | ||
| + | # | ||
| + | return response | ||
| try: | try: | ||
| sock_cmd = socket.socket(socket.AF_INET, | sock_cmd = socket.socket(socket.AF_INET, | ||
| sock_cmd.connect((' | sock_cmd.connect((' | ||
| + | | ||
| # Init H-bridge PWM frequency to 50 Hz and mode to brake. | # Init H-bridge PWM frequency to 50 Hz and mode to brake. | ||
| # Set the H-bridge watchdog timer to 300 ms. | # Set the H-bridge watchdog timer to 300 ms. | ||
| - | | + | |
| - | sock_cmd.send(b' | + | |
| - | sock_cmd.send(b' | + | |
| - | | + | |
| - | time.sleep(0.05) | + | |
| - | results = sock_cmd.recv(1024) | + | |
| # init track swith states to unknown | # init track swith states to unknown | ||
| switch_left = " | switch_left = " | ||
| Line 154: | Line 258: | ||
| while True: | while True: | ||
| # Get speed and switch settings | # Get speed and switch settings | ||
| - | sock_cmd.send(b' | + | |
| - | time.sleep(0.05) | + | position1 = int(positions[: |
| - | positions = sock_cmd.recv(1024) | + | |
| - | # | + | |
| - | position1 = int(positions.decode()[:4]) | + | |
| speed = int(100 * (1024 - position1) / 1024) | speed = int(100 * (1024 - position1) / 1024) | ||
| - | sock_cmd.send(b' | + | |
| - | time.sleep(0.05) | + | |
| - | switches = sock_cmd.recv(1024) | + | |
| - | # | + | |
| # Set track switches if controlling slide switches changed | # Set track switches if controlling slide switches changed | ||
| - | if (int(switches.decode()[0],16) & 8 == 8) and (switch_left != " | + | if (int(switches[0], |
| switch_left = " | switch_left = " | ||
| - | | + | |
| time.sleep(0.05) | time.sleep(0.05) | ||
| - | sock_cmd.send(b' | + | |
| - | time.sleep(0.05) | + | elif (int(switches[0], |
| - | results = sock_cmd.recv(1024) | + | |
| - | elif (int(switches.decode()[0],16) & 8 == 0) and (switch_left != " | + | |
| switch_left = " | switch_left = " | ||
| - | | + | |
| time.sleep(0.05) | time.sleep(0.05) | ||
| - | sock_cmd.send(b' | + | |
| - | time.sleep(0.05) | + | if (int(switches[0], |
| - | results = sock_cmd.recv(1024) | + | |
| - | if (int(switches.decode()[0],16) & 4 == 4) and (switch_right != " | + | |
| switch_right = " | switch_right = " | ||
| - | | + | |
| time.sleep(0.05) | time.sleep(0.05) | ||
| - | sock_cmd.send(b' | + | |
| - | time.sleep(0.05) | + | elif (int(switches[0], |
| - | results = sock_cmd.recv(1024) | + | |
| - | elif (int(switches.decode()[0],16) & 4 == 0) and (switch_right != " | + | |
| switch_right = " | switch_right = " | ||
| - | sock_cmd.send(b' | + | |
| - | time.sleep(0.05) | + | |
| - | sock_cmd.send(b' | + | |
| time.sleep(0.05) | time.sleep(0.05) | ||
| - | | + | |
| # | # | ||
| # Set engine direction if speed is zero | # Set engine direction if speed is zero | ||
| if speed == 0: | if speed == 0: | ||
| - | if int(switches.decode()[0],16) & 1 == 1 : | + | if int(switches[0], |
| - | | + | |
| else : | else : | ||
| - | | + | |
| # Always set engine speed to keep watchdog alive | # Always set engine speed to keep watchdog alive | ||
| - | | + | |
| time.sleep(0.05) | time.sleep(0.05) | ||
| - | results = sock_cmd.recv(1024) # collect backslash prompt chars | ||
| # | # | ||