Skip to content

Instantly share code, notes, and snippets.

@RRMoelker
Created July 14, 2016 15:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RRMoelker/856839b07f34c5c5f71c7829622eb4c9 to your computer and use it in GitHub Desktop.
Save RRMoelker/856839b07f34c5c5f71c7829622eb4c9 to your computer and use it in GitHub Desktop.
Food dispenser WiPy food cycle with stuttering motion
# coding=utf-8
#
# Loop through food delivery cycle
#
import time
from machine import Pin
from servo import Servo
led = Pin('GP25', mode=Pin.OUT)
led(0) # turn off the heartbeat LED
SERVO_WAIT = 50
# Servo specific constants
PULSE_MIN = 900 # in µs, actually bit higher than specs indicate
PULSE_MAX = 2100 # in µs
FREQUENCY = 50 # Hz
ROTATIONAL_RANGE_100 = 12000 # 120deg * 100
servo_top = Servo(10, FREQUENCY, ROTATIONAL_RANGE_100, PULSE_MIN, PULSE_MAX)
servo_bottom = Servo(9, FREQUENCY, ROTATIONAL_RANGE_100, PULSE_MIN, PULSE_MAX)
top_servo_limits = {
'open': 0, # deg
'stutter': [75, 74, 73], # deg
'closed': 100, # deg
'direction': -1, # angle direction from closed to open
}
bottom_servo_limits = {
'open': 120, # deg
'stutter': [90, 100, 110],
'closed': 20, # deg
'direction': 1, # # angle direction from closed to open
}
def get_next_stutter(stutter_array):
if (len(stutter_array) > 0):
return stutter_array.pop()
else:
return None
def set_angle(servo, angle):
servo.angle(angle * 100)
time.sleep_ms(SERVO_WAIT)
def move_servo(servo, from_angle, to_angle, dir, stutter_array=[]):
"""
Open or close servo, possibly shutters a bit to prevent jamming
"""
stutter = get_next_stutter(stutter_array)
range1 = range(from_angle, to_angle, dir)
for angle in range1:
set_angle(servo, angle)
if angle == stutter:
stutter_angles = range(angle + -15 * dir, angle, dir)
for angle in stutter_angles:
set_angle(servo, angle)
stutter = get_next_stutter(stutter_array)
def cycle_servo(servo, limits):
"""
Open and close servo
"""
print('opening')
move_servo(servo, limits['closed'], limits['open'], limits['direction'])
print('closing')
move_servo(servo, limits['open'], limits['closed'], limits['direction'] * -1, limits['stutter'])
cycle_servo(servo_top, top_servo_limits)
cycle_servo(servo_bottom, bottom_servo_limits)
led(1) # turn on the heartbeat LED
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment