-
Notifications
You must be signed in to change notification settings - Fork 1
/
carrinho.c
224 lines (204 loc) · 8 KB
/
carrinho.c
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
212
213
214
215
216
217
218
219
220
221
222
223
224
#include <Servo.h> // inclui biblioteca de manipulação de servos motores.
#include "include/AFMotor.h" // inclui biblioteca de manipulação de motores DCs.
// Essa biblioteca já vem inclusa no arduino versão 1.6 ou superior (Servo.h)
//Definindo os pinos
#define trigPin A0 //Pino TRIG do sensor no pino analógico A0
#define echoPin A1 //Pino ECHO do sensor no pino analógico A1
#define BUZZER A2 // Define o pino do buzzer (Som) no pino ANALÓGICO A0
AF_DCMotor motor1(1); // Define o motor1 ligado ao M1
AF_DCMotor motor2(2); // Define o motor2 ligado ao M2
int TempoGirar = 1;//esse é o tempo para o robô girar em 45º com uma bateria de 9v.
int distanciaObstaculo = 30; //distância para o robô parar e recalcular o melhor caminho
int velocidadeMotores = 80; // velocidade que os motores funcionarão na bateria 9v. Para a bateria 9v a velocidade 80 é ideal
Servo servo_ultra_sonico; // nomeando o servo motor
//variáveis para o sensor ultrassonico
long duracao;
long distancia_cm=0;
int minimumRange=5; //tempo de resposta do sensor
int maximumRange=200;
// executado na inicialização do Arduino
void setup(){
Serial.begin(9600); // inicializa a comunicação serial para mostrar dados
servo_ultra_sonico.attach(10); // Define o mini servo motor ligado no pino digital 10.
pinMode(trigPin, OUTPUT); //define o pino TRIG como saída
pinMode(echoPin, INPUT); //define o pino ECHO como entrada
pinMode(BUZZER,OUTPUT); // Define o pino do buzzer como saída
motor1.setSpeed(velocidadeMotores); // Define a velocidade para os motores. A velocidade máxima é 255.
motor2.setSpeed(velocidadeMotores); //Usamos uma bateria de 9v 450mAh, com ela a velocidade ficou boa. Mas dependendo da bateria utilizada a velocidade deverá ser utilizada. Não use pilhas, pois são fracas
servo_ultra_sonico.write(90); // O servo do sensor se inicia a 90 graus (meio)
rotacao_Parado; //inica com os motores parados
}
// Função principal do Arduino
void loop(){
pensar(); //inicia a função pensar
}
// Função para chamar outras funções e definir o que o robô fará
void pensar(){
reposicionaServoSonar(); //Coloca o servo para olhar a frente
int distancia = lerSonar(); // Ler o sensor de distância
Serial.print("distancia em cm: ");
Serial.println(distancia); // Exibe no serial monitor
if (distancia > distanciaObstaculo) { // Se a distância for maior que 20 cm
rotacao_Frente(); //robô anda para frente
}else{
rotacao_Parado(); //para o robô
posicionaCarroMelhorCaminho(); //calcula o melhor caminho
pensar();
}
}
// Função para ler e calcular a distância do sensor ultrassônico
int lerSonar(){
digitalWrite(trigPin, LOW); //não envia som
delayMicroseconds(2);
digitalWrite(trigPin,HIGH); //envia som
delayMicroseconds(10);
digitalWrite(trigPin,LOW); //não envia o som e espera o retorno do som enviado
duracao = pulseIn(echoPin,HIGH); //Captura a duração em tempo do retorno do som.
distancia_cm = duracao/56; //Calcula a distância
delay(30);
return distancia_cm; // Retorna a distância
}
// Função para calcular a distância do centro
int calcularDistanciaCentro(){
servo_ultra_sonico.write(90);
delay(20);
int leituraDoSonar = lerSonar(); // Ler sensor de distância
delay(500);
leituraDoSonar = lerSonar();
delay(500);
Serial.print("Distancia do Centro: "); // Exibe no serial
Serial.println(leituraDoSonar);
return leituraDoSonar; // Retorna a distância
}
// Função para calcular a distância da direita
int calcularDistanciaDireita(){
servo_ultra_sonico.write(0);
delay(200);
int leituraDoSonar = lerSonar();
delay(500);
leituraDoSonar = lerSonar();
delay(500);
Serial.print("Distancia da Direita: ");
Serial.println(leituraDoSonar);
return leituraDoSonar;
}
// Função para calcular a distância da esquerda
int calcularDistanciaEsquerda(){
servo_ultra_sonico.write(180);
delay(200);
int leituraDoSonar = lerSonar();
delay(500);
leituraDoSonar = lerSonar();
delay(500);
Serial.print("Distancia Esquerda: ");
Serial.println(leituraDoSonar);
return leituraDoSonar;
}
// Função para captar as distâncias lidas e calcular a melhor distância. Acesse: Seu Robô https://seurobo.com.br/
char calculaMelhorDistancia(){
int esquerda = calcularDistanciaEsquerda();
int centro = calcularDistanciaCentro();
int direita = calcularDistanciaDireita();
reposicionaServoSonar();
int maiorDistancia = 0;
char melhorDistancia = '0';
if (centro > direita && centro > esquerda){
melhorDistancia = 'c';
maiorDistancia = centro;
}else
if (direita > centro && direita > esquerda){
melhorDistancia = 'd';
maiorDistancia = direita;
}else
if (esquerda > centro && esquerda > direita){
melhorDistancia = 'e';
maiorDistancia = esquerda;
}
if (maiorDistancia <= distanciaObstaculo) { //distância limite para parar o robô
rotacao_Re();
posicionaCarroMelhorCaminho();
}
reposicionaServoSonar();
return melhorDistancia;
}
// Função para colocar o carrinho na melhor distância, isto é, girá-lo para a melhor distância
void posicionaCarroMelhorCaminho(){
char melhorDist = calculaMelhorDistancia();
Serial.print("melhor Distancia em cm: ");
Serial.println(melhorDist);
if (melhorDist == 'c'){
pensar();
}else if (melhorDist == 'd'){
rotacao_Direita();
}else if (melhorDist == 'e'){
rotacao_Esquerda();
}else{
rotacao_Re();
}
reposicionaServoSonar();
}
// Função para deixar o sensor "olho" do robô no centro
void reposicionaServoSonar(){
servo_ultra_sonico.write(90);
delay(200);
}
// Função para fazer o carro parar
void rotacao_Parado()
{
Serial.println(" Motor: Parar ");
motor1.run(RELEASE); // Motor para
motor2.run(RELEASE);
}
// Função para fazer o robô andar para frente
void rotacao_Frente()
{
Serial.println("Motor: Frente ");
motor1.run(FORWARD); // Roda vai para frente
motor2.run(FORWARD);
delay(50);
}
// Função que faz o robô andar para trás e emite som quando ele dá ré
void rotacao_Re()
{
Serial.println("Motor: ré ");
for (int i=0; i <= 3; i++){
digitalWrite(BUZZER, HIGH); // Liga o som
delay(100);
motor1.run(BACKWARD); // Roda vai para trás
motor2.run(BACKWARD); // Roda vai para trás
delay(100);
digitalWrite(BUZZER, LOW); // Desliga o som
delay(100);
}
rotacao_Parado();
}
// Função que faz o robô virar à direita, http://loja.seurobo.com.br/
void rotacao_Direita()
{
digitalWrite(BUZZER, HIGH); // Liga o som
delay(100);
motor1.run(BACKWARD); //o robô dá uma ré para não colidir ao girar
motor2.run(BACKWARD);
delay(50);
digitalWrite(BUZZER, LOW); // Desliga o som
delay(100);
Serial.println(" Para a direita ");
motor1.run(FORWARD); // Roda vai para frente
motor2.run(BACKWARD); // Roda vai para trás
delay(TempoGirar);
}
// Função que faz o robô virar à esquerda
void rotacao_Esquerda()
{
digitalWrite(BUZZER, HIGH); // Liga o som
delay(100);
motor1.run(BACKWARD); // // O robô dá uma ré para não colidir ao girar
motor2.run(BACKWARD);
delay(50);
digitalWrite(BUZZER, LOW); // Desliga o som
delay(100);
Serial.println(" Para a esquerda ");
motor1.run(BACKWARD); // Roda vai para trás
motor2.run(FORWARD); // Roda vai para frente
delay(TempoGirar);
}