Go Down

Topic: Array de sensores CNY70, (Read 2619 times) previous topic - next topic

Fred Gomes

ahh..
eu já percebi o que queres dizer..
era para alterar o meu código e deixar de usar os valores binários não é? , por causaimo código  da minha dúvida anterior..

mas essa questão já está resolvida, vê o último código que eu deixei, eu é-me retornado um valor décimal (valor décima respectivo ao valor em binário que o senval[] contêm (não te esqueças que estou a efectuar uma leitura digital).

e a minha dúvida agora é consoante o valor biinário/decimal que eu obtenho quero obter um erro (podes ver na programação),

e o que eu queria que me ajudasses era a resolver este meu problema, já experimentei colocar um seguimento de IF´s para o valor decimal(respectivo ao codigo em binario que tenho na programação ) , e em função desse valor decimal obter um erro, mas ao fazer o print de error este nunca me varia de 0.0, sabes pq isso aocntece?.. era ai que queria que me ajudasses..

Fred Gomes

quanto a isto:

Code: [Select]
(valorsensor==0b00100) || (valorsensor=0b01110)
eu estava a pensar que o que eu estava a fazer ia fazer: se valor sensor = XXX, OU YYY, ao fazer o OU ele ia substituir o que estava em XXX por YYY e se se verifica-se apenas um destes casos ele efectuava aquela condição..

mas vou expeirmentar como disseste..
ja digo os resultados..

Fred Gomes

Code: [Select]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/

int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
 Serial.begin(9600);
 pinMode (motor_right, OUTPUT);
 pinMode (motor_left, OUTPUT);
 pinMode (2, INPUT);    
 pinMode (3, INPUT);    
 pinMode (4, INPUT);    
 pinMode (5, INPUT);
 pinMode (6, INPUT);
 digitalWrite (2, HIGH);
 digitalWrite (3, HIGH);
 digitalWrite (4, HIGH);
 digitalWrite (5, HIGH);
 digitalWrite (6, HIGH);
}
void loop(){
errorval = LineError();



 if(errorval < 0.0){
   vel_left = (int)(maxvel*(1-fabs(errorval)));
   vel_right = (int)(maxvel);
 }
 else if(errorval > 0.0){
   vel_left = (int)(maxvel);
   vel_right = (int)(maxvel*(1-errorval));
 }
 else{
   vel_left = (int)(maxvel);
   vel_right = (int)(maxvel);
 }
 //Fazer actuar os motores:
 analogWrite(motor_right,vel_right);
 analogWrite(motor_left, vel_left);

 delay(200);
 Serial.println(errorval);

}

// escolher o sensor que esta sobre a linha

double LineError()
{
 double error = 0.0;
 int valorsensor = 0;
 for (int i=0; i < nsensores; i++){
 
   senval[i] = digitalRead (sensor[i]);
 }
 valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
 Serial.println ("valor do sensor");
 Serial.println(valorsensor);
 delay(500);


 if (valorsensor== 0b10000){
   valorsensor = 16;
   error = -1.0;
 }
 else if (valorsensor == 0b11000){
   valorsensor = 24;
   error = -0.75;
 }
 else if (valorsensor == 0b01000){
   valorsensor = 8;
   error = -0.5;
 }
 else if (valorsensor == 0b01100){
   valorsensor = 12;
   error = -0.25;
 }
 else if((valorsensor==0b00100) || (valorsensor=0b01110)){
   valorsensor = 4 ||14;
   error = 0.0;
 }
 else if (valorsensor == 0b00110){
   valorsensor = 6;
   error = 0.25;
 }
 else if (valorsensor == 0b00010){
   valorsensor = 2;
   error = 0.5;
 }
 else if (valorsensor == 0b00011){
   valorsensor = 3;
   error = 0.75;
 }
 else if (valorsensor == 0b00001){
   valorsensor = 1;
   error = 1.0;
 
 }
 return error;
}


devia funcionar, e o error não me varia de 0.0..

Italo Lima

Problema na mesma linha :)

olha as igualdades. Tem um == e um =.

Fred Gomes

é isso:D
já funciona...

muito obrigado pela ajuda...

olha, se quiseres , tens aqui um forum muito fixe..: lusorobotica.com , de robotica..

podemos encontrar-nos lá;) e ves lá o meu projecto final de curso que ando a construir..

Go Up