-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontrol.h
97 lines (79 loc) · 1.56 KB
/
control.h
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
/*
* kP -- const. proporcional
* kI -- const. Integral
* kD -- const. derivada
* mediaS -- media dos sensores de referencial
*
*/
//Portas IRLinhas
#define IRL1 A0 //Direita
#define IRL2 A1 //Esquerda
//Portas ponte H
#define M1D 11
#define M1U 10
#define M2D 6
#define M2U 5
//Portas IR obstáculo
//#define IRO1
//#define IRO2
//#define IRO3
//Constantes
int mediaS = 100;
//void lerSensoresObstaculo()
//{
// int O1 = analogRead(IRO1);
// int O2 = analogRead(IRO2);
// int O3 = analogRead(IRO3);
//}
int lerSensorLinha()
{
int x1 = analogRead(IRL1);
int x2 = analogRead(IRL2);
return (x1 + x2)/2;
}
void PWM(int x1, int x2)
{
// MOTOR ESQUERDO
// motor esquerdo para frente
if (x1 > 0) {
analogWrite(M2U, x1);
analogWrite(M2D, 0);
}
// motor esquerdo "travado"
else if (x1 == 0) {
analogWrite(M2U, 0);
analogWrite(M2D, 0);
}
// Motor esquerdo para tras
else {
analogWrite(M2U, 0);
analogWrite(M2D, abs(x1));
}
// MOTOR DIREITO
if (x2 > 0) {
analogWrite(M1U, x2);
analogWrite(M1D, 0);
}
else if (x2 == 0) {
analogWrite(M1U, 0);
analogWrite(M1D, 0);
}
else {
analogWrite(M1U, 0);
analogWrite(M1D, abs(x2));
}
}
void PID(float kP, float kI, float kD, int PWM2, int mediaS)
{
float erro = (float)lerSensorLinha() - (float)mediaS;
float lastErro, PID2, P, I, D;
int motor1, motor2;
P = erro*kP;
I = I + (erro*kI);
D = kD*(erro - lastErro);
PID2 = P + I + D;
lastErro = erro;
motor1 = PWM2 + (int)PID2;
motor2 = PWM2 - (int)PID2;
PWM(motor1, motor2);
}