Olá pessoal gostaria de saber se tem alguém que pode me ajuda no meu projeto... estou utilizando sensor ultrasônico e sensor infravermelho.
No meu projeto eu quero ligar um robô, ele se move através do sensor ultrassônico e quando eu pressionar o botão de Ligar no controle remoto é acionado o movimento através do controle remoto, permitindo que eu possa fazer uma pausa, avançar ou recuar, por exemplo.
E quando quiser retornar a movimentação através do sensor ultrassônico, apertar um botão e retorna para a função de sensor ultrassônico.
O meu código está quase funcionando corretamente, porém se dou uma pausa, fica bem pouco e já gira os motores para frente novamente, ou seja, está funcionando mas não de forma adequada e não estou conseguindo resolver esse problema.
Segue meu código:
#include <Servo.h>
#include <SPI.h>
#include <IRremote.h>
float num = 0;
Servo servo1;
Servo servo2;
Servo servo3;
int cm;
int st;
int trig = 6;
int echo = 7;
long microseconds;
/* =================== Declaração do IR ===================*/
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
long infraredvalue;
/* ========================== // ==========================*/
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // Iniciando op receptor
st=2;
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
servo1.attach(8);
servo2.attach(9);
servo3.attach(10);
servo1.write(110);
servo2.write(70);
servo3.write(100);
delay(1000);
}
void loop() {
static boolean IRMode = true; // Iniciando o modo IR
sensor();
if (irrecv.decode(&results)) {
infraredvalue = results.value; //Recebe o valor lido pelo IR
Serial.println(infraredvalue, HEX);
if (infraredvalue == 0x1FE708F){
IRMode = false;
//sensor();
}
if (infraredvalue == 0x1FE48B7){
IRMode = true;
//controle();
}
if (IRMode == true){
controle();
}
if (!IRMode) {
sensor();
}
irrecv.resume(); // Recebe o próximo valor
}
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}
void sensor(){
long duration, cm;
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
delayMicroseconds(2);
duration = pulseIn(echo, HIGH);
cm = microsecondsToCentimeters(duration);
if (cm > 10 and st==1){ //Se a distância do obstáculo for maior que 10 cm alinha o sensor com os servomotores
alinha();
}
if (cm <= 10 and st==1){ //Se a distância atender à condição o servomotor para para 180 graus
sonar2();
}
if (cm <= 10 and st==2){ //Se a distância atender à condição os servomotores param
stop1();
}
if (cm > 10 and st==2){ //Se a distância atender à condição os sermotores avançam
frente();
}
if (cm > 10 and st==3){ //Se a distância atender à condição os sermotores avançam
frente();
}
if (cm <= 10 and st==3){ //Se a distância do obstáculo for maior que 10 cm alinha o sensor com os servomotores
alinha();
}
}
void controle(){
switch (infraredvalue) {
case 0x1FEA05F: //Se o botão com código 1FEA05F for pressionados servomotores param
stop2();
//break;
case 0x1FE609F: //Se o botão com código 1FE609F for pressionado o sensor com os servomotores
alinha();
//break;
case 0x1FE20DF: //Se o botão com código 1FE20DF for pressionado os sermotores avançam
frente();
//break;
case 0x1FE8877: //Se o botão com código 1FE8877 for pressionado deixa a função do controle() e volta a função sensor()
sensor();
//break;
}
}
/* BLOCO DE TESTE ALTERNATIVO
void controle(){
if (infraredvalue == 0x1FEA05F) //Verifica se a tecla 1FEA05F foi acionada
{
pare2();
}
if (infraredvalue == 0x1FE609F) //Verifica se a tecla 1FE609F foi acionada
{
alinha();
}
if (infraredvalue == 0x1FE20DF) //Verifica se a tecla 1FE20DF foi acionada
{
frente();
}
// Voltar para o sensor
if (infraredvalue == 0x1FE8877) //Verifica se a tecla 1FE8877 foi acionada
{
sensor();
}
}
*/
//OS SERVOMOTORES FORAM MODIFICADOS PARA GIRAR 360 GRAUS
void frente() {
servo1.write(110); //enviando um ângulo de 110 graus para o sensor se alinhar com os servomotores
servo2.write (70); //enviando um ângulo de 70 graus que é o ponto em que o servo1 avança
servo3.write (100); //enviando um ângulo de 100 graus que é o ponto em que o servo2 avança
delay(15);
}
void stop2() {
servo2.write(94); //enviando um ângulo de 94 graus que é o ponto em que os servomotores param
servo3.write(94); //enviando um ângulo de 94 graus que é o ponto em que os servomotores param
st = 1;
delay(200);
//sonar();
}
void stop1() {
servo2.write(94); //enviando um ângulo de 94 graus que é o ponto em que os servomotores param
servo3.write(94); //enviando um ângulo de 94 graus que é o ponto em que os servomotores param
st = 1;
delay(200);
sonar();
}
void sonar() {
servo1.write(0); //enviando um ângulo de 0 grau para verificar se existe algum obstáculo à direita
delay(2000);
}
void sonar2() {
servo1.write(180); //enviando um ângulo de 0 grau para verificar se existe algum obstáculo à esquerda
st=3;
delay(2000);
}
void alinha() { //alinhar o sonar com os servomotores
servo1.write(110);
for(int i=0;i<=10;i++) {
servo2.writeMicroseconds (1000);
servo3.writeMicroseconds (1000);
st = 2;
delay(30);
}
}
Obrigado.