Estou nesse projeto de robô de limpeza mas to empacado no código, sou iniciante no Arduino e tbm em programação logo não sei bem oq esta dando errado.
Bem o robô é composto por :
Arduino Mega
Motorshield l293D
2 sensores HC SR-04
Plataforma com 2 motores DC
E como deveria funcionar :
Se ambos os sensores detectarem q o caminho esta sem obstaculos o robô prosegue
Ambos os sensores detectam um obstaculo muito proximo o robô ira para trás
Se um sensor indicar que há algo proximo e o outro indicar que não há nada o carro vira para sem obstáculo.
#include <NewPing.h>
#include <AFMotor.h>
#define MAX_DISTANCE 300
#define LEFT_TRIGGER_PIN 14
#define LEFT_ECHO_PIN 15
#define RIGHT_TRIGGER_PIN 16
#define RIGHT_ECHO_PIN 17
NewPing sensorLeft = NewPing(LEFT_TRIGGER_PIN, LEFT_ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
NewPing sensorRight = NewPing(RIGHT_TRIGGER_PIN, RIGHT_ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
AF_DCMotor motor(1); // Motor da direita
AF_DCMotor motor2(2); // Motor da esquerda
void setup()
{
Serial.begin(9600);
}
void loop()
{
// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
delay(50);
// Send ping, get ping time in microseconds (uS) then convert to CM.
unsigned int left = sensorLeft.ping() / US_ROUNDTRIP_CM;
unsigned int right = sensorRight.ping() / US_ROUNDTRIP_CM;
Serial.print("Left: ");
Serial.print(left);
Serial.print(" | Right: ");
Serial.print(right);
Serial.println("");
// All distances and delays need fine-tunes based on the platformer performance
if (left >= 100 || right >= 100)
{
Serial.println( " ----FRENTE---- ");
motor.setSpeed(255);
motor2.setSpeed(255);
motor.run(FORWARD);
motor2.run(FORWARD);
delay(1000);
}
else
{
if ( left <= 10 || right <= 10 )
{
Serial.println( " ----TRAS---- ");
motor.setSpeed(255);
motor2.setSpeed(255);
motor.run(BACKWARD);
motor2.run(BACKWARD);
delay(1000);
}
else
{
if ( left <= 50 || right >= 70 )
{
Serial.println( " ----DIREITA---- " );
motor.setSpeed(255);
motor2.setSpeed(255);
motor.run(BACKWARD);
motor2.run(FORWARD);
delay(2500);
}
else
{
if ( left >= 70 || right <= 50 )
{
Serial.println( " ----ESQUERDA---- " );
motor.setSpeed(255);
motor2.setSpeed(255);
motor.run(FORWARD);
motor2.run(BACKWARD);
delay(2500);
}
else
{
Serial.println(" ERROR RESTARTING PROGRAM ");
delay(10000);
}
}
}
}
}
Bem o problema é que quando eu ligo o robô não sai dos dois primeiros IF, ou seja, ou ele vai para a frente, ou vai para trás se os sensores detectarem q está perto da parede, mas nunca aciona os IF para virar para a esquerda ou para a direita.
Bem é isso aguardo respostas e se estiver mal-escrito ou mal explicado me avise pois é meu primeiro post em um forum.
Não consigo entender o pq os if para virar são ignorados, estou lendo e tentando outros métodos( switch e case ) mas nada de funcionar... claro q não espero solução, só dicas do que eu possa estar fazendo errado ou uma direção.
A as condições meio zuadas, tava testando varios valores.
Sensores estão OK
Bem não encadear os if, tenho algumas idéias que vo tentar para resolver isso ja que vc falou. Quem sabe eu consiga usar o Switch e o case, ou talves if separados para cada caso em vez dos encadeiamentos...enfim vo tentando =)
Assim, tem algum problema em testar 2 variáveis em um só if? todos exemplo e outras programações que vejo só testam uma variável por if.
Agora fora do tópico
Notei que um exemplo da biblioteca Newping.h não funciona se não baixa a taxa de comunicação na linha do serial begin, tem algum canto para reportar isso? Isso me causo tanta dor de cabeça pra resolver e seria legal não acontecer com mais ninguem.
Se o robot não vai estar ligado a um computador, eventualmente podes tirar a serial.
Tu podes testar as variáveis que quiseres num só if... mas tens de ver se queres efectuar a operação lógica OU (|) ou a operação lógica E (&)... os teus ifs parece-me que precisariam de um E em vez de OU.
Vlw mesmo em bubulindo ( cara é estranho agradecer alguem com esse nick...)
Como sou meio que impaciente eu comecei a aprender e pulei o básico, como vc disse eu o problema principal era os ||(ou) em vez de &&(E) e tbm tirei aqueles if encadeados e aprendi a usar o else if, ta funcionando certinho lindo agora =D
O serial prints torna mais fácil saber que estudar oq ele ta fazendo quando da problema, como eu acredito que eles não fazem mal vo deixar eles quietos msm. =3
Assim como ficou no final
// Inclusao de bibliotecas
#include <NewPing.h>
#include <AFMotor.h>
// Definicoes
#define MAX_DISTANCE 300 // distancia maxima dos sensores
#define LEFT_TRIGGER_PIN 14 // Pino trigger do sensor esquerdo na porta 14
#define LEFT_ECHO_PIN 15 // Pino echo do sensor esquerdo na porta 15
#define RIGHT_TRIGGER_PIN 16 // Pino trigger do sensor direito na porta 16
#define RIGHT_ECHO_PIN 17 // Pino echo do sensor direito na porta 17
#define TURN_DISTANCE 22 // Valor real: 21.675519
#define SPEED 255 // Velocidade maxima
NewPing sensorLeft = NewPing(LEFT_TRIGGER_PIN, LEFT_ECHO_PIN, MAX_DISTANCE); // Novo sensor newping
NewPing sensorRight = NewPing(RIGHT_TRIGGER_PIN, RIGHT_ECHO_PIN, MAX_DISTANCE); // Novo sensor newping
AF_DCMotor engineLeft(1); // Seleciona motor da esquerda
AF_DCMotor engineRight(2); // Seleciona motor da direita
// INICIO
void setup()
{
Serial.begin(9600);
}
void loop()
{
// Usa o minimo de alocacao de variaveis possivel devido a problemas de relocacao:
// http://stackoverflow.com/a/15782933
// Espera 50ms para realizar uma nova leitura (valor minimo deve ser 29ms,
// menor que isso causa conflito nas leituras.
delay(50);
// Sensores enviam um sinal, recebem o sinal refletido em Ms e convertem para CM
unsigned int left = sensorLeft.ping() / US_ROUNDTRIP_CM;
unsigned int right = sensorRight.ping() / US_ROUNDTRIP_CM;
Serial.print("Left: ");
Serial.print(left);
Serial.print(" | Right: ");
Serial.print(right);
Serial.println("");
engineLeft.setSpeed(SPEED);
engineRight.setSpeed(SPEED);
// Continua em frente enquanto nao tiver obstaculos.
if (left >= TURN_DISTANCE && right >= TURN_DISTANCE) {
Serial.println("---- FRENTE ----");
engineLeft.run(FORWARD);
engineRight.run(FORWARD);
}
// Retorna quando estiver muito perto.
else if (left <= TURN_DISTANCE && right <= TURN_DISTANCE) {
Serial.println("---- TRAS ----");
engineLeft.run(BACKWARD);
engineRight.run(BACKWARD);
}
// Vira pra direita
else if (right <= TURN_DISTANCE && right < left) {
Serial.println("---- DIREITA ----");
engineLeft.run(BACKWARD);
engineRight.run(FORWARD);
delay(1500);
}
// Vira pra esquerda
else if (left <= TURN_DISTANCE && left < right) {
Serial.println("---- ESQUERDA ----");
engineLeft.run(FORWARD);
engineRight.run(BACKWARD);
delay(1500);
}
// Deu Treta
else {
Serial.println( " -----ERROR----- " );
delay(10000);
}
delay(1000);
}
Agora a ultima coisa que sobro é axar uma maneira de alimentar o arduino sem ter que conectar no notebook, um amigo falou para arrancar o encaixe do cabo que vai no PC e soldar 2 fios de alimentação mas to com dó, procurar um adaptador ou algo do tipo.
Novamente Brigadão! Nunca mais vo me apressar tanto em programação, melhor ir um passo por vez.
Agora a ultima coisa que sobro é axar uma maneira de alimentar o arduino sem ter que conectar no notebook, um amigo falou para arrancar o encaixe do cabo que vai no PC e soldar 2 fios de alimentação mas to com dó, procurar um adaptador ou algo do tipo.
Não vejo porque necessitas de algo tão radical já que o mega tem ficha de alimentação e se o alimentares com 12V vindos de algo podes "pendurar " nesses 12V todos os teus sensores e motores.Procura por baterias LIPO