[RESOLVIDO] [PROJETO] Projeto KAME( Robo EXPLORADOR, ultrasom(HC-SR04) + servo + ponte H(L298N) + Arduino UNO )

sou novato com  arduino :X sei apenas o basico


Para o projeto tenho:
- um Arduino UNO
- um sensor ultrassom
- um servo 180°
- dois motores DC

- uma ponte H, L298N
- um chassi para montar tudo

Obs.: tenho também sensores IR

Estou querendo que ele funcione assim:
- posição do servo igual a 90°
- ler distância frontal
- se distância frontal for menor ou igual 15 cm:
   - parar
   - posição do servo igual a 0°
   - ler distância esquerda
   - posição do servo igual a 180°
   - ler distância direita
   - se distância esquerda for maior que 15 cm e distância direita for maior que 15 cm faça:
      - virar à direita
     senão se distância esquerda for maior que 15 cm e distância direita for menor ou igual a 15 cm faça:
      - virar à esquerda
     senão se distância esquerda for menor ou igual a 15 cm e distância direita for maior que 15 cm faça:
      - virar à direita
     senão (distância esquerda for mmenor ou igual a 15 cm e distância direita for menor ou igual a 15 cm) faça:
      - girar 180° à direita
     fim se
  senão (distância frontal form maior que 15 cm) faça:
   - seguir em frente
  fim se

Estou com problemas na construção do codigo

Consegui apenas com que o servo vire para um lado e faça a leitura da distância e seguir sem ler o outro lado :( ..

Exibições: 3787

Responder esta

Respostas a este tópico


#include <Ultrasonic.h>
#include <Servo.h>

#define echoPin 9
#define trigPin 8
Ultrasonic distancia(8,9);
int echopin = 9; // a saido echo do SRF05 liga no pin 13
int trigerpin = 8; // a saida triger do SRFo5 liga no pin 12
int in1 = 2;
int in2 = 3;
int in3 = 4;
int in4 = 7;
int enable1 = 5;
int enable2 = 6;

void setup()
{
  iniciar_Motor();
  Serial.begin(9600);

  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(enable1, OUTPUT);
  pinMode(enable2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
   }

void loop()
{

    rotacao_Parado();
    delay(500);
    int dist = ultrasonico();
    rotacao_Frente();
     
    int dist2 = ultrasonico();
      if(dist == dist2)
    {
          rotacao_Direita();
          delay(1000);
    }
    else
       if(dist2 <= 15)
       {
            rotacao_Re();
delay(1000);
            rotacao_Direita();
            delay(600);
    }
    else
       if(dist2 > 10000)
       {
                  rotacao_Re();
delay(1000);
           rotacao_Esquerda();
           delay(600);
       }
       else
           rotacao_Frente();
delay(1000);
}

void rotacao_Parado()
{
      analogWrite(enable1,0);
      analogWrite(enable2, 0);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
}


void rotacao_Frente()
{

        analogWrite(enable1, 255);
      analogWrite(enable2, 255);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);

}

void rotacao_Re()
{

      analogWrite(enable1, 255);
      analogWrite(enable2, 0);
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);}

void rotacao_Direita()
{
      analogWrite(enable1, 0);
      analogWrite(enable2, 255);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);}
void rotacao_Esquerda()
{

       analogWrite(enable1, 255);
      analogWrite(enable2, 0);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
}

void iniciar_Motor()
{
 analogWrite(enable1, 255);
      analogWrite(enable2, 255);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4,HIGH);
}

int ultrasonico()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);
  int cm = (distancia.Ranging(CM));
  Serial.print("Distancia em CM: ");
  Serial.println(cm);
  return cm;
}

#include <Servo.h>
#include <Ultrasonic.h>
Servo myservo;
int pos = 90;
int echopin = 9; // a saido echo do SRF05 liga no pin 13
int trigerpin = 8; // a saida triger do SRFo5 liga no pin 12
int in1 = 2;
int in2 = 3;
int in3 = 4;
int in4 = 7;
int enable1 = 5;
int enable2 = 6;
unsigned long pulsetime = 0; // Variavel que faz a leitura do pulso
unsigned long distancia = 0; //Variavel que que armazena a distancia
void stopMotor() {
  //para os motores
  analogWrite(enable1, 0);
  analogWrite(enable2, 0);
}
void setup()
{
  myservo.attach(10);
    pinMode(enable1, OUTPUT);
  pinMode(enable2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(trigerpin, OUTPUT);
  pinMode(echopin, INPUT);
}
void loop()
{
  digitalWrite(trigerpin, HIGH);
  delayMicroseconds(50);
  digitalWrite(trigerpin,LOW);
  pulsetime = pulseIn(echopin, HIGH);
  distancia = pulsetime/58; // converte para cm
  if (distancia > 16) // se a distancia for maior que 16 cm
  {
    analogWrite(enable1, 255);
    analogWrite(enable2, 255);
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);

    //anda sempre em frente ...
  }
  if (distancia <= 15)
  {
    stopMotor();
    delay(1000);
  }
  for (pos = 90; pos < 180; pos += 5)
  {
    myservo.write(pos);
    delay(150);

    if (distancia > 16) // se a distancia for maior que 16 cm
    {
      analogWrite(enable1, 255);
      analogWrite(enable2, 0);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
    }  
  }
  if (distancia <= 15) // se a distancia for menor ou igual que 5 cm
  {
    for (pos = 180; pos >= 1; pos -= 5)
    {
      myservo.write(pos);
      delay(150);

      if (distancia > 16) // se a distancia for maior que 16 cm
      {
          analogWrite(enable1, 0);
        analogWrite(enable2, 255);
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
      }
    }
  }
  if (distancia > 20);
  {
    myservo.write(pos);
     analogWrite(enable1, 255);
        analogWrite(enable2, 255);
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
  }
}

Fala, sr Kelvin.

Seu projeto é bem próximo do meu ex-F1, mas ainda não terminei.

Procura postagem no facebook: softelli@click21.com.br

ou no youtube: softelli

Se precisar, eu te dou uma ajuda no código.

A propósito, achei bem interessante você já postar o fluxograma em portugol. :)

Abraço.

Boa noite sr Edson,

Ta faltando oque para o seu ?

Estou precisando muito de ajuda com o codigo :/, sou iniciante.

Obrigado,

Abraços.

O meu... vou ter que arrumar a roda frontal do 3cycle que quebrou durante a filmagem. :(

https://www.youtube.com/watch?v=c_a7lIoMkhc&feature=g-upl


Eu vou te ajudar no código, mas não espere eu fazê-lo por você.... porque eu espero que você aprenda

durante o processo...em outras palavras, eu tô doido pra arrumar seu código, mas prefiro não fazê-lo...

A maioria dos problemas que aparece por aqui é de Lógica de Programação... e depois, de falta de conhecimento na linguagem.

Então, algumas dicas sobre o seu código:

  1. Na função servo.write(pos), não precisa incrementar ou decrementar de 5 em 5. Simplesmente ordene o servo a escrever na posição que vc precisa: servo.write(90); (a não ser que vc esteja propositadamente querendo reduzir a velocidade do servo e perder ciclos e tempo).
  2. Na trecho abaixo, por exemplo:

....

  for (pos = 90; pos < 180; pos += 5)
  {
    myservo.write(pos);
    delay(150);

    if (distancia > 16) // se a distancia for maior que 16 cm
    {
      analogWrite(enable1, 255);
      analogWrite(enable2, 0);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
    }  
  }

....

Está bastante complexo... não há como sabermos o que esses analogWrite e digitalWrite estão fazendo.Seja o que for, eles estão fazendo isso dentro do laço FOR... os comandos estão sendo repetidos a cada 5 graus de 90 a 175 (porque o 180 não consegue passar pela comparação "menor").

Você começou bem com o português acima.
 E assim deveria continuar, vou dar exemplo:

 

  if (distancia <= 15)  //se a distancia for menor ou igual a 15 cm
  {
    stopMotor();   // pare o motor
    delay(1000);  //aguarde por 1 segundo


  } else { //senão (se a distancia for maior que 15 cm)

    // faça qualquer outra coisa, continue andando, etc....

}

 


Como não temos idéia da programação que corre na sua mente, o ideal é vc comentar o código ao máximo. Mas procure seguir exatamente a programação que vc fez em português no início do post.

E não se preocupe, estou aqui pelo prazer de ajudar mesmo.

Abraço.

 

.

Olá amigo, eu estou junto nesse projeto com o Kelvin, abaixo mando o código com mais comentários para melhor entendimento.

#include <Servo.h>
#include <Ultrasonic.h>
Servo myservo;
int pos = 90;  //posição inicial do servo
int echopin = 9; // a saido echo do SRF05 liga no pin 9
int trigerpin = 8; // a saida triger do SRFo5 liga no pin 8
int in1 = 2; // pino 1 do motor 1
int in2 = 3; // pino 2 do motor 1
int in3 = 4; // pino 1 do motor 2
int in4 = 7; // pinto 2 do motor 2
int enable1 = 5; // define a velociadade do motor 1
int enable2 = 6; // define a velocidade do motor 2
unsigned long pulsetime = 0; // Variavel que faz a leitura do pulso
unsigned long distancia = 0; //Variavel que que armazena a distancia
void stopMotor() {
  //para os motores
  analogWrite(enable1, 0);
  analogWrite(enable2, 0); 
}
void setup()
{
  myservo.attach(10); // anexa o servo lógico ao fisico no pino 10
  pinMode(enable1, OUTPUT); // define todos os pinos como saída
  pinMode(enable2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(trigerpin, OUTPUT); // define o pino triger como saída
  pinMode(echopin, INPUT); // define o pino echo como entrada
}
void loop()
{
  digitalWrite(trigerpin, HIGH);
  delayMicroseconds(50);
  digitalWrite(trigerpin,LOW);
  pulsetime = pulseIn(echopin, HIGH);
  distancia = pulsetime/58; // converte para cm
  if (distancia > 16) // se a distancia for maior que 16 cm
  {
    analogWrite(enable1, 255); // velocidade do motor 1
    analogWrite(enable2, 255); // velocidade do motor 2
    digitalWrite(in1, LOW); // apenas pinos secundarios em HiGH, definindo o movimento para frente
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);

  }
  if (distancia <= 15) // se a distancia for menor ou igual a 15
  {
    stopMotor();  //para o motor por 1 segundo
    delay(1000);
  }
  for (pos = 90; pos < 180; pos += 5) // para posição 90 girar o servo em pulsos de 5 graus até 175
  {
    myservo.write(pos);
    delay(150);

    if (distancia > 16) // se a distancia for maior que 16 cm
    {
      analogWrite(enable1, 255);
      analogWrite(enable2, 0); // gira para esquerda
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
    }  
  }
  if (distancia <= 15) // se a distancia for menor ou igual que 15 cm
  {
    for (pos = 180; pos >= 1; pos -= 5) // girar o servo para o outro lado, no mesmo ritmo 
    {
      myservo.write(pos);
      delay(150);

      if (distancia > 16) // se a distancia for maior que 16 cm
      {
          analogWrite(enable1, 0); // girar a direta
        analogWrite(enable2, 255);
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
      }
    }
  }
  if (distancia > 16); // se a distancia for maior que 16
  {
    myservo.write(pos);  // servo volta a posição inicial e anda para frente
     analogWrite(enable1, 255);
        analogWrite(enable2, 255);
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
  }
}

 

ps.: o servo não precisa necessariamente girar em pulsos de 5 graus só precisamos que ele rode para o ultrasom ler a distancia

Srs Campelo(s), boa tarde.

Ambos sabem exatamente o que querem, e isso é muito importante.


Estava quase me algemando para não arrumar o código... mas, vai que isso é um TCC.

Tenta isso:

#include <Servo.h>
#include <Ultrasonic.h>
Servo myservo;
int pos = 90;  //posição inicial do servo
int echopin = 9; // a saido echo do SRF05 liga no pin 9
int trigerpin = 8; // a saida triger do SRFo5 liga no pin 8
int in1 = 2; // pino 1 do motor 1
int in2 = 3; // pino 2 do motor 1
int in3 = 4; // pino 1 do motor 2
int in4 = 7; // pinto 2 do motor 2
int enable1 = 5; // define a velociadade do motor 1
int enable2 = 6; // define a velocidade do motor 2
unsigned long pulsetime = 0; // Variavel que faz a leitura do pulso
unsigned long distancia = 0; //Variavel que que armazena a distancia
void stopMotor() {
  //para os motores
  analogWrite(enable1, 0);
  analogWrite(enable2, 0);
}
void setup()
{
  myservo.attach(10); // anexa o servo lógico ao fisico no pino 10
  pinMode(enable1, OUTPUT); // define todos os pinos como saída
  pinMode(enable2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(trigerpin, OUTPUT); // define o pino triger como saída
  pinMode(echopin, INPUT); // define o pino echo como entrada
}
void loop()
{

  distancia = leiaDistancia(); //executa a funcao que retorna a distancia em cm
 
  if (distancia > 16) // se a distancia for maior que 16 cm
     {
       andeParaFrente();  //continua andando.
     }
  else { //senão, lógico, a distancia frontal é MENOR ou IGUAL a 16.

       
       stopMotor(); //pare o motor
       delay(1000); //aguarde 1 segundo
       
       int distEsquerda = 0;
       int distDireita = 0;
       myservo.write(175); //gira o servo a 175 graus
       delay(1000); // tem que ser ajustado para esperar o servo chegar no 175
       distEsquerda = leiaDistancia();
       myservo.write(90); //gira o servo para 90 graus - deve ser a posicao inicial ou central.
              
       //vamos analisar o que foi lido na Esquerda
       if (distEsquerda > 16) // se a distancia ESQUERDA for maior que 16 cm
       {
          giraParaEsquerda(3000); //invoca a funcao que gira para ESQUERDA por 3 segundos. Favor ajustar esse valor.
       
       } else { //senão, lógico, a distancia esquerda é MENOR ou IGUAL a 16. Vamos analisar a DIREITA, então.
           myservo.write(5);
           delay(1000);//tem que esperar o servo chegar em 5 graus.
           distDireita = leiaDistancia(); // lendo a distancia da DIREITA
           myservo.write(90); //gira o servo para 90 graus - deve ser a posicao inicial ou central.
           
           if(distDireita > 16){
             giraParaDireita(3000); // mesma coisa. ajute esse TEMPO para que o robo gire os 5 graus.
           }
       }
  }
}
int leiaDistancia(){ //funcao que devolve a distancia em cm
  digitalWrite(trigerpin, HIGH);
  delayMicroseconds(50);
  digitalWrite(trigerpin,LOW);
  pulsetime = pulseIn(echopin, HIGH);
  return pulsetime/58; // converte para cm
}
void andeParaFrente(){
    analogWrite(enable1, 255); // velocidade do motor 1
    analogWrite(enable2, 255); // velocidade do motor 2
    digitalWrite(in1, LOW); // apenas pinos secundarios em HiGH, definindo o movimento para frente
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
}
void giraParaEsquerda(long tempo){//funcao para girar a esquerda. Observe o tempo em millissegundos.
      analogWrite(enable1, 255);
      analogWrite(enable2, 0); // gira para esquerda
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(tempo); //o motor só deve ficar ligado esse tempo.
      stopMotor(); //agora eu desligo.
}
void giraParaDireita(long tempo){//funcao para girar a esquerda. Observe o tempo em millissegundos.
      analogWrite(enable1, 0); // girar a direta
      analogWrite(enable2, 255);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(tempo); //o motor só deve ficar ligado esse tempo.
      stopMotor(); //agora eu desligo.
}

 

 

 

 

 

 

 

 

Ah, esqueci.

Se todas as distâncias (frontal, Esquerda e Direita) forem MENORES ou IGUAIS a 16:

- o servo vai continuar fazendo a varredura na esquerda e direita;

- o robot vai continuar parado.


Será que vcs não precisam de uma função que faça a manobra (ré + esquerda ou ré + direita).

Abraços.

Eu tava pensado assim, supondo que o robot estivesse em um labirinto e ele se encontrasse em uma situação em que tanto pra direita quanto pra esquerda não tiver onde ir (claro, pra frente também não) é girar 180 graus voltar para seguir o caminho diferente.

Eu tava pensando em fazer o código com void para cada função (frente, trás, esquerda, direita), mas como não sou muito experiente estava com um pouco de dificuldade e sem tempo. Obrigado Sr. Edson, esse código vai nos ajudar muito. E como está bem comentado deu pra entender bacana como funciona, com certeza aprendi bastante com esse projeto e com sua ajuda.

Abraços.

Aliás, já até fiz isso, baseando-se no seu código.

Criei outro void:

void girar180graus(long tempo){//funcao para girar 180 graus. Observe o tempo em millissegundos.
analogWrite(enable1, 200);
analogWrite(enable2, 200);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(700); //o motor só deve ficar ligado esse tempo.
stopMotor(); //agora eu desligo.
}

e adicionei o comando no final do loop:

if(distDireita <= 16) {
girar180graus(300);
}

Eu testei e funcionou perfeitamente =D

Obrigado pela ajuda Sr. Edson, abraço.

Parabéns!

Que bom que funcionou.


O Kelvin disse na sala que vocês querem fazer Eng. Mecatrônica ou afins...

Recomendo que estudem, desde já, a linguagem C/C++, desde o início (tipos primitivos, compostos, laços, etc). Isso vai ajudar nas disciplinas que envolvem computação gráfica, realidade virtual, visão computacional, etc...

Quem dera o Python fosse suficiente para programar o arduino, é uma linguagem muito utilizada no meio acadêmico, mas por enquanto ele só está no lado PC dos projetos, enquanto o C++ programa o Arduino.

http://www.slideshare.net/turicas/arduino-pythonldg#btnNext

Enquanto vocês não chegam lá, proponham novos desafios e desenvolva novas fucionalidades para o seu explorador, como comunicação bluetooth, RF, integração com PC, com controle do Wii, etc.

Divirtam-se.

Abraços.

Sr. Edson 

Muito obrigado pela ajuda!

Vamos aprofundar nossos estudos em linguagem C/C++ com certeza.

Novos desafios ? Sempre, ja compramos uma camera sem fio, mais servos pra controlar a camera, temos um recptor IR, controle IR, estamos querendo comprar um transmissor bluetooth, e futuramente um controle de ps3.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço