ラズパイ&ブレッドボードで遊ぶ(1)~LEDとスイッチ

先日、Raspberry Pi Pico を使って、本体のLEDを制御するまでの基礎的な話を書きました。

今回は、購入から1年以上経ってしまいましたが、ブレッドボードを使って遊んでみたいと思います。

ヘッダーピンの取り付け

購入した「Raspberry Pi Pico Basic Kit」は、ヘッダーピンとUSBケーブルがセットになっています。

https://try-widely.com/raspberry-pi-pico-1/ より再掲

本体のLEDを点滅させる、いわゆるLチカだけならヘッダーピンは不要ですが、ブレッドボードで動作させるには必須です。

「Raspberry Pi Pico H」という、末尾に「H」の付く製品なら、ヘッダーピンが実装済みのようですが、これくらいなら、それほど抵抗なくはんだ付けできそうです。

こんなふうにピンヘッダの上に本体を載せるだけで安定(自立)してしまうんですが、この状態ではんだ付けをしてしまうとピンヘッダ(末端)間の長さ、傾きに歪みが出る可能性もありますので、ブレッドボードに装着した状態ではんだ付けするのが良いかと思います。

この状態ではんだ付け(固定)してしまえば、ブレッドボードに入らない、という最悪の状態は防止できます。

決して、はんだ付けが得意とは言えないのですが、意外ときれいに仕上がったんじゃないでしょうか。

はんだが固着すれば、本体を持ち上げるとピンヘッダが抜けることなく、取り外せます。

「DEBUG」と記された3ピンのヘッダーピンを取り付けるかどうかは、必要に応じて、ですかね。20ピンのヘッダーピンとは逆に、上側に取り付けます。

無くさないように取り付けた、という程度で、特に使用予定はありません。

ブレッドボードのLチカ

まずは単純にLED点滅をさせてみます。

使用したLEDは、個性的なもの。共立電子産業の「シリコンハウス」で購入した赤/緑の2色で発光できるLEDです。(前回は極性切換えで色を変えましたが、今回は緑色LEDとしてだけ使用します)

ブレッドボードに接続するのは、LEDと同梱の抵抗だけ。

https://www.raspberrypi.com/products/raspberry-pi-pico/
PIN番号機能備考
25GP19LED同梱の500Ω抵抗を介して、LEDに接続(反対側は-に接続)
38GNDブレッドボードの-に接続

LED1つを点滅させる程度なら、本体から出力される電力だけで十分です。

import machine
import time

led_pin = machine.Pin(19, machine.Pin.OUT)  # 19番ピンを出力ピンとして設定

while True:
    led_pin.on()  # LEDをONにする
    time.sleep(0.5)  # 0.5秒待つ
    led_pin.off()  # LEDをOFFにする
    time.sleep(0.5)  # 0.5秒待つ

本体LEDを制御したときのソースコードとは、ピン番号の違いしかありません。

Thonny でソースコードを修正して保存(保存は必須ではないですが)。

Thonny の実行ボタンをクリックします。

本体のLEDを点滅させた時よりは、電子工作感がありますよね。

タクトスイッチでLEDをON/OFF

続いては、タクトスイッチでLEDを操作してみたいと思います。

タクトスイッチを押し込むと、この写真で言えば26番と28番(ブレッドボード上の番号)が導通します。

ブレッドボードの26番はGP16に直結しています。ハード的にはプルアップは行っていません。

PIN番号機能備考
21GP16タクトスイッチの一方(GND接続ではない方)に接続
25GP19LED同梱の500Ω抵抗を介して、LEDに接続(反対側は-に接続)
38GND-に接続

ソースコードはこんな感じです。

import machine
import time

sw_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
led_pin = machine.Pin(19, machine.Pin.OUT)  # 19番ピンを出力ピンとして設定

while True:
    if sw_pin.value() == 0:  # スイッチ判定
        led_pin.on()  # LEDをONにする
    else:
        led_pin.off()  # LEDをOFFにする
        
    time.sleep(0.1)  # 0.1秒待つ

GP16は、Pin関数の第2引数でプルアップを指定しています。

では、動かしてみます。

「押し込む」という感じがなく、軽くタッチしているような映像ですが、押している間、LEDが点灯します。

意識的にはチャタリングの考慮はしていないのですが、メインループごとに0.1秒のウェイトがかかっているので、LEDのチラつきは、ほぼ発生しません。

ソースコードですが、

if sw_pin.value() == 0:  # スイッチ判定

スイッチ押下(導通)でGNDに落ちるよう、プルアップしていますので、「押しているとき」にピンの値を取得すると「入力値は"0″」になります。

ロータリーディップスイッチを組み込む

最近よく利用している電子パーツ屋さんで特売をしていたロータリーディップスイッチを組み込んでみます。

購入したのは、A6A-16CWというオムロンの製品。

オムロンのサイトよりダウンロードした a6a_ds_j_1_9.pdf より引用
PIN番号機能備考
19GP14ロータリーディップスイッチの"8″に接続
20GP15ロータリーディップスイッチの"4″に接続
21GP16ロータリーディップスイッチの"1″に接続
22GP17ロータリーディップスイッチの"2″に接続
25GP19LED同梱の500Ω抵抗を介して、LEDに接続(反対側は-に接続)
38GND-に接続

ロータリーディップスイッチの"C"は、GNDに接続しました。

通常、名前の通りロータリーディップスイッチは、普通のロータリースイッチとは異なり、日常的にグルグル回転させるものではなく各種設定に使用したりするものですが、値が取得できることを確認するため、数字が奇数ならLED点灯、偶数なら消灯としてみました。

import machine
import time

dipsw1_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw2_pin = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw4_pin = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw8_pin = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
led_pin = machine.Pin(19, machine.Pin.OUT)  # 19番ピンを出力ピンとして設定

while True:
    dipsw = dipsw1_pin.value() + dipsw2_pin.value()*2 + dipsw4_pin.value()*4 + dipsw8_pin.value()*8
    if (dipsw % 2) == 1:  # DIPSWが奇数
        led_pin.on()  # LEDをONにする
    else:
        led_pin.off()  # LEDをOFFにする
        
    time.sleep(0.1)  # 0.1秒待つ

でも、値が取れているかどうかの確認には、いまひとつ。

なので、ちょっと改造。(回路は同じです)

import machine
import time

dipsw1_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw2_pin = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw4_pin = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw8_pin = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
led_pin = machine.Pin(19, machine.Pin.OUT)  # 19番ピンを出力ピンとして設定
pwm = machine.PWM(led_pin)  # PWMオブジェクトを作成

pwm.freq(1000)  # PWM周波数を設定
pwm.duty_u16(0)  # 初期状態では0%の出力

presw = 0

while True:
    dipsw = dipsw1_pin.value() + dipsw2_pin.value()*2 + dipsw4_pin.value()*4 + dipsw8_pin.value()*8
    if presw != dipsw:
        pwmval = dipsw * 512
        pwm.duty_u16( pwmval )
            
    presw = dipsw
            
    time.sleep(0.1)  # 0.1秒待つ

ディップスイッチの数字で、LEDのPWMデューティー比を変えてみたい(調光制御をしてみたい)と思います。

0 なら 0 = 消灯、
1 なら 512 = ( 512 ÷ 65536 ≒ 0.78% )
2 なら 512 = ( 1024 ÷ 65536 ≒ 1.56% )
  :
15 なら 7680 = ( 7680 ÷ 65536 ≒ 11.72% )

これでも、十分に明るく見えます。

映像は、途中、早送りしています

A6A-16CW という品番をご存じの方には、違和感のあるソースコードかもしれませんね。

CWの"C"は、出力コード表の「リアル・コード」ではなく、「コンプリメンタリ・コード」を示しています。上に挙げた「16ポジション」のコンプリメンタリ・コードを見ると、ポジション 0 が、1/2/4/8の各スイッチがONであることを示しています。逆に、ポジション F(15) は、全スイッチがOFFということです。

dipsw = dipsw1_pin.value() + dipsw2_pin.value()*2 + dipsw4_pin.value()*4 + dipsw8_pin.value()*8

この、値を取得する式だと、一見するとポジション 0 のときにALL ONなので 15 が取得されそうですが、タクトスイッチと同様、"C"はGNDに接続し、各PINはプルアップ設定していますので、各スイッチとも、OFFで"1″、ONで"0″になります。つまりは、各スイッチがONであるポジション 0 が 1/2/4/8ともに 0。なので合計0です。

ポジション0だから0、Fだから15、というのは反転の反転、ということなんですね。

というわけで、今回は Raspberry Pi Picoとブレッドボードを使用して、タイマやスイッチでLEDを制御してみました。