Repository navigation
Expand file tree
/
Copy pathArduino Code.ino
More file actions
211 lines (183 loc) · 7.46 KB
/
Copy pathArduino Code.ino
File metadata and controls
211 lines (183 loc) · 7.46 KB
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/*******PINOUT DEFINES*********/
// it is not recommended to make changes
// nao e recomendado que se faca alteracoes
// no se recomienda hacer cambios
// LED
#define LED 6
// left motor
#define pwmL 9
#define leftMotor1 7
#define leftMotor2 8
// right motor
#define pwmR 3
#define rightMotor1 5
#define rightMotor2 4
// DIP switch
#define DIP1 10
#define DIP2 11
#define DIP3 12
#define DIP4 13
// Robocore's line sensor
#define lineL A0
#define lineR A1
// Jsumo's distance sensor
#define distL A2
#define distR A3
// Jsumo's micro-start
#define microST 2
/*******PINOUT DEFINES - END*********/
/*******FUNCTIONS*******/
void MotorL(int pwm); // left motor / motor esquerdo / motor izquierdo
void MotorR(int pwm); // right motor / motor direito / motor derecho
int readDIP(); // read DIP switch / ler chave DIP / leer el interruptor DIP
/*******FUNCTIONS - END*******/
int start; //Variáveis para indicar se o robô deve ser acionado ou permanecer parado
int frontR,frontL; //Variáveis para indicar o valor mais recente retornado pelo sensor frontal de direita e da esquerda
int infR,infL; //Variáveis para indicar o valor mais recente retornado pelo sensor inferior de direita e da esquerda
int infR_min=255; //Variáveis para definir o valor mínimo aceitável pelo sensor de linha de direita
int infL_min=255; //Variáveis para definir o valor mínimo aceitável pelo sensor de linha de direita
void setup() {
/****************PINOUT CONFIG****************/
// OUTPUTS
pinMode(LED, OUTPUT); // led
// right motor
pinMode(pwmR, OUTPUT); // right motor power
pinMode(rightMotor1, OUTPUT); // right motor dir.
pinMode(rightMotor2, OUTPUT); // right motor dir.
// left motor
pinMode(pwmL, OUTPUT); // left motor power
pinMode(leftMotor1, OUTPUT); // left motor dir.
pinMode(leftMotor2, OUTPUT); // left motor dir.
// INPUTS: DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
// DIP switch
pinMode(DIP1, INPUT_PULLUP); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
pinMode(DIP2, INPUT_PULLUP); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
pinMode(DIP3, INPUT_PULLUP); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
pinMode(DIP4, INPUT_PULLUP); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
// line sensor
pinMode(lineL, INPUT); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
pinMode(lineR, INPUT); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
// distance sensor
pinMode(distR, INPUT); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
pinMode(distL, INPUT); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
// micro-start
pinMode(microST, INPUT); // DO NOT CHANGE / NAO MUDAR / NO CAMBIAR
/****************PINOUT CONFIG - END***************/
/***************INITIAL CONDITIONS*****************/
digitalWrite(LED, LOW); // LED off / LED desligado / LED apagado
MotorL(0); // left motor stopped / motor esquerdo parado / motor izquierdo parado
MotorR(0); // right motor stopped / motor direito parado / motor derecho parado
/*************INITIAL CONDITIONS - END*************/
}
/**LEFT MOTOR CONTROL / CONTROLE DO MOTOR ESQUERDO / CONTROL DEL MOTOR IZQUIERDO**/
// pwm = 0 -> stopped / parado / parado
// 0<pwm<=255 -> forward / para frente / seguir adelante
// -255<=pwm<0 -> backward / para tras / seguir espalda
void MotorL(int pwm){
// leftMotor1=0 and leftMotor2=0 -> stopped / parado / parado
// leftMotor1=0 and leftMotor2=1 -> moves forward / avanca / avanzar
// leftMotor1=1 and leftMotor2=0 -> moves back / recua / retrocede
// leftMotor1=1 and leftMotor2=1 -> stopped (braked) / parado (travado) / parado (frenado)
if(pwm==0){
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, LOW);
}
else if(pwm<0)
{
analogWrite(pwmL, -pwm);
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
}
else
{
analogWrite(pwmL, pwm);
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, HIGH);
}
}
/**RIGHT MOTOR CONTROL / CONTROLE DO MOTOR DIREITO / CONTROL DEL MOTOR DERECHO**/
// pwm = 0 -> stopped / parado / parado
// 0<pwm<=255 -> forward / frente / adelante
// -255<=pwm<0 -> backward / tras / espalda
void MotorR(int pwm){
// rightMotor1=0 and rightMotor2=0 -> stopped / parado / parado
// rightMotor1=0 and rightMotor2=1 -> moves forward / avanca / avanzar
// rightMotor1=1 and rightMotor2=0 -> moves back / recua / retrocede
// rightMotor1=1 and rightMotor2=1 -> stopped (braked) / parado (travado) / parado (frenado)
if(pwm==0){
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, LOW);
}
else if(pwm<0)
{
analogWrite(pwmR, -pwm);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
}
else
{
analogWrite(pwmR, pwm);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
}
}
/** read DIP switch / ler chave DIP / leer el interruptor DIP **/
// returns a value between 0 and 15
// retorna um valor entre 0 e 15
// devuelve un valor entre 0 y 15
int readDIP(){
int n=0;
if(digitalRead(DIP4)==HIGH)
n=1;
if(digitalRead(DIP3)==HIGH)
n|= (1<<1);
if(digitalRead(DIP2)==HIGH)
n|= (1<<2);
if(digitalRead(DIP1)==HIGH)
n|= (1<<3);
}
void loop() {
start = digitalRead(microST); //verifica se o micro-start foi ligadopleo controle do juiz, iniciando luta
if(start==1){ //se foi ligado o rb6o de movimenta
digitalWrite(LED, HIGH); // liga o LED
infR = digitalRead(lineR);
infL = digitalRead(lineR);
if ((infR==0)&&(infL==0)){ //caso os sensores IR inferiores não detectem a linha
frontR = digitalRead(distR); //realiza a leitura dos 2 sensores frontais
frontL = digitalRead(distL);
if((frontR==1)&&(frontL==1)){ //se os dois sensores frontais detectam o adversário
MotorL(255); //o robô avança na direção do adversário
MotorR(255);
}
else if((frontR==0)&&(frontL==1)){ //caso o sensor frontal da direita pare de detectar o adversário
MotorL(0); //o robô para o motor esquerdo e
MotorR(255); //gira o motor direito tentando identificar novamente o adversário
}
else if ((frontR==1)&&(frontL==0)){ //caso o sensor frontal da direita pare de detectar o adversário
MotorR(0); //o robô para o motor direito e
MotorL(255); //gira o motor esquerdo tentando identificar novamente o adversário
}
else{
MotorL(255); //caso o robô não esteja detectando o adversário ele irá girar em sentido horário
MotorR(-255); //com ambos os motores em máxima potência
}
}
else{ //caso o robô detecte a borda do dojo
MotorL(-255); //ele irá recuar pra não cair para fora
MotorR(-255);
}
}
else{ // assume que o robô deve ficar parado e está sob piso preto
digitalWrite(LED, LOW); // LED desligado
MotorL(0); // motores parados
MotorR(0); // depois cofere o menor valor detectado quando o sensor esta detectando a cor preta
infR = digitalRead(lineR); // lê o valor atual do sensor de linha
if(infR<infR_min){
infR_min=infR;
}
infL = digitalRead(lineL);
if(infL<infL_min){
infL_min=infL;
}
}
}