• Welcome to LusoRobótica - Robótica em Português.
 

Servo + Sensor Ultrasonico + arduino + ponte H

Started by Bony, 03 de September de 2011, 04:50

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Bony

Quote from: senso on 30 de September de 2011, 21:38
Com um multimetro.
Sabes medir correntes?

Pois nao tenho nenhum...
nao sei, mas gostava de saber :D

SN754410
Ponte H quadrupla.
Tensão de saída: 36V
Corrente de saída: 2x1A
Não necessita de diodos de protecção no motor.
Compativel com o Layout das L293D, em: http://lusorobotica.com/index.php?topic=262.0

Bony

Aquilo aquece que e uma coisa por demais, queima mesmo nem sei como é que aquilo ainda nao se queimou, mal lá meto o dedo em cima esta mesmo a "ferver" loOl

relativamente ao problema de os motores estarem a andar devagar de mais, em digital resolver meter por analog em PWM a 100% e os gajos assim ja andam no maximo :S que conclusao se pode tirar daqui ?

Bony

ainda ando de volta deste projecto... isto programa-lo como eu quero ainda nao consegui, ja me pintei de amarelo e nada... agora ao enviar o programa para o arduino da-me isto

done uploading, mas por baixo da este erro:

"Binary sketch size: 4440 bytes (of a 32256 byte maximum)
avrdude: stk500_getsync(): not in sync: resp=0x00"

o que será ?

senso

Se dá esse erro de certeza que não faz o upload, está a dizer-te que o bootloader não está sincronizado com o avrdude, ou seja que não lhe respondeu ou que respondeu com caracteres estranhos.

Tens alguma coisa nos pinos digital0/1?
Avr fanboy

Bony

#34
já descobri, era a serial port em que o arduino estava ligado, tinha COM1 e era a COM3 :)

Bony

#include <Servo.h>

int maxspeed = 100;

#define MotorR 5
#define MotorL 3

int pause = 1000;

#define sensorpin 2
int duration;
int distance;

Servo servo;

void getDistance(){

  pinMode(sensorpin, OUTPUT);
  digitalWrite(sensorpin, LOW);                          // Make sure pin is low before sending a short high to trigger ranging
  delayMicroseconds(2);
  digitalWrite(sensorpin, HIGH);                         // Send a short 10 microsecond high burst on pin to start ranging
  delayMicroseconds(10);
  digitalWrite(sensorpin, LOW);                                  // Send pin low again before waiting for pulse back in
  pinMode(sensorpin, INPUT);
  duration = pulseIn(sensorpin, HIGH);                        // Reads echo pulse in from SRF05 in micro seconds
  distance = duration/58;                                      // Dividing this by 58 gives us a distance in cm
}

void rightForward(void){
  digitalWrite(8, HIGH);
  digitalWrite(11, LOW);
}

void leftForward(void){
  digitalWrite(12, LOW);
  digitalWrite(7, HIGH);
}

void rightBackward(){
  digitalWrite(8, LOW);
  digitalWrite(11, HIGH);
}

void leftBackward(void){
  digitalWrite(12, HIGH);
  digitalWrite(7, LOW);
}

void accelerate(){

    analogWrite(MotorR, 0);
    analogWrite(MotorL, 0);

    for(int i = 0; i < maxspeed; i += 10){
      analogWrite(MotorR, i);
      analogWrite(MotorL, i);
      delay(40);
    }
   
    analogWrite(MotorR, maxspeed);
    analogWrite(MotorL, maxspeed);
    delay(40);
}

void slowdown(){

  for(int i = maxspeed; i > 0; i -= 10){
    analogWrite(MotorR, i);
    analogWrite(MotorL, i);
    delay(40);
  }

  analogWrite(MotorR, 0);
  analogWrite(MotorL, 0);
}


void setup(){
 
  Serial.begin(9600);
 
  // right motor
    pinMode(8, OUTPUT); // 1A
    pinMode(11, OUTPUT); // 1B
    pinMode(MotorR, OUTPUT); // PWM
   
    // left Motor
    pinMode(MotorL, OUTPUT); // PWM
    pinMode(12, OUTPUT); // 2A
    pinMode(7, OUTPUT); // 2B
   
    servo.attach(6);
    servo.write(80);
}

void loop(){
 
  int incomingByte = 0;
 
  if(Serial.available() > 0){
 
    incomingByte = Serial.read();
   
  }
 
  if(incomingByte == 102){
    rightForward();
    leftForward();
    accelerate();
  }
 
  if(incomingByte == 98){
    rightBackward();
    leftBackward();
    accelerate(); 
  }
 
  if(incomingByte == 108){
    rightForward();
    leftBackward();
    accelerate();
  }
 
  if(incomingByte == 114){
    rightBackward();
    leftForward();
    accelerate();
  }
 
  if(incomingByte == 100){
    slowdown();
  }
 
  if(incomingByte == 76){
    servo.write(170);
  }
 
  if(incomingByte == 77){
    servo.write(80);
  }
 
  if(incomingByte == 82){
    servo.write(0);
  }
 
  delay(100);
  getDistance();
  Serial.println(distance, DEC);
 
}

Neste codigo aqui, quais é que sao os pins dos motores ?

ele liga a motor a 3 pins diferentes :S mas eu so posso ligar a 2 pinos.

do tipo:

#define MotorR 5 ligar ao pino 5
#define MotorL 3 e ligar ao pino 3
depois mais abaixo, diz:

// right motor
    pinMode(8, OUTPUT); // 1A
    pinMode(11, OUTPUT); // 1B
    pinMode(MotorR, OUTPUT); // PWM
   
    // left Motor
    pinMode(MotorL, OUTPUT); // PWM
    pinMode(12, OUTPUT); // 2A
    pinMode(7, OUTPUT); // 2B

3 pins :( mas eu so tenho dois pela ponte H.

senso

Não tens acesso aos enables da ponte H?
Normalmente usa-se as entradas das pontes H para selecionar a direcção de rotação e faz-se o pwm para controlo de velocidade no enable de cada canal da ponte.
Avr fanboy

Bony

#37
Tenho. Estou a utilizar a ponte H SN754410, e tive agora a ver o DS do CI, e o EN é o pin 1 e 9 e tenho ambos ligados ao VCC.

sendo assim como é que ficam as ligacoes ?

Bony

#38
nao estou mesmo a ver o problema disto... isto a meu ver deve ser alguma ligacao nas ponte H :S a nivel do Enable...

o sensor funciona perfeitamente bem, mas o servo e os 2 motores nada... quando o ligo o servo mexe-se mas depois para logo e fica a fazer um barulho como se tivesse preso e nao consegue andar...

até fiz um video para verem que o sensor funciona:

SRF05+arduino+servo+dc motors.mp4

tirei uma foto as ligacoes da ponte H, porque penso que o problema, deve estar em alguma ligacao da mesma... mas ja estou farto de rever e rever e pesquisar e aparentemente tudo se encontra bem...
deixo aqui duas fotos frente e tras:

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0084.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0083.jpg

vejam la se detetam alguma coisa de mal ligada ou em falta... tenho a ponte H a ser alimentada pelo arduino, mas por sua vez os motores sao alimentados pelas 4 pilhas cmo está vizivel no video, que corresponde ao pin 8 da ponte H.

estou a utilizar este codigo:

#include <Servo.h>

int maxspeed = 100;

#define MotorR 5
#define MotorL 3

int pause = 1000;

#define sensorpin 2
int duration;
int distance;

Servo servo;


void getDistance(){

  pinMode(sensorpin, OUTPUT);
  digitalWrite(sensorpin, LOW);                          // Make sure pin is low before sending a short high to trigger ranging
  delayMicroseconds(2);
  digitalWrite(sensorpin, HIGH);                         // Send a short 10 microsecond high burst on pin to start ranging
  delayMicroseconds(10);
  digitalWrite(sensorpin, LOW);                                  // Send pin low again before waiting for pulse back in
  pinMode(sensorpin, INPUT);
  duration = pulseIn(sensorpin, HIGH);                        // Reads echo pulse in from SRF05 in micro seconds
  distance = duration/58;                                      // Dividing this by 58 gives us a distance in cm
}

void rightForward(void){
  digitalWrite(8, HIGH);
  digitalWrite(11, LOW);
}

void leftForward(void){
  digitalWrite(12, LOW);
  digitalWrite(7, HIGH);
}

void rightBackward(){
  digitalWrite(8, LOW);
  digitalWrite(11, HIGH);
}

void leftBackward(void){
  digitalWrite(12, HIGH);
  digitalWrite(7, LOW);
}

void accelerate(){

  analogWrite(MotorR, 0);
  analogWrite(MotorL, 0);

  for(int i = 0; i < maxspeed; i += 10){
    analogWrite(MotorR, i);
    analogWrite(MotorL, i);
    delay(40);
  }

  analogWrite(MotorR, maxspeed);
  analogWrite(MotorL, maxspeed);
  delay(40);
}


void slowdown(){

  for(int i = maxspeed; i > 0; i -= 10){
    analogWrite(MotorR, i);
    analogWrite(MotorL, i);
    delay(40);
  }

  analogWrite(MotorR, 0);
  analogWrite(MotorL, 0);


}


void setup(){

  Serial.begin(9600);

  // right motor
  pinMode(8, OUTPUT); // 1A
  pinMode(11, OUTPUT); // 1B
  pinMode(MotorR, OUTPUT); // PWM


  // left Motor
  pinMode(MotorL, OUTPUT); // PWM
  pinMode(12, OUTPUT); // 2A
  pinMode(7, OUTPUT); // 2B

  servo.attach(6);
  servo.write(90
    );
}

void loop(){

  int incomingByte = 0;

  if(Serial.available() > 0){

    incomingByte = Serial.read();

  }

  if(incomingByte == 102){
    rightForward();
    leftForward();
    accelerate();
  }

  if(incomingByte == 98){
    rightBackward();
    leftBackward();
    accelerate(); 
  }

  if(incomingByte == 108){
    rightForward();
    leftBackward();
    accelerate();
  }

  if(incomingByte == 114){
    rightBackward();
    leftForward();
    accelerate();
  }

  if(incomingByte == 100){
    slowdown();
  }

  if(incomingByte == 76){
    servo.write(170);
  }

  if(incomingByte == 77){
    servo.write(80);
  }

  if(incomingByte == 82){
    servo.write(0);
  }

  delay(100);
  getDistance();
  Serial.println(distance, DEC);

}


senso

Só estás a uma ponte H de casa chip porque?
Isso é falta de uns condensadores de decoupling, que deve ser uma ruideira na alimentação que o arduino entra em modo de reset.
Avr fanboy

Bony

Quote from: senso on 08 de March de 2012, 23:39
Só estás a uma ponte H de casa chip porque?
Isso é falta de uns condensadores de decoupling, que deve ser uma ruideira na alimentação que o arduino entra em modo de reset.

porque era o tal problema de aquecerem muito, foi me dito que era melhor meter uma ponte H para cada motor.

Nao é visivel nas fotos, mas cada motor já tem um condensador.

esses condensadores de decoupling é para meter onde? nos motores ou na ponte H ?

Bony

Comeco a ficar frustrado com isto... nao sei mais o que fazer...

já lhe meti os condesadores, segui tal e qual este esquema :

http://i296.photobucket.com/albums/mm184/CrazyBony/3235658022_7f505922e3_o.jpg

a unica diferenca é no pin 1 (enable) liguei ao pin 5 do arduino, e do outro CI liguei tb o pin 1 ao pin 3 do arduino, como diz o codigo, para ter o PWM.

Mas nada, o gajo continua a nao dar sinal de vida...

o servo, quando ligo o arduino via UBS, nada, quando ligo o arduino com uma pilha de 9 Volts o gajo gira ate aos 180 e fica ali, aquele LED amarelo que os arduinos tem que esta sempre acesso quando o servo gira e fica nos 180 quase que se apaga parece que esta ali algum curto circuito ou assim...

deixo aqui mais umas fotos de varios angulos da ponte H e as suas ligacoes, sei que é dificil de perceber mas vejam lá se descobrem algo de errado... é que mto sinceramente, ja nao sei mais o que fazer com isto...

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0095.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0094.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0093.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0092.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0091.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0090.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0089.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0088.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0087.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0087.jpg

http://i296.photobucket.com/albums/mm184/CrazyBony/IMAG0086.jpg

se tiverem alguma duvida de onde é que vai ligar onde perguntei que eu digo.

cumps

Hugu

Quote from: Bony on 09 de March de 2012, 02:44
Comeco a ficar frustrado com isto... nao sei mais o que fazer...

já lhe meti os condesadores, segui tal e qual este esquema :



a unica diferenca é no pin 1 (enable) liguei ao pin 5 do arduino, e do outro CI liguei tb o pin 1 ao pin 3 do arduino, como diz o codigo, para ter o PWM.

Mas nada, o gajo continua a nao dar sinal de vida...

o servo, quando ligo o arduino via UBS, nada, quando ligo o arduino com uma pilha de 9 Volts o gajo gira ate aos 180 e fica ali, aquele LED amarelo que os arduinos tem que esta sempre acesso quando o servo gira e fica nos 180 quase que se apaga parece que esta ali algum curto circuito ou assim...

deixo aqui mais umas fotos de varios angulos da ponte H e as suas ligacoes, sei que é dificil de perceber mas vejam lá se descobrem algo de errado... é que mto sinceramente, ja nao sei mais o que fazer com isto...






se tiverem alguma duvida de onde é que vai ligar onde perguntei que eu digo.

cumps


senso

Que regulador de voltagem é esse que está ai perdido no desenho?
Avr fanboy