Go Down

Topic: Montando um carrinho (L298N) (Read 17 times) previous topic - next topic

jpricaro



Fala ai Jo,

Me desculpe por demorar a entrar, mas as coisas estão corridas por aqui =/

Você tirou a placa fora e fez os testes iguais aos meus? Sem mais nada ligado na placa? Você mediu a bateria ou fonte e ela fornece mais de 5V?

Muito estranho isso, a saída do motor deveria ter a mesma voltagem do VMS... ... Eu seguiria as trilhas da placa para ver se tem algo estranho, sei lá, não imagino como te ajudar.


Fala Mortis, quanto a demora nem esquenta.... tranquilo....
Cara eu fiz dos dois jeitos, só coloquei o multímetro na saída do motor (sem os fios ligados, só o multímetro mesmo) e deram os 5v.... ai pensei que o jeito que vc ligou pudesse ter interferido em alguma coisa e desliguei tudo.... só a plaquina controladora.... a bateria e o multímetro nas saídas.... os jumpers tb iguais aos seus.... mas nada mudou... tudo igual.... que decepção.... fazê o que né.... vou esperar as baterias que eu comprei chegarem... ai eu testo de novo!!!!!

Outra coisa que fiz foi medir a corrente do carrinho igual ao colega Filantropic ensinou no outro tópico que eu abri e deu certo... a corrente é de 0,68 A... quem sse interessar procura no tópico que eu postei um vídeo do youtube que o cara ensina a medir....

Outra coisa foi o controle remoto com o N95, deu certo, consegui deixar do jeito que eu queria.... o carrinho só anda para as direções quando vc pressiona a tecla, se soltar ele para... simulando um controle remoto real.... ficou legar.... mas o direcional é muito pequeno.... eu dedo é grande e constantemente aperto as outras teclas em volta e ele sai da aplicação.... ou seja.... o manejo té legal....mas a agilidade tá ruim..... vou pesquiser usar um controle de PS2 que tenho jogado aqui.... quem sabe!!!!

Se algum colega quiser dicas ou o código estou a disposição!!!

Se alguém tiver uma idéia de o porque minha plaquinha não tá "soltando" os 7 v na saída do motor eu agradeço!!!!

Jo


Fala Jo, blz?

Meu querido, se você puder disponibilizar seu código será bem legal. Fala tb qual software está usando no N95 para controlar o carro.

Essa questão de usar o controle do PS2, PS3 é o meu objetivo tb (via bluetooth) , já vi alguns no Youtube mas sem o código fonte. O que não ficou claro é se conectam o controle ao PC ou diretamente ao módulo.

abraço.

jojorge01

Fala cara.... quanto ao código tô pondo os dois no final..... ok... acredito que dá pra customizar para uma melhor performace e aparência (no do N95), mas agora tô fazendo tudo funcionar e depois vou voltar olhando o que pode ser melhorado... sugestões e críticas sào MUITO BEM VINDAS.

Quanto ao controle.... minha idéia é ligar ele o controle de PS2 no arduino... ler os comandos e enviar via bluethoot tb.... preciso pesquisar direitinho como isso funciona.... tb já achei pra compar um shield que é o direcional pronto para ser usado.... tb é uma opção.... ainda voi amadurecer a idéia e continuar postanto aqui.... faça o mesmo vc tb... o nosso tópico já tem bastante coisa legal!!!!!


segue o código:


Code: [Select]

int ENA=5;//connected to Arduino's port 5(output pwm)
int IN1=2;//connected to Arduino's port 2
int IN2=3;//connected to Arduino's port 3
int ENB=6;//connected to Arduino's port 6(output pwm)
int IN3=4;//connected to Arduino's port 4
int IN4=7;//connected to Arduino's port 7
byte VelocidadeAtual = 255;


void setup()
{
  pinMode(ENA,OUTPUT);//output
  pinMode(ENB,OUTPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  Serial.begin(9600);

}
void loop()
{
  // ena = velocidade
  // in = direção
  char c = Serial.read();


  // aqui precisa melhorar, tirar os ifs e colocar algo mais eficiente
  if (c == '1')
  {
    // para frente
    AndaParaFrente();
    FuncionaMotor(VelocidadeAtual);
  }

  if (c == '2')
  {
    // para trás   
    AndaParaTraz();
    FuncionaMotor(VelocidadeAtual);
  }


  if (c == '3')
  {
    // direita 
    // começa a funcionar com 90
    ViraDireita();
    FuncionaMotorA(VelocidadeAtual * .4);
    FuncionaMotorB(VelocidadeAtual);
  }


  if (c == '4')
  {
    // direita 
    // começa a funcionar com 90
    ViraEsquerda();
    FuncionaMotorA(VelocidadeAtual);
    FuncionaMotorB(VelocidadeAtual * .4 );
  }


  if (c == '5')
  {
    // para 
    ParaMotores();
  }





}


//------------------------------------------------------------------------------------------
// Liga os motores e determina a velocidade
//------------------------------------------------------------------------------------------
void FuncionaMotor(byte Velocidade)
{
  FuncionaMotorA(Velocidade);
  FuncionaMotorB(Velocidade);
}



void FuncionaMotorA(byte Velocidade)
{
  analogWrite(ENA, Velocidade);//start driving motorA
}

void FuncionaMotorB(byte Velocidade)
{
  analogWrite(ENB, Velocidade);//start driving motorA
}

void ParaMotores()
{
  digitalWrite(ENA,LOW);
  digitalWrite(ENB,LOW);//stop driving

}

//------------------------------------------------------------------------------------------
// FIM - Liga os motores e determina a velocidade
//------------------------------------------------------------------------------------------





//------------------------------------------------------------------------------------------
// Direcoes
//------------------------------------------------------------------------------------------


void AndaParaFrente()
{
  // MOTOR 1
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);//setting motorA's directon 

  // MOTOR 2
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);//setting motorB's directon 
}



void AndaParaTraz()
{
  // MOTOR 1
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);//setting motorA's directon 

  // MOTOR 2
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);//setting motorB's directon
}


void ViraEsquerda()
{

  // MOTOR 1
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);//setting motorA's directon 

  // MOTOR 2
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);//setting motorB's directon

}






void ViraDireita()
{

  // MOTOR 1
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);//setting motorA's directon 

  // MOTOR 2
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);//setting motorB's directon

}




Para o N95, isto que estou postando é um script que roda em Python... então precisa ter ele instalado na máquina... vc acha ele aqui: http://sourceforge.net/projects/pys60 o livro que use como base foi este: "Wiley Mobile Python-Rapid prototyping of applications on the mobile platform"... dá pra achar tranquilo, é só procurar.
A idéia é, primeiro se conectar ao bluethoot do carrinho, depois, quando o cara apertar o direcional para cima vai aparecer uma bolinha vermelha no topo da tela para indicar no celular a direção e enquanto vc mantém a tecla pressionada o script fica enviando o caractere "1" que no arduino tá programado para ele andar pra frente.... quando vc solta o direcional ele para de mandar o 1 e desliga os motores!!!! Funciona assim para as quatro direções.


Segue o código:

Code: [Select]

import appuifw, e32, key_codes, graphics, socket


def choose_service(services):
    names = []
    channels = []
    for name, channel in services.items():
        names.append(name)
        channels.append(channel)

    index = appuifw.popup_menu(names, u"Choose service")
    return channels[index]

def connect():
    global sock
    address, services = socket.bt_discover()
    channel = choose_service(services)
    sock = socket.socket(socket.AF_BT, socket.SOCK_STREAM)

    print "address:", address
    print "channel:", channel

    sock.connect((address, channel))


def frente():
    global sock
    sock.send("1")


def tras():
    global sock
    sock.send("2")


def esquerda():
    global sock
    sock.send("3")


def direita():
    global sock
    sock.send("4")


def desliga():
    global sock
    sock.send("5")




WHITE = (255,255,255)
RED = (255,0,0)
BLUE = (0,0,255)
YELLOW = (255,255,0)



def handle_redraw(rect):
    if img: canvas.blit(img)


def draw_point(pos):
    if pos == 1:
          img.point((125,30), outline = RED, width = 50)
    elif pos == 2:
          img.point((125,285), outline = RED, width = 50)
    elif pos == 3:
          img.point((200,170), outline = RED, width = 50)
    elif pos == 4:
          img.point((35,170), outline = RED, width = 50)









key_down = None
clicked = None



def handle_event(event):
    global clicked, key_down
    if event['type'] == appuifw.EEventKey:
            if key_down:
                    key_down = (event['keycode'], "down")
            else:
                    key_down = (event['keycode'], "pressed")
    elif event['type'] == appuifw.EEventKeyUp and key_down:
            code, mode = key_down
            if mode == "pressed":
                    clicked = code
            key_down = None
            desliga()
            img.clear(BLUE)



    handle_redraw(None)






def key_clicked(code):
        global clicked
        if code == clicked:
                clicked = None
                return True
        return False

def key_is_down(code):
        if key_down and key_down == (code, "down"):
                return True
        return False

def quit():
        global running
        running = False


img = None

canvas = appuifw.Canvas(redraw_callback = handle_redraw, event_callback=handle_event)

appuifw.app.body = canvas
appuifw.app.screen = 'full'
appuifw.app.exit_key_handler = quit
appuifw.app.menu = [(u"Connect", connect)]

w, h = canvas.size
img = graphics.Image.new((w, h))
img.clear(BLUE)




running = True
while running:
   
    e32.ao_sleep(0.05)

    if key_is_down(key_codes.EKeyUpArrow):
            draw_point(1)
            frente()
    elif key_is_down(key_codes.EKeyDownArrow):
            draw_point(2)
            tras()
    elif key_is_down(key_codes.EKeyRightArrow):
            draw_point(3)
            direita()
    elif key_is_down(key_codes.EKeyLeftArrow):
            draw_point(4)
            esquerda()

    else:
            img.clear(BLUE)




Mais uma vez, dúvidas, discussões, sugestões e críticas são bem vindas....
Abraço!

jpricaro

Pessoal, vou compartilhar com vocês um curso gratuito disponível no youtube:

http://www.youtube.com/user/graccula/videos?sort=dd&flow=grid&view=0&page=2

O responsável se Chama Renato Aloi. As aulas vão desde o básico até o avançado. Gostei bastante mesmo.

Fica a dica.

jpricaro


Fala cara.... quanto ao código tô pondo os dois no final..... ok... acredito que dá pra customizar para uma melhor performace e aparência (no do N95), mas agora tô fazendo tudo funcionar e depois vou voltar olhando o que pode ser melhorado... sugestões e críticas sào MUITO BEM VINDAS.

Quanto ao controle.... minha idéia é ligar ele o controle de PS2 no arduino... ler os comandos e enviar via bluethoot tb.... preciso pesquisar direitinho como isso funciona.... tb já achei pra compar um shield que é o direcional pronto para ser usado.... tb é uma opção.... ainda voi amadurecer a idéia e continuar postanto aqui.... faça o mesmo vc tb... o nosso tópico já tem bastante coisa legal!!!!!


segue o código:


Code: [Select]

int ENA=5;//connected to Arduino's port 5(output pwm)
int IN1=2;//connected to Arduino's port 2
int IN2=3;//connected to Arduino's port 3
int ENB=6;//connected to Arduino's port 6(output pwm)
int IN3=4;//connected to Arduino's port 4
int IN4=7;//connected to Arduino's port 7
byte VelocidadeAtual = 255;


void setup()
{
  pinMode(ENA,OUTPUT);//output
  pinMode(ENB,OUTPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  Serial.begin(9600);

}
void loop()
{
  // ena = velocidade
  // in = direção
  char c = Serial.read();


  // aqui precisa melhorar, tirar os ifs e colocar algo mais eficiente
  if (c == '1')
  {
    // para frente
    AndaParaFrente();
    FuncionaMotor(VelocidadeAtual);
  }

  if (c == '2')
  {
    // para trás   
    AndaParaTraz();
    FuncionaMotor(VelocidadeAtual);
  }


  if (c == '3')
  {
    // direita 
    // começa a funcionar com 90
    ViraDireita();
    FuncionaMotorA(VelocidadeAtual * .4);
    FuncionaMotorB(VelocidadeAtual);
  }


  if (c == '4')
  {
    // direita 
    // começa a funcionar com 90
    ViraEsquerda();
    FuncionaMotorA(VelocidadeAtual);
    FuncionaMotorB(VelocidadeAtual * .4 );
  }


  if (c == '5')
  {
    // para 
    ParaMotores();
  }





}


//------------------------------------------------------------------------------------------
// Liga os motores e determina a velocidade
//------------------------------------------------------------------------------------------
void FuncionaMotor(byte Velocidade)
{
  FuncionaMotorA(Velocidade);
  FuncionaMotorB(Velocidade);
}



void FuncionaMotorA(byte Velocidade)
{
  analogWrite(ENA, Velocidade);//start driving motorA
}

void FuncionaMotorB(byte Velocidade)
{
  analogWrite(ENB, Velocidade);//start driving motorA
}

void ParaMotores()
{
  digitalWrite(ENA,LOW);
  digitalWrite(ENB,LOW);//stop driving

}

//------------------------------------------------------------------------------------------
// FIM - Liga os motores e determina a velocidade
//------------------------------------------------------------------------------------------





//------------------------------------------------------------------------------------------
// Direcoes
//------------------------------------------------------------------------------------------


void AndaParaFrente()
{
  // MOTOR 1
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);//setting motorA's directon 

  // MOTOR 2
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);//setting motorB's directon 
}



void AndaParaTraz()
{
  // MOTOR 1
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);//setting motorA's directon 

  // MOTOR 2
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);//setting motorB's directon
}


void ViraEsquerda()
{

  // MOTOR 1
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);//setting motorA's directon 

  // MOTOR 2
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);//setting motorB's directon

}






void ViraDireita()
{

  // MOTOR 1
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);//setting motorA's directon 

  // MOTOR 2
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);//setting motorB's directon

}




Para o N95, isto que estou postando é um script que roda em Python... então precisa ter ele instalado na máquina... vc acha ele aqui: http://sourceforge.net/projects/pys60 o livro que use como base foi este: "Wiley Mobile Python-Rapid prototyping of applications on the mobile platform"... dá pra achar tranquilo, é só procurar.
A idéia é, primeiro se conectar ao bluethoot do carrinho, depois, quando o cara apertar o direcional para cima vai aparecer uma bolinha vermelha no topo da tela para indicar no celular a direção e enquanto vc mantém a tecla pressionada o script fica enviando o caractere "1" que no arduino tá programado para ele andar pra frente.... quando vc solta o direcional ele para de mandar o 1 e desliga os motores!!!! Funciona assim para as quatro direções.


Segue o código:

Code: [Select]

import appuifw, e32, key_codes, graphics, socket


def choose_service(services):
    names = []
    channels = []
    for name, channel in services.items():
        names.append(name)
        channels.append(channel)

    index = appuifw.popup_menu(names, u"Choose service")
    return channels[index]

def connect():
    global sock
    address, services = socket.bt_discover()
    channel = choose_service(services)
    sock = socket.socket(socket.AF_BT, socket.SOCK_STREAM)

    print "address:", address
    print "channel:", channel

    sock.connect((address, channel))


def frente():
    global sock
    sock.send("1")


def tras():
    global sock
    sock.send("2")


def esquerda():
    global sock
    sock.send("3")


def direita():
    global sock
    sock.send("4")


def desliga():
    global sock
    sock.send("5")




WHITE = (255,255,255)
RED = (255,0,0)
BLUE = (0,0,255)
YELLOW = (255,255,0)



def handle_redraw(rect):
    if img: canvas.blit(img)


def draw_point(pos):
    if pos == 1:
          img.point((125,30), outline = RED, width = 50)
    elif pos == 2:
          img.point((125,285), outline = RED, width = 50)
    elif pos == 3:
          img.point((200,170), outline = RED, width = 50)
    elif pos == 4:
          img.point((35,170), outline = RED, width = 50)









key_down = None
clicked = None



def handle_event(event):
    global clicked, key_down
    if event['type'] == appuifw.EEventKey:
            if key_down:
                    key_down = (event['keycode'], "down")
            else:
                    key_down = (event['keycode'], "pressed")
    elif event['type'] == appuifw.EEventKeyUp and key_down:
            code, mode = key_down
            if mode == "pressed":
                    clicked = code
            key_down = None
            desliga()
            img.clear(BLUE)



    handle_redraw(None)






def key_clicked(code):
        global clicked
        if code == clicked:
                clicked = None
                return True
        return False

def key_is_down(code):
        if key_down and key_down == (code, "down"):
                return True
        return False

def quit():
        global running
        running = False


img = None

canvas = appuifw.Canvas(redraw_callback = handle_redraw, event_callback=handle_event)

appuifw.app.body = canvas
appuifw.app.screen = 'full'
appuifw.app.exit_key_handler = quit
appuifw.app.menu = [(u"Connect", connect)]

w, h = canvas.size
img = graphics.Image.new((w, h))
img.clear(BLUE)




running = True
while running:
   
    e32.ao_sleep(0.05)

    if key_is_down(key_codes.EKeyUpArrow):
            draw_point(1)
            frente()
    elif key_is_down(key_codes.EKeyDownArrow):
            draw_point(2)
            tras()
    elif key_is_down(key_codes.EKeyRightArrow):
            draw_point(3)
            direita()
    elif key_is_down(key_codes.EKeyLeftArrow):
            draw_point(4)
            esquerda()

    else:
            img.clear(BLUE)




Mais uma vez, dúvidas, discussões, sugestões e críticas são bem vindas....
Abraço!


Jo,

Não entendi muito bem esta segunda parte. Devo instalar o Python no meu Android e adicionar esse Script? É isso?


OBS: Instalei o Python e os comando dele são: "=, (, ), " e TAB. Tem que alterar algo?

jojorge01

Fala jpricaro, blz?



Jo,

Não entendi muito bem esta segunda parte. Devo instalar o Python no meu Android e adicionar esse Script? É isso?


OBS: Instalei o Python e os comando dele são: "=, (, ), " e TAB. Tem que alterar algo?


Sim, deve instalar o Python, mas este código que eu passei é somente para celular  Symbian 3 edição..... pra Android eu não sei..... até queria escrever esta aplicação pro Android, mas meu celular é "veinho" ainda hehehehehe

Abraço!!
Jo

Go Up