Source code for pneumatics_exercise.valve_sequence

#!/usr/bin/env python
"""\
valve_sequence.py

Play back a sequence of pneumatic valve activations using a serial port
connection to an Arduino running ValveControl.

Copyright (c) 2015-2017, Garth Zeglin.  All rights reserved. Licensed under the
terms of the BSD 3-clause license.

"""
################################################################
# Import standard Python 2.7 modules.
from __future__ import print_function
import os, sys, time, argparse

# This module requires a pySerial installation.
#  Package details: https://pypi.python.org/pypi/pyserial,
#  Documentation: http://pythonhosted.org/pyserial/
import serial

################################################################
[docs]def set_flow( port, flow, extend=1, retract=2, pause=None, verbose=False): """Issue an open-loop set of flow commands for a valve pair attached to an actuator. Returns immediately or after an optional delay. No return value. :param port: serial port stream handle :param flow: net flow from -100 full retraction rate to 100 full extension rate :param extend: channel number for extension valve pair :param retract: channel number for retract valve pair :param pause: time in seconds to delay after issuing command :param verbose: flag to enable printed debugging output :return: None """ if flow > 0: ext_command = "speed %d %d" % (extend, flow) ret_command = "speed %d %d" % (retract, -100) elif flow == 0: ext_command = "speed %d %d" % (extend, 0) ret_command = "speed %d %d" % (retract, 0) else: ext_command = "speed %d %d" % (extend, -100) ret_command = "speed %d %d" % (retract, -flow) if verbose: print ("Issuing %s, %s" % (ext_command, ret_command)) port.write("%s\n%s\n" % (ext_command, ret_command)) if pause is not None: time.sleep(pause) # ignore any sensor feedback port.flushInput() return
################################################################ # The following section is run when this is loaded as a script. if __name__ == "__main__": # Initialize the command parser. parser = argparse.ArgumentParser( description = """Scripted sequence of pneumatic valve activations using the ValveControl controller on an Arduino.""") parser.add_argument( '-v', '--verbose', action='store_true', help='Enable more detailed output.' ) parser.add_argument( '--debug', action='store_true', help='Enable debugging output.' ) parser.add_argument( '-p', '--port', default='/dev/tty.usbmodem1411', help='Specify the name of the Arduino serial port device (default is /dev/tty.usbmodem1411).') # Parse the command line, returning a Namespace. args = parser.parse_args() # Open the serial port, which should also reset the Arduino print("Connecting to Arduino.") port = serial.Serial( args.port, 115200, timeout=5 ) if args.verbose: print("Opened serial port named", port.name) print("Sleeping briefly while Arduino boots...") time.sleep(2.0) # throw away any extraneous input print("Flushing Arduino input...") port.flushInput() # Begin the motion sequence. This may be safely interrupted by the user pressing Control-C. try: print("Beginning movement sequence.") set_flow(port, 50, pause=2.0, verbose=args.verbose) set_flow(port, 0, pause=2.0, verbose=args.verbose) set_flow(port, -50, pause=2.0, verbose=args.verbose) set_flow(port, 0, pause=2.0, verbose=args.verbose) set_flow(port, 100, pause=2.0, verbose=args.verbose) set_flow(port, 0, pause=2.0, verbose=args.verbose) set_flow(port, -100, pause=2.0, verbose=args.verbose) print("Movement complete.") except KeyboardInterrupt: print("User interrupted motion.") # Close the serial port connection. port.write("stop\n") port.close()