Offline
Newbie
Karma: 0
Posts: 20
|
 |
« on: September 20, 2012, 01:40:05 pm » |
Estou fazendo um seguidor de linha com um arduino uno, o robô em sim ja esta quase pronto, mas estou com problema na hora de executar o codigo. As ligações estão corretas e os sensores estão enviando os dados normalmente mas o arduino não esta enviando o sinal de nivel alto para ligar os motores, testei conectando um cabo direto de onde devia vir os sinais do arduino no polo possitivo e ele funciona, http://www.youtube.com/watch?v.....e=youtu.be o codigo para controlar o robô é este: const int PinoSensor = 0; const int PinoSensor2 = 1;
const int motorpin1 = 3; const int motor2pin1 = 5;
int ValorSensor = 0;
int ValorSensor2 = 1;
void setup(){ Serial.begin(9600); pinMode(motorpin1,OUTPUT);
pinMode(PinoSensor1,INPUT); pinMode(motor2pin1,OUTPUT);
pinMode(PinoSensor2,INPUT); } void loop(){ int sensorValue = analogRead(PinoSensor); Serial.println(sensorValue); if (ValorSensor >=100){
digitalWrite(motorpin2,HIGH);
} else { digitalWrite(motorpin1,LOW);
} sensorValue = analogRead(PinoSensor2); if (ValorSensor2 >= 350){
digitalWrite(motor2pin1,HIGH);
} else { digitalWrite(motor2pin1,LOW);
} } e para obter os valores dos sensores é este o codigo que estou usando: void setup() { Serial.begin(9600); //Necessary to set up Serial port } void loop() { Serial.print(analogRead(0)); Serial.print(' '); delay(1000); //Set the number to change frequency of readings. } Não estou conseguindo entender qual é o erro, se alguem poder me ajudar agradeço
|
|
|
|
|
Logged
|
|
|
|
|
Portugal
Offline
God Member
Karma: 9
Posts: 744
Tomorrow I will know a BIT more than yesterday
|
 |
« Reply #1 on: September 21, 2012, 02:26:33 am » |
No primeiro bloco de codigo tens erros de sintaxe (nomes de variaveis mal) Corregi para ficar assim: const int PinoSensor1 = 0; const int PinoSensor2 = 1; const int motorpin1 = 3; const int motor2pin1 = 5; int ValorSensor = 0; int ValorSensor2 = 1; void setup() { Serial.begin(9600); pinMode(motorpin1,OUTPUT); pinMode(PinoSensor1,INPUT); pinMode(motor2pin1,OUTPUT); pinMode(PinoSensor2,INPUT); } void loop() { int sensorValue = analogRead(PinoSensor1); Serial.println("Valor lido Sensor 1:"); Serial.println(sensorValue); //que leitura obtens aqui?? if (ValorSensor >=100)digitalWrite(motorpin1,HIGH); else digitalWrite(motorpin1,LOW); sensorValue = analogRead(PinoSensor2); //a variavel sensorValue esta a ser recarregada aqui para o outro sensor queres mesmo isso? if (ValorSensor2 >= 350)digitalWrite(motor2pin1,HIGH); else digitalWrite(motor2pin1,LOW); delay(1000); } Testa a ver o que faz agora
|
|
|
|
« Last Edit: September 21, 2012, 02:54:05 am by HugoPT »
|
Logged
|
Debian,Mint,Ubuntu Arduino Mega 2560 Arduino Nano Arduino Duemilanove MAC OS Montain Lion Raspberry PI Model B
|
|
|
|
'round the world...
Offline
Edison Member
Karma: 19
Posts: 2307
|
 |
« Reply #2 on: September 21, 2012, 06:50:47 am » |
Que valores estás a ver vindo dos sensores? Porque não testas o hardware primeiro actuando os motores com delays primeiro para teres a certeza que os motores estão a funcionar? Por último, como ligaste os motores ao Arduino? Lembra-te que o Arduino não consegue actuar um motor e se o tentares, certamente que vais queimar o pino do chip... Mostra como ligaste isso com um esquema.
|
|
|
|
|
Logged
|
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o. Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum). Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.
Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).
|
|
|
|
Offline
Full Member
Karma: 4
Posts: 243
|
 |
« Reply #3 on: September 21, 2012, 08:09:36 am » |
Complementado a dúvida dos colegas com as minhas dúvidas, quais e quantos sensores você esta usando?
Eu fiz um seguidor usando três sensores um central para a linha preta, e dois laterais para a superfície branca, esses laterais servem de referência sobre para qual lado o seguidor irá se o sensor central estiver fora do valor de referência.
O esquema, fotos, componentes que você esta usando podem nos ajudar a entender o que estás a fazer.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 20
|
 |
« Reply #4 on: September 22, 2012, 10:35:44 pm » |
Obrigado pela atenção de todos, com a ajuda do haistems_por, conseguir fazer o robô funcionar direito  mas caso possa ajudar alguem vou colocar mais dados do meu robo e de como fiz. O robô é guiado por dois sensores frontais de IR o esquela obtive nesta pagina http://extremeelectronics.co.in/robotics/making-a-line-sensor-using-ir-receiver/ Para controlar os motores eu usei um SN754410, que é similar os L283d, so que mais potente. O esquema do robô é este  Obs: os sensor sharp são so para representar os sensores ir pode se visto aqui tambem  Obs2: como meu robo so anda em uma direção, sempre para frente, so usei duas portas do sn754410, a 2 e a 15, uma para cada motor E o código que usei foi este const int PinoSensor = 0; const int PinoSensor2 = 1;
const int motorpin1 = 3; const int motor2pin1 = 5;
int ValorSensor = 0;
int ValorSensor2 = 1;
void setup(){ Serial.begin(9600); pinMode(motorpin1,OUTPUT);
pinMode(PinoSensor,INPUT); pinMode(motor2pin1,OUTPUT);
pinMode(PinoSensor2,INPUT); } void loop(){ int sensorValue = analogRead(PinoSensor); Serial.println(sensorValue); if (sensorValue >=100){
digitalWrite(motorpin1,HIGH);
} else { digitalWrite(motorpin1,LOW);
} int sensorValue2 = analogRead(PinoSensor2); if (sensorValue2 >= 350){
digitalWrite(motor2pin1,HIGH);
} else { digitalWrite(motor2pin1,LOW);
} }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 4
Posts: 243
|
 |
« Reply #5 on: September 23, 2012, 08:56:14 am » |
Obrigado pela atenção de todos, com a ajuda do haistems_por, conseguir fazer o robô funcionar direito  mas caso possa ajudar alguem vou colocar mais dados do meu robo e de como fiz. Fala ai Lucas! Teu código ajudará outras pessoas, estou certo disso ^^ Eu uso três sensores no meu following, um para a faixa preta (referência central) eu para a área branca (referências laterais). E Parabéns xD
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 20
|
 |
« Reply #6 on: September 23, 2012, 10:29:19 am » |
Obrigado Mortis  , fiz com dois sensores pq nunca tinha feito um seguidor de linha e queria fazer o mais basico possivel para começar a entender o funcionamente, por isso do codigo tão simples sem nem usar todas as portas do sn754410 Quero mesmo é fazer um com cinco sensores que possa fazer curva de 90º *---*, mas não faço a menor ideia de como o codigo funciona  agora vou pesquisar mais e tentar fazer o de cinco sensores 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #7 on: September 23, 2012, 11:01:19 am » |
Boas. Para não estar a abrir um novo tópico e visto o meu caso ser também referente a um veiculo que segue uma linha, coloco aqui a questão para o meu caso. Para reutilizar um pequeno veiculo que tinha feito há algum tempo, resolvi colocar no mesmo 2 LDR de forma a poder fazer com que o mesmo se move-se seguindo uma linha preta. Fica a imagem com o veiculo e o conceito que tenho para os 2 LDR.  Mas não consigo que o mesmo ande como pretendia. Não sei estarei a utilizar erradamente os 2LDR para o que pretendo ou se será no próprio código que deixo abaixo. #include <Servo.h> #define LEFTSERVOPIN 11 #define RIGHTSERVOPIN 13 Servo leftServo; Servo rightServo; int speed = 15; //velocidade de ambos os servos: percentagem entre 0 e 100 int pinLDRDir = 0; // pino analógico A0 direita float LDRDir = 0; // receberá o valor do LDR da direita int pinLDREsq = 2; // pino analógico A2 esquerda float LDREsq = 0; // receberá o valor do LDR da esquerdaDR void setup() { setSpeed(speed); pinMode(LEFTSERVOPIN, OUTPUT); pinMode(RIGHTSERVOPIN, OUTPUT); leftServo.attach(LEFTSERVOPIN); //'attaches' esquerdo servo rightServo.attach(RIGHTSERVOPIN); //'attaches' direito servo vaiParado();
Serial.begin(9600); } void loop() { LDRDir = analogRead(pinLDRDir); LDREsq = analogRead(pinLDREsq); //Se 75% de LDREsq >= LDRDir - Vira a if( LDREsq*0.75 >= LDRDir) vaiEsquerda(); //Senão se 75% de LDRDir >= LDREsq - Vira a else if( LDRDir*0.75 >= LDREsq) vaiDireita(); else vaiFrente(); } //------------------------------------------------------------------------------------------------------------ //INICIALIZAÇÃO DOS SERVOS PELO ARDUINO - ROTINAS /* * define a velocidade do veiculo entre 0-(parado) e 100-(velocidade máxima) */ void setSpeed(int newSpeed){ if(newSpeed >= 100) { newSpeed = 100;} if(newSpeed <= 0) { newSpeed = 0;} speed = newSpeed * 0.9; } /* veiculo em frente */ void vaiFrente(){ leftServo.write(90 + speed); rightServo.write(90 - speed); } /* veiculo para trás */ void vaiTras(){ leftServo.write(90 - speed); rightServo.write(90 + speed); } /* veiculo para a direita */ void vaiDireita(){ leftServo.write(90 + speed); rightServo.write(90 + speed); } /* veiculo para a esquerda */ void vaiEsquerda(){ leftServo.write(90 - speed); rightServo.write(90 - speed); } /* veiculo parado */ void vaiParado(){ //leftServo.write(90); //rightServo.write(90); leftServo.write(0); rightServo.write(0); }
Agradeço todo e qualquer contributo que possam dar.
|
|
|
|
« Last Edit: September 23, 2012, 11:03:39 am by andremendes »
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 4
Posts: 243
|
 |
« Reply #8 on: September 23, 2012, 02:01:31 pm » |
Fala ai Lucas,
Você já fez 90%, o resto é repetir o que você já fez com alguns IFs a mais!
Eu fiz algo bem simples também, mas nós chegaremos lá rs
É isso ai!
|
|
|
|
« Last Edit: September 23, 2012, 02:11:05 pm by Mortis »
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 4
Posts: 243
|
 |
« Reply #9 on: September 23, 2012, 02:20:04 pm » |
Olá, Andre... Primeira diferença é que usamos sensores IR, mas o funcionamento não é muito diferente. A primeira coisa: Quais valores os LDRs retornam quando estão sobre o branco e o preto? normalmente eu comparo o resultado da leitura do analogRead() com um valor, por exemplo: if( LDREsq >= 100) //Supondo que seja 100 o valor sobre a linha vaiEsquerda(); else if( LDRDir >= 100) //Supondo que seja 100 o valor sobre a linha vaiDireita(); else vaiFrente(); }
Você compara os dois lados, mas não tem um valor de referência Tem um tutorial que parece legal em http://www.buildcircuit.com/ldr-based-line-following-robot-using-arduino-and-ardumoto/Nesste tudorial ele usa led para emitir a luz e aumentar a leitura do LDR, sem o led e em ambiente escuro teu sensor ficaria sem referência. Até
|
|
|
|
« Last Edit: September 23, 2012, 02:22:55 pm by Mortis »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #10 on: September 23, 2012, 03:26:16 pm » |
No branco entre os 300 e os 350 e no preto está a dar entre 135 e 145.
Vou experimentar comparando com um valor e ver o tutorial.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 4
Posts: 243
|
 |
« Reply #11 on: September 24, 2012, 07:28:53 am » |
No branco entre os 300 e os 350 e no preto está a dar entre 135 e 145.
Vou experimentar comparando com um valor e ver o tutorial.
Beleza! Depois nos conta o resulado! Abraço
|
|
|
|
|
Logged
|
|
|
|
|
|