注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

  • 学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!

2.11 ジョイスティック

はじめに

ジョイスティックは、ゲーム、ロボット、ナビゲーションシステムなどでよく使用される入力デバイスです。一般的に、方向を制御するための2つの軸(X軸とY軸)と、追加入力用のボタン(BtnまたはSW)を備えています。このプロジェクトでは、ジョイスティックを実際に操作しながら、対応するX値、Y値、およびボタンの状態を画面に表示することで、その動作を学びます。


必要なもの

このプロジェクトに必要なコンポーネントは以下のとおりです。

COMPONENT INTRODUCTION

PURCHASE LINK

ジョイスティックモジュール

-

ジャンパーワイヤー

購入

Fusion HAT+

-

Raspberry Pi

-


回路図

../_images/2.1.9_sch.png

配線図

以下の図を参考にして回路を組み立ててください。

../_images/2.1.9_bb.png

以下の点を確認してください。

  • ジョイスティックのVRXピンとVRYピンがADCピンに接続されていること。

  • ジョイスティックのSWピンがGPIO17に接続されていること。

  • 電源とGNDが正しく接続されていること。


サンプルの実行

このチュートリアルで使用するすべてのサンプルコードは ai-lab-kit ディレクトリに含まれています。 以下の手順に従ってサンプルを実行してください。

cd ~/ai-lab-kit/python/
sudo python3 2.11_Joystick.py

このPythonスクリプトは、Fusion HAT+上でジョイスティックのデータをリアルタイムで読み取り、表示します。実行すると、次のように動作します。

  1. スクリプトはFusion HAT+からX軸およびY軸の値を継続的に読み取ります。

  2. GPIO17に接続されたボタンを監視し、押されているかどうかを判定します。

  3. X、Y、およびボタン状態の値は、 X: <value>  Y: <value>  Btn: <value> の形式でコンソールに表示されます。ここで、

    • XY はADCチップから読み取ったアナログ値です。

    • Btn は、ボタンが押されていないときは 1、押されているときは 0 になります。

  4. スクリプトは0.2秒ごとに更新され、 Ctrl+C で中断されるまで継続的に実行されます。


コード

以下は、このプロジェクトで使用するPythonコードです。

#!/usr/bin/env python3
from fusion_hat.adc import ADC
from fusion_hat.pin import Pin, Mode, Pull
import time

# Initialize the Joystick
BtnPin = Pin(17, mode=Mode.IN, pull=Pull.UP)
xAxis = ADC('A1')
yAxis = ADC('A0')

def MAP(x, in_min, in_max, out_min, out_max):
   return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

try:
   # Main loop to read and print ADC values and button state
   while True:
      # Read X and Y values from ADC channels
      x_val = MAP(xAxis.read(),0,4095,-100,100)
      y_val = MAP(yAxis.read(),0,4095,-100,100)

      # Read the state of the button (pressed or not)
      Btn_val = BtnPin.value()

      # Print the X, Y, and button values
      print('X: %d  Y: %d  Btn: %d' % (x_val, y_val, Btn_val))

      # Delay of 0.2 seconds before the next read
      time.sleep(0.2)

# Gracefully handle script termination (e.g., via KeyboardInterrupt)
except KeyboardInterrupt:
   pass

コードの解説

  1. インポート:

    from fusion_hat.adc import ADC
    from fusion_hat.pin import Pin, Mode, Pull
    import time
    

    このスクリプトでは、必要なモジュールをインポートしています。 fusion_hat はGPIO機能のために使用し、 time は待機時間を追加するために使用します。

  2. 初期化:

    # Initialize the Joystick
    BtnPin = Pin(17, mode=Mode.IN, pull=Pull.UP)
    xAxis = ADC('A1')
    yAxis = ADC('A0')
    

    このスクリプトでは、Pin クラスと ADC クラスのインスタンスを作成してジョイスティックを初期化します。ボタンは内部プルアップ抵抗を有効にした入力モードに設定され、X軸とY軸はそれぞれADCチャンネルA1とA0から読み取るように設定されています。

  3. メインループ:

    try:
       # Main loop to read and print ADC values and button state
       while True:
          # Read X and Y values from ADC channels
          x_val = MAP(xAxis.read(),0,4095,-100,100)
          y_val = MAP(yAxis.read(),0,4095,-100,100)
    
          # Read the state of the button (pressed or not)
          Btn_val = BtnPin.value()
    
          # Print the X, Y, and button values
          print('X: %d  Y: %d  Btn: %d' % (x_val, y_val, Btn_val))
    
          # Delay of 0.2 seconds before the next read
          time.sleep(0.2)
    
    # Gracefully handle script termination (e.g., via KeyboardInterrupt)
    except KeyboardInterrupt:
       pass
    
    • X軸とY軸の値を、それぞれADCチャンネル0および1から読み取ります。

    • SWピンからボタンの状態(押されているかどうか)を読み取ります。

    • X、Y、およびボタンの値を0.2秒ごとに画面に表示します。


トラブルシューティング

  1. ADC値が想定した範囲に入らない:

    • 原因: ADCチャンネルの設定ミス、または配線の問題。

    • 対処方法: ADCチャンネルの設定と配線を確認してください。ジョイスティックが正しいADCチャンネルに接続されていることを確認してください。

  2. ボタンの状態が常に0になる:

    • 原因: ボタンの配線ミス、またはプルアップ/プルダウン設定の誤り。

    • 対処方法: ボタンの配線を確認してください。プルアップ/プルダウン設定が正しく、ボタンがSWピンに適切に接続されていることを確認してください。

  3. ADC値が変化しない:

    • 原因: ADCチャンネルに入力が接続されていない。

    • 対処方法: ジョイスティックをADCチャンネル0および1に接続し、変化する入力が得られるようにしてください。


拡張アイデア

  1. ジョイスティック制御: X値とY値を使って、仮想ジョイスティックやゲーム内の要素を制御できます。

  2. データログ記録: X、Y、およびボタンの値をファイルに保存して分析できます。

    with open("sensor_log.txt", "a") as log_file:
          log_file.write(f"X: {x_val}, Y: {y_val}, Btn: {Btn_val}\n")
    

まとめ

この実験では、Fusion HAT+を使用してジョイスティックをアナログ-デジタル変換に接続する方法を学びました。ジョイスティック入力の読み取りと解釈の仕組みを理解することで、ゲーム、ロボット、その他のアプリケーション向けのインタラクティブなシステムを構築できるようになります。