LusoRobótica - Robótica em Português
Robótica => Iniciantes => Tópico iniciado por: joao rexinho em 11 de Novembro de 2009, 15:00
-
Boas malta,hoje foi a garagem e encontrei um carro rc 40hz. Então pensei e se eu retira se o a placa de controlo e fazer com que ele fosse autonomo com sensores para se desviar dos objectos.
Materiais que penso utilizar:
-Arduino duemilnove;
-o carro tem 2 motores dc, um controla as rodas do lado direito e o outro controla as da esquerda através de engrenagens.
Na programação
sei que:
-para a frente :frente-frente;(nenhum obstáculo a frente)
-para tras : trás-trás;(nenhum obstáculo a atras )
-para esquerda : trás-frente:(obstáculo a direita)
-para direita: frente-trás:(obstáculo a esquerda)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwtfoodge.com%2Fwp-content%2Fuploads%2F2009%2F07%2Ftycorebound-500x375.jpg&hash=f4e287aca4f1608f844e554dba5925f6d662253b)
Decidi continuar com o projecto vou comprar
1xH-Bridge Motor
2xInfrared Proximity
Fiz um esquema
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg411.imageshack.us%2Fimg411%2F3810%2Fcircuito.th.jpg&hash=8a521b7ebba2239d4b55dfe3d74f4ad1001b21ac) (http://img411.imageshack.us/i/circuito.jpg/)
Será possível concretizar ?
Melhorei. Mas entanto ao ler um comment do metRo_ que tinha me passado ao lado fiz um esquema.
Nao sei qual irei realizar. Com o servo fica mais barato e tem maior ângulo de captação mas não sei como programar a ponte h + Sensor IR + Servo ???
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg535.imageshack.us%2Fimg535%2F5342%2Fcircuitoservo.th.jpg&hash=4c033123141d690c50dadac544b04b5a35135b2a) (http://img535.imageshack.us/i/circuitoservo.jpg/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg198.imageshack.us%2Fimg198%2F4279%2Fcircuito2ir.th.jpg&hash=d2037825902b199ef512b4bba0a878414539d612) (http://img198.imageshack.us/i/circuito2ir.jpg/)
-
Grandes rodas ;D
Mantem-nos informados ;)
-
Bem... Tens aí uma base muito boa para brincar...
O uso da Ponte H depende do uso que queres dar aos componentes que já fazem parte do carro.
Para teres uma ideia do que estou a dizer:
Podes usar um Arduino no carro + ponte H + motores do carro (e deitas o resto tudo fora)
Ou podes por exemplo nao mexer no carro e "hackear" o comando, criando, por exemplo, uma aplicação de PC que permita controlar o carro. Neste "modo", ligas o Arduino ao comando. ;)
Mas por falares em sensores, deduzo que queres transformar o carro num robô. Assim sendo, deves aproveitar apenas os motores DC do carro e livrar-te de toda a electrónica restante.
Quanto à 2ª questão, depende do que queres fazer... O teu objectivo é construir um carro que siga uma luz ou que evite obstáculos?
-
Desculpem !!!! librei agua em cima do pc :(mas retirei lhe logo a fonte e metio a secar ao sol e na hora do meio dia ele ainda nao ligava metio a beira do desumificador, agora liguei o só o touchpad é que nao esta a funcionar la muito bem.
Prefiro fazer um robô que se desvie dos obstáculos para depois poder adicionar mais sensores.Qual e o sensor que me aconselhas?quantos?
e o l293d donde posso comprar?
-
Bem.. que situação.
Acho que fazes bem em o ir fazendo simples e depois melhorando.
Aconselho o Sharp IR (http://lusorobotica.com/index.php/topic,100.0.html) pelo preço/facilidade de utilização.
-
Como tinha prometido aqui vai o video da energia do motor de uma impressora
http://www.youtube.com/user/joaorexinho#p/u/2/9GqDbeAEZv0 (http://www.youtube.com/user/joaorexinho#p/u/2/9GqDbeAEZv0)
-
quantos sensores IR devo comprar?onde posso comprar um l293d?
-
Não é o L293D mas é compatível: http://loja.lusorobotica.com/componentes/15-h-bridge-motor-driver-1a.html (http://loja.lusorobotica.com/componentes/15-h-bridge-motor-driver-1a.html)
-
Ok :D ja adicionei a o carrinho isso e dois sensores IR da sharp. Não sei se chega ai e que esta a minha duvida?Porque eu quero que o meu carro "robô" se desvie dos obstáculos :-\.
-
Dois sensores sharp à frente já te permite que ele se desvia dos obstáculos, agora o que podes fazer e dava para brincares um pouco mais, assim como aprender, era comprar um micro-servo e colocavas o sensor no servo, e assim tinhas 180º de protecção :)
-
entao ja vou efectuar a compra de 2 sharp e um h bridge motor driver.Mas as rodas de frente nao viram,tem dois motores DC em que um faz andar as duas rodas de um lado e o outro as duas rodas do outro.
-
Ok amigo... Já viste um robô com lagartas a virar?
É a mesma coisa... As rodas da esquerda para a frente e as da direita para trás e o carro roda sobre si mesmo para a direita. (e vice-versa)
-
Sim era um exemplo que eu queria dar para o pessoal perceber.Afinal ainda vou aguentar uns dias antes de comprar porque parece que e esta semana que abre o grupo de robótica na minha escola :D!!!
-
Ja actualizei tirei as duvidas antigas e coloquei a nova ;D. Estou a tentar desenvolver o codigo :).
-
Gostava de saber se os esquemas estão bem?
-
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
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?
-
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?
-
Entao como devo por ja tentei po no[] um i como aparece num codigo de ponte H
-
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!
-
Continua a dar o mesmo erro :(
-
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
-
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???????????
-
tive alterar tudo de novo e deu me isto:
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 ::)
-
Então era o que eu falei no inicio, variável ao mesmo tempo void.
-
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.
-
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?
-
os motores DC nao se mexem e o servo so faz quando se liga
-
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 ==
-
montei exactamente o circuito como esta neste esquema http://arduinofun.com/blog/2009/10/25/duel-motor-driver/ (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 (http://itp.nyu.edu/physcomp/Labs/DCMotorControl) e começou a aquecer e o motor nao funcionava. será que o SN754410NE queimou?
-
Algum indicio de peça "aberta"?
-
como assim? ???
-
montei exactamente o circuito como esta neste esquema http://arduinofun.com/blog/2009/10/25/duel-motor-driver/ (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 (http://itp.nyu.edu/physcomp/Labs/DCMotorControl) e começou a aquecer e o motor nao funcionava. será que o SN754410NE queimou?
cheira-me a curto circuito. tens a certeza de que estás a ligar tudo correctamente? tens alguma foto para vermos?
-
Acho que o problema foi que a bateria era de 9v 1300mAh e o H-BRIGED é de 1A resumindo 1300mAh=1,3A de intensidade
-
A bateria ate podia ser de 4000mah, se a ponte-h so "pedir" 1A, é essa corrente que a bateria vai disponibilizar...
-
sei qualm foi foi o problema