From 9c54528920a03fe046c50bc582067d8f2514d1c8 Mon Sep 17 00:00:00 2001 From: damic014 Date: Sun, 13 Oct 2019 22:14:47 -0500 Subject: Add System library and system test file. Still need to finalize some implementation details (linear encoder, motor orientation, etc.). Need to compile and test on RPi still. Convert naming in other libraries to follow Python naming scheme. --- System_Python/system.py | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 System_Python/system.py (limited to 'System_Python/system.py') diff --git a/System_Python/system.py b/System_Python/system.py new file mode 100644 index 0000000..064700c --- /dev/null +++ b/System_Python/system.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +from motor import Motor +from encoder import Encoder + +# IO pin definitions +### Motor pins +motor_speed_pin = 17 +motor_forward_pin = 27 +motor_reverse_pin = 22 +### Encoder pins (shared by both encoders) +encoder_clock_pin = 2 +encoder_data_pin = 3 +### Angular encoder pins +encoder_angular_cs_pin = 4 +### Linear encoder pins +encoder_linear_cs_pin = 5 + + +# System Class +# This is the primary interface a student will use to control the pendulum. +class System: + def __init__(self): + # Initialize the motor. + self.motor = Motor(motor_speed_pin, motor_forward_pin, motor_reverse_pin) + # Initialize the angular encoder. + self.encoder_angular = Encoder(encoder_clock_pin, encoder_angular_cs_pin, encoder_data_pin) + self.encoder_angular.set_zero() + # Initialize the linear encoder. + self.encoder_linear = Encoder(encoder_clock_pin, encoder_linear_cs_pin, encoder_data_pin) + self.encoder_linear.set_zero() + # END __init__() + + # Get the values of the encoders to determine the angular and linear position of the pendulum. + # Values are returned as a tuple: (angle, linear). + ### angle: 0 indicates the pendulum is exactly straight up. + ##### 180 or -180 indicate the pendulum is exactly straight down. + ##### Positive values indicate the pendulum is leaning to the right. + ##### Negative values indicate the pendulum is leaning to the left. + ### linear: 0 indicates the pendulum is exactly in the middle of the track. + ##### Positive values indicate the pendulum is right-of-center. + ##### Negative values indicate the pendulum is left-of-center. + def measure(self): + angular_position = self.encoder_angular.read_position('Degrees') + if angular_position > 180: + angular_position = angular_position - 360 + # TODO: Implement linear position + # Need to determine how to keep track of position based on gearing and rotations. + #linear_position = self.encoder_linear.read_position('Raw') + linear_position = 0 + return (angular_position, linear_position) + # END measure() + + # Adjust the pendulum's linear position using the motor. + ### speed: Acceptable values range from -100 to 100 (as a percentage), with 100/-100 being the maximum adjustment speed. + ##### Negative values will move the pendulum to the left. + ##### Positive values will move the pendulum to the right. + def adjust(self, speed): + # cap the speed inputs + if speed > 100.0: + speed = 100.0 + if speed < -100.0: + speed = -100.0 + # change the motor speed + # TODO: Make sure the motor is oriented so that positive speed the correct direction (same for negative). Change the values otherwise. + self.motor.move(speed) + # END adjust() +# END System + \ No newline at end of file -- cgit v1.2.3