LusoRobótica - Robótica em Português
Robótica => Projectos de robótica => Projectos em desenvolvimento => Tópico iniciado por: fred gomes em 23 de Janeiro de 2010, 11:38
-
Boas pessoa.
Hoje decidi pegar no projecto dum seguidor de linhas (utilizando o arduino) que se encontrava pendente devido a uns problemas que tinha com o funcionamento dele e que não os tinha conseguido resolver..
programação que estou a utilizar é a seguinte:
int motor_right1 = 5;
int motor_right2 = 6;
int motor_left1 = 10;
int motor_left2 = 11;
int sensor_right = 5;
int sensor_left = 0;
int valor = 0;
int valor1 = 0;
void setup(){
Serial.begin(9600);
pinMode (motor_right1, OUTPUT);
pinMode (motor_right2, OUTPUT);
pinMode (motor_left1, OUTPUT);
pinMode (motor_left2, OUTPUT);
}
void loop(){
valor = analogRead (sensor_right);
Serial.print (valor);
delay (200);
if (valor < 350){
analogWrite (motor_right1, 0);
analogWrite (motor_right2, 0);
}
else {
analogWrite (motor_right1,255);
analogWrite (motor_right2, 0);
}
Serial.print(" ");
valor1 = analogRead (sensor_left);
Serial.println (valor1);
delay(200);
if (valor1 <350){
analogWrite (motor_left1,0);
analogWrite (motor_left2,0);
}
else{
analogWrite (motor_left1,255);
analogWrite (motor_left2,0);
}
if (valor > 350 && valor1 < 350){
analogWrite (motor_right1,0 );
analogWrite (motor_right2, 0);
analogWrite (motor_left1, 255);
analogWrite (motor_left2,0);
while (valor > 350 && valor1 >350);
}
if (valor <350 && valor1 > 350){
analogWrite (motor_right1, 255);
analogWrite (motor_right1, 0);
analogWrite (motor_left1, 255);
analogWrite (motor_left1, 0);
while (valor > 350 && valor1 >350);
}
}
os sensores dão os valores esperados, ora muito altos, ora muito baixos, mas os motores nao se comportam segundo a programação.., estou a utilizar o L293D,
alguém sabe o porquê de não obter os resultados esperados?
-
Boas.
alteração de código (estive a ver melhor e o código que tinha tinha inversão de marcha incluida, não a estou a utilizar agora...
int motor_right = 3;
int motor_left = 6;
int sensor_right = 5;
int sensor_left = 0;
int valor = 0;
int valor1 = 0;
void setup(){
Serial.begin(9600);
pinMode (motor_right, OUTPUT);
pinMode (motor_left, OUTPUT);
}
void loop(){
valor = analogRead (sensor_right);
Serial.print (valor);
delay(200);
if (valor < 350){
analogWrite (motor_right, 0);
}
else {
analogWrite (motor_right,255);
}
Serial.print(" ");
valor1 = analogRead (sensor_left);
Serial.println (valor1);
delay(200);
if (valor1 <350){
analogWrite (motor_left,0);
}
else{
analogWrite (motor_left,255);
}
if (valor > 350 && valor1 < 350){
analogWrite (motor_right,0 );
analogWrite (motor_left, 255);
while (valor > 350 && valor1 >350);
}
if (valor <350 && valor1 > 350){
analogWrite (motor_right, 255);
analogWrite (motor_left, 0);
while (valor > 350 && valor1 >350);
}
}
agora os motores andam e param consoante o valor dos sensores, mas se colocar o sensor da esquerda no branco e o da direita manter-se no preto, o da direita abranda um bocado, e o da esquerda abranca mais do que o da direita e continua andar "aos solabancos, muito de vagarinho", isso nao deveria acontecer, o da direita deveria continuar andar normalmente e o da esquerda parar...o mesmo acontece para o oposto, sensor da direita no preto, e da esquerda no branco..
alguém sabe a que se deve isto?
Obrigado.
-
diz-nos como tens tu ligado o circuito (pelo menos a parte do arduino + ponte h + motores)..
-
Boas Ricardo..
Então...
### Pinos da Ponte H--->
pino1.+ da fonte
pino2.saída PWM 6 do arduino
pino3.motor right
pino 4 e 5. massa
pino6.motor left
pino7.saída PWM 3 do arduino
pino8.+ da fonte
essa parte penso que está bem ligada, caso contrário os motores nem andariam.o meu problema é que ao colocar um sensor no branco e outro no preto , o motor que deveria parar nao para por completo (anda aos solbancos de vagarinho) e o reduz a sua velocidade mas anda ligeiramente mais depressa..,
cumps
-
Uma coisa boa que fazias era meter um Serial.print() dos valores no loop, que é para veres quais são os valores...
Aconselhava-te a tirar os whiles que tens dentro dos IFs... Pode muito bem ser isso que esteja a causar os solavancos...
-
Boas mycrobyte :)
Segui os teus conselhos, e já funcionou :D , muitissimo obrigado...
e já agora, sabes me dizer o porquê dos whiles provocarem os solabancos nos motores?, eu pensava que isso deveria ter haver com alguns "delay´s"..
-
Boas mycrobyte :)
Segui os teus conselhos, e já funcionou :D , muitissimo obrigado...
e já agora, sabes me dizer o porquê dos whiles provocarem os solabancos nos motores?, eu pensava que isso deveria ter haver com alguns "delay´s"..
É muito simples, ao definires valores concretos, estás a partir do princípio que o valor real nunca anda próximo desse valor que defines... Ora, pode acontecer que o valor real seja até exactamente o valor que tu definiste como margem...
Agora supõe outra coisa. Imagina que os valores dos 2 sensores são: 900 e 200
tens:
valor = 900 e valor1 = 200
Agora vê o teu código... Relembro que o código é lido sequencialmente e as coisas não são executadas em simultâneo.
void loop(){
valor = analogRead (sensor_right);
Serial.print (valor);
delay(200);
if (valor < 350){ não entra aqui, porque valor = 900
analogWrite (motor_right, 0);
}
else { Entra aqui...
analogWrite (motor_right,255);
}
Serial.print(" ");
valor1 = analogRead (sensor_left);
Serial.println (valor1);
delay(200);
if (valor1 <350){ Entra aqui porque valor1 = 200
analogWrite (motor_left,0);
}
else{
analogWrite (motor_left,255);
}
if (valor > 350 && valor1 < 350){ Entra aqui, pelas mesmas razões
analogWrite (motor_right,0 );
analogWrite (motor_left, 255);
while (valor > 350 && valor1 >350);
}
if (valor <350 && valor1 > 350){
analogWrite (motor_right, 255);
analogWrite (motor_left, 0);
while (valor > 350 && valor1 >350);
}
}
Ora, o que é executado, está sublinhado... E resumidamente, por ordem:
- Motor direito on (255)
- Motor esquerdo off (0)
- Motor direito off (0)
- Motor esquerdo on (255)
Ora cá está o belo do solavanco.
Para já não falar que os whiles, penso que querias que não saísse dali enquanto se verificasse a condição que tens no IF. Ora vê:
if (valor > 350 && valor1 < 350){
while (valor > 350 && valor1 >350);
}
Se as condições não são as mesmas, o while não faz ali nada, pois quando valor > 350 && valor1 >350, nem chegas a executar o que está dentro do IF.
Isto fez algum sentido? Espero ter tirado algumas dúvidas a mais pessoal. ;)
PS: é microbyte :D
-
já percebi o motivo dos solabancos..lool, tens toda a razão..
eu tinha muitas coisas desnecessárias no código (apesar de não estarem propiamente incorrectas só estavam ali atrapalhar),
já alterei o codigo e ja funciona na prefeição...
mais uma vez mto obrigado pelas explicações mycrobite ;)
-
ups :-X
sorry, ...microbyte..
-
coloca aqui o codigo final sff...
-
Olá..
neste tópico tens la o código.
"Robot de Busca e Salvamento!"
está logo no inicio..