🔧
Manuais Técnicos
  • Manuais Técnicos
  • Eletrônica
    • Motores DC
      • Princípios do Eletromagnetismo
      • Diferenças na construção de motores DC elétricos
      • Escolha de Motores
      • Modelagem motor brushed
    • PCBs
      • Conceitos Básicos
        • Resistores
        • Capacitores
        • Indutores
        • Diodos
      • Conceitos Avançados
        • Reguladores
        • Comunicações Digitais
        • Simulação de Sinais
        • Tratamento de sinais
        • Filtros de sinal RC
      • Altium
        • Normas
        • Organização no esquemático
          • Net Labels (Rótulos de Rede)
          • Nomeclatura dos componentes
          • Estética e Leitura Rápida
        • Criação da PCB no Altium
          • Espaçamento entre Componentes, Trilhas e Vias
          • Encapsulamento, Gerbers e Footprints
    • Programação
      • 1. Introdução
      • 2. Comentários
      • 3. Identação
      • 4. Variáveis
      • 5. Funções
      • 6. Bibliotecas
      • 7. Pré-Processamento
      • 8. VS Code
      • 9. GitHub
    • Baterias LiPo
      • Conceitos básicos
        • Resistência interna
        • Taxa de descarga
        • Capacidade de carga
        • Tensão nominal
      • Dimensionando e escolhendo uma bateria
        • Sistema de Locomoção
          • Cálculo de torque
          • Dados dos motores
          • Corrente no sistema
          • Consumo total do sistema
          • Conclusões
          • Exemplo
        • Sistema de Arma
          • Obtendo o torque da arma
          • Correntes da arma
          • Conclusões
          • Exemplo
        • Escolha de uma bateria
          • Sistemas em Paralelo
          • Sistemas em Série
          • Escolha da Bateria
      • Utilização do carregador
        • Opção de carga
        • Opção Storage
        • Opção Balance
      • Notas para uma operação segura
      • Práticas para aumentar a vida útil da bateria
      • Como montar uma bateria Li-Po
    • Altium
      • Instalação e Ativação
      • Esquemático
      • Roteamento
    • Controle de PS4
      • Hardware
      • Software
      • Aplicações
      • Conclusão
    • Módulo Bluetooth HC-05
  • Mecânica
    • Solidworks
      • Instalação, Ativação e Interface
      • Esboço 2D
      • Recursos
      • Montagem
      • Desenho
      • Projeto com Ajustes e Tolerâncias
      • Pack & Go
    • Tratamento Térmico
    • Componentes Mecânicos
      • Parafusos
      • Prisioneiros
      • Porcas
      • Arruelas
      • Anel Elástico
      • Chavetas
      • Rolamentos
      • Correias
      • Engrenagens
      • Eixos
      • Molas Prato
    • Ajustes e Tolerâncias
    • Desenho Técnico
    • Motores
    • Dimensionamentos
    • Usinagem
      • Fresamento convencional
      • Torneamento convencional
      • Corte à água e laser
      • Fresamento e CNC
    • Soldagem
      • Soldagem TIG
    • Impressão 3D
    • Ciência dos Materiais
      • Propriedades mecânicas dos materiais
      • Ensaio de Tração
        • Elasticidade
        • Rigidez
        • Dureza
          • Rigidez x Dureza
        • Resiliência
        • Ductilidade
        • Tenacidade
          • Ductilidade x Tenacidade
        • Tensão de escoamento
        • Tensão máxima
          • Fratura
      • Classificação Dos Materiais
        • Aços
        • Alumínio
        • Polímeros
      • Tratamento Térmico
        • Têmpera com Revenimento
        • Recozimento
        • Carbonitretação
      • Conclusão
    • Pedidos de materiais e serviços
      • Pedidos de aço
      • Pedidos de fibra de carbono
  • Gestão
    • Material de Divulgação Processo Seletivo
Powered by GitBook
On this page
  • 3.1 ESP32 na IDE do arduino
  • 3.2 Bibliotecas
  • 3.3 Conexão
  • 3.4 Troubleshooting
  • 3.4.1 Apagando a memória flash do ESP32
  • 3.5 Dados Recebidos
  • 3.5.1 Leitura dos dados
  • 3.5.2 Análise dos dados
  • 3.6 Dados enviados
  • 3.7 Fail Safe
  1. Eletrônica
  2. Controle de PS4

Software

Será abordado nesta seção a programação utilizada para utilizar o DualShock4 em conjunto com o ESP32.

PreviousHardwareNextAplicações

Last updated 3 months ago

3.1 ESP32 na IDE do arduino

Para isso utilizamos a IDE do arduino, o que exige algumas configurações. Depois que a IDE (disponível neste link) for instalada, é necessário adicionar o ESP32 ao gerenciador de placas. Isso deve ser feito pelo menu preferências.

Imagem 3 e 4 – Acessando o menu de preferências. Menu de preferências aberto.

Dentro deste menu devemos colar a URL abaixo na área destinada às URLs de Placas Adicionais, como exemplificado na imagem 4.

Feito isso, aparecerá a opção de instalar os dados das placas ESP32 no gerenciador de placas.

Imagem 5 - Gerenciador de placas aberto no esp32.

Após o download destes dados, a IDE do arduino estará pronta para ser usada com o módulo ESP32. Basta selecionar a placa e a porta COM na qual o ESP está conectado.

Imagem 6 - seletor de placas

Imagem 7 - Janela do seletor de placas

Vale ressaltar que um módulo ESP32 pode ter diversos nomes no seletor de placas, ou seja, não há apenas um nome que represente os módulos que temos no laboratório, estes que podem ser utilizados como “DOIT ESP32 DEVKIT V1” ou “ESP32 Dev Module”.

Imagem 8 - Módulo ESP32 atualmente utilizado (05/2023)

3.2 Bibliotecas

A biblioteca necessária está disponível neste link, basta instalar o .zip do arquivo disponibilizado no github.

Imagem 9 - local de download .zip

Após a conclusão do download, é necessário incluir a biblioteca na IDE do arduino. Para isso vá até a opção exibida abaixo e selecione o arquivo zip instalado.

Imagem 10 - opção de adição de biblioteca .zip na IDE do arduino

Feito isso, basta apenas incluir as seguintes bibliotecas no código:

#include <PS4Controller.h>
#include <ps4.h>
#include <ps4_int.h>

Vale ressaltar que nem todas as bibliotecas são vitais para o correto funcionamento do código, talvez uma ou duas dessas sejam o bastante. Caso haja algum problema relativo à falta de memória disponível, é uma boa opção retirar alguma destas bibliotecas.

Em alguns dispositivos esta biblioteca pode gerar um erro interno durante a compilação, o que exige que editemos alguns arquivos da mesma.

Imagem 11 - Erros internos à biblioteca

Os arquivos qual devemos editar estão dentro da pasta da biblioteca do controle, que se encontra dentro da pasta de bibliotecas do arduino, normalmente neste endereço:

"E:\Pastas do sistema\Documents\Arduino\libraries\PS4Cotroller\src\ps4_spp.c"

"E:\Pastas do sistema\Documents\Arduino\libraries\PS4Controller\src\PS4Controller.cpp"

Imagem 12 - localização do arquivo “ps4_spp.c” e “PS4Controller.cpp”

Dentro desta pasta devemos encontrar o arquivo “ps4_spp.c” e editá-lo com o bloco de notas ou outro aplicativo.

Com o arquivo aberto, vá até as últimas linhas do mesmo. E comente as linhas de acordo com a imagem abaixo.

Imagem 13 - Representação das linhas que devem ser comentadas em “ps4_spp.c”

No outro arquivo, o “PS4Controller.cpp”, é necessário inserir o seguinte na linha 44:

#define ESP_BD_ADDr_STR "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"

Imagem 14 - linha 44 de “PS4Controller.cpp”, com a linha que deve ser adicionada

Feito isso, salve os arquivos com as mudanças feitas e sua biblioteca estará pronta para ser utilizada.

3.3 Conexão

Antes de desenvolver a lógica de funcionamento para o ESP32 precisamos do MAC address respectivo ao controle DualShock 4.

Um endereço MAC (Media Access Control) é um identificador exclusivo atribuído a uma interface de rede, como uma placa de rede Ethernet ou uma placa de comunicação sem fio. É um número de 48 bits (normalmente representado em notação hexadecimal) que é gravado no momento em que o dispositivo é fabricado e geralmente não pode ser alterado. O endereço MAC é usado para identificar, de forma única, um dispositivo em uma rede local, desempenhando papel fundamental no direcionamento de pacotes de dados entre dispositivos em uma rede Ethernet ou conexão Bluetooth.

Para descobrir o MAC Address do controle será necessário baixar o aplicativo SIXPAIRTOOL (por meio deste Link) para que o aplicativo descubra o MAC Address do controle, é necessário conectar a manete pelo cabo USB, ele irá aparecer na interface do programa escrito neste formato: “32:4E:14:A2:09:01” (caracteres meramente ilustrativos).

Imagem 15 - Sixpair Tool exibindo o MAC address de um DualShock 4 conectado

Agora que já possuímos o MAC address do controle, basta apenas utilizá-lo na seguinte função, com uma lógica para aguardar a conexão:

PS4.begin("e8:d8:19:21:71:14"); //MAC address do controle 
while (!PS4.isConnected()) { //aguarda a conexão
    Serial.println("Esperando Conexão");
    delay(250);
}

Deste modo, o ESP irá aguardar até que a manete esteja conectada, e também irá informar via monitor serial se a conexão foi bem sucedida.

3.4 Troubleshooting

Caso o DualShock não estabeleça a conexão da forma prevista, há algumas fontes para esse problema, estas que variam entre hardware e software.

Os problemas causados por hardware podem ocorrer tanto no controle quanto na placa de recepção. Então, é necessário verificar a carga da bateria do controle simplesmente colocando- o no modo de conexão. É muito importante que a placa não seja alimentada nessa etapa e, verificando quanto tempo ele leva para desligar, se o led apagar em um curto período significa que a bateria precisa ser carregada (1.2 Bateria). Caso a bateria esteja carregada o suficiente, verifique a alimentação da placa na qual o controle será conectado.

Por outro lado, os problemas de software se limitam à placa de conexão. Caso este esteja de acordo com o tópico 3.Software, o problema pode estar relacionado com o MAC address definido na programação, este que seleciona qual controle a placa será conectada

(vide 3.3 Conexão).

Há outra possível fonte de erros na utilização de um ESP32. Caso ambos os dispositivos estejam ligados e em modo de conexão e o led indicador do controle esteja cessando sua intermitência prematuramente com seu último momento aceso um pouco mais extenso do que os demais, isso é um sinal de que há um erro relacionado à memória flash do ESP, assim, ela necessita ser apagada.

3.4.1 Apagando a memória flash do ESP32

Como descrito no último tópico, apagar a memória flash do ESP32 é uma maneira de corrigir um erro de conexão via Bluetooth com o controle.

Para isso, precisaremos de instalar uma ferramenta chamada esptool. Essa instalação será via pip, um software de instalação em python, ou seja, você precisa do Python 3.6 ou mais recente no seu sistema, disponível neste link.

Com o python instalado, abra o Prompt de Comando e instale o esptool via pip com o seguinte código:

$py -m pip install esptool

Em algumas instalações do Python este comando pode não funcionar e gerar um erro. Se for o caso teste algum destes outros comandos:

$pip install espatool
$pip3 install espatool
$pip2 install espatool
$python -m pip install esptool

Imagem 16 - Instalação do esptool pelo prompt de comando

Após finalizar a instalação do esptool, basta apenas conectar o ESP32 ao dispositivo, segurar o botão BOOT e escrever o seguinte código no prompt de comando:

$py -m esptool —chip esp32 erase_flash

Este comando pode não ser reconhecido e gerar um erro. Se for o caso teste este outro comando:

$esptool.py —chip esp32 erase_flash

Após inserir o comando, aguarde alguns segundos até que toda a memória seja limpa.

Caso o prompt não encontre o ESP, tente:

➢ Reconecta-lo;

➢ Trocar o ESP32;

➢ Verificar a integridade do cabo;

➢ Colocá-lo em modo de download, pressionando BOOT e apertando EN ao mesmo tempo.

Vale ressaltar que, após a primeira instalação do esptool, basta apenas conectar o esp ao computador e inserir um dos códigos acima para limpar a flash, ou seja, não é necessário repetir os primeiros passos de instalação.

3.5 Dados Recebidos

Serão descritos neste tópico todos os dados que podem ser recebidos do dualshock 4 via bluetooth.

3.5.1 Leitura dos dados

A seguir temos uma tabela com os botões, suas respectivas funções e o retorno de cada uma delas:

Imagem 17 - DualShock 4 com seus botões numerados

—-- tabela ——

3.5.2 Análise dos dados

Podemos utilizar os dados recebidos de diversas maneiras: além de controlar a movimentação do robô, podemos fazer configurações na lógica de funcionamento entre outros.

O código a seguir transforma os dados de um stick (x e y) em duas variáveis que representam a velocidade (em porcentagem) de dois motores (esquerdo e direito).

int OutputMotor_L = constrain(map(LStickY, -127, 127, -100, 100) + map(LStickX, -127, 127, -100, 100) , -100, 100);
int OutputMotor_R = constrain(map(LStickY, -127, 127, -100, 100) - map(LStickX, -127, 127, -100, 100) , -100, 100);

Outra ferramenta muito útil é a criação de uma deadzone, pois o stick é analógico e há imprecisões quanto ao seu ponto 0, Já que nem sempre voltará precisamente ao ponto central quando em repouso, o que pode gerar certos erros quando a intenção é manter o robô parado.

A seguir, uma das maneiras de se fazer isso:

int LStickX = PS4.LStickX(); //Posição x do left stick- valores que variam de -127 a 127
if (LStickX<-10||LStickX>10) { //deadzone do stick 
    //sinal válido, motores movimentando
} else {
    //sinal inválido, motores parados
}

É importante lembrar que este valor de dead zone utilizado é adquirido a partir de testes, ou seja, -10 a 10 é meramente ilustrativo.

Quanto aos outros botões com leituras digitais a lógica é mais simples:

if(PS4.Triangle()) {
    //função do botão triângulo na lógica
}

Por outro lado, é recomendável se utilizar uma dupla verificação na leitura dos gatilhos:

if (PS4.L2()) {
    Serial.printf(PS4.L2Value()); //valor de l2 no monitor serial //tratamento do valor analógico de L2
}

3.6 Dados enviados

Há alguns dados que podem ser enviados para o controle, como por exemplo a cor do led, uma ferramenta muito útil que funciona como feedback.

Para mudar a cor do led precisamos escolher o código RGB da cor desejada e colocá-lo nesta função:

PS4.setLed(red, green, blue); //valores de 0 a 255

Podemos fazer com que o led funcione de forma intermitente, com a possibilidade de selecionar o tempo em que ele permanece ligado e desligado, de 0 a 2550 ms:

PS4.setFlashRate(T_on,T_off); // 0 a 2550

Para fazer com que o controle vibre, temos duas possibilidades de intensidade, um gerador fraco e um forte, que podem funcionar simultaneamente:

PS4.setRumble(fraca, forte); //0 a 255

3.7 Fail Safe

Fail safe é uma funcionalidade muito importante, pois evita acidentes e uma possível desqualificação.

Sua implementação no código é relativamente simples, basta incluir a seguinte lógica:

if (PS4.isConnected()) { //verifica a conexão do controle //lógica principal de funcionamento
} else { //caso não esteja conectado
  //para os motores
}

https://dl.espressif.com/dl/package_esp32_index.json
https://github.com/aed3/PS4-esp32
https://www.python.org/downloads/