def runControl(self, param): s1 = stepper(port=stepperPort, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=8) if param == "stop": s1.start_relative_move(0) s1.hard_stop() s1.free() return micro_steps = self.ids.microstep_slider.value speed = self.ids.speed_slider.value / 10 acceleration = self.ids.acell_slider.value * 10 deceleration = self.ids.decell_slider.value * 10 if self.ids.dir_button.source == 'cw.png': direction = 1 else: direction = -1 s1.set_accel(acceleration) s1.set_deaccel(deceleration) s1.set_micro_steps(int(micro_steps)) s1.set_speed(speed) if self.ids.length_mode_button.text == "Rotations": s1.start_relative_move(int(direction * self.ids.length_slider.value)) else: s1.move_steps(int(direction * self.ids.length_slider.value))
def back(self): global checkingSliders s1 = stepper(port=stepperPort, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=8) SCREEN_MANAGER.transition.direction = 'right' SCREEN_MANAGER.current = "motors" checkingSliders = False s1.free()
def slider2(self): global s0 s0 = stepper(port=0, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=self.speedSlider.value) s0.start_relative_move(20)
def initialize(self): global s0 cyprus.initialize() cyprus.setup_servo(1) cyprus.setup_servo(2) cyprus.set_pwm_values(1, period_value=100000, compare_value=0, compare_mode=cyprus.LESS_THAN_OR_EQUAL) cyprus.set_servo_position(2, 0.25) s0 = stepper(port=0, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=8) s0.set_as_home()
def fancy_button(self): global s0 txt_var1 = s0.get_position_in_units() s0 = stepper(port=0, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=5) s0.relative_move(15) self.fancyPosition.text = "current position: %d " % s0.get_position_in_units( ) time.sleep( 5 ) # some speed values are increased and sleeps time decreased temporarily so code will run faster self.ids.speed = 6 s0.relative_move(10) self.fancyPosition.text = "current position: %d " % s0.get_position_in_units( )
def build(self): self.title = "Robotic Arm" return sm Builder.load_file('main.kv') Window.clearcolor = (.1, .1, .1, 1) # (WHITE) cyprus.open_spi() # //////////////////////////////////////////////////////////////// # // SLUSH/HARDWARE SETUP // # //////////////////////////////////////////////////////////////// sm = ScreenManager() arm = stepper(port=0, speed=10) # //////////////////////////////////////////////////////////////// # // MAIN FUNCTIONS // # // SHOULD INTERACT DIRECTLY WITH HARDWARE // # //////////////////////////////////////////////////////////////// class MainScreen(Screen): version = cyprus.read_firmware_version() armPosition = 0 lastClick = time.clock() def __init__(self, **kwargs): super(MainScreen, self).__init__(**kwargs) self.initialize()
Class to handle running the GUI Application """ def build(self): """ Build the application :return: Kivy Screen Manager instance """ return SCREEN_MANAGER Window.clearcolor = (1, 1, 1, 1) # White s0 = stepper(port=0, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=8) class MainScreen(Screen): """ Class to handle the main screen and its associated touch events """ def start_speed_thread(self): Thread(target=self.speed_update).start() global need_to_leave need_to_leave = False global motor_running
# // IMPORT STATEMENTS // # //////////////////////////////////////////////////////////////// import spidev import os from time import sleep import RPi.GPIO as GPIO from pidev.stepper import stepper from Slush.Devices import L6470Registers spi = spidev.SpiDev() # Init a 200 steps per revolution stepper on Port 0 s0 = stepper(port=0, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=8) # get current position and print it to the screen s0.get_position_in_units() # this tells us that the startup position is currently setup as the "home" position # move stepper connected to port 0, 5 rotations clockwise s0.start_relative_move(5) # get current position and print it to the screen s0.get_position_in_units() # note the current position is 5 units - in this case 5 revolutions away from home
class MainScreen(Screen): version = cyprus.read_firmware_version() staircaseSpeedText = '0' rampSpeed = INIT_RAMP_SPEED staircaseSpeed = 40 gate = False staircase = False ramp = False s0 = stepper(port=0, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=8) s0.set_speed(3.75) staircase_speed = 100000 def __init__(self, **kwargs): super(MainScreen, self).__init__(**kwargs) self.initialize() def thread_flip(self): y = threading.Thread(target=self.auto, daemon=True) y.start() def toggleGate(self): self.gate = not self.gate if self.gate: cyprus.set_servo_position(2, .48) else: cyprus.set_servo_position(2, 0) print("Open and Close gate here") def toggleStaircase(self): self.staircase = not self.staircase if self.staircase: print(self.staircase) cyprus.set_pwm_values(1, period_value=100000, compare_value=self.staircase_speed, compare_mode=cyprus.LESS_THAN_OR_EQUAL) else: print(self.staircase) cyprus.set_pwm_values(1, period_value=100000, compare_value=0, compare_mode=cyprus.LESS_THAN_OR_EQUAL) print("Turn on and off staircase here") def toggleRamp(self): self.ramp = not self.ramp if self.ramp: self.s0.start_relative_move(29) else: self.s0.start_relative_move(-29) print("Move ramp up and down here") def auto(self): """"" while True: if cyprus.read_gpio() and 0B0010: pass else: self.s0.start_relative_move(29) if cyprus.read_gpio() and 0B001: pass else: """ "" self.toggleRamp() time.sleep(7.75) self.s0.set_speed(4) self.toggleRamp() time.sleep(1) self.toggleStaircase() time.sleep(5.25) self.toggleGate() time.sleep(1.75) self.toggleStaircase() time.sleep(.5) self.toggleGate() print("Run through one cycle of the perpetual motion machine") def setRampSpeed(self, speed): self.s0.set_speed(speed) self.ids.rampSpeedLabel.text = "Ramp Speed: " + "{:.1f}".format(speed) print("Set the ramp speed and update slider text") def setStaircaseSpeed(self, speed): self.staircase_speed = speed * 1000 self.ids.staircaseSpeedLabel.text = "StairCase Speed: " + str( speed) + "%" if self.staircase: cyprus.set_pwm_values(1, period_value=100000, compare_value=(speed * 1000), compare_mode=cyprus.LESS_THAN_OR_EQUAL) print("Set the staircase speed and update slider text") def initialize(self): cyprus.setup_servo(2) cyprus.setup_servo(1) print("Close gate, stop staircase and home ramp here") def resetColors(self): self.ids.gate.color = YELLOW self.ids.staircase.color = YELLOW self.ids.ramp.color = YELLOW self.ids.auto.color = BLUE def quit(self): print("Exit") MyApp().stop()
class MyApp(App): def build(self): self.title = "Perpetual Motion" return sm Builder.load_file('main.kv') Window.clearcolor = (.1, .1, .1, 1) # (WHITE) cyprus.open_spi() # //////////////////////////////////////////////////////////////// # // SLUSH/HARDWARE SETUP // # //////////////////////////////////////////////////////////////// sm = ScreenManager() ramp = stepper(port=0, speed=INIT_RAMP_SPEED) # //////////////////////////////////////////////////////////////// # // MAIN FUNCTIONS // # // SHOULD INTERACT DIRECTLY WITH HARDWARE // # //////////////////////////////////////////////////////////////// # //////////////////////////////////////////////////////////////// # // DEFINE MAINSCREEN CLASS THAT KIVY RECOGNIZES // # // // # // KIVY UI CAN INTERACT DIRECTLY W/ THE FUNCTIONS DEFINED // # // CORRESPONDS TO BUTTON/SLIDER/WIDGET "on_release" // # // // # // SHOULD REFERENCE MAIN FUNCTIONS WITHIN THESE FUNCTIONS // # // SHOULD NOT INTERACT DIRECTLY WITH THE HARDWARE //
return sm Builder.load_file('main.kv') Window.clearcolor = (.1, .1, .1, 1) # (WHITE) cyprus.open_spi() # //////////////////////////////////////////////////////////////// # // SLUSH/HARDWARE SETUP // # //////////////////////////////////////////////////////////////// sm = ScreenManager() ramp = stepper(port=0, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=25, speed=INIT_RAMP_SPEED) ramp.go_until_press(0, 20000) ramp.set_as_home() cyprus.initialize() cyprus.setup_servo(2) cyprus.set_servo_position(2, 0) cyprus.setup_servo(1) cyprus.set_pwm_values(1, period_value=100000, compare_value=0, compare_mode=cyprus.LESS_THAN_OR_EQUAL)
def _update_texture_filters(self, image, texture): texture.mag_filter = 'nearest' class ProjectNameGUI(App): def build(self): return SCREEN_MANAGER Window.clearcolor = (0, 0, 0, 1) current = 30 motor_1 = stepper(port=1, speed=100, hold_current=current, run_current=current, accel_current=current, deaccel_current=current) motor_2 = stepper(port=2, speed=100, hold_current=current, run_current=current, accel_current=current, deaccel_current=current) motor_3 = stepper(port=3, speed=100, hold_current=current, run_current=current, accel_current=current, deaccel_current=current) motor_4 = stepper(port=4, speed=100, hold_current=current, run_current=current, accel_current=current, deaccel_current=current) motor_5 = stepper(port=5, speed=100, hold_current=current, run_current=current, accel_current=current, deaccel_current=current) motor_6 = stepper(port=6, speed=100, hold_current=current, run_current=current, accel_current=current, deaccel_current=current)
class MainScreen(Screen): """ Class to handle the main screen and its associated touch events """ s0 = stepper(port=0, micro_steps=32, hold_current=20, run_current=20, accel_current=20, deaccel_current=20, steps_per_unit=200, speed=8) cyprus.initialize() cyprus.setup_servo(1) go = False direction_pin = 1 def thread_flip(self): y = threading.Thread(target=self.flip, daemon=True) y.start() def flip(self): if cyprus.read_gpio() & 0B0001: time.sleep(.05) if cyprus.read_gpio() & 0B0001: cyprus.set_servo_position(1, 1) self.ids.flip.text = "180 Degrees" else: cyprus.set_servo_position(1, 0) self.ids.flip.text = "0 Degrees" def pressed(self): self.go = not self.go if self.go: self.s0.run(self.direction_pin, int(self.ids.slider.value)) self.ids.motor.text = "Motor On" else: self.s0.softStop() self.ids.motor.text = "Motor Off" def direction(self): if self.go: if self.direction_pin == 1: self.direction_pin = 0 self.ids.direction.text = "Clockwise" self.s0.run(self.direction_pin, int(self.ids.slider.value)) else: self.direction_pin = 1 self.ids.direction.text = "Counter-Clockwise" self.s0.run(self.direction_pin, int(self.ids.slider.value)) def motor_thread(self): y = threading.Thread(target=self.motor, daemon=True) y.start() def motor(self): self.s0.set_as_home() print(self.s0.get_position_in_units()) self.ids.updates.text = str(self.s0.get_position_in_units()) self.s0.set_speed(1) self.s0.go_to_position(15) print(self.s0.get_position_in_units()) self.ids.updates.text = str(self.s0.get_position_in_units()) time.sleep(10) self.s0.set_speed(5) self.s0.relative_move(10) self.ids.updates.text = str(self.s0.get_position_in_units()) time.sleep(8) self.s0.relative_move(-25) self.ids.updates.text = str(self.s0.get_position_in_units()) time.sleep(30) self.s0.set_speed(8) self.s0.relative_move(-100) self.ids.updates.text = str(self.s0.get_position_in_units()) time.sleep(10) self.s0.relative_move(100) self.ids.updates.text = "Finished: " + str( self.s0.get_position_in_units()) def admin_action(self): """ Hidden admin button touch event. Transitions to passCodeScreen. This method is called from pidev/kivy/PassCodeScreen.kv :return: None """ SCREEN_MANAGER.current = 'passCode'
from pidev.MixPanel import MixPanel from pidev.kivy.PassCodeScreen import PassCodeScreen from pidev.kivy.PauseScreen import PauseScreen from pidev.kivy import DPEAButton from pidev.kivy import ImageButton from kivy.properties import ObjectProperty from kivy.uix.slider import Slider from kivy.animation import Animation from threading import Thread from time import sleep from pidev.Joystick import Joystick from pidev.stepper import stepper STEPPER = stepper() s = Slider(min=-100, max=100, value=25) MIXPANEL_TOKEN = "x" MIXPANEL = MixPanel("Project Name", MIXPANEL_TOKEN) SCREEN_MANAGER = ScreenManager() MAIN_SCREEN_NAME = 'main' ADMIN_SCREEN_NAME = 'admin' NEW_SCREEN = 'NewScreen' class ProjectNameGUI(App): """ Class to handle running the GUI Application