Montando um carrinho (L298N)

jpricaro:
ahahahahh, o rduino está me deixando doido, tá fod....... Nem formular uma pergunta estou conseguindo...KKKKKKK

Minha dúvida era, depois de enviar os códigos para placa, onde deveria apertar para o carro funcionar????? Achei que funcionava assim: na IDE teria um botão onde eu clico "Frente" o carro anda para frente, eu clico "atras" ele anda para trás....

Mas agora você falou que é pelo controle remoto... putzzzz

Estou usando esse código, sugerido no link: GeekOnfire.com is for sale | HugeDomains

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
void setup()
{
pinMode(ENA,OUTPUT);//output
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
digitalWrite(ENA,LOW);
digitalWrite(ENB,LOW);//stop driving
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//setting motorA's directon
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//setting motorB's directon
}
void loop()
{
analogWrite(ENA,255);//start driving motorA
analogWrite(ENB,255);//start driving motorB

}

vlw

Agora sim! rs

Se você ligou tudo corretamente, os motores deveriam funcionar logo quando você liga o arduino (quando você liga na bateria ou na USB o arduino já começa a executar o código, ele não espera vc apertar nada rs). Tanto que, para evitar que ele execute algo, você tem de segurar o reset enquanto liga e manter segurado por uns 10 segundos após ligar, assim ele não executa o setup e o loop.

Sim, você precisa de "alguém" que se comunique com o arduino (via bluetooth) para dizer frente, trás, etc Esse alguém pode ser o PC, o celular, um controle ir, etc.

Uma dica, tenta somente com o arduino, a placa com o l298n e um motor, ai você pode usar a USB para alimetar o arduino e usar o 5V out para alimentar a placa e o motor, entendeu?

Faz os testes com o mínimo possível conectado, ai vc vai ligando o resto depois, fica muito mais fácil.

Muita calma, é muita coisa para aprenter e precisamos mastigar antes de engolir (eletônica analógica, eletônica digital, programação, lógica e mecânica)

Boa sorte por ai... Se tudo der certo amanhã a noite estou por aqui e vc me conta os resultados!

Até!

Fala pessoal, legal o tópico, todos aprendendo juntos.... quanto aos últimos comentários do Mortis, concordo plenamente tb.... acho mais fácil vc ir ligando aos poucos, os primeiros testes que fiz foi exatamente assim liguei dois motores com o carrinho "no ar", ou seja, sem as rodas tocarem o chão/mesa, pq com este código que vc tá executando precisa tomar cuidado pq se não ele vai sair igual um foguete e vai cair ca mesa (quase aconteceu comigo), ao invés de 255 coloca 120 ou 150 no máximo, só pra sentir o gostinho de ver ele andando, ainda com um fio pendurado, mas andando.
Quanto aos comandos, vc escreve o programa para ler a serial e fazer as ações de ir para a frente, para trás, esquerda e direita. Estes comando vc dá pela própria IDE o arduino usando o Monitor Serial, quando funcionar vc pensa em um controle remoto, por IR, Bluethooth, ou até mesmo esta interface EZ que vc citou. Se quiser a noite posso te mandar o código que estou usando, ele está em constante evolução, mas te mando sem problemas.

Aproveitando o tópico.... não estou conseguindo de jeito nenhum sair com mais de 5 v na saída para os motores. Já ativei para a plaquina pegar energia do Arduino e deixar a alimentação dos 7,4 só para os motores, mas sempre fica em 5 v, tem como mandar mais que isso? Se alguém tiver alguma opinião ou ajuda eu agradeço!!!

Jo

jojorge01:
Aproveitando o tópico.... não estou conseguindo de jeito nenhum sair com mais de 5 v na saída para os motores. Já ativei para a plaquina pegar energia do Arduino e deixar a alimentação dos 7,4 só para os motores, mas sempre fica em 5 v, tem como mandar mais que isso? Se alguém tiver alguma opinião ou ajuda eu agradeço!!!

Jo

E ai Jo,

A noite posso testar a saída para ver se nesse circuito tem algo diferente, afinal os chineses são imprevisíveis rs

Mas a especificação diz: Driver power supply: +6V~+35V

Então, teoricamente, o que você colocar no vms irá para para o motor com a perda apenas relacionada à resistência do L298n. Se eu estiver errado, alguém me corrija, pois estou deduzindo ^^.

Quando você liga a pilhas de Li-on no vms e ativa os motores (ENA ou ENB) com PWM de 255 na saída você lê apenas 5v?

A noite eu posto o resultado do teste, agora preciso trabalhar rs.

Até

Fala Mortis, já li e re-li duzentas vezes a página e não achei nada que pudesse me dizer o porque leio somente os 5 v na saída (tá certo vai... é 5, qq coisa, mas não passa de 5 v)..... o que recentemente tentei fazer foi alimentar a parte lógica com a energia do arduino pq achei.... bom como ele tá alimentando o chip dele que é 5v ele limita toda a entrada.... mas após fazer a mudança... ficou tudo na mesma. Acredito que eu tenha ligado certo, pois como já falei tenho dois conjuntos de pilhas, pra testar fiz assim, tirei as pilhas ligadas direto na controladora de motores e liguei as que alimentam o arduino, quando fiz isso as luzes do arduino e da controladora acenderam...

Não tenho idéia de o que fazer..... se tiver alguma vamos compartilhar.....
Se puder fazer estes testes na sua eu agradeço!!!!

Abraço a todos,
Jo

jojorge01:
Fala Mortis, já li e re-li duzentas vezes a página e não achei nada que pudesse me dizer o porque leio somente os 5 v na saída (tá certo vai... é 5, qq coisa, mas não passa de 5 v)..... o que recentemente tentei fazer foi alimentar a parte lógica com a energia do arduino pq achei.... bom como ele tá alimentando o chip dele que é 5v ele limita toda a entrada.... mas após fazer a mudança... ficou tudo na mesma. Acredito que eu tenha ligado certo, pois como já falei tenho dois conjuntos de pilhas, pra testar fiz assim, tirei as pilhas ligadas direto na controladora de motores e liguei as que alimentam o arduino, quando fiz isso as luzes do arduino e da controladora acenderam...

Não tenho idéia de o que fazer..... se tiver alguma vamos compartilhar.....
Se puder fazer estes testes na sua eu agradeço!!!!

Abraço a todos,
Jo

Jo, como exatamente você fez as ligações? Você ligou o arduino na bateria e os 5v out do arduino nos 5V da placa (ao lado do pino do motor B)?

Preciso confirmar, mas esse conector 5V (ao lado do pino do motor B) no geekonfire é indicado como 5V_OUT, mas creio que isso só ocorre se o jumper 5v_EN estiver ON (com jumper), ou seja o VMS passa pelo regulador que passa 5V para o pino 5V_OUT.

Se tirar o jumper, ele passa a ser 5v_IN, ou seja, é necessário colocar 5V ai para alimentar o CI (L298N).

Depois confirmo isso:
se o 5v_EN estiver ON o pino 5V (ao lado do pino do motor B) fornecerá 5V com origem no regulador, ou seja fornecerá 5V (OUT).
se o 5v_EN estiver OFF o pino 5V precisará ser alimentado com 5V para a parte lógica, ou seja será entrada (IN) para o L298N.

Outra parte é a saída, eu não creio que o regulador de tensão esteja no caminho para a saída do mortor.

O que vou testar é:

  • ligar uma bateria no VMS e GND, manter o jumper 5V_EN
  • Ligar o multímetro na saída do motor A
  • Ligar o ENA no pino 5V out para ativar a ponte H
  • ver o multímetro nos informa ^^

Fala Mortis, isso, liguei exatamente como vc falou, vi um cara fazendo assim em um site e experimentei (segue o site https://sites.google.com/site/raspberrypiarduinorobot/project-definition) . Quanto ao site geekonfire que vc falou, realmente lá está assim, mas se reparar estão as duas saídas assim, deve ser algum engano na legenda da foto. Ahhh eu tirei o jumper tb.

Aqui tirei a energia da placa sensor shield

Aqui entrando com a energia na controladora, usei as mesmas cores de fio.

Bom, estes testes que vc descreveu eu fiz tb.... sem querer.... heheheh mas fiz.... mas se vc puder fazer tb legal, pois existe uma grande chance de eu ter feito errado.
Aguardo seu retorno!!

Abraço!
Jo

Beleza, Jo.

No final no geekonfire não esta errado, só esta incompleto. Eles colocaram as anotações considerando o jumper 5V_EN. Se removermos esse jumper é que a porta muda de OUT para IN.

Confirmarei os teus testes a noite e digo o quanto eu consegui na saída dos motores com a minha bateria de 7,4v, testo também com uma fonte externa de 9v ou 12v.

Até

Ai Jo,

Fiz um teste rápido sem o Arduíno:

Liguei a bateria (VMS e GND) e as pontas do multímetro nos conectores do motor A.

Liguei o ENA ao 5V e o IN1 ao GND.

E cá esta a voltagem, 7,07v (minha bateria não esta totalmente carregada):

Estou com preguiça de fazer o teste com o Arduíno agora ^^, mas acredito que o resultado será o mesmo!

Fala galera.

Finalmente consegui ligar a criança seguindo a orientação do jojorge01. O que estava acontecendo é que no código de exemplo ( GeekOnfire.com is for sale | HugeDomains ) ele utiliza a porta 5 e no meu a porta é a 10. Foi só alterar isso e o carro ligou. :slight_smile: :slight_smile: :slight_smile:

jojorge01:
Quanto aos comandos, vc escreve o programa para ler a serial e fazer as ações de ir para a frente, para trás, esquerda e direita. Estes comando vc dá pela própria IDE o arduino usando o Monitor Serial, quando funcionar vc pensa em um controle remoto, por IR, Bluethooth, ou até mesmo esta interface EZ que vc citou. Se quiser a noite posso te mandar o código que estou usando, ele está em constante evolução, mas te mando sem problemas.

Aproveitando o tópico.... não estou conseguindo de jeito nenhum sair com mais de 5 v na saída para os motores. Já ativei para a plaquina pegar energia do Arduino e deixar a alimentação dos 7,4 só para os motores, mas sempre fica em 5 v, tem como mandar mais que isso? Se alguém tiver alguma opinião ou ajuda eu agradeço!!!

Jo

Jorge gostaria sim que me passasse seu código. Vlw.

O que ainda não ficou claro é a questão de comandar através da IDE (Monitor Serial). Como funciona? Preciso digitar o comando que quero? No caso do carro estar em movimento, para ele parar basta digitar "STOP"?

Vlw mais uma vez pela ajuda, em especial ao Jorge e o Mortis. Um abraço.

jpricaro:
O que ainda não ficou claro é a questão de comandar através da IDE (Monitor Serial). Como funciona? Preciso digitar o comando que quero? No caso do carro estar em movimento, para ele parar basta digitar "STOP"?

Vlw mais uma vez pela ajuda, em especial ao Jorge e o Mortis. Um abraço.

Primeiro, a idéia aqui é ajudar, então denada! =)

Primeiro precisamos "ensinar ao arduino", ou seja, criar o código que vai ler a serial e executar o comando, É exatamente o que tem no link abaixo, a única diferença é que no lugar do digitalWrite(2, HIGH); você vai colocar o código para executar a ação que vc quiser, por exemplo a = direita, b = esquerda, etc

Boa programação ao! :wink:

Mortis:

jpricaro:
O que ainda não ficou claro é a questão de comandar através da IDE (Monitor Serial). Como funciona? Preciso digitar o comando que quero? No caso do carro estar em movimento, para ele parar basta digitar "STOP"?

Vlw mais uma vez pela ajuda, em especial ao Jorge e o Mortis. Um abraço.

Primeiro, a idéia aqui é ajudar, então denada! =)

Primeiro precisamos "ensinar ao arduino", ou seja, criar o código que vai ler a serial e executar o comando, É exatamente o que tem no link abaixo, a única diferença é que no lugar do digitalWrite(2, HIGH); você vai colocar o código para executar a ação que vc quiser, por exemplo a = direita, b = esquerda, etc

http://arduino.cc/en/Tutorial/SwitchCase2

Boa programação ao! :wink:

Pra ilustrar um pouco melhor o que vc var ter que fazer, dê uma olhada no vídeo, este é o primeiro de 3, assista todos que vc vai tirar de letra mais esta heheheh.

Este professor ensina duas coias que vc vai precisar, a primeira é como ligar o Bluethooth, depois pra testar o Bluethooth ele usa o esquema do monitor... é bem simples, qualquer coisa vc nos avisa!!!!

O código eu te passo a noite ok?
Abraço!!
Jo

Mortis:
Ai Jo,

Fiz um teste rápido sem o Arduíno:

Liguei a bateria (VMS e GND) e as pontas do multímetro nos conectores do motor A.
Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.

Liguei o ENA ao 5V e o IN1 ao GND.
Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.

E cá esta a voltagem, 7,07v (minha bateria não esta totalmente carregada):
Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.

Estou com preguiça de fazer o teste com o Arduíno agora ^^, mas acredito que o resultado será o mesmo!

Beleza cara... vou dar mais olha olhada se não fiz m....

Valeu pela informação!!!
Jo

jojorge01:

Mortis:
Ai Jo,

Fiz um teste rápido sem o Arduíno:

Liguei a bateria (VMS e GND) e as pontas do multímetro nos conectores do motor A.
Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.

Liguei o ENA ao 5V e o IN1 ao GND.
Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.

E cá esta a voltagem, 7,07v (minha bateria não esta totalmente carregada):
Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.

Estou com preguiça de fazer o teste com o Arduíno agora ^^, mas acredito que o resultado será o mesmo!

Beleza cara... vou dar mais olha olhada se não fiz m....

Valeu pela informação!!!
Jo

Fala pessoal, desculpe pelo ausência.... tive que fazer uma cirurgia esta semana.... mas já tô bem e em casa.....

Mortis, fiz os testes, realmente "só" os 5v..... fiz até uma ligação igual a sua.... mas somente os 5v!!!!
O que será que tá errado?
Se alguém tiver uma luz eu agradeço!!
Jo

:disappointed_relieved:

Mortis:
Me interessou essa parte: "Apply to be a beta tester when you register for the forum. Contributors get a free forever license for the debugger upgrade when it is released"

É interessante vermos as regras, "free forever" é muito melhor!

Yes, it is "free forever" for all beta contributors (the more the better, hint hint) but it won't cost very much anyway :slight_smile: http://www.visualmicro.com

You can see a slow but detailed overview of the Arduino debugger on youtube
Arduino debugger.

The first couple of minutes is for new Arduino users, the remainder shows basic debugging.

Sorry for using English

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.

Mortis:
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

jojorge01:

Mortis:
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.

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:

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: PyS60 download | SourceForge.net 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:

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!

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

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.

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:

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: 



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, [u]**dúvidas, discussões, sugestões e críticas são bem vindas**[/u].... 
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?