collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[Ontem às 15:31]


Arame de Estendal por almamater
[18 de Abril de 2024, 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

Autor Tópico: um carro  (Lida 12508 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline joao rexinho

  • Mini Robot
  • *
  • Mensagens: 183
  • http://sites.google.com/site/roboticaelectronica/
Re: um carro
« Responder #15 em: 06 de Março de 2010, 01:05 »
dicidi optar pelo servo. So que deparo me com um problema a programaçao :-\ A unica  programaçao que encontrei para o servo com sensor IR em cima mas utiliza servos para andar e eu quero atravez de uma ponte H. andei a alterar umas coisas no codigo a fazer o compiling mas agora surge me este erro que nao percebo "error: declaration of 'motor_left' as array of functionsBad error line: -14" o codigo e o seguinte

Código: [Seleccione]
int sensorIR = 0;
int calibIR = 10000;
int valIR;

int sensorPot = 2;
int valPot;

int button = 5;
int valButton;
int turnOnOff=0;

int servoTU = 9;
int motor_left[] = {9, 10};
int motor_right[] = {11, 12};
unsigned long lastPulseTU;
int pulseWidthR = 1250;
int pulseWidthL = 1750;
int pulseWidthRTU = 0;
int pulseWidthLTU = 0;

int pulseWidthTU = 1710;
int centerTU = 1430;
int rangeTU=1360;

int motor_left[] = 20;
int refreshTimeServoR = 20;
int refreshTimeServoTU = 20;

int led=3;

int angleDepart=0;
signed long angle=0;
int angleMin=-45;
int angleMax=45;
int nbAngle;
int distance[180];
int distanceMax[18];
int distanceMin[18];
int distanceMoy[18];
int direction[18];
int directionTU;
int sensTU=1;
int turn=0;
int n;

void setup()
void motor_left[](int pulseWidth){
  if(millis()-lastPulseL >= refreshTimeServoL){
    digitalWrite(motor_left[0], LOW);
    digitalWrite(motor_left[1], HIGH);
    delayMicroseconds(pulseWidth);
    digitalWrite(motor_right[0], HIGH);
    digitalWrite(motor_right[1], LOW);
    lastPulseL=millis();
  }
}

void motor_right[](int pulseWidth){
  if(millis()-lastPulseR >= refreshTimeServoR){
    digitalWrite(motor_left[0], HIGH);
    digitalWrite(motor_left[1], LOW);
    delayMicroseconds(pulseWidth);
    digitalWrite(motor_right[0], LOW);
    digitalWrite(motor_right[1], HIGH);
    lastPulseR=millis();
  }
}

int servoT(int pulseWidth){
  if(millis()-lastPulseTU >= refreshTimeServoTU){
    digitalWrite(servoTU,HIGH);
    delayMicroseconds(pulseWidth);
    digitalWrite(servoTU,LOW);
    lastPulseTU=millis();
    return 1;
  }
  return 0;
}

int getPulseT(){
  int pulse;
  if(angle<=angleMin){
   sensTU=0;
  // displaySonar();
   //directionTU=getDirection();
  }
  if(angle>=angleMax){
   //directionTU=getDirection();
  // displaySonar();
   sensTU=1;
  }
  return (centerTU+((angle)*rangeTU/90));
}

int readSensorIR(){
  return (calibIR/analogRead(sensorIR));         
}

void setLed(int valLed){
  analogWrite(led,valLed);
}


int readSensorPot(){
  return (centerTU+long(analogRead(sensorPot))*1000/1024-500);
}                     

int readButton(){
  unsigned long contactTime;
  valButton=analogRead(button);
 //Serial.print(valButton);
 //Serial.print(" ");
  if(valButton<512)
   return turnOnOff;
  contactTime=millis();
  while(valButton>=512){
   valButton=analogRead(button);
   //Serial.print(valButton);
   //Serial.print("\n");
  }
 if(millis()-contactTime<20)
   return turnOnOff;
 angle=angleDepart;
 return(1-turnOnOff);
}

int getDirection(){
int angle=0,i,j,n=0,seg=0,dir=4,maxSeg=0;
for(i=0;i<18;i++){
   distanceMax[i]=0;
   distanceMin[i]=10000;
   distanceMoy[i]=0;
   for(j=0;j<5;j++){
      if(distance[n+j]>distanceMax[i])
       distanceMax[i]=distance[n+j];
      if(distance[n+j]<distanceMin[i])
       distanceMin[i]=distance[n+j];
     distanceMoy[i]=distance[n+j];
     //Serial.print(distance[n+j]);
     //Serial.print(" ");
   }   
   direction[i]=0;
   if(distanceMax[i]>110&&distanceMin[i]>55&&distanceMoy[i]>77){
    seg++;
    if(seg>maxSeg)
    maxSeg=seg;
    direction[i]=seg;
   }
   else
    seg=0;
   n+=5; 
 }
 for(i=0;i<18;i++){
   if(direction[i]==maxSeg){
    dir=i-maxSeg/2;
    dir=dir*5-40;
   }
// Serial.print(direction[i]);
 }
 
 //Serial.print(" dir ");
// Serial.print(" \n");
 return dir; 
}

void displaySonar(){
  int n;
  for(n=0;n<nbAngle;n++){
   Serial.print(distance[n]);
   Serial.print(" ");
  }
 Serial.print("\n");
}

void pilote2(int valUS,int valTU){
  int acc=0;
  directionTU=getDirection()/5;
  acc=(30*max(min(valUS,100),3)/100)-8;
  // Serial.print(acc,DEC);
  //Serial.print("acc   ");
  // Serial.print(directionTU);
  // Serial.print(" ");
   pulseWidthR = min(max(pulseWidthR-acc-directionTU,1250),1750);
   pulseWidthL = max(min(pulseWidthL+acc-directionTU,1750),1250);
   
  // Serial.print(pulseWidthR,DEC);
  // Serial.print("pR   ");
  // Serial.print(pulseWidthL,DEC);
  // Serial.print("pL   ");
  //Serial.print("\n");
}

void pilote(int valUS,int valTU){
  int acc=0,dirR=75,dirL=75;
  directionTU=getDirection();
  if(directionTU>0){
    dirR=75;
    dirL=75-150*directionTU/45;
   }
  if(directionTU<0){
    dirL=75;
    dirR=75-150*directionTU/45;
   }
 
  acc=(30*max(min(valUS,100),3)/100)-15;
  //Serial.print(acc,DEC);
  //Serial.print("acc   ");
  //Serial.print(directionTU);
  // Serial.print("directU   ");
 
  //Serial.print(dirL);
  //Serial.print(" dirL   ");
  // Serial.print(dirR);
  //Serial.print("dirR ");
 
 
  pulseWidthL = max(min(pulseWidthL+acc,1675),1325);
  pulseWidthR = min(max(pulseWidthR-acc,1325),1675);
 
  pulseWidthL = max(min(pulseWidthL+dirL,1750),1250); 
  pulseWidthR = min(max(pulseWidthR-dirR,1250),1750);
 
 
  // Serial.print(pulseWidthR,DEC);
  // Serial.print("pR   ");
  // Serial.print(pulseWidthL,DEC);
  // Serial.print("pL   ");
  // Serial.print("\n");
}

void setup(){
  pinMode(servoTU,OUTPUT);
  pinMode(motor_left[i], OUTPUT);
  pinMode(motor_right[i], OUTPUT);
 
  pinMode(sensorUS,INPUT);
  pinMode(button,INPUT);

  pinMode(13,OUTPUT);
  lastPulseL=millis();
  lastPulseR=millis();
  lastPulseTU=millis();
 
  nbAngle=angleMax-angleMin;
  for (int n=0;n<nbAngle;n++)
   distance[n]=100;
 }

void loop(){ 
  turnOnOff=readButton();
 // Serial.print(turnOnOff);
 // Serial.print("  ");
 
  valIR=readSensorIR();
 
 
  setLed((100-min(max(valIR,0),100))*1024/100);
 
 // Serial.print(valIR,DEC);
 // Serial.print("cm   ");
  valUS=readSensorUS();
   
 // Serial.print(valUS);
 // Serial.print("cm   ");
 
  if(turnOnOff==1){
    pilote2(valUS,valIR);
   
   servoL(pulseWidthL);
   servoR(pulseWidthR);
   turn=servoT(getPulseT());
   if(turn==1){
    distance[angle+angleMax]=valIR;
    if(sensTU==1)
     angle=angle-1;
    else
     angle=angle+1;
   }
  }
  else{
   valPot=(valPot+readSensorPot())/2;
   servoT(valPot);
  }
 
  //Serial.print(valPot);
  //erial.print(" \n");
}

Digam me se esta bem?
« Última modificação: 06 de Março de 2010, 01:08 por joao rexinho »
http://sites.google.com/site/roboticaelectronica/home
Estudante de Engenharia Eletrônica e Telecomunicações em Aveiro

Offline vicardosof

  • Mini Robot
  • *
  • Mensagens: 223
Re: um carro
« Responder #16 em: 06 de Março de 2010, 01:16 »
Já viste que existe um motor_left como variável e ao mesmo tempo sub? Como o compilador irá saber qual estás a referir?

Offline joao rexinho

  • Mini Robot
  • *
  • Mensagens: 183
  • http://sites.google.com/site/roboticaelectronica/
Re: um carro
« Responder #17 em: 06 de Março de 2010, 01:25 »
Entao como devo por  ja tentei po no[] um i como aparece num codigo de ponte H
http://sites.google.com/site/roboticaelectronica/home
Estudante de Engenharia Eletrônica e Telecomunicações em Aveiro

Offline vicardosof

  • Mini Robot
  • *
  • Mensagens: 223
Re: um carro
« Responder #18 em: 06 de Março de 2010, 01:38 »
Pelo que percebo de programação, podes mudar o nome da variável:
int motor_left[] = {9, 10};
int motor_right[] = {11, 12};

podes trocar para:
int motorleft[] = {9, 10};
int motorright[] = {11, 12};
Só não te esqueças de trocar no código inteiro!

Offline joao rexinho

  • Mini Robot
  • *
  • Mensagens: 183
  • http://sites.google.com/site/roboticaelectronica/
Re: um carro
« Responder #19 em: 06 de Março de 2010, 02:35 »
Continua a dar o mesmo erro  :(
http://sites.google.com/site/roboticaelectronica/home
Estudante de Engenharia Eletrônica e Telecomunicações em Aveiro

Offline vicardosof

  • Mini Robot
  • *
  • Mensagens: 223
Re: um carro
« Responder #20 em: 06 de Março de 2010, 02:40 »
Apaga a linha do erro e tenta compilar, caso o erro pare devemos focalizar numa linha e caso o erro aconteça em outra linha, devemos focar ao código

Offline joao rexinho

  • Mini Robot
  • *
  • Mensagens: 183
  • http://sites.google.com/site/roboticaelectronica/
Re: um carro
« Responder #21 em: 06 de Março de 2010, 03:05 »
continua , apaguei  as linhas que encoliam motor_left uma a uma depois passou  para motor_right e depois pra a "linha if(millis()-lastPulseL >= refreshTimeServoL){" e de seguida com as digitalWrite :( :( o que devo fazer???????????
« Última modificação: 06 de Março de 2010, 12:13 por joao rexinho »
http://sites.google.com/site/roboticaelectronica/home
Estudante de Engenharia Eletrônica e Telecomunicações em Aveiro

Offline joao rexinho

  • Mini Robot
  • *
  • Mensagens: 183
  • http://sites.google.com/site/roboticaelectronica/
Re: um carro
« Responder #22 em: 06 de Março de 2010, 13:30 »
tive alterar tudo de novo e deu me isto:
Código: [Seleccione]
int sensorIR = 0;
int calibIR = 10000;
int valIR;

int sensorPot = 2;
int valPot;

int button = 5;
int valButton;
int turnOnOff=0;

int servoTU = 8;
int motorleft[] = {9, 10};
int motorright[] = {11, 12};
unsigned long lastPulseR;
unsigned long lastPulseL;
unsigned long lastPulseTU;
int pulseWidthR = 1250;
int pulseWidthL = 1750;
int pulseWidthRTU = 0;
int pulseWidthLTU = 0;

int pulseWidthTU = 1710;
int centerTU = 1430;
int rangeTU=1360;

int refreshTimeServoL = 20;
int refreshTimeServoR = 20;
int refreshTimeServoTU = 20;

int led=3;

int angleDepart=0;
signed long angle=0;
int angleMin=-45;
int angleMax=45;
int nbAngle;
int distance[180];
int distanceMax[18];
int distanceMin[18];
int distanceMoy[18];
int direction[18];
int directionTU;
int sensTU=1;
int turn=0;
int n;

void servoL(int pulseWidth){
  if(millis()-lastPulseL >= refreshTimeServoL){
    digitalWrite(motorleft[0], LOW);
    digitalWrite(motorleft[1], HIGH);
    delayMicroseconds(pulseWidth);
    digitalWrite(motorright[0], HIGH);
    digitalWrite(motorright[1], LOW);
    lastPulseL=millis();
  }
}

void servoR(int pulseWidth){
  if(millis()-lastPulseR >= refreshTimeServoR){
    digitalWrite(motorleft[0], HIGH);
    digitalWrite(motorleft[1], LOW);
    delayMicroseconds(pulseWidth);
    digitalWrite(motorright[0], LOW);
    digitalWrite(motorright[1], HIGH);
    lastPulseR=millis();
  }
}

int servoT(int pulseWidth){
  if(millis()-lastPulseTU >= refreshTimeServoTU){
    digitalWrite(servoTU,HIGH);
    delayMicroseconds(pulseWidth);
    digitalWrite(servoTU,LOW);
    lastPulseTU=millis();
    return 1;
  }
  return 0;
}

int getPulseT(){
  int pulse;
  if(angle<=angleMin){
   sensTU=0;
  // displaySonar();
   //directionTU=getDirection();
  }
  if(angle>=angleMax){
   //directionTU=getDirection();
  // displaySonar();
   sensTU=1;
  }
  return (centerTU+((angle)*rangeTU/90));
}

int readSensorIR(){
  return (calibIR/analogRead(sensorIR));         
}

void setLed(int valLed){
  analogWrite(led,valLed);
}



int readSensorPot(){
  return (centerTU+long(analogRead(sensorPot))*1000/1024-500);
}                     

int readButton(){
  unsigned long contactTime;
  valButton=analogRead(button);
 //Serial.print(valButton);
 //Serial.print(" ");
  if(valButton<512)
   return turnOnOff;
  contactTime=millis();
  while(valButton>=512){
   valButton=analogRead(button);
   //Serial.print(valButton);
   //Serial.print("\n");
  }
 if(millis()-contactTime<20)
   return turnOnOff;
 angle=angleDepart;
 return(1-turnOnOff);
}

int getDirection(){
int angle=0,i,j,n=0,seg=0,dir=4,maxSeg=0;
for(i=0;i<18;i++){
   distanceMax[i]=0;
   distanceMin[i]=10000;
   distanceMoy[i]=0;
   for(j=0;j<5;j++){
      if(distance[n+j]>distanceMax[i])
       distanceMax[i]=distance[n+j];
      if(distance[n+j]<distanceMin[i])
       distanceMin[i]=distance[n+j];
     distanceMoy[i]=distance[n+j];
     //Serial.print(distance[n+j]);
     //Serial.print(" ");
   }   
   direction[i]=0;
   if(distanceMax[i]>110&&distanceMin[i]>55&&distanceMoy[i]>77){
    seg++;
    if(seg>maxSeg)
    maxSeg=seg;
    direction[i]=seg;
   }
   else
    seg=0;
   n+=5; 
 }
 for(i=0;i<18;i++){
   if(direction[i]==maxSeg){
    dir=i-maxSeg/2;
    dir=dir*5-40;
   }
// Serial.print(direction[i]);
 }
 
 //Serial.print(" dir ");
// Serial.print(" \n");
 return dir; 
}

void displaySonar(){
  int n;
  for(n=0;n<nbAngle;n++){
   Serial.print(distance[n]);
   Serial.print(" ");
  }
 Serial.print("\n");
}

void pilote2(int valTU){
  int acc=0;
  directionTU=getDirection()/5;
  // Serial.print(acc,DEC);
  //Serial.print("acc   ");
  // Serial.print(directionTU);
  // Serial.print(" ");
   pulseWidthR = min(max(pulseWidthR-acc-directionTU,1250),1750);
   pulseWidthL = max(min(pulseWidthL+acc-directionTU,1750),1250);
   
  // Serial.print(pulseWidthR,DEC);
  // Serial.print("pR   ");
  // Serial.print(pulseWidthL,DEC);
  // Serial.print("pL   ");
  //Serial.print("\n");
}

void pilote(int valUS,int valTU){
  int acc=0,dirR=75,dirL=75;
  directionTU=getDirection();
  if(directionTU>0){
    dirR=75;
    dirL=75-150*directionTU/45;
   }
  if(directionTU<0){
    dirL=75;
    dirR=75-150*directionTU/45;
   }
 
  acc=(30*max(min(valUS,100),3)/100)-15;
  //Serial.print(acc,DEC);
  //Serial.print("acc   ");
  //Serial.print(directionTU);
  // Serial.print("directU   ");
 
  //Serial.print(dirL);
  //Serial.print(" dirL   ");
  // Serial.print(dirR);
  //Serial.print("dirR ");
 
 
  pulseWidthL = max(min(pulseWidthL+acc,1675),1325);
  pulseWidthR = min(max(pulseWidthR-acc,1325),1675);
 
  pulseWidthL = max(min(pulseWidthL+dirL,1750),1250); 
  pulseWidthR = min(max(pulseWidthR-dirR,1250),1750);
 
 
  // Serial.print(pulseWidthR,DEC);
  // Serial.print("pR   ");
  // Serial.print(pulseWidthL,DEC);
  // Serial.print("pL   ");
  // Serial.print("\n");
}

void setup(){
  pinMode(servoTU,OUTPUT);


 

  pinMode(button,INPUT);

  pinMode(13,OUTPUT);
  lastPulseL=millis();
  lastPulseR=millis();
  lastPulseTU=millis();
 
  nbAngle=angleMax-angleMin;
  for (int n=0;n<nbAngle;n++)
   distance[n]=100;
 }

void loop(){ 
  turnOnOff=readButton();
 // Serial.print(turnOnOff);
 // Serial.print("  ");
 
  valIR=readSensorIR();
 
 
  setLed((100-min(max(valIR,0),100))*1024/100);
 
 // Serial.print(valIR,DEC);
 // Serial.print("cm   ");

   
 // Serial.print(valUS);
 // Serial.print("cm   ");
 
  if(turnOnOff==1){
    pilote2(valIR);
   
   servoL(pulseWidthL);
   servoR(pulseWidthR);
   turn=servoT(getPulseT());
   if(turn==1){
    distance[angle+angleMax]=valIR;
    if(sensTU==1)
     angle=angle-1;
    else
     angle=angle+1;
   }
  }
  else{
   valPot=(valPot+readSensorPot())/2;
   servoT(valPot);
  }
 
  //Serial.print(valPot);
  //erial.print(" \n");
}

agora nao de erro. Vou montar o esquema e ver se funciona ::)
http://sites.google.com/site/roboticaelectronica/home
Estudante de Engenharia Eletrônica e Telecomunicações em Aveiro

Offline vicardosof

  • Mini Robot
  • *
  • Mensagens: 223
Re: um carro
« Responder #23 em: 06 de Março de 2010, 13:44 »
Então era o que eu falei no inicio, variável ao mesmo tempo void.

Offline joao rexinho

  • Mini Robot
  • *
  • Mensagens: 183
  • http://sites.google.com/site/roboticaelectronica/
Re: um carro
« Responder #24 em: 06 de Março de 2010, 18:03 »
Nao funciona :( :( :( o servo faz um movimento e volta ao local onde começou e depois nao mexe mais :( :( peço ajuda novamente visto que so um elemento do forum e que me responde.
http://sites.google.com/site/roboticaelectronica/home
Estudante de Engenharia Eletrônica e Telecomunicações em Aveiro

Offline vicardosof

  • Mini Robot
  • *
  • Mensagens: 223
Re: um carro
« Responder #25 em: 06 de Março de 2010, 18:17 »
Irei fazer um resumo do ocorrido:

Tens dois motores DC e queres fazer com que eles movimentem um carro e desvie de objectos.

O problema do motor para ocorre quando? Quando ligas ou quando desvia?

Offline joao rexinho

  • Mini Robot
  • *
  • Mensagens: 183
  • http://sites.google.com/site/roboticaelectronica/
Re: um carro
« Responder #26 em: 06 de Março de 2010, 18:51 »
os motores DC nao se mexem e o servo so faz quando se liga
http://sites.google.com/site/roboticaelectronica/home
Estudante de Engenharia Eletrônica e Telecomunicações em Aveiro

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: um carro
« Responder #27 em: 06 de Março de 2010, 20:40 »
continua , apaguei  as linhas que encoliam motor_left uma a uma depois passou  para motor_right e depois pra a "linha if(millis()-lastPulseL >= refreshTimeServoL){" e de seguida com as digitalWrite :( :( o que devo fazer???????????
Quando é assim procura por {} e () e [] mal fechados ou uma ; ou : no sitio errado, ou usar = num if em vez de ==
Avr fanboy

Offline joao rexinho

  • Mini Robot
  • *
  • Mensagens: 183
  • http://sites.google.com/site/roboticaelectronica/
Re: um carro
« Responder #28 em: 09 de Março de 2010, 20:07 »
montei exactamente o circuito como esta neste esquema http://arduinofun.com/blog/2009/10/25/duel-motor-driver/  e o SN754410NE começou a aquecer muito ate me queimei ma os motores n funcionaram e fiz outro esquema com esta aqui http://itp.nyu.edu/physcomp/Labs/DCMotorControl e começou a aquecer e o motor nao funcionava. será que o SN754410NE queimou?
http://sites.google.com/site/roboticaelectronica/home
Estudante de Engenharia Eletrônica e Telecomunicações em Aveiro

Offline vicardosof

  • Mini Robot
  • *
  • Mensagens: 223
Re: um carro
« Responder #29 em: 09 de Março de 2010, 20:30 »
Algum indicio de peça "aberta"?