注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好者コミュニティ (Facebook) へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と共にさらに深く学びましょう。
参加する理由
専門サポート: 購入後の問題や技術的課題をコミュニティとチームで解決
学びと共有: ヒントや学習資料を交換し、技術力を向上
限定プレビュー: 新製品情報や先行発表に早期アクセス
特別割引: 新製品を特別価格で購入可能
イベントと景品企画: 景品イベントや季節ごとのキャンペーンに参加
👉 一緒に探求し、ものづくりを楽しみましょう。[ここ] をクリックして参加!
2.1.7 可変抵抗器 (MCP3008)
概要
アナログ信号をデジタル値に変換するために A/D 変換が利用されます。 この実験では MCP3008 A/D 変換器を使用してこの変換を行います。 可変抵抗器は可変電圧を発生させ、物理量を変化させます。 MCP3008 はこのアナログ電圧をデジタル値に変換し、ラズベリーパイで読み取り処理できます。
必要な部品
本プロジェクトで必要な部品は次のとおりです。
キット一式で購入すると便利です。リンクはこちら:
名称 |
キット内数量 |
リンク |
|---|---|---|
Raphael Kit |
337 |
個別に購入することもできます。以下のリンクをご参照ください。
部品紹介 |
購入リンク |
|---|---|
- |
回路図
T-Board 名 |
physical |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
GPIO22 |
pin15 |
3 |
22 |
実験手順
ステップ 1: 回路を組み立てます。
注釈
図を参考にチップを配置してください。溝が左側になるように配置します。
ステップ 2: SPI インターフェースを設定し、 spidev ライブラリをインストールします(詳細は SPI 設定 参照)。すでに設定済みの場合は省略可能です。
ステップ 3: コードファイルを開きます。
cd ~/raphael-kit/python-pi5
ステップ 4: 実行します。
sudo python3 2.1.7-2_Potentiometer_zero.py
コードを実行した後、可変抵抗器のつまみを回すと LED の明るさが変化します。
警告
RuntimeError: Cannot determine SOC peripheral base address エラーが表示された場合は 「gpiozero」が動作しない場合。 を参照してください。
コード
注釈
以下のコードは 修正/リセット/コピー/実行/停止 が可能です。
その前に raphael-kit/python-pi5 のソースコードパスに移動してください。変更後、直接実行して結果を確認できます。
#!/usr/bin/env python3
import spidev
import time
from gpiozero import PWMLED
# Initialize PWM LED on GPIO22
led = PWMLED(22)
# Initialize SPI
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CS0 (CE0)
spi.max_speed_hz = 1000000
def read_adc(channel):
"""
Read analog value from MCP3008
:param channel: ADC channel (0-7)
:return: 10-bit integer (0-1023)
"""
if channel < 0 or channel > 7:
return -1
# MCP3008 protocol
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 3) << 8) | adc[2]
return value
def MAP(x, in_min, in_max, out_min, out_max):
"""
Map a value from one range to another
"""
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
try:
while True:
# Read from MCP3008 channel 0
res = read_adc(0)
print('res = %d' % res)
# Map 0–1023 to 0–100%
R_val = MAP(res, 0, 1023, 0, 100)
# Set LED brightness
led.value = R_val / 100.0
time.sleep(0.2)
except KeyboardInterrupt:
led.value = 0 # Turn off the LED
コード解説
gpiozeroは PWM 出力で LED を制御するために使用します。spidevは MCP3008 との通信、timeは遅延処理に使用します。#!/usr/bin/env python3 import spidev import time from gpiozero import PWMLED
GPIO22 に接続された LED を PWM 制御するために
PWMLEDオブジェクトを初期化し、SPI(バス0、CE0)を設定します。# Initialize PWM LED on GPIO22 led = PWMLED(22) # Initialize SPI spi = spidev.SpiDev() spi.open(0, 0) # Bus 0, CS0 (CE0) spi.max_speed_hz = 1000000
read_adc関数は MCP3008 から指定したチャネル (0〜7) のアナログ値を取得します。def read_adc(channel): """ Read analog value from MCP3008 :param channel: ADC channel (0-7) :return: 10-bit integer (0-1023) """ if channel < 0 or channel > 7: return -1 adc = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((adc[1] & 3) << 8) | adc[2] return value
MAP関数は一つの範囲を別の範囲に変換するために使います(ADC の値を LED の明るさに対応させるために使用)。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
無限ループで ADC 値を読み取り、0〜1023 の範囲を 0〜100 に変換し、LED の明るさを調整します。0.2 秒ごとに更新します。
try: while True: # Read from MCP3008 channel 0 res = read_adc(0) print('res = %d' % res) # Map 0–1023 to 0–100% R_val = MAP(res, 0, 1023, 0, 100) # Set LED brightness led.value = R_val / 100.0 time.sleep(0.2)
Ctrl+C で停止した場合、LED を消灯します。
except KeyboardInterrupt: led.value = 0 # Turn off the LED