Módulo Joystick Analógico de Interface com Raspberry Pi Pico
Neste tutorial, aprenderemos a fazer a interface do módulo Joystick Analógico KY-023 com o Raspberry Pi Pico. Primeiro, veremos alguma introdução, pinagem e funcionamento do módulo, depois disso, veremos um esboço do Raspberry Pi Pico MicroPython para o módulo do joystick ler seu estado, como eixo x, eixo y, etc. outras palavras, vamos ler o movimento de 2 eixos.
Conteudo
Pré-requisitos
Antes de começarmos esta lição, certifique-se de que você esteja familiarizado e tenha a versão mais recente do Python3 instalada em seu sistema e configure o MicroPython em seu Raspberry Pi Pico. Além disso, você deve ter um ambiente de desenvolvimento integrado (IDE) em execução para fazer a programação.
Módulo de joystick KY-023
O módulo Joystick é um módulo de mola autocentrado muito simples semelhante ao PS2 (PlayStation 2). Consiste em dois resistores variáveis e um botão de pressão. Os resistores variáveis fornecem saída na forma de tensão analógica e o botão de pressão fornece saída na forma digital, tanto no estado baixo quanto no estado alto. Um potenciômetro é para controle do eixo x e outro potenciômetro é para controle do eixo Y.
Uma coisa importante a notar aqui é que o Joystick possui dois potenciômetros de 10k, um para cada eixo, que fornece tensão variável. O módulo joystick KY-023 visa fornecer movimento bidimensional (eixo x e eixo y) a um microcontrolador.
Há um botão no centro que é usado para controlar a dimensão do eixo z. Ele é ativado quando você pressiona a tampa preta para baixo.
PinOut
O módulo joystick consiste em 5 pinos. A descrição de cada pino é dada abaixo:
Número do Pino | Nome do Pino | Descrição |
---|---|---|
1 | GND | Conecte ao terminal de aterramento do Raspberry Pi Pico |
2 | +5v | Conecte o pino de 5 volts do Raspberry Pi Pico |
3 | VRx | Ele fornece tensão w.r.t posição do eixo x do joystick. (esquerda/direita) |
4 | VRy | Ele fornece tensão w.r.t posição do eixo Y do joystick. (cima/baixo) |
5 | SW | Mude no centro. Este pino fornece a saída obtida do botão de pressão. Quando o botão de pressão é solto a saída será HIGH e quando for pressionado a saída será LOW. |
O diagrama de circuito interno do módulo joystick é mostrado abaixo:
Funcionamento do módulo joystick
O Módulo Joystick funciona com o princípio básico de dois potenciômetros e um Mecanismo Gimbal. Esses dois mecanismos facilitam a determinação da posição do Joystick (direita, esquerda, para cima e para baixo) usando o Raspberry Pi Pico.
Cada potenciômetro é conectado a cada um dos eixos do Joystick. Eles são usados para determinar a posição da haste. A posição é interpretada como valores analógicos do microcontrolador.
A resistência do potenciômetro muda conforme a posição física do joystick é variada. Essa mudança é medida através dos pinos ADC da placa. No Raspberry Pi Pico, existe um ADC do tipo SAR de 12 bits. Assim, o valor digital estará entre 0-4095
Quando movemos o módulo joystick do lado esquerdo ou do lado direito o valor do VRX varia. Quando movemos este módulo para cima ou para baixo, o valor de VRY varia. Quando o movemos na direção diagonal, os valores de VRX e VRY variam. Quando o pressionamos na posição do meio, o pino SW fica alto.
Canais ADC Raspberry Pi Pico
Raspberry Pi Pico tem uma resolução de 12 bits que podemos alterar de acordo com nossas necessidades. Ele suporta quatro conversores analógicos para digitais baseados em SAR de 12 bits. Mas apenas três canais analógicos são expostos à pinagem. O quarto canal analógico está conectado internamente ao sensor de temperatura interno. Portanto, se quisermos medir a temperatura, podemos usar diretamente a temperatura interna lendo o valor analógico de ADC4. A tabela a seguir mostra que o sinal de entrada para ADC0, ADC1 e ADC2 pode ser conectado com os pinos GP26, GP27 e GP28, respectivamente.
Modulo ADC | Pinos GPIO |
---|---|
ADC0 | GP26 |
ADC1 | GP27 |
ADC2 | GP28 |
A conversão A/D pode ser realizada em polling, interrupção e FIFO com modo DMA.
A velocidade de conversão ADC por amostra é de 2μs, ou seja, 500kS/s. Porque o microcontrolador RP2040 opera na frequência de clock de 48 MHZ que vem do USB PLL. O ADC leva 96 ciclos de clock da CPU para realizar uma conversão. Portanto, a frequência de amostragem é
(96 x 1 / 48MHz) = 2 μs por amostra (500kS/s).
Interface do módulo joystick com o Raspberry Pi Pico
Os seguintes componentes são necessários:
- Raspberry PI Pico
- Módulo Joystick
- Fios de conexão
Siga o esquema esquemático abaixo:
Como você pode ver, o módulo Joystick possui 5 pinos que iremos conectar com a placa Raspberry Pi Pico. Conecte o pino de +5V do módulo do joystick com o pino de 5V do Raspberry Pi Pico. Em seguida, conecte os dois pinos GND juntos. Usamos os pinos analógicos GP27 e GP26 da placa Raspberry Pi Pico para conectar com os pinos VRx e VRy do módulo joystick, respectivamente. Além disso, conectamos o GP22 do Raspberry Pi Pico com o pino SW do módulo. Você pode usar qualquer pino analógico apropriado do Raspberry Pi Pico para conectar com os pinos VRx e VRy e qualquer pino GPIO apropriado da placa para conectar com o SW.
MicroPython Sketch: Lendo entrada analógica/digital do módulo Joystick
Abra seu Thonny IDE e vá em File > New para abrir um novo arquivo. Copie o código abaixo nesse arquivo.
Este esboço exibirá no monitor do shell, as posições físicas do Joystick em termos de coordenadas xey. Além disso, a saída do switch também será mostrada.
from machine import Pin, ADC from time import sleep VRX = ADC(Pin(27)) VRY = ADC(Pin(26)) SW = Pin(22,Pin.IN, Pin.PULL_UP) while True: xAxis = VRX.read_u16() yAxis = VRY.read_u16() switch = SW.value() print("X-axis: " + str(xAxis) + ", Y-axis: " + str(yAxis) + ", Switch " + str(switch)) if switch == 0: print("Botão de pressão pressionado!") print(" ") sleep(1)
Como o Código Funciona?
Primeiramente para ler a entrada Analógica, importaremos a classe ADC. A classe Pin também é importada para interagir com os GPIOs. Importaremos o módulo da máquina que contém as classes para interagir com os GPIOs. O módulo de sono também é importado para uso em atrasos.
from machine import Pin, ADC from time import sleep
Em seguida, definiremos os pinos analógicos que conectamos com os pinos VRx e VRy do módulo. Além disso, configuraremos o GP22 que conectamos com o pino SW do módulo como um pino de entrada com um resistor de pull-up. Isto irá definir o pino SW para HIGH inicialmente. O pino SW é HIGH quando o botão não é pressionado.
VRX = ADC(Pin(27)) VRY = ADC(Pin(26)) SW = Pin(22,Pin.IN, Pin.PULL_UP)
Dentro do loop while infinito, primeiro adquiriremos as posições dos eixos x e y do joystick. Usando o método read_u16(), vamos ler o valor de VRX e VRY e armazená-los nas variáveis ‘xAxis’ e ‘yAxis’ respectivamente.
Para ler o valor analógico, usamos o método read_u16() no objeto ADC para obter o valor necessário. Obteremos leituras de 0-65535, pois a resolução de 12 bits foi dimensionada para 16 bits aqui.
xAxis = VRX.read_u16() yAxis = VRY.read_u16()
Também vamos ler a saída do switch e armazená-la na variável ‘switch’. Isso será feito usando SW.value(). Ele retornará ‘1’ se a saída do SW for HIGH e ‘0’ se a saída do SW for LOW. Observe que uma saída HIGH significa que o botão não está pressionado e uma saída LOW significa que o botão está pressionado.
switch = SW.value()
Após cada segundo, todas essas três leituras serão exibidas no monitor serial.
print("X-axis: " + str(xAxis) + ", Y-axis: " + str(yAxis) + ", Switch " + str(switch))
Sempre que a saída do switch estiver baixa, o terminal shell imprimirá a mensagem “Botão pressionado!”
if switch == 0: print("Botão de pressão pressionado!")
Demonstração
Após copiar o código acima para um novo arquivo, clique no ícone “Salvar”. Isso oferece duas opções para salvar esse arquivo no seu computador ou diretamente em seus dispositivos, como o Raspberry Pi Pico. Isso significa que também podemos enviar arquivos diretamente para um dispositivo. Mas, por enquanto, salve-o em seu computador. Você pode selecionar qualquer local em seu computador onde deseja salvar este arquivo. Salve-o como main.py (você também pode usar qualquer outro nome, apenas certifique-se de que termine em .py)
Agora clique no botão “Executar” para fazer o upload do código para o Raspberry Pi Pico. Antes de fazer o upload do código, certifique-se de que a placa correta esteja selecionada.
Mova o joystick em direções diferentes e você poderá visualizar as posições correspondentes dos eixos x e y junto com a saída do interruptor. Agora pressione o botão de pressão. A saída do interruptor agora será ‘0’ e você receberá uma mensagem mostrando que o botão de pressão foi pressionado.
O joystick KY-023 que usamos era analógico e forneceu leituras mais precisas do que os joysticks direcionais simples. No entanto, o Joystick não é muito sensível a mudanças de posição porque a conversão do Raspberry Pi Pico ADC não é tão precisa.