注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好者コミュニティ (Facebook) へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く学びましょう。
参加する理由
専門サポート: 購入後の問題や技術的な課題をコミュニティとチームで解決
学びと共有: ヒントやチュートリアルを交換し、スキルを向上
限定プレビュー: 新製品発表や先行情報に早期アクセス
特別割引: 新製品を特別価格で購入可能
イベントとプレゼント企画: プレゼントや季節ごとのキャンペーンに参加
👉 一緒に探求し、創造しましょう。今すぐ [ここ] をクリックして参加!
2.1.9 ジョイスティック (MCP3008)
概要
このプロジェクトではジョイスティックの仕組みを学びます。 ジョイスティックを操作し、その結果を画面に表示します。
必要な部品
このプロジェクトでは以下の部品を使用します。
キット一式で購入するのが便利です。リンクはこちら:
名前 |
キット内の部品数 |
リンク |
|---|---|---|
Raphael Kit |
337 |
個別に購入する場合は以下のリンクを参照してください。
部品名 |
購入リンク |
|---|---|
- |
|
- |
回路図
ジョイスティックのデータを読み取る際、X軸とY軸はアナログ信号であるため、MCP3008 を使ってアナログ値をデジタル値に変換する必要があります。Z軸はデジタル信号なので、GPIO で直接読み取るか、ADC を使用することもできます。
実験手順
ステップ 1: 回路を組み立てます。
ステップ 2: SPI インターフェースを設定し、 spidev ライブラリをインストールします(詳細は SPI 設定 を参照)。すでに完了している場合はこのステップを省略できます。
ステップ 3: コードのフォルダに移動します。
cd ~/raphael-kit/python
ステップ 4: 実行します。
sudo python3 2.1.9-2_Joystick.py
コードを実行すると、ジョイスティックを動かしたときに X、Y、ボタンの値が画面に表示されます。
警告
RuntimeError: Cannot determine SOC peripheral base address というエラーが出た場合は、「gpiozero」が動作しない場合。 を参照してください。
コード
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
BTN_PIN = 22
GPIO.setmode(GPIO.BCM)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000
def read_adc(channel):
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
try:
while True:
x_val = read_adc(1)
y_val = read_adc(2)
Btn_val = GPIO.input(BTN_PIN)
print('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
spi.close()
GPIO.cleanup()
コード解説
import RPi.GPIO as GPIO
import spidev
import time
RPi.GPIOはジョイスティックのボタン入力を扱います。spidevは SPI 経由で MCP3008 と通信します。timeは処理間の遅延を追加するために使用します。
BTN_PIN = 22
GPIO.setmode(GPIO.BCM)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000
GPIO モードを BCM に設定し、ジョイスティックボタンをプルアップ入力で初期化します。
また、MCP3008 との SPI 通信 (バス0, CE0, 速度1MHz) を設定します。
def read_adc(channel):
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
指定した MCP3008 チャネルからアナログ値を読み取ります。3バイトを SPI で送信し、10 ビットの値 (0–1023) を返します。
while True:
x_val = read_adc(1)
y_val = read_adc(2)
Btn_val = GPIO.input(BTN_PIN)
print('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
time.sleep(0.2)
メインループではジョイスティックの X/Y 軸の値とボタン状態を 0.2 秒ごとに取得し表示します。 Ctrl+C で終了すると SPI と GPIO を適切にクリーンアップします。