-
Notifications
You must be signed in to change notification settings - Fork 0
/
ServoController.ino
148 lines (121 loc) · 2.88 KB
/
ServoController.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <Servo.h> //舵机控制库
//2路舵机
Servo servoX; //云台X轴舵机 左右
Servo servoY; //云台Y轴舵机 上下
int getServoX()
{
return servoX.read();
}
int getServoY()
{
return servoY.read();
}
//-1 means to ignore
void servo_wait_and_print(int xTarget, int yTarget)
{
int x = 0, y = 0;
while (1)
{
x = servoX.read();
y = servoY.read();
if ((x == xTarget || xTarget == -1) && (y == yTarget || yTarget == -1))
break;
delay(10);
}
// Serial.print("ServoX="); Serial.print(x);
// Serial.print(" ServoY="); Serial.print(y);
// Serial.println();
delay(20);
}
//舵机左转
void servo_left(int step)
{
int servotempX = servoX.read(); //获取舵机目前的角度值
servotempX += step;
if (servotempX <= 170 && servotempX >= 10) //我定义的舵机旋转角度为10度到170度
{
servoX.write(servotempX);
delay(10);
// int servoCheck=servoX.read();
// Serial.print("ServoY real value ="); Serial.print(servoCheck); Serial.println();
}
else
return;
servo_wait_and_print(servotempX, -1);
}
//舵机右转
void servo_right(int step)
{
int servotempX = servoX.read(); //获取舵机目前的角度值
servotempX -= step;
if (servotempX <= 170 && servotempX >= 10) //我定义的舵机旋转角度为10度到170度
servoX.write(servotempX);
else
return;
servo_wait_and_print(servotempX, -1);
}
//舵机上转
void servo_up(int step)
{
int servotempY = servoY.read(); //获取舵机目前的角度值
servotempY -= step;
if (servotempY <= 90 && servotempY >= 10) //我定义的舵机旋转角度为10度到170度
servoY.write(servotempY);
else
return;
servo_wait_and_print(-1, servotempY);
}
//舵机下转
void servo_down(int step)
{
int servotempY = servoY.read(); //获取舵机目前的角度值
servotempY += step; //舵机运动1度
if (servotempY <= 90 && servotempY >= 10) //我定义的舵机旋转角度为10度到170度
servoY.write(servotempY);
else
return;
servo_wait_and_print(-1, servotempY);
}
void servo_output_angle(int x, int y)
{
// Serial.println(x, y);
if (x == 0 || y == 0)
return;
if (x < 10)
x = 10;
if (x > 170)
x = 170;
if (y < 30)
y = 30;
if (y > 130)
y = 130;
servoX.write(x);
servoY.write(y);
servo_wait_and_print(x, y);
}
//reset
void servo_reset()
{
servoX.write(80);
servoY.write(90);
servo_wait_and_print(80, 90);
}
//reset for scanning
void servo_scan_reset(int x, int y)
{
//分两步进行,减慢冲击
servoX.write(x);
int yy=getServoY();
servo_wait_and_print(x, yy);
delay(100);
servoY.write(y);
servo_wait_and_print(x, y);
}
void servo_init()
{
servoX.attach(10);//水平舵机接10脚
servoY.attach(11);//上下舵机接11脚
servoX.write(90);//输出舵机初始位置为90度
servoY.write(90);//输出舵机初始位置为90度
servo_reset();
}