7.1 光センサー・テルミン

テルミンは物理的な接触を必要としない電子楽器です。プレイヤーの手の位置に応じて、異なる音階を出力します。

通常、制御部分は、テルミニスト(テルミン奏者)の手の位置を感知し、一方の手で発振器を、もう一方の手で音量を制御する二つの金属アンテナで構成されています。テルミンからの電気信号は増幅され、スピーカーに送られます。

Pico Wを使って同じ楽器を再現することはできませんが、フォトレジスタとパッシブブザーを使用して、類似したゲームプレイを実現できます。

必要な部品

このプロジェクトでは、以下の部品が必要です。

一式を購入することは非常に便利です。リンクはこちら:

名前

このキットに含まれるアイテム

リンク

ケプラーキット

450以上

Kepler Kit

以下のリンクから個々の部品も購入できます。

SN

コンポーネント

数量

リンク

1

Raspberry Pi Pico W

1

BUY

2

マイクロUSBケーブル

1

3

ブレッドボード

1

BUY

4

ジャンパーワイヤー

数本

BUY

5

LED

1

BUY

6

トランジスタ

1(S8050)

BUY

7

抵抗器

3(1KΩ, 220Ω, 10KΩ)

BUY

8

アクティブ ブザー

1

9

フォトレジスタ

1

BUY

回路図

sch_light_theremin

プロジェクトを開始する前に、光の強度の範囲を調整するために、フォトレジスタの上で手を上下に振ってください。GP16に接続されたLEDは、デバッグ時間を示すために使用され、LEDが点灯しているとデバッグが開始され、消灯しているとデバッグが終了したことを示します。

GP15が高レベルを出力すると、S8050(NPNトランジスタ)が導通し、パッシブブザーが鳴り始めます。

光が強いと、GP28の値は小さくなります。逆に、光が弱いと、値は大きくなります。 フォトレジスタの値をプログラムしてパッシブブザーの周波数に影響を与えることで、感光デバイスをシミュレートできます。

配線

wiring_light_theremin

コード

注釈

  • kepler-kit-main/micropython パス下の 7.1_light_theremin.py ファイルを開くか、このコードをThonnyにコピーして、「Run Current Script」をクリックするか、単にF5キーを押して実行してください。

  • 画面の右下隅にある "MicroPython (Raspberry Pi Pico)" インタープリタをクリックするのを忘れないでください。

  • 詳細なチュートリアルは、 コードを直接開いて実行する を参照してください。

import machine
import utime

led = machine.Pin(16, machine.Pin.OUT)
photoresistor = machine.ADC(28)
buzzer = machine.PWM(machine.Pin(15))

light_low = 65535
light_high = 0

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

def tone(pin, frequency, duration):
    pin.freq(frequency)
    pin.duty_u16(30000)
    utime.sleep_ms(duration)
    pin.duty_u16(0)

# フォトレジスタの最大・最小値をキャリブレーションする。
timer_init_start = utime.ticks_ms()
led.value(1)
while utime.ticks_diff(utime.ticks_ms(), timer_init_start) < 5000:
    light_value = photoresistor.read_u16()
    if light_value > light_high:
        light_high = light_value
    if light_value < light_low:
        light_low = light_value
led.value(0)

# プレイ
while True:
    light_value = photoresistor.read_u16()
    pitch = int(interval_mapping(light_value, light_low, light_high, 50, 6000))
    if pitch > 50:
        tone(buzzer, pitch, 20)
    utime.sleep_ms(10)

プログラムが実行されると、LEDが点灯し、フォトレジスタの検出範囲をキャリブレーションするために5秒間の時間が与えられます。

これは、使用する際に違う光環境(例えば、正午と夕暮れでの光の強度が異なる)や、フォトレジスタ上で手を動かす高さが異なるためです。楽器を演奏する際に手をどれだけ高く持ち上げるか、つまり手の最大・最小の高さを設定する必要があります。

5秒後、LEDは消灯し、その時点でフォトレジスタ上で手を振って演奏できます。