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

[Arduino]Tutorial - L293D com Arduino

Started by guibot, 06 de October de 2008, 01:55

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

guibot

como estás a alimentar o teu circuito?

R.S.


guibot

os 5V do usb podem não ser suficientes para os teus motores

tirando isto, já deste uma revisão geral a todas as ligações?

R.S.


guibot

afinal o que era? o usb? ou as ligações?  :)

R.S.

era da porta usb do pc, ja com a minha pen estava me a dar uns problemas estava sempre a ligar e desligar a pen. Mudei de porta e ja deu:D


SilentWarrior

#37
Boas, consegui ligar um motor DC usando esse tutorial e esse h-bridge. (mesmo codigo e esquema que o R.S.)

Mas agora estou a tentar usar PWM para controlar a velocidade do motor, mas nao consigo obter velocidades diferentes, apenas a mesma velocidade.

E tambem nao consigo inverter a direcção (que esperava) usando uma troca de HIGH-LOW para LOW-HIGH, basicamente uma troca de polaridades (fisicamente). Outro problema que tenho é que para "desligar" o motor tenho de meter ambos os pinos em HIGH-HIGH e nao LOW-LOW.

Que e que raio se passa aqui? O que é que poderá ser? Assim que notei que algo estava errado desliguei tudo, e manti desligado não va estar para ai a fazer algum grande estrago.

Quero usar isto para controlar a velocidade de 2 motores DC, para usar depois com o processing + um comando da XBOX. Se quizerem o codigo para ler o controlador XBOX tal como como modificar o controlador tambem arranjo. :)

SilentWarrior

Boas de novo.

Consegui controlar finalmente o motor usando PWM.

O metodo que usei foi ligar no pin1 do L293D uma porta extra do arduino e dar-lhe por ai um PWM. Esta porta era anteriormente ligada em serie com os 5v do resto do circuito como mostra no esquema do tutorial, mas desta forma consegue-se controlar o input para todo o driver (acho eu que e todo e nao so o lado esquerdo). Neste caso limita a utilidade dos motores ja que apenas podemos controlar a velocidade de todo o driver e nao apenas cada 1 dos motores, mas ja é um inicio.

TigPT

Txii o que para aqui vai :P

Vamos esquecer que o L293D controla 2 motores e concentramos-nos em 1 e apenas 1 dos gates.

As entradas lógicas são InA1 e InA2 para entradas do gateA e o motor liga a OutA1 e OutA2

As entradas In1A e InA2 controlam o motor ligado ao gateA.

Assim, ambas as entradas a LOW o motor fica parado e ambas as entradas a HIGH o motor fica parado (por protecção interna do IC, não se deve fazer).

Para andar para 1 dos sentidos coloca-se HIGH num dos pins e LOW no outro, para inverter visse-versa.

Para controlar velocidade, os pins InA1 e InA2 estão ligados os dois a saidas de microcontrolador que suportem PWM para que quando se quer 50% da velocidade se coloque por exemplo InA1 a 50% PWM e InA2 a LOW (o pin HIGH é que fica com o PWM em vez de HIGH para controlar a velocidade).

Confirma que tens como acima indicado e certamente que tudo irá funcionar correctamente. Caso contrário faz-nos o esquema que tens montado e mostra o código para te podermos ajudar ;)

SilentWarrior

Quote from: TigPT on 31 de March de 2010, 18:19
Txii o que para aqui vai :P

Vamos esquecer que o L293D controla 2 motores e concentramos-nos em 1 e apenas 1 dos gates.

As entradas lógicas são InA1 e InA2 para entradas do gateA e o motor liga a OutA1 e OutA2

As entradas In1A e InA2 controlam o motor ligado ao gateA.

Assim, ambas as entradas a LOW o motor fica parado e ambas as entradas a HIGH o motor fica parado (por protecção interna do IC, não se deve fazer).

Para andar para 1 dos sentidos coloca-se HIGH num dos pins e LOW no outro, para inverter visse-versa.

Para controlar velocidade, os pins InA1 e InA2 estão ligados os dois a saidas de microcontrolador que suportem PWM para que quando se quer 50% da velocidade se coloque por exemplo InA1 a 50% PWM e InA2 a LOW (o pin HIGH é que fica com o PWM em vez de HIGH para controlar a velocidade).

Confirma que tens como acima indicado e certamente que tudo irá funcionar correctamente. Caso contrário faz-nos o esquema que tens montado e mostra o código para te podermos ajudar ;)

Boas, voltei a ligar tudo como tinha para testar e funcionou... provavelmente foi qualquer coisinha que estava a fazer mal e que me baralhou os resultados.

O codigo que estou a usar é:
int data = 1000;
int motor_left[] = {10, 11};

void setup() {
  Serial.begin(9600);
 
  // Setup motors
  int i;
  for(i = 0; i < 2; i++){
    pinMode(motor_left[i], OUTPUT);
  }
 
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], LOW);
}

int sp = 0;
int order = 0;

int lf = 10; // line feed
int cr = 13; // carriage return
char buf[] = {1,2,3}; // quick buffer
int bi; //buffer index
void loop () {
  if (Serial.available() > 0) {
   
                int v = 0;
// read the incoming byte:
char c = Serial.read();
                if(c != (char)lf){
                  buf[bi++] = c;
                }
                if(c == (char)lf){
                  bi=0;
                  for(int i=0;i<3;i++)
                    v += (int) buf[i];
                  Serial.print("I received: ");
  Serial.println(v);
                }
// say what you got:
//Serial.print("I received: ");
//Serial.println(c);
  }
 
  //sp++;

 
  if(sp>255){
    sp = -225;
  }
   
 
  if(sp<0)
      order=1;
  else
      order=0;

  Serial.println(sp);
  //digitalWrite(motor_left[0], HIGH);
 
  int val = (sp<0)? -sp: sp;
  Serial.println(val);
  //analogWrite(9, sp);
 
  if(order==0){
    analogWrite(motor_left[0], val);
    digitalWrite(motor_left[1], LOW);
  }else{
    analogWrite(motor_left[1], val);
    digitalWrite(motor_left[0], LOW);
  }
 
 
 
  delay(200);
}


Podem ignorar a parte para ler o serial pois está incorrecta. Estou a trabalhar nela neste momento. Aceito sugestões para ler um valor inteiro (ou melhor ainda string) para controlar a velocidade do motor (int velocidade = 0-255).


Algo tipo :
(Processing)

int lf = 10; // line feed
int cr = 13; // carriage return
String buf = ""; // quick buffer

int pval = 0;
void serialEvent(Serial p){
    int c = myPort.read();
    if(c != lf && c != cr){
      buf += char(c);
    }
    if(c == lf){
      println("Received: "+ buf);
      String[] buf2 = new String[1];
      if(buf.contains(":"))
        buf2 = buf.split(":");
     
      pval = val;
      if(buf2.length>1 && buf2[0].contains("potentiometer"))
        val = (buf2[1].length()>0)? int(buf2[1]) : val;
      if(buf2.length>1 && buf2[0].contains("fotosensor"))
        val = (buf2[1].length()>0)? int(buf2[1]) : val;
      buf = "";
    }
}


Mas ao contrario, lendo no proprio arduino os dados vindos do computador. Quero fazer algo tipo mySerialPort.write("motor1:255") para meter o "motor1" a velocidade (int)225.

alcas

olá, vc pode encontrar aqui infos com L293D e com SN754410NE em  http://arduino.cc/en/Reference/StepperBipolarCircuit

uma duvida: algume sabe se eu posso substituir o L293D pelo L293B já que eu não tenho o L293D?

rafhit

#42
boas!

tou a usar o l293d com o kit mr.basic e tou a ter o seguinte problema: ao usar o carrito no ar, ele faz tudo o que era suposto fazer.... mas quando o pouso no chão ele so anda para a frente e para atras, não tem força suficiente para fazer as curvas...e o l293d aquece mt!
agora... quando ligo os motores directamente ás pilhas...ele anda mt bem! tanto pa frente como para tras e nas curvas tmb...
pelos vistos o l293d "tira a força" aos motores....ou entao é o arduino!
alguém sabe o que se passa?
obg