.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_joystick:
2.11 ジョイスティック
=========================
**はじめに**
ジョイスティックは、ゲーム、ロボット、ナビゲーションシステムなどでよく使用される入力デバイスです。一般的に、方向を制御するための2つの軸(X軸とY軸)と、追加入力用のボタン(BtnまたはSW)を備えています。このプロジェクトでは、ジョイスティックを実際に操作しながら、対応するX値、Y値、およびボタンの状態を画面に表示することで、その動作を学びます。
----------------------------------------------
**必要なもの**
このプロジェクトに必要なコンポーネントは以下のとおりです。
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT INTRODUCTION
- PURCHASE LINK
* - :ref:`cpn_joystick`
- \-
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
.. image:: img/fzz/2.1.9_sch.png
:width: 80%
:align: center
----------------------------------------------
**配線図**
以下の図を参考にして回路を組み立ててください。
.. image:: img/fzz/2.1.9_bb.png
:width: 80%
:align: center
以下の点を確認してください。
- ジョイスティックのVRXピンとVRYピンがADCピンに接続されていること。
- ジョイスティックのSWピンがGPIO17に接続されていること。
- 電源とGNDが正しく接続されていること。
----------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。
以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
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: Y: Btn: `` の形式でコンソールに表示されます。ここで、
- ``X`` と ``Y`` はADCチップから読み取ったアナログ値です。
- ``Btn`` は、ボタンが押されていないときは ``1``、押されているときは ``0`` になります。
4. スクリプトは0.2秒ごとに更新され、 ``Ctrl+C`` で中断されるまで継続的に実行されます。
----------------------------------------------
**コード**
以下は、このプロジェクトで使用するPythonコードです。
.. raw:: html
.. code-block:: 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. **インポート:**
.. code-block:: python
from fusion_hat.adc import ADC
from fusion_hat.pin import Pin, Mode, Pull
import time
このスクリプトでは、必要なモジュールをインポートしています。 ``fusion_hat`` はGPIO機能のために使用し、 ``time`` は待機時間を追加するために使用します。
2. **初期化:**
.. code-block:: python
# 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. **メインループ:**
.. code-block:: python
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、およびボタンの値をファイルに保存して分析できます。
.. code-block:: python
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+を使用してジョイスティックをアナログ-デジタル変換に接続する方法を学びました。ジョイスティック入力の読み取りと解釈の仕組みを理解することで、ゲーム、ロボット、その他のアプリケーション向けのインタラクティブなシステムを構築できるようになります。