【Raspberry Pi Pico】Joystickで入力方向を読み取る方法まとめ

joystick-top Raspberry Pi

本記事の内容

Raspberry Pi PicoとSeeeduino xiaoにアナログJoystickを接続して、Joystickを倒した方向を読み取ってみました。

Seeeduino xiaoではSSD1306有機ELディスプレイを利用して、Joystickの入力値をリアルタイムで表示する装置を作製しています。

必要なもの

  • Raspberry Pi Pico、もしくは、Seeeduino xiao RP2040
  • Analog thumb Joystick

Jotstickは、スターターキットに付属するものになります。そのため、オンラインショップなどで検索しても、このタイプの単品はなかなか見つかりません。

Freenove UNOボード付きRFIDスターターキットV2.0 Arduino IDEと互換性あり 、266ページの詳細なチュートリアル、198アイテム、49プロジェクト、プログラミングと電子機器の学習

配線

X方向、Y方向のJoystickの傾きはアナログ値で読み取るため、Raspberry Pi PicoでADCが使用できる26ピンと27ピンに接続します。SWはJoystickの押しボタン判定なので、適当なGPIOに繋げば問題ありません。

Joystickの5VとGNDは、Raspberry Pi PicoのVBUSとGNDに繋ぎたいところですが、5Vを入力すると、なぜかJoystick直立状態でも入力値がずれて表示されます。。。
(0-65535で読み込むため、倒していない状態は中央値の32767付近となるはず。)

そのため、5Vは3V3(OUT)に接続することをお勧めします。

プログラムコード

Raspberry Pi PicoでADCを利用して、26ピンと27ピンの入力値を読み取るコードになります。

from machine import Pin, ADC
import utime

xAxis = ADC(Pin(27))
yAxis = ADC(Pin(26))
button = Pin(16,Pin.IN, Pin.PULL_UP)

while True:
    xValue = xAxis.read_u16()
    yValue = yAxis.read_u16()
    buttonValue = button.value()
    print("X: " + str(xValue) + ", Y: " + str(yValue) + " -- button " + str(buttonValue))
    utime.sleep(1)

上記コードを実行することで、JoystickのX軸とY軸の傾きと押しボタン判定が、Shell上に表示されます。

【おまけ】Seeeduino xiaoでJoystickの入力値をディスプレイに表示

Seeeduino xiao RP2040はMicroPythonでコードを書き込めるので、Raspberry Pi Picoと同じ要領で開発できます。以下ではSeeeduino xiaoとSSD1306有機ELディスプレイを使用して、リアルタイムでJoystickの入力値をディスプレイ表示させてみました。

配線

接続先は以下の通りです。配線図は割愛させていただきます。

Seeeduino xiaoSSD1306Joystick
P6_SDASDA
P7_SCLSCL
3V3VCC5V
GNDGNDGND
P27_ADC1VRX
P26_ADC0VRY
P28SW

Seeeduino xiao RP2040でSSD1306有機ELディスプレイを使用する方法は、前回の記事を参考にしてください。

プログラムコード

前回の記事と同様に、ssd1306.pyをアップロードして、読み込んでいます。

from machine import Pin, ADC,I2C
from ssd1306 import SSD1306_I2C
import utime

i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)
display = SSD1306_I2C(128, 64, i2c)

xAxis = ADC(Pin(27))
yAxis = ADC(Pin(26))
button = Pin(28,Pin.IN, Pin.PULL_UP)

while True:
    xValue = xAxis.read_u16()
    yValue = yAxis.read_u16()
    buttonValue = button.value()
    print("X: " + str(xValue) + ", Y: " + str(yValue) + " -- button " + str(buttonValue))
    
    display.text("X: " + str(xValue), 0, 0, 1)
    display.text("Y: " + str(yValue), 0, 10, 1)
    display.text("button: " + str(buttonValue), 0, 20, 1)
    display.show()
    utime.sleep(1)
    
    display.fill(0)
    display.show()

実行結果

配線はこんがらかっていますが、リアルタイムでJoystickの傾きをディスプレイに表示させることができました。

まとめ

Raspberry Pi PicoとSeeeduino xiaoでJoystickを使用して、倒した方向の入力値を読み取る方法をまとめました。

JoystickとRaspberry Pi Pico、Seeeduino xiaoを活用して、クレーンゲームのミニおもちゃが作れそうですね。

コメント