-
Notifications
You must be signed in to change notification settings - Fork 42
/
Copy pathgripper.py
65 lines (55 loc) · 1.54 KB
/
gripper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import RPi.GPIO as GPIO
from time import sleep
import chess
electromagnet_pin = 40
servo_pin = 38
PIECE_HEIGHTS = {
chess.KING: 41,
chess.QUEEN: 34,
chess.ROOK: 20,
chess.BISHOP: 28,
chess.KNIGHT: 24,
chess.PAWN: 19
}
MAX_PIECE_HEIGHT = max(PIECE_HEIGHTS.values())
RESTING_HEIGHT = MAX_PIECE_HEIGHT + 15
class Gripper(object):
def __init__(self):
self.previous_z = None
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servo_pin, GPIO.OUT)
GPIO.setup(electromagnet_pin, GPIO.OUT)
def calibrate(self):
self.move(RESTING_HEIGHT)
def move(self, z):
z = max(0.0, min(z, 100.0))
dc = (z * 0.067) + 4.0
p = GPIO.PWM(servo_pin, 50.0)
p.start(dc)
if self.previous_z is None:
t = 10.0
else:
t = (abs(self.previous_z - z) / 10.0) + 0.5
sleep(t)
p.stop()
del p
self.previous_z = z
def electromagnet(self, on):
output = GPIO.HIGH if on else GPIO.LOW
GPIO.output(electromagnet_pin, output)
def pickup(self, piece_type):
piece_height = PIECE_HEIGHTS[piece_type]
self.move(piece_height)
sleep(0.4)
self.electromagnet(True)
sleep(0.2)
self.move(RESTING_HEIGHT + piece_height)
def dropoff(self, piece_type):
piece_height = PIECE_HEIGHTS[piece_type]
self.move(piece_height)
sleep(0.2)
self.electromagnet(False)
sleep(0.4)
self.move(RESTING_HEIGHT)
def cleanup(self):
GPIO.cleanup()