Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Robô Arduino com controlador PS2 (joystick para PlayStation 2)

Componentes e suprimentos

Arduino UNO
× 1
Drivers de motor SparkFun Dual H-Bridge L298
× 1
Kit de tanque robótico DIY
× 1
Controlador sem fio Sony PS2
× 1

Aplicativos e serviços online

Arduino IDE

Sobre este projeto




Neste tutorial, mostrarei como usar um joystick sem fio do PlayStation 2 (PS2) para pilotar um tanque robótico. Uma placa Arduino Uno foi usada no núcleo deste projeto. Ele recebe comandos do controlador sem fio e define a velocidade dos motores. Outras placas de desenvolvimento também podem ser usadas (NodeMCU, Firebeetle, etc.), e os princípios apresentados neste tutorial podem ser aplicados em outros modelos de robôs e gadgets.

Eu já projetei um tanque robótico controlado por Blynk. Ele se conecta a uma rede Wi-Fi e recebe comandos do servidor Blynk. Um smartphone rodando o aplicativo Blynk foi usado como controle remoto e diferentes métodos de entrada foram usados:botões, barras deslizantes e até acelerômetro do smartphone. Você pode encontrar mais sobre este projeto aqui:https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

Também fiz alguns experimentos com comandos de voz. Pode ser útil se você quiser controlar um robô remotamente sem usar as mãos ou se quiser torná-lo acessível para alguém com movimentos limitados. Pode-se pensar em uma cadeira de rodas robótica controlada por voz, por exemplo. Um kit de robótica DIY foi usado, junto com algumas das minhas ferramentas favoritas:Adafruit.io, IFTTT e Arduino IDE. Instruções completas aqui:

https://www.hackster.io/igorF2/wi-fi-voice-controlled-robot-using-google-assistant-79802c

Você pode utilizar diversos kits ou até mesmo desenhar seus próprios robôs utilizando materiais simples, sem a necessidade de utilizar ferramentas complexas como impressoras 3D e máquinas de corte a laser. Você pode encontrar um exemplo em um dos meus tutoriais anteriores:

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09








Etapa 1:Ferramentas e materiais






As seguintes ferramentas foram utilizadas neste projeto:
  • Ferro e fio de solda (link / link). Os motores DC já vinham com fios soldados aos seus terminais ... Mas eventualmente ele irá quebrar e você terá que vendê-lo novamente. Portanto, considere ter um bom ferro de solda e fio à mão.
  • Folha de espuma EVA (ou outro material não condutor). O chassi do robô que usei neste projeto é feito de alumínio e as placas de circuito são instaladas nessas peças de metal. Usei uma camada de folha de espuma entre as placas e a placa de metal para evitar possíveis curtos-circuitos.
  • Fita dupla-face . Foi usado para colar as folhas de espuma nas placas de circuito e para a instalação do modo H-Bridge.
  • Tesouras , para cortar alguns retângulos de folha de espuma.

Usei as seguintes peças de hardware para meu projeto:
  • placa de desenvolvimento baseada em Arduino Uno (link / link / link / link). É usado como o controlador principal do robô. É realmente fácil de usar e programar com o Arduino IDE, ótimo para iniciantes em eletrônica e programação.
  • Módulo ponte H de canal duplo L298N (link / link / link / link). Este módulo permite que os sinais de 3,3 V do Wemos (ou de um Arduino) sejam amplificados para os 12 V necessários para os motores.
  • DIY Robot Chassis Tank (link). Este incrível kit tem tudo que você precisa para construir um tanque:dois motores DC, engrenagens, esteiras, parafusos, porcas, etc. Já vem com as ferramentas necessárias para montar o chassi, o que é ótimo para iniciantes!
  • Controle remoto sem fio PS2 (link). Este controlador de videogame pode enviar comandos sem fio para um receptor, que pode interagir com um microcontrolador usando comunicação serial.
  • baterias 18650 3,7 V (x3) (link / link). Eu costumava alimentar todo o circuito. Este tanque usa motores de 12V. Usei três baterias de 3,7 V em série para alimentá-los.
  • suporte de bateria 3S 18650 (link / link / link). Ele pode conter três baterias 18650 em série e pode ser facilmente instalado na parte de trás do tanque.
  • carregador de bateria 18650 (link / link). Eventualmente, suas baterias ficarão sem carga. Quando isso acontecer, um carregador de bateria virá em seu socorro.
  • Jumpers (link / link). Usei 6 jumpers macho-fêmea para sinais entre a ponte h e Wemos, e 2 jumpers macho-fêmea para 5V e Gnd. Você pode precisar de mais se planeja adicionar alguns sensores.
  • Cabo USB Tipo B . Você precisará disso para enviar seu código. A maioria das placas já vem com seu próprio cabo.

Os links acima são apenas uma sugestão de onde você pode encontrar os itens usados ​​neste tutorial (e talvez apoiar meus tutoriais futuros). Sinta-se à vontade para procurá-los em outro lugar e comprar em sua loja local ou online favorita.






Etapa 2:montagem do robô




A primeira parte deste projeto foi a montagem da estrutura do robô.

Em projetos anteriores desenvolvi a estrutura do meu próprio robô, utilizando materiais de fácil acesso (sem a necessidade de ferramentas complexas, impressoras 3D ou máquinas de corte a laser). Você pode encontrar este projeto no link abaixo:

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

Mais tarde, decidi dar uma chance a um kit robótico obtido em uma loja online. Você pode encontrar um link para o chassi do robô no seguinte link:http://bit.ly/2ycI8fP. Se está procurando um kit, acho uma boa opção! Usei em outros dois tutoriais, como vocês podem ver nos links abaixo:

https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

https://www.hackster.io/igorF2/wi-fi-voice-controlled-robot-using-google-assistant-79802c

A princípio parecia que a montagem seria complexa ou que teria problemas como a falta de peças (dada a quantidade de peças que compõem o kit). Mas esse kit realmente me surpreendeu! Todas as peças me parecem de boa qualidade, e várias peças de reposição acompanhavam o kit. Assim, um parafuso perdido embaixo da bancada não impossibilitará a execução do seu projeto, que achei excelente (principalmente depois de perder alguns parafusos).

Outro ponto positivo é que todas as ferramentas necessárias para montar o robô estão incluídas no kit (algumas chaves Allen e a chave de fenda). Acredito que isso torna o kit excelente para iniciantes que não têm muitas ferramentas!

Como aspecto negativo, destaco a falta de documentação. O montador do robô

ual (um arquivo de planilha em chinês) não é extremamente amigável e não há muitos tutoriais online para esse tanque. E então decidi documentar o processo de montagem do meu robô no vídeo acima! Outro ponto de atenção diz respeito ao material da estrutura do robô. A base é inteiramente feita de alumínio, o que pode causar algum curto-circuito caso os pinos das placas de circuito impresso toquem na moldura.

Existem outros kits online que você pode usar. Você pode até fazer sua própria estrutura, como descrevi a seguir.








Etapa 3:Instalação do circuito




Um pacote de energia feito de três baterias 18650 foi instalado na parte traseira do robô. Ele fornece 11,1 V (3 x 3,7 V) para o robô. Isso é o suficiente para alimentar os motores de 12 Vcc.

Uma ponte H de canal duplo L298N foi usada para o controle dos motores. Ele recebe alguns sinais de 5 V da placa Arduino e fornece tensões mais altas para os motores. Também permite que os motores funcionem em ambas as direções, dependendo da combinação desses sinais de entrada.

Cada dispositivo foi conectado de acordo com o esquema.





Segue uma lista dos pinos que você precisará conectar:

Entradas / saídas do Arduino Uno:
  • Pino digital 3 => Pino ENA H-Bridge
  • Pino digital 5 => pino H-Bridge IN1
  • Pino digital 4 => pino H-Bridge IN2
  • Pino digital 8 => Pino H-Bridge IN3
  • Pino digital 7 => pino H-Bridge IN4
  • Pino digital 6 => Pino ENB H-Bridge
  • 5V pin => H-Bridge 5V pin
  • Gnd pin => H-bridge Gnd pin
  • Pino digital 10 => pino 6 do receptor PS2
  • Pino digital 11 => pino 2 do receptor PS2
  • Pino digital 12 => pino 1 do receptor PS2
  • Pino digital 13 => Pino 7 do receptor PS2
  • 3,3 V pin => PS2 receptor pino 5
  • Gnd pin => receptor PS2 pino 4

Entradas / saídas H-Bridge:
  • ENA pin => Arduino digital pin 3
  • IN1 pin => Arduino digital pin 5
  • IN2 pin => Arduino digital pin 4
  • IN3 pin => Arduino digital pin 8
  • IN4 pin => Arduino digital pin 7
  • ENB pin => Arduino digital pin 6
  • 5V pin => Arduino 5V pin
  • Gnd pin => Arduino Gnd pin
  • Gnd pin => Fio negativo da bateria
  • 12V pin => Fio positivo da bateria
  • OUT1 => Fio negativo do motor direito
  • OUT2 => Fio positivo do motor direito
  • OUT3 => Fio positivo do motor esquerdo
  • OUT4 => Fio negativo do motor esquerdo

Receptor PS2:
  • Pino 1 (dados) => pino digital 12 do Arduino
  • Pino 2 (comando) => pino digital Arduino 11
  • Pino 4 (solo) => pino Gnd do Arduino
  • Pino 5 (alimentação) => pino Arduino 3.3V
  • Pino 6 (atenção) => pino digital 10 do Arduino
  • Pino 7 (relógio) => pino digital Arduino 13










Etapa 4:configurar o IDE do Arduino




Para este projeto, usei o IDE Arduino para programar a placa Arduino.

1 Baixe e instale a versão mais recente do IDE do Arduino

Você pode encontrar a versão mais recente para Windows, Linux ou MAC OSX no site do Arduino:https://www.arduino.cc/en/main/software

Baixe-o gratuitamente, instale-o no seu computador e execute-o.

2. Adicionando as bibliotecas

Neste projeto, utilizo a biblioteca Arduino PS2X.

Baixe a biblioteca em https://github.com/madsci1016/Arduino-PS2X. Descompacte o arquivo e copie as pastas para as pastas de bibliotecas / ferramentas do IDE do Arduino.

............

Agora que seu ambiente de desenvolvimento está pronto, vamos passar para a próxima etapa!






Etapa 5:Biblioteca de controladores sem fio PS2 explicada




Um controlador sem fio PS2 é uma ótima ferramenta para seus projetos de robótica. Possui uma quantidade incrível de botões:20 botões digitais e 2 analógicos. Desta forma, existem possibilidades infinitas de controlar o seu robô.

Usei a biblioteca PS2X de Bill Porter (https://github.com/madsci1016/Arduino-PS2X) para fazer a interface do controlador com uma placa Arduino Uno.

Ele define uma classe PS2X para o controlador, que contém alguns métodos de leitura de entradas analógicas e digitais do joystick. Um objeto para esta classe é criado usando o seguinte código (antes ou durante a configuração):
  PS2X ps2x;  

Uma vez que o objeto foi definido, ele deve ser vinculado aos pinos de E / S do Arduino usando a seguinte função:
  erro =ps2x.config_gamepad (relógio, comando, atenção, dados, pressão ?, ruído?);  

Esta função pode retornar alguns erros se houver algo errado com as conexões ou com o próprio controlador.

As principais funções utilizadas na biblioteca são as de leitura de entradas digitais e analógicas. Para leitura e entrada digital, o seguinte método é usado:
  ps2x.Button (botão);  

Em que botão é o nome do botão a ser lido. Cada botão é mapeado da seguinte maneira:

Botões direcionais:

  • PSB_PAD_UP =botão direcional para cima;
  • PSB_PAD_DOWN =botão direcional para baixo;
  • PSB_PAD_LEFT =botão esquerdo do D-pad
  • PSB_PAD_RIGHT =botão direito do D-pad

Botões de ação:

  • PSB_GREEN ou PSB_TRIANGLE =botão do triângulo verde
  • PSB_RED ou PSB_CIRCLE =botão do círculo vermelho
  • PSB_BLUE ou PSB_CROSS =botão azul x
  • PSB_PINK ou PSB_SQUARE =​​botão quadrado rosa

Gatilhos:

  • PSB_L1 =botão disparador 1 do lado esquerdo
  • PSB_R1 =botão disparador 1 do lado direito
  • PSB_L2 =botão disparador 2 do lado esquerdo
  • PSB_R2 =botão disparador 2 do lado direito

Sticks:

  • PSB_L3 =botão de pressão do manípulo esquerdo (sim, você pode pressionar o manche como um botão de pressão)
  • PSB_R3 =botão do manípulo direito

Menu:
  • PSB_SELECT =botão de seleção
  • PSB_START =botão iniciar

Para ler o valor analógico (com conversor em um número inteiro entre 0 e 255) dos manípulos use o seguinte método:
  ps2x.Analog (stick_axis);  

Em que stick_axis representa o stick e a direção a ser lida, da seguinte forma:
  • PSS_LY =posição y do controle esquerdo
  • PSS_LX =posição x do controle esquerdo
  • PSS_RY =posição y do manípulo direito
  • PSS_RX =posição x do manípulo direito

Com essas funções básicas, você estará pronto para usar o controlador PS2 em seu projeto! Nas etapas a seguir, mostro alguns exemplos de esboço do Arduino combinando esses botões!






Etapa 6:Esboço nº 1 - Botões do Dpad




Videogames antigos, como SEGA Master System e Mega Drive e Nintendo SNES, não tinham botões sensíveis à força. Os botões direcionais eram apenas botões liga / desliga. Para este primeiro exemplo, eu queria emular o tipo de controle que se teria em videogames antigos desses consoles.

Para este primeiro Sketch, usei os botões do Dpad como entradas para o robô. Cada botão foi utilizado pelo robô para realizar um dos movimentos básicos:avançar, virar à direita, virar à esquerda ou retroceder.

Esses botões têm saídas binárias. Desta forma, o microcontrolador só entenderá que os botões foram pressionados, mas não entenderá com que força eles foram pressionados. Dessa forma, ao clicar em um determinado botão, os motores funcionarão em velocidade máxima.

Se você conectou tudo de acordo com meus esquemas, você terá as seguintes saídas:
  • PSB_PAD_UP =avançar
  • PSB_PAD_DOWN =retroceder
  • PSB_PAD_LEFT =vire à esquerda
  • PSB_PAD_RIGHT =vire à direita

Como eu disse antes, o motor se moverá a uma velocidade fixa. Ao virar para a esquerda ou para a direita, os motores funcionarão em direções opostas, de modo que o robô girará em torno de seu eixo.



Código Arduino:

Baixe o código e abra-o no Arduino IDE. Se você usar a mesma pinagem que eu usei, provavelmente não terá que mudar nada no código (embora possa ser necessário, se a orientação dos motores for diferente

Para fazer o upload do código, selecione a placa 'Arduino / Genuino Uno', selecione a porta COM correta, conecte a placa na porta USB do seu computador e carregue o código.
Após a conclusão do upload, desconecte o cabo USB e coloque o baterias. O código começará a ser executado e a placa Arduino conectará automaticamente o joystick PS2. Abra o monitor serial na primeira utilização e verifique o status da conexão. Se não conseguir se conectar com o joystick, há algo que você deve fazer:
  • Reinicialize a placa Arduino Uno. Tente várias vezes (para mim, geralmente funciona após a terceira reinicialização);
  • Verifique se o joystick está ligado (e com as baterias carregadas). O receptor possui alguns LEDs que indicam se o joystick foi emparelhado. Verifique também se os pinos RX e TX do Arduino piscam ao receber novos comandos (e atualiza o status na porta serial);
  • Verifique as conexões ... pode haver algo errado nos jumpers entre os componentes.





Código explicado:


Neste projeto eu só tive que usar a biblioteca PS2X_lib.h. I é adicionado no início do código.
  #include   

Defina os pinos do Arduino conectado à ponte h. Se você usar as mesmas conexões que eu usei, você terá a seguinte configuração. Se você optar por usar pinos diferentes, atualize esta parte do código.
  // Estes são usados ​​para definir a direção do driver de ponte. #define ENA 3 // ENA #define MOTORA_1 4 // IN3 #define MOTORA_2 5 // IN4 #define MOTORB_1 8 // IN1 #define MOTORB_2 7 // IN2 #define ENB 6 // ENB  

Algumas variáveis ​​globais foram declaradas antes da configuração ( p2sx , erro , tipo e vibrar ) O primeiro é uma instância da classe PS2X. O status de erro durante a conexão será armazenado em erro inteiro. Tipo e vibrar indicará o tipo de controlador (controlador DualShock ou GuitarHero) e se ele deve vibrar após um determinado comando.

A primeira coisa que fiz durante a instalação foi configurar o estado dos pinos de E / S (como saída) e definir os pinos de ativação como BAIXOS. Desta forma, você desabilitará ambos os motores na inicialização e o robô não se moverá aleatoriamente enquanto espera pelo resto do código.
  // Configure os pinos de saída pinMode (ENA, OUTPUT); pinMode (MOTORA_1, SAÍDA); pinMode (MOTORA_2, SAÍDA); pinMode (ENB, OUTPUT); pinMode (MOTORB_1, SAÍDA); pinMode (MOTORB_2, SAÍDA); // Desabilita ambos os motores digitalWrite (ENA, 0); digitalWrite (ENB, 0);  

Então comecei a comunicação da porta serial (útil para depurar o código). Escolha uma taxa de transmissão apropriada e defina a mesma velocidade no Monitor Serial.
  // Inicia a comunicação serial Serial.begin (57600);  

Por fim, configure o objeto ps2x com os pinos do Arduino que foram conectados ao receptor do joystick (relógio, comando, atenção e dados respectivamente). Ele pode retornar um erro (a ser exibido no monitor serial). O tipo de controlador também será exibido (embora você provavelmente já saiba o tipo de controlador que tem em mãos neste momento:D).
erro
  =ps2x.config_gamepad (13,11,10,12, verdadeiro, verdadeiro); // configurar pinos e configurações:GamePad (relógio, comando, atenção, dados, pressões ?, Rumble?) verificar se há erros // Verificar se há erros se (erro ==0) {Serial.println ("Controlador encontrado, configurado com sucesso" ); } else if (erro ==1) Serial.println ("Nenhum controlador encontrado, verifique a fiação ou reinicie o Arduino"); else if (erro ==2) Serial.println ("Controlador encontrado, mas não aceita comandos"); else if (erro ==3) Serial.println ("Controlador se recusando a entrar no modo Pressões, pode não suportá-lo."); // Verifique o tipo de controlador type =ps2x.readType (); switch (tipo) {case 0:Serial.println ("Tipo de controlador desconhecido"); pausa; caso 1:Serial.println ("Controlador DualShock encontrado"); pausa; caso 2:Serial.println ("GuitarHero Controller Found"); pausa; }  

Durante o loop principal, o Arduino lerá cada botão do D-pad (UP, DOWN, LEFT e RIGTH) e definirá os diferentes valores para os pinos de saída, a fim de mover as rodas. Após um rápido atraso, um novo loop é iniciado.

A seção a seguir mostra como mover o robô para frente se o botão PARA CIMA for pressionado. Os pinos MOTORA_1 e MOTORA_2 definem o sentido de rotação do Motor A. A ENA definirá se o movimento está habilitado ou não (motor ON / OFF). Observe que é uma saída "analógica" (na verdade, uma PWM). Seu valor deve ser algo entre 0 e 1023. Isso modulará o PWM, e mudará a tensão média na saída do h-brigde (entre 0 e 12V). Se a tensão média for muito baixa, o motor não será capaz de se mover.
  // AVANÇAR if (ps2x.Button (PSB_PAD_UP)) {digitalWrite (MOTORA_1, BAIXO); digitalWrite (MOTORA_2, HIGH); digitalWrite (MOTORB_1, HIGH); digitalWrite (MOTORB_2, LOW); analogWrite (ENB, 1023); analogWrite (ENA, 1023); Serial.println ("Avançar"); }  

* Usei saídas PWM para os pinos ENA e ENB. Dessa forma, 1023 representaria um pulso de maior comprimento (pino sempre ligado) e 0 a ausência de pulsos (pino sempre desligado). Se um valor diferente (menor) for usado aqui, espera-se que os motores funcionem mais lentamente, uma vez que a tensão média em seus terminais será menor.






Etapa 7:Esboço 2 - Stick analógico e botões digitais (L2 e R2)




Em um determinado momento, todos os consoles adotaram joysticks com dois joysticks analógicos. Essas novas entradas permitiram entradas sensíveis à força que criaram ações de velocidade variável e se tornaram populares em todos os tipos de videogames.

Neste segundo exemplo, eu queria usar uma chave analógica para dirigir o tanque e um par de botões de aceleração e freios / ré. Este tipo de configuração é muito popular em muitos jogos de corrida, como Mario Kart por exemplo. Pressione o botão R2 para acelerar o tanque, L2 para reverter e defina a direção do movimento com base na posição x do controle esquerdo.



O tipo de kit robótico que usei não tem muita inércia (se a tensão dos motores estiver em 0 V ele não vai continuar se movendo por um tempo). Dessa forma, não houve a necessidade de definir um comando para a frenagem do robô.

A maior parte do código já foi explicada na etapa anterior. Uma diferença é que defini duas variáveis ​​que armazenam a velocidade de cada motor (de 0 a 1023).
  int motor_right_speed =0; 
int motor_left_speed =0;

No loop principal, o Arduino lerá a posição x do controle esquerdo. Ele receberá um valor entre 0 e 255 e o mapeará entre -1023 e 1023.

Este valor será adicionado (ou subtraído) à velocidade de cada motor, a fim de criar uma diferença entre a velocidade de cada pista e fazer o robô virar à esquerda ou à direita.
  int nJoyL =ps2x.Analog (PSS_LX); // ler o manípulo esquerdo nJoyL =map (nJoyL, 0, 255, 1023, -1023); motor_right_speed =1023; motor_left_speed =1023; if (nJoyL <0) {motor_right_speed =motor_right_speed + nJoyL; } if (nJoyL> 0) {motor_left_speed =motor_left_speed - nJoyL; }  

Se o botão R2 for pressionado, o tanque deve mover-se para frente. Dessa forma, o Arduino define os valores apropriados para os pinos do motor. ENA e ENB criam saídas 'analógicas' para cada motor, com um valor proporcional à velocidade desejada para cada motor (com base na posição x do controle esquerdo).

L2 fará algo semelhante, mas inverterá a direção do motor.
  if (ps2x.Button (PSB_R2)) {digitalWrite (MOTORA_1, LOW); digitalWrite (MOTORA_2, HIGH); digitalWrite (MOTORB_1, HIGH); digitalWrite (MOTORB_2, LOW); analogWrite (ENA, motor_right_speed); analogWrite (ENB, motor_left_speed); } if (ps2x.Button (PSB_L2)) {digitalWrite (MOTORA_1, HIGH); digitalWrite (MOTORA_2, LOW); digitalWrite (MOTORB_1, LOW); digitalWrite (MOTORB_2, HIGH); analogWrite (ENA, motor_right_speed); analogWrite (ENB, motor_left_speed); } if (! ps2x.Button (PSB_L2) ​​&&! ps2x.Button (PSB_R2)) {analogWrite (ENA, 0); analogWrite (ENB, 0); }  

Se nenhum dos botões for pressionado, os motores serão desabilitados.






Etapa 8:Esboço nº 3 - Sticks analógicos esquerdo e direito (unidade diferencial)




Esta é a minha forma favorita de controlar o tanque (embora não seja a melhor em termos de recursos)! Me faz sentir como se estivesse controlando uma máquina realmente grande com as duas mãos!

Neste código, usei os dois sticks para definir a direção e a velocidade de cada faixa. O stick esquerdo comandará o caminho esquerdo e o stick direito controlará o caminho direito.



O código é quase igual ao descrito antes. Mas desta vez eu queria ler a posição y de ambos os manípulos:
  int nJoyL =ps2x.Analog (PSS_LY); // lê o manípulo esquerdo int nJoyR =ps2x.Analog (PSS_RY); // ler o manípulo direito nJoyL =map (nJoyL, 0, 255, 1023, -1023); nJoyR =mapa (nJoyR, 0, 255, -1023, 1023);  

Dependendo da posição do stick, o código definirá os pinos digitais para definir a direção de cada motor.

Usei um valor fixo para ativar (1023), mas usaria um valor variável com base no valor real do stick analógico. Eu defini uma zona morta (+ -50) em que o microcontrolador irá desabilitar os motores.
  // Executa movimentos com base em ambas as alavancas analógicas if (nJoyR> 50) {digitalWrite (MOTORA_1, HIGH); digitalWrite (MOTORA_2, LOW); analogWrite (ENA, 1023); } if (nJoyR <-50) {digitalWrite (MOTORA_1, BAIXO); digitalWrite (MOTORA_2, HIGH); analogWrite (ENA, 1023); } if (abs (nJoyR) <50) {analogWrite (ENA, 0); }  






Etapa 9:Esboço nº 4 - Somente analógico esquerdo




Neste último aplicativo Sketch, usei um único joystick para controlar o robô. É ótimo em termos de uso de recursos (você terá muitos botões restantes para diferentes ações a serem configuradas), mas é bastante difícil de entender.

A velocidade de cada trilha é definida dependendo das posições xey do joystick. Desta forma, é possível aplicar velocidades diferentes em cada pista, e movimentar o robô com velocidades / direções diferentes. O código usado aqui foi derivado do tutorial a seguir. Confira!

https://www.impulseadventure.com/elec/robot-differential-steering.html






Etapa 10:Considerações finais


Eu coloquei muito esforço neste projeto, para torná-lo o mais claro e educacional possível. Se você gostou, não se esqueça de 'curtir' e 'compartilhar'. Seu apoio é muito importante para mim! :D

Se você ainda não segue meus tutoriais, dê uma olhada nesses outros tutoriais de robótica! Espero que você goste deles!

https://www.hackster.io/igorF2/joy-robot-robo-da-alegria-bba54f

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

https://www.hackster.io/igorF2/nunchuk-controlled-robotic-arm-with-arduino-b1c0fa

https://www.hackster.io/igorF2/wi-fi-browser-controlled-robotic-arm-89b63d

Por favor, considere apoiar meus projetos futuros com uma pequena doação de Bitcoin! :D

Endereço de depósito BTC:1FiWFYSjRaL7sLdr5wr6h86QkMA6pQxkXJ




Código

  • Esboço # 1
  • Sketch # 2
  • Sketch # 3
  • Sketch # 4
Sketch # 1 Arduino
 // PS2 Tank por Igor Fonseca @ 2019 // Controla um tanque robótico usando um joystick PS2, usando botões direcional // baseado em um exemplo usando a biblioteca PS2X de Bill Porter 2011 // Todo o texto acima deve ser incluído em qualquer redistribuição.// incluir bibliotecas # incluir  // Elas são usadas para definir a direção do driver da ponte. # define ENA 3 // ENA # define MOTORA_1 4 // IN3 # define MOTORA_2 5 // IN4 #define MOTORB_1 8 // IN1 # define MOTORB_2 7 // IN2 # define ENB 6 // ENBPS2X ps2x; // criar classe de controlador PS2 // agora, a biblioteca NÃO suporta controladores hot pluggable, o que significa // você deve sempre reiniciar seu Arduino após conectar o controlador, // ou chamar config_gamepad (pinos) novamente após conectar o controlador. erro interno =0; byte type =0; byte vibrate =0; void setup () {// Configure os pinos de saída pinMode (ENA, OUTPUT); pinMode (MOTORA_1, SAÍDA); pinMode (MOTORA_2, SAÍDA); pinMode (ENB, OUTPUT); pinMode (MOTORB_1, SAÍDA); pinMode (MOTORB_2, SAÍDA); // Desabilita ambos os motores digitalWrite (ENA, 0); digitalWrite (ENB, 0); // Inicia a comunicação serial Serial.begin (57600); erro =ps2x.config_gamepad (13,11,10,12, verdadeiro, verdadeiro); // configurar pinos e configurações:GamePad (relógio, comando, atenção, dados, pressões ?, Rumble?) verificar se há erros // Verificar se há erros se (erro ==0) {Serial.println ("Controlador encontrado, configurado com sucesso" ); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); pausa; case 1:Serial.println("DualShock Controller Found"); pausa; case 2:Serial.println("GuitarHero Controller Found"); pausa; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller // Perform movements based on D-pad buttons // MOVE FORWARD if(ps2x.Button(PSB_PAD_UP)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move forward"); } // TURN RIGHT if(ps2x.Button(PSB_PAD_RIGHT)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Turn right"); } // TURN LEFT if(ps2x.Button(PSB_PAD_LEFT)){ digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Turn left"); } // MOVE BACK if(ps2x.Button(PSB_PAD_DOWN)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move back"); } if (!ps2x.Button(PSB_PAD_DOWN) &&!ps2x.Button(PSB_PAD_UP) &&!ps2x.Button(PSB_PAD_RIGHT) &&!ps2x.Button(PSB_PAD_LEFT)) { analogWrite(ENB, 0); analogWrite(ENA, 0); } delay(50); }} 
Sketch #2Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using D-pad buttons// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include // These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBint motor_right_speed =0;int motor_left_speed =0;PS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); pausa; case 1:Serial.println("DualShock Controller Found"); pausa; case 2:Serial.println("GuitarHero Controller Found"); pausa; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL =ps2x.Analog(PSS_LX); // read left stick nJoyL =map(nJoyL, 0, 255, 1023, -1023); int motor_right_speed =1023; int motor_left_speed =1023; if (nJoyL <0) { motor_right_speed =motor_right_speed + nJoyL; } if (nJoyL> 0) { motor_left_speed =motor_left_speed - nJoyL; } if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(ps2x.Button(PSB_L2)) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(!ps2x.Button(PSB_L2) &&!ps2x.Button(PSB_R2)) { analogWrite(ENA, 0); analogWrite(ENB, 0); } delay(50); }} 
Sketch #3Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using D-pad buttons// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include // These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBPS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); pausa; case 1:Serial.println("DualShock Controller Found"); pausa; case 2:Serial.println("GuitarHero Controller Found"); pausa; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL =ps2x.Analog(PSS_LY); // read left stick int nJoyR =ps2x.Analog(PSS_RY); // read right stick nJoyL =map(nJoyL, 0, 255, 1023, -1023); nJoyR =map(nJoyR, 0, 255, -1023, 1023); // Perform movements based on both analog sticks if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); analogWrite(ENA, 1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); analogWrite(ENA, 1023); } if (abs(nJoyR)<50) { analogWrite(ENA, 0); } if(nJoyL>50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); } if(nJoyL<-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); } if (abs(nJoyL)<50) { analogWrite(ENB, 0); } delay(50); }} 
Sketch #4Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using left analog stick// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include  //for v1.6// These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBint motor_right_speed =0;int motor_left_speed =0;PS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); pausa; case 1:Serial.println("DualShock Controller Found"); pausa; case 2:Serial.println("GuitarHero Controller Found"); pausa; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyX =ps2x.Analog(PSS_LX); // read x-joystick int nJoyY =ps2x.Analog(PSS_LY); // read y-joystick nJoyX =map(nJoyX, 0, 255, -1023, 1023); nJoyY =map(nJoyY, 0, 255, 1023, -1023); // OUTPUTS int nMotMixL; // Motor (left) mixed output int nMotMixR; // Motor (right) mixed output // CONFIG // - fPivYLimt :The threshold at which the pivot action starts // This threshold is measured in units on the Y-axis // away from the X-axis (Y=0). A greater value will assign // more of the joystick's range to pivot actions. // Allowable range:(0..+127) float fPivYLimit =1023.0; // TEMP VARIABLES float nMotPremixL; // Motor (left) premixed output float nMotPremixR; // Motor (right) premixed output int nPivSpeed; // Pivot Speed float fPivScale; // Balance scale between drive and pivot // Calculate Drive Turn output due to Joystick X input if (nJoyY>=0) { // Forward nMotPremixL =(nJoyX>=0)? 1023.0 :(1023.0 + nJoyX); nMotPremixR =(nJoyX>=0)? (1023.0 - nJoyX) :1023.0; } else { // Reverse nMotPremixL =(nJoyX>=0)? (1023.0 - nJoyX) :1023.0; nMotPremixR =(nJoyX>=0)? 1023.0 :(1023.0 + nJoyX); } // Scale Drive output due to Joystick Y input (throttle) nMotPremixL =nMotPremixL * nJoyY/1023.0; nMotPremixR =nMotPremixR * nJoyY/1023.0; // Now calculate pivot amount // - Strength of pivot (nPivSpeed) based on Joystick X input // - Blending of pivot vs drive (fPivScale) based on Joystick Y input nPivSpeed =nJoyX; fPivScale =(abs(nJoyY)>fPivYLimit)? 0.0 :(1.0 - abs(nJoyY)/fPivYLimit); // Calculate final mix of Drive and Pivot nMotMixL =(1.0-fPivScale)*nMotPremixL + fPivScale*( nPivSpeed); nMotMixR =(1.0-fPivScale)*nMotPremixR + fPivScale*(-nPivSpeed); motor_left_speed =nMotMixL; motor_right_speed =nMotMixR; if (motor_right_speed> 50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else if (motor_right_speed <-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2, HIGH); } else { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, LOW); } if (motor_left_speed> 50) { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, HIGH); } else if (motor_left_speed <-50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); } else { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, LOW); } analogWrite(ENA, abs(motor_left_speed)); analogWrite(ENB, abs(motor_right_speed)); if (abs(motor_left_speed> 50) || abs(motor_left_speed> 50)) { Serial.println("Moving!"); } delay(50); }} 

Esquemas


Processo de manufatura

  1. Construa seu robô de streaming de vídeo controlado pela Internet com Arduino e Raspberry Pi
  2. Unopad - Controlador Arduino MIDI com Ableton
  3. Obstáculos para evitar o robô com servo motor
  4. Controle de um robô Roomba com Arduino e dispositivo Android
  5. Braço robótico controlado por Nunchuk (com Arduino)
  6. Arduino Nano:Controle 2 motores de passo com joystick
  7. Joystick Arduino
  8. Construa um Battle Bot controlado com um controlador PS2
  9. Controlar Arduino Robot Arm com aplicativo Android
  10. Faça um Robô Comer Com Arduino Nano | Parafuso de ouro