デジタル入力とアナログ入力は、外部デバイスからの情報を取得して処理する際に使われる基本的な入力の方法です。
これを理解するために、具体的な例として「タクトスイッチ」と「可変抵抗」を使って説明してゆきます。
デジタル入力(タクトスイッチ)
デジタル入力とは、「オン」か「オフ」の2つの状態しか持たない入力方法です。これは二進数(0または1)で表され、スイッチの押下や離す動作を検知するのに適しています。デジタル入力の最も身近な例がタクトスイッチです。
タクトスイッチの動作
- オン状態:スイッチを押すと、回路が閉じて電流が流れるため、「1」(HIGH)として検知されます。
- オフ状態:スイッチが離されていると、回路が開いて電流が流れないため、「0」(LOW)として検知されます。
実際の使い方
- タクトスイッチは、押されたかどうかだけを判断するので、状態がはっきりと「押されている(1)」か「押されていない(0)」のどちらかしかありません。たとえば、ボタンを押すことでLEDが点灯する、あるいはプログラムの特定の動作を実行する、というようなシンプルな制御に使われます。
from gpiozero import LED, Button # LEDとButtonクラスをインポート
from signal import pause # プログラムを無限待機させるために使用
# GPIO 17番ピンに接続されたLEDオブジェクトを作成
led = LED(17)
# GPIO 18番ピンに接続されたタクトスイッチオブジェクトを作成
button = Button(18)
# ボタンが押されたときにLEDを点灯
button.when_pressed = led.on
# ボタンが離されたときにLEDを消灯
button.when_released = led.off
# プログラムを無限ループで待機状態にする
pause()
配線図
アナログ入力(可変抵抗)
アナログ入力は、デジタル入力(0か1の状態)とは異なり、連続した電圧値を取得して扱う入力方法です。
アナログ信号は無限の値を取ることができ、典型的には電圧の変化を使ってこれを表現します。
Raspberry Piにはアナログ入力の機能がありませんが、ADC(アナログ-デジタルコンバータ)を使うことでアナログ信号をデジタル値に変換し、Raspberry Piで読み取ることが可能になります。
ADC0834の概要
ADC0834は、4チャンネルのアナログ-デジタルコンバータです。
ADC0834は、0〜5Vの範囲のアナログ信号を受け取り、それを0〜256のデジタル値に変換します(8ビットの分解能)。
SPI(シリアル・ペリフェラル・インターフェース)を介してRaspberry Piと通信し、アナログ信号をデジタルデータに変換して送信します。
可変抵抗(ポテンショメータ)
可変抵抗器(ポテンショメータ)は、抵抗値を手動で変えることができるデバイスです。
回転軸を回すことで、電圧を連続的に調整できます可変抵抗を使用して、回転角度に応じた電圧の変化をRaspberry Piで読み取り、それを利用して入力値の調整や制御を行うことができます。
ラズベリーパイの設定>SPI通信がONになっていることを確認しておいてください。
配線の手順
- 可変抵抗の中央ピンをADC0834のCH0(アナログ入力チャンネル0)に接続します。
- 可変抵抗の一方の端を3.3Vに接続し、もう一方の端を**GND(グランド)**に接続します。
- ADC0834のデジタル出力ピンをRaspberry PiのGPIOピンに接続します:
CS
(チップセレクト)をGPIO 8に接続。CLK
(クロック)をGPIO 11に接続。DIN
(データ入力)をGPIO 10に接続。DOUT
(データ出力)をGPIO 9に接続。VCC
を3.3Vに、GND
をGNDに接続します。
プログラムの概要
Raspberry Piを使って、ADC0834を介して可変抵抗のアナログ値を読み取り、その値を表示するプログラムを作成します。
import spidev
import time
# SPI通信の初期化
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000 # SPI通信の速度を1MHzに設定
# メインループ
try:
while True:
# SPI通信でデータを取得
start_bit = 0x01 # スタートビット(常に1)
command = (0x08 | 0) << 4 # CH0(アナログ入力チャンネル0)を選択
adc = spi.xfer2([start_bit, command, 0x00]) # SPI通信でデータを送受信
# デジタル値に変換
pot_value = ((adc[1] & 0x0f) << 8) | adc[2]
# アナログ値を表示
print(f"可変抵抗のアナログ値: {pot_value}")
# 0.1秒間隔で値を取得
time.sleep(0.1)
# プログラム終了時にSPI通信を閉じる
except KeyboardInterrupt:
spi.close()
ボリュームの回し具合によってアナログ値が変化すれば成功です。