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 :( ..
Tags:
#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:
....
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por