-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathribbon_cutter.ino
84 lines (72 loc) · 1.59 KB
/
ribbon_cutter.ino
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <Servo.h>
// pins
#define pot A0
#define button A1
#define servo A2
#define heat A3
#define led LED_BUILTIN
Servo arm;
// params
#define angle_down 170
#define angle_up 30
#define speed_max 2
#define rest_top 250
#define rest_bottom 1000
// calculated
#if angle_down < angle_up
#define angle_dir 1
const int servo_steps = angle_up - angle_down;
#else
const int servo_steps = angle_down - angle_up;
#define angle_dir -1
#endif
int pos = angle_down;
unsigned long step_time = 2048 / servo_steps;
void setup() {
pinMode(button, INPUT);
pinMode(pot, INPUT);
pinMode(led, OUTPUT);
pinMode(heat, OUTPUT);
digitalWrite(led, LOW);
digitalWrite(heat, LOW);
arm.attach(servo);
arm.write(angle_down);
delay(rest_bottom);
arm.detach();
}
void loop() {
// Wait for button release
while (true) {
if (digitalRead(button) == HIGH)
break;
else
delay(1);
}
// Wait for button press
while (true) {
if (digitalRead(button) == LOW)
break;
else
delay(1);
}
// Cycle start
digitalWrite(led, HIGH);
// Read pot to set speed
step_time = ((unsigned long) analogRead(pot) * (unsigned long)speed_max) / (unsigned long)servo_steps;
// Turn on heat, start servo
digitalWrite(heat, HIGH);
arm.attach(servo);
// Raise arm
for (pos = angle_down; pos != angle_up; pos += angle_dir) {
arm.write(pos);
delay(step_time);
}
// Turn off heat, wait a little
digitalWrite(heat, LOW);
delay(rest_top);
// Lower arm, wait a little, let servo rest
arm.write(angle_down);
delay(rest_bottom);
arm.detach();
digitalWrite(led, LOW);
}