はじめに
知人から、少し面白い相談を受けました。とある機器を特殊なモードへ入れるために、
- スイッチAを押す(通電する)
- 数秒保持
- 次にスイッチBを押す(通電する)
- さらに一定時間保持
という操作が必要とのこと。しかも、
- 押す順番
- 押している時間
が重要で、人が毎回操作するのは面倒です。そこで今回は、
「1回スイッチを押すだけで、自動的に順番通りボタン操作する装置」
を Raspberry Pi Pico で作って見ようと思います。最終的には、リレーモジュールを使い、
人間がボタンを押したのと同じ状態
を外部回路側で再現します。ただし、いきなり実機へ接続するのは危険なので、まずはLEDで動作確認しながら進めます。

やりたいこと
最終的な動作イメージはこんな感じです。
スタートスイッチ(モーメンタリ)押下 → AスイッチON → 5秒保持 → AスイッチOFF → BスイッチON → 3秒保持 → BスイッチOFF
つまり、時間付きの順番制御です。これは実はかなり多くの機器で使われています。
例えば
・隠しメンテナンスモード
・初期化モード
・設定モード
・サービスモード
まずLEDで確認する理由
今回、かなり実際の開発に近い要望となっています。
そのため、
・入力確認 → スイッチがよめるか
・出力確認 → LEDが制御できるか
・本番機器
という順番で進めることにしました。いきなり実機接続して配線ミスや仕様の読み違えを避けたいと考えました。
スタートスイッチを作る
最初にやるのは、
「スイッチを押したことをPicoが検知できるか」
です。ここで重要なのが「プルアップ」です。
プルアップとは
GPIO入力は、何も接続しないと不安定になります。スイッチをただ配線すると不安定ということです。
これを「フローティング」と呼びます。そこで、
通常時は1に固定
しておきます。これがプルアップです。(不安定なものを引っ張り上げ(プルアップ)て、1にする)
そしてスイッチを押すと、GPIOがGNDへ接続され0になります。つまり、
| 状態 | GPIO |
|---|---|
| 通常時 | 1 |
| 押下 | 0 |
になります。混乱しやすいですが「スイッチを押したら0」が正常な状態にしました。
使用部品
| 部品 | 用途 |
| Raspberry Pi Pico | 制御 |
| タクトスイッチ(モーメンタリ) | スタート入力 |
| LED×2 | A,Bスイッチ代用 |
| 220Ω抵抗 | LED保護 |
| ブレッドボード | 配線 |
| ジャンパワイヤ | 配線 |
配線
モーメンタリスイッチ
| Pico | 接続 |
| GP15 | スイッチ |
| GND | スイッチ |
LED
LED:Aスイッチ代用
| Pico | 接続 |
| GP14 | 抵抗 |
| 抵抗 | LED |
| LED | GND |
LED:Bスイッチ代用
| Pico | 接続 |
| GP13 | 抵抗 |
| 抵抗 | LED |
| LED | GND |
from machine import Pin
import time
switch = Pin(15, Pin.IN, Pin.PULL_UP)
led_a = Pin(14, Pin.OUT)
led_b = Pin(13, Pin.OUT)
while True:
if switch.value() == 0:
print("start")
# A ON
led_a.on()
time.sleep(5)
# A OFF
led_a.off()
# B ON
led_b.on()
time.sleep(3)
# B OFF
led_b.off()
print("finish")
# 誤連続動作防止
time.sleep(1)
time.sleep(0.01)この時点でできていること
すでに本番にかなり近いことができています。GPIOをつかった順番制御ができています。
LEDへの入力をリレーのトリガーにすればよいだけです。
プルアップ処理したおかげで、モーメンタリのスタートスイッチを長押ししたり連打しても破綻しないようになっています。
次回予告
次は実際に、
・リレーモジュール
・外部回路
へ進みます
コメント