Skip to content

rowanG077/pytic

 
 

Repository files navigation

PyTic v0.0.4

pololu tic


Introduction

PyTic is an object-oriented Python wrapper for the Pololu Tic stepper driver series. The wrapper interacts with the stepper driver device using the API described in the Pololu-Tic-Software GitHub page using the ctypes library. The device comunication protocol is USB.


Installation

Prerequisites

PyTic requires the Tic Software and Drivers for Windows msi provided by Pololu to be installed as a prerequisite. Other operating system drivers can be found on the Pololu Tic Resources, but are not currently supported by this Python package.

Pip Install

To install the PyTic package on a Windows machine equipped with Python 2.7 or higher, run the following pip command:

C:\> pip install pytic
  • Note: Only Windows x64 machines are supported at this time.

Package Architecture

PyTic encompasses almost all functionality present in the original C-API with some additional features. The Pololu Tic Stepper Driver is represented in Python using the pytic.PyTic() object.

----------------------------------
|     Package Relation Tree      |
----------------------------------

PyTic                 [Tic Object]
  |-- Settings        [Structure Interface Object]
      |- Pin Settings [Structure Interface Object] [List]
  |-- Variables       [Structure Interface Object]
      |- Pin Info     [Structure Interface Object] [List]
  |-- Logger          [Notification]

Constants             [Module]
  |-- Typed Enums     [IntEnum / IntFlag]
  |-- Scalar Values   [Final[int]]

PyTic Constants (Generated Typed Enums)

The Pololu Tic C-API uses many TIC_* constants for modes, pins, commands, variables, and settings. PyTic now generates typed IntEnum and IntFlag classes in pytic.constants directly from the upstream tic_protocol.h header. New code should use those typed enums such as ControlMode, StepMode, PinNumber, and PinFunction. There is no raw tic_constant compatibility dictionary in this major-version API. Use the generated enums and scalar constants directly.

Error Handling

All Pololu Tic C-API functions when dynamically imported into PyTic are wrapped in a higher-order function error handler called TED(), short for [T]ic [E]rror [D]ecoder. TED() will make all Tic wrapped functions return 0 from a successful call and 1 from a call that generated an error. In addition, TED() performs low-level bit mask decoding and writes the enumerated error value to the PyTic object internal log. This log can be output the ther terminal or file using the standard logging library.


Example Code

Outlined in this section are several examples of how to use PyTic to control a Pololu Tic Stepper Driver. The objective of this section is to show the PyTic syntax used to implement the Pololu Tic Stepper Driver C-API as opposed to detail each of the available functions. For a full list of commands, settings, and variable information please refer to either the Pololu Tic Manual, the Pololu Tic C-API, or this package's source code.

Simple Program

The simple program below demonstrates how to connect to a Pololu Tic Stepper Driver device over USB and move to several positions after the previous position has been reached.

import pytic
from time import sleep

# - Initialization -------------------------------------------

tic = pytic.PyTic()

# Connect to first available Tic Device serial number over USB
serial_nums = tic.list_connected_device_serial_numbers()
tic.connect_to_serial_number(serial_nums[0])

# Load configuration file and apply settings
tic.settings.load_config('path\\to\\config.yml')
tic.settings.apply()                             

# - Motion Command Sequence ----------------------------------

# Zero current motor position
tic.halt_and_set_position(0)

# Energize Motor
tic.energize()
tic.exit_safe_start()

# Move to listed positions
positions = [1000, 2000, 3000, 0]
for p in positions:
  tic.set_target_position(p)
  while tic.variables.current_position != tic.variables.target_position:
    sleep(0.1)

# De-energize motor and get error status
tic.enter_safe_start()
tic.deenergize()
print(tic.variables.error_status)
  • Note: Modified settings will not take effect until PyTic.settings.apply() method is called. This is to avoid unnecessary writes to non-volitile memory.

Using Settings

The PyTic.settings structure interface object is used to alter device settings stored in non-volitile memory. As detailed above in PyTic Constants, the generated typed enums from pytic.constants are the API for enum-backed settings. To avoid unnecissary writes to non-volitile memory, the PyTic.settings.apply() function must be called for the new settings to take effect.

from pytic import ControlMode, PinFunction, PinNumber, Product, StepMode

# ... assume PyTic object initialized and connected to device as 'tic'

# Modify individual properties of composite settings object
tic.settings.product = Product.T825
tic.settings.control_mode = ControlMode.SERIAL
tic.settings.step_mode = StepMode.MICROSTEP16

# Turn the Serial RX Pin into a generic digital user input
pin = PinNumber.RX
tic.settings.pin_settings[pin].func = PinFunction.USER_INPUT
tic.settings.pin_settings[pin].pullup = True

# Required to burn new settings to Tic non-volitile memory
tic.settings.apply()

Logging

PyTic uses the logging package to display Tic status messages. The default logging level is logging.DEBUG. For less verbose logging, set PyTic.log_level = logging.CRITICAL. The log name is PyTic for users that would like to have a parent-object handle the logging information.


Example YAML Configuration File

PyTic settings can be set invidually using the PyTic.settings structure interface in the script or all-at-once using a YAML config file and the PyTic.settings.load_config('\\path\\to\\config.yml') function. Enum-backed YAML fields use enum member names, not legacy TIC_* macro names. Here is an example YAML config file with some usage notes,

tic_settings:                             # required header for load_config fcn.
  product: T825
  auto_clear_driver_error: True           # ** These 4 settings         **
  ignore_err_line_high: True              # ** were experimentally      **
  serial_crc_for_commands: False          # ** determined to stabalize  **
  serial_crc_for_responses: False         # ** device performance       **
  command_timeout: 0                      # ** device performance       **
  max_speed: 180000000                    # pulses/s * 10^-4
  starting_speed: 0                       # pulses/s * 10^-4
  max_accel: 9000000                      # pulses/s^2 * 10^-2
  max_decel: 9000000                      # pulses/s^2 * 10^-2
  step_mode: MICROSTEP16
  current_limit: 640                    # mA, Only select values acceptable, See notes.
  decay_mode: T825_FAST
  pin_settings:                         # Ex. Modifying Default Pin Fcn.
    - pin_num: RX
      func: USER_INPUT
      pullup: True
      analog: False
    # - pin_num: TX                     # ... modifying a 2nd pin ...
    #   func: USER_INPUT
    #   polarity: True
    #   analog: False

Notes:

  • In Python code, use the typed enums in pytic.constants or the package root exports.
  • In YAML config files, enum-backed fields take enum member names such as SERIAL, MICROSTEP16, RX, or USER_INPUT.
  • current_limit only accepts select values detailed in the Pololu Tic Manual

Dependencies

Dependencies include the following,

  • PyYAML

Level of Support Notice

This code is currently not supported. It is being released to the community AS IS without any guarantee of support. The community is welcome to submit issues, but should not expect an active response.


External Resources

External resources include the following,

About

PyTic - An Object-Oriented Python Wrapper for Pololu Tic Stepper Drivers

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Python 95.2%
  • Nix 4.8%