スピーカーとサーボモーターを接続してボタンを押すとメロディーが変わってサーブを動かします。

ボタンを押すとマリオの音が変わってサーボが動きます。

ボタンを押すとマリオの曲がかわりサーボが動きます。
PWMを使って音とサーボを制御しています。

使う部品

スピーカー タクトスイッチ サーボモーター

タクトスイッチ

ボタンを押し込むことで電気回路を通電させる小形のスイッチです。
今回使用するスイッチはボタンを押すとオン、離すとオフになる「モーメンタリスイッチ」です。
ボタンを押した後に手を離してもON状態を保持する方式が「オルタネイトスイッチ」です。

配線図

 

スピーカーの配線に極性はありません。どちらの線をさしても大丈夫です。

実際の配線

 

 

MicroPythonプログラム

import utime
from machine import Pin, PWM

sound = PWM(Pin(13, Pin.OUT))
# スピーカーのPWMクラスを作成
servo = PWM(Pin(28))
#  サーボモーターのPWMクラスを作成
button = Pin(16, Pin.IN, Pin.PULL_DOWN)
# スイッチのクラスを作成

#  音階の周波数を設定
B0  = 31
C1  = 33
CS1 = 35
D1  = 37
DS1 = 39
E1  = 41
F1  = 44
FS1 = 46
G1  = 49
GS1 = 52
A1  = 55
AS1 = 58
B1  = 62
C2  = 65
CS2 = 69
D2  = 73
DS2 = 78
E2  = 82
F2  = 87
FS2 = 93
G2  = 98
GS2 = 104
A2  = 110
AS2 = 117
B2  = 123
C3  = 131
CS3 = 139
D3  = 147
DS3 = 156
E3  = 165
F3  = 175
FS3 = 185
G3  = 196
GS3 = 208
A3  = 220
AS3 = 233
B3  = 247
C4  = 262
CS4 = 277
D4  = 294
DS4 = 311
E4  = 330
F4  = 349
FS4 = 370
G4  = 392
GS4 = 415
A4  = 440
AS4 = 466
B4  = 494
C5  = 523
CS5 = 554
D5  = 587
DS5 = 622
E5  = 659
F5  = 698
FS5 = 740
G5  = 784
GS5 = 831
A5  = 880
AS5 = 932
B5  = 988
C6  = 1047
CS6 = 1109
D6  = 1175
DS6 = 1245
E6  = 1319
F6  = 1397
FS6 = 1480
G6  = 1568
GS6 = 1661
A6  = 1760
AS6 = 1865
B6  = 1976
C7  = 2093
CS7 = 2217
D7  = 2349
DS7 = 2489
E7  = 2637
F7  = 2794
FS7 = 2960
G7  = 3136
GS7 = 3322
A7  = 3520
AS7 = 3729
B7  = 3951
C8  = 4186
CS8 = 4435
D8  = 4699
DS8 = 4978

#  ワンアップしたときの音楽
def oneup():
    global sound
    effect = [E5, G5, F6, C6, D6, G6, 0]
    for i in range(len(effect)):
        if int(effect[i]) == 0:
            sound.duty_u16(0)
        else:
            sound.freq(int(effect[i]))
            sound.duty_u16(0x8000)

        utime.sleep_ms(150)
#  ジャンプしたときの処理(サーボモーターを動かしてワンアップ音演奏)
def jump():
    servo.freq(50)
    servo.duty_u16(1500)
    utime.sleep(0.2)
    servo.duty_u16(3000)
    utime.sleep(0.1)
    oneup()
#  マリオのテーマ曲を演奏(繰り返し)
def mario():
    global sound
    melody = [E7, E7, 0, E7, 0, C7, E7, 0, G7, 0, 0, 0, G6, 0, 0, 0, C7, 0, 0, G6, 0, 0, E6, 0, 0, A6, 0, B6, 0, AS6, A6, 0, G6, E7, 0, G7, A7, 0, F7, G7, 0, E7, 0,C7, D7, B6, 0, 0, C7, 0, 0, G6, 0, 0, E6, 0, 0, A6, 0, B6, 0, AS6, A6, 0, G6, E7, 0, G7, A7, 0, F7, G7, 0, E7, 0,C7, D7, B6, 0, 0, 0, 0]

    while True:
        for i in range(len(melody)):
            if melody[i] == 0:
                sound.duty_u16(0)
            else:
                sound.freq(melody[i])
                sound.duty_u16(0x8000)

            utime.sleep_ms(150)

# ボタンが押された時の処理
def button_handler(pin):
    jump()

#  ボタンが押されるごとに呼び出されます。button_handler 「jump()」を実行
button.irq(trigger=Pin.IRQ_RISING, handler=button_handler)
#  マリオのテーマ(ずーっと流れています。)
mario()
クラス Pin — I/O ピンの制御
ピンオブジェクトは、I/O ピン (GPIO – 汎用入出力)を制御するために使われます。ピンオブジェクトは、一般に物理ピンに関連付けられていて、出力電圧を駆動したり、入力電圧を読み取ることができます。ピンクラスには、ピンのモード(IN, OUT など)を設定するメソッドと、デジタル論理レベルを取得および設定するメソッドがあります
button.irq(trigger=Pin.IRQ_RISING, handler=button_handler)
trigger=Pin.IRQ_RISING  IRQ トリガタイプ
立ち上がりエッジ(電位がLowレベルからHighレベルへ遷移)で割り込みを生成しするよう設定。
handler=button_handler
ピンの割り込みが生成されるときに呼び出されるように(割り込みハンドラ)を設定。

実行

マリオのテーマが流れます。
タクトスイッチを押すとジャンプ音とワンアップ音楽が流れます。
同時にサーボモーターが動きます。
テンテン
テンテン

PICOは同時にいろいろなことを実行できます