quinta-feira, 18 de julho de 2013

Controlar um carrinho com o Controle do PS3 Usando Arduino

Esse é um projeto bem legal e bem simples, que pode ser encontrado facilmente na internet, porém nem sempre está descrito de forma simples para que qualquer um possa implementá-lo.


Hardware 

Primeiramente, vamos precisar de uma placa Arduino. No meu projeto utilizei a Arduino UNO mesmo, porém após compilar o Sketch, com todas as bibliotecas, o tamanho ficou próximo dos 30KB, que é o tamanho máximo que o programa pode ter(2KB é utilizado pelo BootLoader).

A comunicação do controle é feita via Bluetooth, então precisaremos ter um Bluetooth para comunicar nosso Arduino com o controle. Mas, não pode ser qualquer Bluetooth e também não pode ser os shields que fazem comunicação serial com o Arduino. Precisaremos da Placa USB Host Shield, que possui uma entrada USB e então precisaremos de um Dongle Bluetooth (desses que conectamos via USB no PC) que seja do padrão Bluetooth 2.0 compatível com EDR. Normalmente na embalagem do Bluetooth aparecem essas informações, caso não apareça, deve ser procurado pela velocidade de 3Mbps.


Temos vários modelos de placa USB Host Shield, testei 3 delas, e todas as três são compatíveis com a biblioteca.



Eu utilizei um carrinho de controle remoto antigo. Retirei a parte eletrônica dele, coloquei um servo motor para controlar os pneus dianteiros(pois o que havia no carrinho era um motor DC e não tinha controle analógico) e aproveitei o motor DC que já havia no carrinho.



Enfim, é isso que precisaremos de "Hardware", para montar nosso projeto:

- Placa Arduino UNO
- Placa USB Host Shield
- Dongle USB 2.0 + EDR (3Mbps)
- Carcaça de carrinho antigo
- Servo motor
- Motor DC
- Controlador de Motor DC (Ponte H)


A placa USB Host Shield vai conectada ao Arduino UNO, normalmente(é importante que essa placa tenha conectores empilháveis),


e na placa USB Host Shield conectaremos nossa placa controladora de motor. No meu casso confeccionei uma placa específica para esse projeto, onde tenho a saída para o servo motor, motor DC, farol(LED) e buzina(buzzer).



Existem placas prontas que fazem a ponte H que controla o motor DC, uma boa alternativa, caso você não tenha conhecimento de confecção de placas. Basta dar uma procurada no mercadolivre ou no google que aparecerão várias opções. Procure como "Ponte H Arduino", ou como "Driver Motor Arduino". É importante que tenham conectores do tipo empilháveis para que os pinos do Arduino estejam disponíveis para fazer a ligação do Servo motor.
A placa USB Host Shield utiliza os pinos de 7 a 13, se não me engano (já faz uns 2 meses que montei esse projeto), então não utilize esses pinos para fazer ligações.

Posteriormente quero postar minhas técnicas de confecção de placa, para fazer em casa.
Ou, quem preferir pode mandar fazer a placa, mas o preço é bem salgado.

A caixa de pilhas do carrinho foi aproveitada e a alimentação foi feita da seguinte forma: 

- GND, ligado ao GND do arduino;
- 7,5V (ou 5 pilhas) ligado no Vin do Arduino;
- 12V ligado na ponte H que controla o motor.

Quando você liga alguma tensão no Vin do Arduino, os reguladores de tensão para 5V e 3,3V funcionam normalmente, como se estivessem sendo alimentados pelo pino P4.
O servo motor que eu utilizei precisa de 5V e foi ligado na porta correspondente do Arduino.

Software

Primeiramente vamos baixar e instalar a biblioteca que controlam a placa USB Host Shield (https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip).

Estou usando a versão 1.0.5 da IDE do Arduino.

Vamos descompactá-la na pasta libraries do seu Sketchbook (normalmente fica na pasta C:\Usuários\Seu usuário\Documentos\Arduino. Pode ser alterado clicando em Arquivo/Preferências/Localização do Sketchbook) e renomeá-la da seguinte maneira USB_Host_Shield_20. Após isso, caso você esteja com a IDE Arduino aberta, feche e abra novamente. Já será possível ver que apareceu uma nova opção com o nome da biblioteca em Arquivo/Exemplos.

Vamos abrir o exemplo USB_Host_Shield_20/Bluetooth/PS3BT. Agora ficou fácil!!


Dando uma rápida olhada no código, você irá reconhecer os comandos dos botões (Triangle, Circle, R2, R1, etc). SIM, você só precisa inserir seu código nos blocos if adequados para controlar seu projeto de acordo com sua necessidade.

Para fazer o servo virar as rodas dianteiras usando o botão analógico esquerdo, adicionei o seguinte código:





A informação passada pelo controle analógico funciona assim: tudo a esquerda é 0, tudo a direita é 255. Com o comando map escrevi diretamente no servo motor, utilizando os comandos da biblioteca <Servo.h>. Como o espaço para giro do motor é pequeno, limitei o movimento em 30 graus para cada lado (90 é o centro, 180 é roda para a esquerda e 0 é roda para a direita, por isso usei os valores invertidos no map)


Para controle do motor usando o botão analógico direito, usei o seguinte código:



O motor precisa que seja mandado uma determinada tensão (PWM) em um pino para ir para a frente e em outro pino para ir para trás, tive que colocar os if para dividir esse ponto central.

Não esquecer de declarar e inicializar as variáveis no início do código:



Para fazer a biblioteca funcionar, alimente o Arduino(necessita alimentação externa), plugue o dongle bluetooth na USB da placa USB Host Shield, deixe por alguns segundos para que a biblioteca leia o endereço MAC do bluetooth. Remova o bluetooth e insira o cabo do controle do PS3, conectado ao controle, para que a biblioteca grave o endereço MAC do bluetooth no controle. Quando o controle reconhecer o MAC, todos os LEDs do controle ficarão piscando. Após isso é só reconectar o bluetooth, pressionar o botão PS no controle e aguardar até que ele conecte e fique somente o LED 1 acesso. Caso não consiga conectar de primeira, tente resetar o Arduino, porém não será mais necessário retirar o bluetooth e gravar MAC no controle, uma vez feito isso, fica gravado permanente.

Agora é só brincar.


Grande parte do conteúdo foi encontrado nas seguintes páginas: http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part-1 http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part-2 http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part-3 https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information Nessas páginas o negócio está bem explicado, inclusive são os criadores da placa USB Host Shield e da biblioteca, porém está em inglês. Caso tenham dúvidas, podem enviá-las nos comentários, que vou responder assim que possível.


Código fonte disponível em Projetos-Arduino/PS3BT_carro.ino

46 comentários:

  1. boa noite cara.. qual a distancia que eh possivel atingir entre controle e carro?

    ResponderExcluir
    Respostas
    1. Boa noite. Eu consegui um bom desempenho a até cerca de 10m. Mas isso deve variar de acordo com o modelo de dongle bluetooth que você adquirir, alimentação, barreiras, etc.

      Abraço

      Excluir
  2. Oi amigo,

    Muito bom seu tutorial.

    Desculpe-me usar este espaço, porem gostaria de informar que tenho O USB Host Shield a venda, aceito mercado pago.

    Contato por email : connectparts@gmail.com

    Obs: Se meu comentário foi irregular ou se estou causando qualquer transtorno, sinta-se a vontade para apaga-lo.

    Obrigado.

    ResponderExcluir
  3. Boa tarde, estou com tudo igual o seu trabalho, porem quando conecto o servo motor na ponte h alimentado por uma 9v ele da um giro compreto e trava, visualizo as seçoes no monitor serial e o controle responde aos comandos, saberia me dizer o motivo do erro? estou com o mesmo codigo que vc usou extamente da mesma forma com os comandos adicionais inseridos.. Obrigado

    ResponderExcluir
  4. Boa noite Anderson, você deve conferir as especificações do seu servo motor, se ele fez uma volta completa (360º) você deve ajustar os valores dos ângulos, pois no meu projeto utilizei um servo de 180º (0 - 179º). É interessante também conferir se a pinagem do servo está batendo com o Arduino, no comando servo1.attach(nro porta).
    É sempre importante ler o datasheet do componente. Espero ter ajudado.

    ResponderExcluir
  5. boa tarde DOuglas o servo motor ta girando só pra um lado e ele ta sendo acionado com os dois analogicos eu fiz o codigo igual ao do tutorial vc poderia me ajudar

    ResponderExcluir
    Respostas
    1. Bom dia Renato,

      respondi lá no canal do Youtube, mas vamos de novo.

      Verifique se o seu servo é de 180 graus e verifique se você está ligando ele a uma porta que tenha saída PWM. No UNO, as portas são : 3, 5, 6, 9, 10, 11.

      Excluir
  6. tem como vc me mandar seu codigo do projeto do carrinho de controle PS3 por email? renato.bps@hotmail.com

    ResponderExcluir
  7. Bom dia.. Gostaria de saber qua shield vc indica para o projeto r tambem se vc me manda o codigo do seu projeto?
    bruno_sr03@hotmail.com

    ResponderExcluir
  8. Bom dia! Gostaria de saber se conseguirei usar o controle no video-game novamente, depois que for utilizado no projeto?

    ResponderExcluir
    Respostas
    1. Consegue sim, mas você vai precisar conectar o controle com o cabo USB no video game, para que o controle aprenda o MAC do video game, antes de jogar sem o fio conectado.

      Excluir
  9. Olá Douglas, você pode passar o codigo que foi ultilizado para o E-mail: washingtonmagalhaes@outlook.com , obrigado ;)

    ResponderExcluir
  10. Queria saber se consigo fazer o msm projeto so que com modulo bluettoth ao inves do shield usb?

    ResponderExcluir
    Respostas
    1. Quando fiz a pesquisa, não era possível. Primeiro porque a biblioteca usada é compatível somente com o USB Host Shield. Outro motivo é que no shield bluetooth você fica limitado a enviar/receber caracteres via serial e também a alguns comandos AT. Enquanto que via USB Host Shield vc consegue enviar e receber o padrão que desejar. E como a comunicação com o PS3 não é feita apenas via serial, não era possível.
      Não sei como está hoje, mas acredito que não tivemos progresso quanto isso. O shield bluetooth é feito pra facilitar a comunicação e a implementação de projetos. Aquela biblioteca usada pra comunicar com o PS3 é beeem complexa.

      Espero que ajude.

      Abraço

      Excluir
  11. Olá Douglas, como vai? Cara muito bacana seu tutorial! Parabéns! Será que seria possivel pegar o código completo com vc? timsantosf@hotmail.com

    Muito Obrigado!

    ResponderExcluir
  12. vc teria como me passar o modelo e marca do seu aptador Bluetooth estou tendo problemas na hora de parear, obrigado

    ResponderExcluir
    Respostas
    1. estou com o msm problema . caso identifique favor me avisar

      Excluir
  13. Boa tarde amigo estou fazendo esse projeto ou melhor um bem semelhante e estou tendo problemas com a sincronização do controle .. alguma outra dica ?

    ResponderExcluir
    Respostas
    1. Pessoal, boa tarde. Também tive problemas com dongle bluetooth. Comprei uns 3 até conseguir um que funcionasse corretamente. A dica é procurar por um Bluetooth 2.0 compatível com EDR.

      Comprei daqueles modelos genéricos, conforme a foto acima e deu certo.

      o Legal é usar o programa de exemplo da biblioteca PS3BT e verificar se estão aparecendo os valores das leituras dos botões e sticks analógicos, antes de testar no código final.

      Abraço

      Excluir
  14. Boa tarde, tem como vse me passar o codigo q vse usou por e-mail por favor (maykewfx@gmail.com), essa "ponte H q vse fez posso botar essa aqui Motor Shield L293D ou esse Ponte H L298n no lugar dela é se der me passa o projeto da sua ponte por favor.
    Grato desde já.

    ResponderExcluir
  15. O meu tá dando erro;
    tô há tempos tentando configurar o driver, os codigos e o meu arduino.
    Tô quase desistindo


    alguém pode me dar uma ajuda geral?

    ResponderExcluir
  16. Essa biblioteca ta toda cagada, so de abrir e compilar do jeito que ta, ela da erros.

    ResponderExcluir
  17. Parabéns Douglas pelo trabalho, estou interessado em montar um modelo como o seu e depois trabalhar em um carrinho de maior potência, teria como disponibilizar o Código e outros arquivos que te ajudou a na montagem do projeto. rodriguese90@hotmail.com

    ResponderExcluir
  18. Grande trabalho Douglas, estou com algumas dificuldades no meu código tbm, tem como me enviar o seu pra comparar, valeu.
    gleidison90@hotmail.com

    ResponderExcluir
  19. Boa noite Douglas, estou com um projeto igual o seu ! Me inspirei haha porém nao consigo ligar um led apertando "X" . Sera que pode me ajudar ?? Manda email qualquer coisa.. matheus_lang@hotmail.com

    ResponderExcluir
  20. Então Matheus, O comando do X é CROSS, daí você usa :
    if(PS3.getButtonClick(CROSS)==1){ // Quando apertar o X, o X valerá 1
    DigitalWrite(led, HIGH);
    }

    ResponderExcluir
  21. Douglas, depois de descompactar o arquivo, eu inserir na biblioteca do arduino, porém quando coloco na opção PS3BT(no caso o bluetooth), e compilo o arquivo
    as linhas que tem o R2 e L2 dam erro... Poderia me ajudar com esse detalhe ? Qualquer coisa entre em contato comigo
    Whatshapp: 959990878/ email:weverson_1997@hotmail.com
    Atenciosamente,

    ResponderExcluir
  22. Muito massa!!
    Tem como enviar o código completo?
    Wenixmoreno325@gmail.com

    ResponderExcluir
  23. Douglas,

    Boa Noite,

    Gostaria de falar com vc por e-mail ou telefone ... é possível ????
    92-992080775
    rodolfocristo@hotmail.com

    Att

    Rodolfo Cristo

    ResponderExcluir
  24. Olá estou com uma dúvida, assim que ligo a placa juntamente com os Shields e o conector bluetooth já conectado e piscando, se eu apertar o botão ps ele já tem que identificar correto?
    Me ajuda alguém

    ResponderExcluir
  25. Olá estou com uma dúvida, assim que ligo a placa juntamente com os Shields e o conector bluetooth já conectado e piscando, se eu apertar o botão ps ele já tem que identificar correto?
    Me ajuda alguém

    ResponderExcluir
    Respostas
    1. Olá Claudinei.

      Na primeira vez que você usa o controle com o carrinho, você deve ligar a placa com o dongle bluetooth conectado no shield por alguns segundos para que o endereço MAC do dongle fique salvo no Arduino.

      Depois, sem desligar o circuito, desconecte o dongle bluetooth e conecte o controle via cabo USB no shield, para que o controle receba o MAC do dongle bluetooth que ficou salvo na memória do Arduino.
      Depois que o controle ficar com o MAC salvo, remova ele e conecte novamente o dongle bluetooh no shield. Daí pra frente não precisa mais fazer esse processo. A placa pode ser reiniciada, pois o MAC do bluetooth já está cadastrado no controle. É só apertar o botão PS, aguardar conectar e aproveitar.

      Lembrando que se você quiser usar o seu controle novamente no seu PS3, deve conectar o controle via cabo USB no PS3 com o mesmo ligado para que o controle cadastre o MAC do PS3 novamente.

      Espero ter ajudado. Qualquer dúvida, fique a vontade pra perguntar.

      Excluir
  26. ola poderia por gentileza fornecer o codigo por email
    476wesley@gmail.com
    desde ja agradeço

    ResponderExcluir
    Respostas
    1. Boa noite. Atualizei o post e coloquei o link para download do código: https://github.com/dougsilvabr/Projetos-Arduino/blob/master/PS3BT_carro.ino

      Excluir
  27. Olá gostaria de saber se é possível me enviar o código.
    maycon255@gmail.com

    desde já agradeço.

    ResponderExcluir
    Respostas
    1. Boa noite. Atualizei o post e coloquei o link para download do código: https://github.com/dougsilvabr/Projetos-Arduino/blob/master/PS3BT_carro.ino

      Excluir
  28. Bon dia, será que é possível fazer esse projeto so que para um avião

    ResponderExcluir
    Respostas
    1. Boa tarde.

      Até é possível, mas acredito que não seja viável pois o alcance é muito curto. E tratando-se de aeromodelo, qualquer falha de comunicação ou atraso, pode custar caro.
      Abraço

      Excluir
    2. Boa tarde.

      Até é possível, mas acredito que não seja viável pois o alcance é muito curto. E tratando-se de aeromodelo, qualquer falha de comunicação ou atraso, pode custar caro.
      Abraço

      Excluir
  29. Bon dia, será que é possível fazer esse projeto so que para um avião

    ResponderExcluir
  30. Bom dia, estou projetando meu TCC, sera semelhante ao seu projeto. iremos usar um controle igual. Vamos controlar uma mini carregadeira. teremos dois motores dc, um em cada roda traseira para avanço, dois atuadores lineares elétricos para movimentação da caçamba e um motor de passo para direção. Não temos muita experiência em eletrônica. Gostaria de saber se posso irar as duvidas que irão surgir aqui com vc?

    ResponderExcluir
    Respostas
    1. Bom dia Francisco.

      Podemos trocar idéias sim. No que eu puder ajudar, estou aí. Qualquer coisa me mande as dúvidas por e-mail (dougsilvabr@gmail.com), que assim que eu puder, te respondo.

      Abraço

      Excluir
  31. Bom dia Douglas.

    Desde já, muito obrigado

    ResponderExcluir