LusoRobótica - Robótica em Português

Robótica => Iniciantes => Tópico iniciado por: rjddomingues em 10 de Fevereiro de 2014, 22:56

Título: arduino motor shield R3
Enviado por: rjddomingues em 10 de Fevereiro de 2014, 22:56
Boas, estou a tentar fazer um robô que se desvie de obstáculos. Utilizo um arduino mega 2560, um motor shieldR3, e uma I/O expansion shield V7 da DfRobot e um sensor ultrassons SRF05. O meu problema é que como sou iniciante no arduino utilizei codigo de varios projectos. E agora o robo não anda. gostava de saber onde é que esta o erro no codigo, para o poder corrigir.


Segue o codigo :

Código: [Seleccione]
#include "IRremote.h"
#include <Servo.h>

//Pins for motor A
const int MotorA1 = 12;
const int MotorA2 = 3;
//Pins for motor B
const int MotorB1 = 13;
const int MotorB2 = 11;
//Pins for ultrasonic sensor
const int trigger=53;
const int echo=49;

int leftscanval, centerscanval, rightscanval, ldiagonalscanval, rdiagonalscanval;
char choice;
 
//Pin for IR control
int receiver = 5; // pin 1 of IR receiver to Arduino digital pin 5
IRrecv irrecv(receiver);           // Was "IRrecv" create instance of 'irrecv'
decode_results results;
char contcommand;
int modecontrol=0;
int power=0;

const int distancelimit = 27; //Distance limit of obstacles in front           
const int sidedistancelimit = 12; //Minimum distance in cm to obstacles at both sides of the robot (the robot will allow a shorter distance at the sides)

int distance;
int numcycles = 0;
char turndirection; //Gets 'l', 'r' or 'f' depending on which direction is free of obstacles
const int turntime = 900; //Time the robot spends turning  ... 900 original
int thereis;
Servo head;

void setup(){
  head.attach(4);
  head.write(80);
  irrecv.enableIRIn(); // Start the IR receiver
  pinMode(MotorA1, OUTPUT);
  pinMode(MotorA2, OUTPUT);
  pinMode(MotorB1, OUTPUT);
  pinMode(MotorB2, OUTPUT);
  pinMode(trigger,OUTPUT);
  pinMode(echo,INPUT);
  //Variable inicialization
  digitalWrite(MotorA1,LOW);
  digitalWrite(MotorA2,LOW);
  digitalWrite(MotorB1,LOW);
  digitalWrite(MotorB2,LOW);
  digitalWrite(trigger,LOW);
}

void go(){
   digitalWrite (MotorA1, HIGH);                             
   digitalWrite (MotorA2, LOW);
   digitalWrite (MotorB1, HIGH);
   digitalWrite (MotorB2, LOW);
}

void backwards(){
  digitalWrite (MotorA1 , LOW);                             
  digitalWrite (MotorA2, HIGH);
  digitalWrite (MotorB1, LOW);
  digitalWrite (MotorB2, HIGH);
}

int watch(){
  long howfar;
  digitalWrite(trigger,LOW);
  delayMicroseconds(5);                                                                             
  digitalWrite(trigger,HIGH);
  delayMicroseconds(15);
  digitalWrite(trigger,LOW);
  howfar=pulseIn(echo,HIGH);
  howfar=howfar*0.01657; //how far away is the object in cm
  return round(howfar);
}

void turnleft(int t){
  digitalWrite (MotorA1, LOW);                             
  digitalWrite (MotorA2, HIGH);
  digitalWrite (MotorB1, HIGH);
  digitalWrite (MotorB2, LOW);
  delay(t);
}

void turnright(int t){
  digitalWrite (MotorA1, HIGH);                             
  digitalWrite (MotorA2, LOW);
  digitalWrite (MotorB1, LOW);
  digitalWrite (MotorB2, HIGH);
  delay(t);


void stopmove(){
  digitalWrite (MotorA1 ,LOW);                             
  digitalWrite (MotorA2, LOW);
  digitalWrite (MotorB1, LOW);
  digitalWrite (MotorB2, LOW);


void watchsurrounding(){ //Meassures distances to the right, left and front and asign them in cm to the variables rightscanval, leftscanval, centerscanval
  centerscanval = watch();
  if(centerscanval<distancelimit){stopmove();}
  head.write(120);
  delay(100);
  ldiagonalscanval = watch();
  if(ldiagonalscanval<distancelimit){stopmove();}
  head.write(160);
  delay(300);
  leftscanval = watch();
  if(leftscanval<sidedistancelimit){stopmove();}
  head.write(120);
  delay(100);
  ldiagonalscanval = watch();
  if(ldiagonalscanval<distancelimit){stopmove();}
  head.write(80);
  delay(100);
  centerscanval = watch();
  if(centerscanval<distancelimit){stopmove();}
  head.write(40);
  delay(100);
  rdiagonalscanval = watch();
  if(rdiagonalscanval<distancelimit){stopmove();}
  head.write(0);
  delay(100);
  rightscanval = watch();
  if(rightscanval<sidedistancelimit){stopmove();}

  head.write(80);
  delay(300);
}

char decide(){
  watchsurrounding();
  if (leftscanval>rightscanval && leftscanval>centerscanval){
    choice = 'l';
  }
  else if (rightscanval>leftscanval && rightscanval>centerscanval){
    choice = 'r';
  }
  else{
    choice = 'f';
  }
  return choice;
}

void translateIR() { //Used when robot is switched to operate in remote control mode
  switch(results.value)
  {
  case 0x0517: //Case 'FORWARD'
    go();
    break;
  case 0x054d: //Case 'LEFT'
    turnleft(turntime);
    stopmove(); 
    break;
  case 0x0516: //Case 'OK'
    stopmove();   
    break;
  case 0x0507: //Case 'RIGHT'
    turnright(turntime);
    stopmove();
    break;
  case 0x0518: //Case 'REVERSE'
    backwards();
    break;
  case 0x0506:  //Case '*'
    modecontrol=0; stopmove(); // If an '*' is received, switch to automatic robot operating mode
    break;
  default:
    ;
  }// End Case
  delay(500); // Do not get immediate repeat
}

void loop(){
 
  if (irrecv.decode(&results)){ //Check if the remote control is sending a signal
    if(results.value==0x0509){ //If an '1' is received, turn on robot
      power=1; }
    if(results.value==0x0512){ //If an '0' is received, turn off robot
      stopmove();
      power=0; }
    if(results.value==0x0506){ //If an '*' is received, switch operating mode from automatic robot to remote control (press also "*" to return to automatic robot mode)
      modecontrol=1; //  Activate remote control operating mode
      stopmove(); //The robot stops and starts responding to the user's directions
    }
    irrecv.resume(); // receive the next value
  }
 
  while(modecontrol==1){ //The system gets into this loop during the remote control mode until modecontrol=0 (with '*')
    if (irrecv.decode(&results)){ //If something is being received
      translateIR();//Do something depending on the signal received
      irrecv.resume(); // receive the next value
     }
  }
  if(power==1){
  go();  // if nothing is wrong go forward using go() function above.
  ++numcycles;
  if(numcycles>130){ //Watch if something is around while moving forward every certain number of cycles
    watchsurrounding();
    if(leftscanval<sidedistancelimit || ldiagonalscanval<distancelimit){
      turnright(turntime);
    }
    if(rightscanval<sidedistancelimit || rdiagonalscanval<distancelimit){
      turnleft(turntime);
    }
    numcycles=0; //Restart count of cycles
  }
  distance = watch(); // use the watch() function to see if anything is ahead.
  if (distance<distancelimit){ // The robot will just stop if it is completely sure there's an obstacle ahead (must test 25 times) (needed to ignore ultrasonic sensor false signals)
      ++thereis;}
  if (distance>distancelimit){
      thereis=0;} //Count is restarted
  if (thereis > 25){
    stopmove(); // Since something is ahead, stop moving.
    turndirection = decide(); //Decide which direction to turn.
    switch (turndirection){
      case 'l':
        turnleft(turntime);
        break;
      case 'r':
        turnright(turntime);
        break;
      case 'f':
        ; //Do not turn if there was really nothing ahead
        break;
    }
    thereis=0;
  }
 }
}

Obrigado
Título: Re: arduino motor shield R3
Enviado por: StarRider em 11 de Fevereiro de 2014, 01:25
Assim de repente, veio-me à ideia aquele ditado "... com agua das malvas"   :o
Título: Re: arduino motor shield R3
Enviado por: metRo_ em 11 de Fevereiro de 2014, 11:21
Não te quero desanimar mas dificilmente alguem te vai analisar o código. Começa pelo mais simples que é colocar o robot a andar x tempo para a frente e x tempo para tras por exemplo e se fores por passos pequenos as pessoas vão-te ajudar de certeza.
Título: Re: arduino motor shield R3
Enviado por: dropes em 11 de Fevereiro de 2014, 17:41
Nunca se coloca o código total e experimenta-se a ver se funciona tudo, ainda mais quando copiado em segmentos.
Tens de testar cada função / shield até entenderes o que cada linha do código faz.
Só depois é que se pode ir acrescentando num novo, e testando de seguida.

Má prática juntar tudo numa listagem e perguntar porque é que não funciona. Era suposto funcionar?!

@StarRider lol, só agora é que fui ver o que tinhas escrito, pensei que fosse de algum escritor conhecido, és mesmo mauzinho =)
Título: Re: arduino motor shield R3
Enviado por: Nunito em 11 de Fevereiro de 2014, 18:19
Assim de repente, veio-me à ideia aquele ditado "... com agua das malvas"   :o
O StarRider a falar para quem não o conheçe, fica mal visto e dá um mau feedback ao fórum, é apenas uma opinião minha.
Título: Re: arduino motor shield R3
Enviado por: rjddomingues em 11 de Fevereiro de 2014, 18:34
Acho que me expressei mal, o código já o experimentei em outro arduino. Uma função de cada vez. Eu utilizei o codigo de outro projecto mas adaptei-o para o meu. Também tenho partes feitas por mim. Agora estou a tentar perceber que parte é que tenho mal no código e acho que já sei qual é. Vou tentar por o robô a andar sem essa parte e depois tentar aprender mais para poder modificar o código que esta mal. O único que quero dizer é que desde que descobri o forum aprendi muito. Comecei sem saber nada de electrónica ou de programação. Mas ao ler os tópicos dos outros utilizadores aprendi imenso. Andava há muito tempo para tentar tirar esta duvida, mas acho que alguns pensaram que eu queria o trabalho todo feito pelos outros.
Nunca fui assim e nunca o serei, sempre aprendi sozinho e assim continuarei. Ao StarRider só quero dizer que agradeço o convite, mas pode guardar a água das malvas toda para ele.
Título: Re: arduino motor shield R3
Enviado por: StarRider em 11 de Fevereiro de 2014, 20:06
O StarRider a falar para quem não o conheçe, fica mal visto e dá um mau feedback ao fórum, é apenas uma opinião minha.

Caro Nunito,

A senilidade tem destas coisas, deixamos de ser "politicamente correctos" (e por vezes hipócritas) e passamos a ser
pragmáticos, embora o conceito de pragmatismo empregue possa ser discutível, não me podem acusar de pelo menos
não tentar ser conciso ... de resto, é tudo uma questão de interpretação.

Abraços,
PA
Título: Re: arduino motor shield R3
Enviado por: Nunito em 11 de Fevereiro de 2014, 20:50
A senilidade tem destas coisas, deixamos de ser "politicamente correctos" (e por vezes hipócritas) e passamos a ser
pragmáticos, embora o conceito de pragmatismo empregue possa ser discutível, não me podem acusar de pelo menos
não tentar ser conciso ... de resto, é tudo uma questão de interpretação.
Cheguei a pensar que estava num fórum de Intelectualismo  :)
Foi só uma opinião minha, as pessoas não se conheçerem umas ás outras podem interpretar mal as coisas, apenas isso.

Abraços
Título: Re: arduino motor shield R3
Enviado por: senso em 11 de Fevereiro de 2014, 21:27
É a falta de tom de voz, quem não está habituado vai ler isso e interpretar como arrogância.

On-topic, não vais lá a copiar e colar bocados de código daqui e dali e esperar que funcione.
Título: Re: arduino motor shield R3
Enviado por: StarRider em 11 de Fevereiro de 2014, 23:36
Boas novamente,

Agora mais a sério, e colocando de lado a forma como o tópico foi lançado,  por muita vontade que se possa
ter em ajudar, neste caso acaba por ser um exercício de futilidade, tanto mais que para ser verdadeiramente
"debugado" é necessário ter o hardware.

É por isso que os programadores de firmware para embedded systems levam os "big bucks"  ;)

Abraços,
PA