From 1e298b701fbc1c1048122efc5181fb37eeba2829 Mon Sep 17 00:00:00 2001 From: Raspberry Pi Date: Tue, 24 Sep 2019 16:57:14 -0500 Subject: Tested on RPi and minor changes to make it work. --- System_Python/motor.py | 67 +++++++++++++++++++++++++++++++++++++++++++++ System_Python/test_Motor.py | 26 +++++++++--------- 2 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 System_Python/motor.py diff --git a/System_Python/motor.py b/System_Python/motor.py new file mode 100644 index 0000000..0f7d891 --- /dev/null +++ b/System_Python/motor.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +# Import required modules +import RPi.GPIO as GPIO + +# Constants: parameters that the caller cannot modify +# Frequency: We have determined that the optimal frequency for our motor is 1kHz +pwm_frequency = 1000 + +# Motor Class +# This controls the motor at the given IO +class Motor: + def __init__(self, speed_pin, forward_pin, reverse_pin): + # Set the board IO (just in case it hasn't been done yet) + GPIO.setmode(GPIO.BCM) + # Set our variables for the directional pins + self.forward_pin = forward_pin + self.reverse_pin = reverse_pin + # setup the IO + GPIO.setup(speed_pin, GPIO.OUT) + GPIO.setup(self.forward_pin, GPIO.OUT) + GPIO.setup(self.reverse_pin, GPIO.OUT) + # Set speed pin as a PWM output + self.speed_pwm = GPIO.PWM(speed_pin, pwm_frequency) + # END __init__ + + # Move the motor at a given speed, given as a floating point percentage (-100 <= x <= 100) + # If speed is less than 0, motor will run in reverse, otherwise it will run forward + def Move(self, speed): + if speed < -100.0 or speed > 100.0: + return + # Stop any previous movements + self.speed_pwm.stop() + # Set the duty cycle for the speed of the motor + self.speed_pwm.ChangeDutyCycle(abs(speed)) + if speed < 0: + # Set direction to reverse + GPIO.output(self.forward_pin, GPIO.LOW) + GPIO.output(self.reverse_pin, GPIO.HIGH) + else: + # Set the direction to forward + GPIO.output(self.forward_pin, GPIO.HIGH) + GPIO.output(self.reverse_pin, GPIO.LOW) + # Start the PWM output to start moving the motor + self.speed_pwm.start(abs(speed)) + # END Move + + # Stop the motor from spinning. + # To brake the motor, both direction outputs are set to HIGH + def Brake(self): + # Stop any current PWM signals + self.speed_pwm.stop() + # Set the direction outputs to brake + GPIO.output(self.forward_pin, GPIO.HIGH) + GPIO.output(self.reverse_pin, GPIO.HIGH) + # END Brake + + # Set the motor to coast (i.e. Do not provide power to the motor, but still allow it to spin) + # To coast the motor, both direction outputs are set to LOW + def Coast(self): + # Stop any current PWM signals + self.speed_pwm.stop() + # Set the direction outputs to coast + GPIO.output(self.forward_pin, GPIO.LOW) + GPIO.output(self.reverse_pin, GPIO.LOW) + # END Coast + \ No newline at end of file diff --git a/System_Python/test_Motor.py b/System_Python/test_Motor.py index f14af59..600f209 100644 --- a/System_Python/test_Motor.py +++ b/System_Python/test_Motor.py @@ -2,22 +2,22 @@ from motor import Motor import time # Decide which pins to hook up to on the Pi before running -speed_pin = 15 -forward_pin = 16 -reverse_pin = 17 +speed_pin = 17 +forward_pin = 27 +reverse_pin = 22 m = Motor(speed_pin, forward_pin, reverse_pin) dir = 'ascending' speed = 0.0 while 1: - m.Move(speed) - if speed >= 100.0: - dir = 'descending' - elif speed <= -100.0: - dir = 'ascending' - if dir == 'ascending': - speed = speed + 0.5 - else: - speed = speed - 0.5 - time.sleep(0.1) \ No newline at end of file + m.Move(speed) + if speed >= 100.0: + dir = 'descending' + elif speed <= -100.0: + dir = 'ascending' + if dir == 'ascending': + speed = speed + 0.5 + else: + speed = speed - 0.5 + time.sleep(0.1) \ No newline at end of file -- cgit v1.2.3