本来使われていたSW付リレーの使用接点が少なかったので2回路2接点のトグルスイッチに置き換え。スイッチ操作により手動てこを上昇に扱った時と自動にした時を再現することができる。
いままでは試験装置への電源確保にフニ付きコンセントを使用していたが取り扱い時の衝撃などで破損するケースがある。ユニットへ内蔵することによりハンダ部の疲労や破損を防止する。
ENRより入力された直流24Vから3.3Vへ降圧しラズベリーパイPicoへ電源を供給できる(現段階ではこれを使用せずUSBにより安定した電源を確保している。)
カソードコモン方式の緑色LEDを使用。接点構成回数を表示する。数字以外にも電源投入時には「On」100カウント終了後は「En]を表示する。
スイッチング電源の入力側へ接続される端子。ENRから出力された直流24Vはリレーソケットを通じてユニットへ接続されるがハンダ付けをしてしまうとメンテナンス性が低下するので基盤とソケット部は容易に切り離せるようにしてある。
100回動作完了後に鳴動するように設計。ENRからの直流24Vにて動作する。
コイル電圧3V、二回路。電子ブザーを制御する。ラズベリーパイからの3.3V出力をトランジスタを介して受け取り扛上する。フロント・コモン・バック接点は2回路並列としている。
電子ブザー用24Vを接続。ラズベリーパイPicoから出力された5Vはこの端子を通して外部へ、情報を取得したい接点を通り戻ってきます。
電子ブザー鳴動用リレーの動作を制御する。ラズベリーパイPicoからの制御線をトランジスタのベースに、電源3.3Vをコレクタに接続し、エミッタの先にリレーを設けてある。
本ユニットの心臓部、7セグメントLEDの制御、ブザーの制御等を行う。10カウントごとに内蔵のチップLEDを点滅させる設計にしてある。意味はない。
今回RaspberryPi Picoを使用した制御回路を作成するにあたり、開発者はmicroPython初心者です。なんなら初めて触りました。
もっと簡潔にプログラムすることが可能です。手抜きしました。ループ文をほとんど使っていません。LEDの点滅やブザー音に関しても一行ずつ命令を書いてます。生暖かい目で見てください。
接点カウントユニット
ラズパイPico プログラム
(解説付き:スマホ・タブレットの方は下の方までスクロールするとあります。解説は間違っていたらごめんなさい)
【本文】
#モジュールのインポート
import machine
import utime
#pico内臓LEDのPin定義
pled = machine.Pin(25, machine.Pin.OUT)
#電子ブザーのPin定義
buzzer = machine.Pin(16, machine.Pin.OUT)
#リレー接点のPin定義
tr = machine.Pin(20, machine.Pin.IN, machine.Pin.PULL_DOWN)
#↓各LEDへの出力Pin定義↓
seg_a=machine.Pin(0,machine.Pin.OUT)
seg_b=machine.Pin(1,machine.Pin.OUT)
seg_c=machine.Pin(2,machine.Pin.OUT)
seg_d=machine.Pin(3,machine.Pin.OUT)
seg_e=machine.Pin(4,machine.Pin.OUT)
seg_f=machine.Pin(5,machine.Pin.OUT)
seg_g=machine.Pin(6,machine.Pin.OUT)
seg_h=machine.Pin(7,machine.Pin.OUT)
seg_aa=machine.Pin(8,machine.Pin.OUT)
seg_bb=machine.Pin(9,machine.Pin.OUT)
seg_cc=machine.Pin(10,machine.Pin.OUT)
seg_dd=machine.Pin(11,machine.Pin.OUT)
seg_ee=machine.Pin(12,machine.Pin.OUT)
seg_ff=machine.Pin(13,machine.Pin.OUT)
seg_gg=machine.Pin(14,machine.Pin.OUT)
seg_hh=machine.Pin(15,machine.Pin.OUT)
#初期化
pled.off()
buzzer.off()
kaisuu = 0
seg_a.value(0)
seg_b.value(0)
seg_c.value(0)
seg_d.value(1)
seg_e.value(0)
seg_f.value(1)
seg_g.value(1)
seg_h.value(1)
seg_aa.value(1)
seg_bb.value(1)
seg_cc.value(0)
seg_dd.value(1)
seg_ee.value(1)
seg_ff.value(1)
seg_gg.value(1)
seg_hh.value(0)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(2)
seg_a.value(0)
seg_b.value(0)
seg_c.value(0)
seg_d.value(0)
seg_e.value(0)
seg_f.value(0)
seg_g.value(0)
seg_h.value(0)
seg_aa.value(0)
seg_bb.value(0)
seg_cc.value(0)
seg_dd.value(0)
seg_ee.value(0)
seg_ff.value(0)
seg_gg.value(0)
seg_hh.value(0)
buzzer.value(0)
utime.sleep(0.3)
seg_a.value(1)
seg_b.value(1)
seg_c.value(1)
seg_d.value(1)
seg_e.value(1)
seg_f.value(0)
seg_g.value(1)
seg_h.value(0)
seg_aa.value(1)
seg_bb.value(1)
seg_cc.value(0)
seg_dd.value(1)
seg_ee.value(1)
seg_ff.value(1)
seg_gg.value(1)
seg_hh.value(0)
while True:
while( tr.value() == 1 ):#0
seg_a.value(1)
seg_b.value(1)
seg_c.value(1)
seg_d.value(1)
seg_e.value(1)
seg_f.value(0)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#1
seg_a.value(1)
seg_b.value(0)
seg_c.value(0)
seg_d.value(0)
seg_e.value(0)
seg_f.value(0)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#2
seg_a.value(1)
seg_b.value(1)
seg_c.value(0)
seg_d.value(1)
seg_e.value(1)
seg_f.value(1)
seg_g.value(0)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#3
seg_a.value(1)
seg_b.value(1)
seg_c.value(0)
seg_d.value(0)
seg_e.value(1)
seg_f.value(1)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#4
seg_a.value(1)
seg_b.value(0)
seg_c.value(1)
seg_d.value(0)
seg_e.value(0)
seg_f.value(1)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#5
seg_a.value(0)
seg_b.value(1)
seg_c.value(1)
seg_d.value(0)
seg_e.value(1)
seg_f.value(1)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#6
seg_a.value(0)
seg_b.value(1)
seg_c.value(1)
seg_d.value(1)
seg_e.value(1)
seg_f.value(1)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#7
seg_a.value(1)
seg_b.value(1)
seg_c.value(0)
seg_d.value(0)
seg_e.value(0)
seg_f.value(0)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#8
seg_a.value(1)
seg_b.value(1)
seg_c.value(1)
seg_d.value(1)
seg_e.value(1)
seg_f.value(1)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#9
seg_a.value(1)
seg_b.value(1)
seg_c.value(1)
seg_d.value(0)
seg_e.value(1)
seg_f.value(1)
seg_g.value(1)
seg_h.value(0)
utime.sleep(0.2)
while( tr.value() == 0 ):
utime.sleep(0.2)
while( tr.value() == 1 ):#0
kaisuu = kaisuu+1
pled.value(1)
utime.sleep(0.2)
pled.value(0)
seg_a.value(1)
seg_b.value(1)
seg_c.value(1)
seg_d.value(1)
seg_e.value(1)
seg_f.value(0)
seg_g.value(1)
seg_h.value(0)
if( tr.value() == 1 ):
break
if kaisuu == 1:
seg_aa.value(1)
seg_bb.value(0)
seg_cc.value(0)
seg_dd.value(0)
seg_ee.value(0)
seg_ff.value(0)
seg_gg.value(1)
seg_hh.value(0)
utime.sleep(0)
elif kaisuu == 2:
seg_aa.value(1)
seg_bb.value(1)
seg_cc.value(1)
seg_dd.value(0)
seg_ee.value(1)
seg_ff.value(1)
seg_gg.value(0)
seg_hh.value(0)
utime.sleep(0)
elif kaisuu == 3:
seg_aa.value(1)
seg_bb.value(1)
seg_cc.value(1)
seg_dd.value(0)
seg_ee.value(0)
seg_ff.value(1)
seg_gg.value(1)
seg_hh.value(0)
utime.sleep(0)
elif kaisuu == 4:
seg_aa.value(1)
seg_bb.value(0)
seg_cc.value(1)
seg_dd.value(1)
seg_ee.value(0)
seg_ff.value(0)
seg_gg.value(1)
seg_hh.value(0)
utime.sleep(0.1)
elif kaisuu == 5:
seg_aa.value(0)
seg_bb.value(1)
seg_cc.value(1)
seg_dd.value(1)
seg_ee.value(0)
seg_ff.value(1)
seg_gg.value(1)
seg_hh.value(0)
utime.sleep(0.1)
elif kaisuu == 6:
seg_aa.value(0)
seg_bb.value(1)
seg_cc.value(1)
seg_dd.value(1)
seg_ee.value(1)
seg_ff.value(1)
seg_gg.value(1)
seg_hh.value(0)
utime.sleep(0.1)
elif kaisuu == 7:
seg_aa.value(1)
seg_bb.value(1)
seg_cc.value(0)
seg_dd.value(0)
seg_ee.value(0)
seg_ff.value(0)
seg_gg.value(1)
seg_hh.value(0)
utime.sleep(0.1)
elif kaisuu == 8:
seg_aa.value(1)
seg_bb.value(1)
seg_cc.value(1)
seg_dd.value(1)
seg_ee.value(1)
seg_ff.value(1)
seg_gg.value(1)
seg_hh.value(0)
utime.sleep(0.1)
elif kaisuu == 9:
seg_aa.value(1)
seg_bb.value(1)
seg_cc.value(1)
seg_dd.value(1)
seg_ee.value(0)
seg_ff.value(1)
seg_gg.value(1)
seg_hh.value(0)
utime.sleep(0.1)
else:
seg_a.value(0)
seg_b.value(0)
seg_c.value(0)
seg_d.value(1)
seg_e.value(0)
seg_f.value(1)
seg_g.value(1)
seg_h.value(1)
seg_aa.value(0)
seg_bb.value(1)
seg_cc.value(1)
seg_dd.value(1)
seg_ee.value(1)
seg_ff.value(1)
seg_gg.value(0)
seg_hh.value(0)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
【解説】
import machine
import utime
記載の通りモジュールをインポートします。
pled = machine.Pin(25, machine.Pin.OUT)
ラズベリーパイPico内蔵のチップLEDを定義します。
GPIOピン25番にLEDが割り振られているので25番ピンを出力モードに設定します。
buzzer = machine.Pin(16, machine.Pin.OUT)
ブザーを制御するためのピンを設定します。
今回はGPIO16番のピンを出力ピンとして設定しました。ブザーを鳴らしたいときにこのピンから3.3Vが出力されます。
tr = machine.Pin(20, machine.Pin.IN, machine.Pin.PULL_DOWN)
リレーの接点構成情報を受け取るピン設定です。
これまでと違い入力ピンとして設定します。
seg_a=machine.Pin(0,machine.Pin.OUT)
seg_b=machine.Pin(1,machine.Pin.OUT)
seg_c=machine.Pin(2,machine.Pin.OUT)
seg_d=machine.Pin(3,machine.Pin.OUT)
seg_e=machine.Pin(4,machine.Pin.OUT)
seg_f=machine.Pin(5,machine.Pin.OUT)
seg_g=machine.Pin(6,machine.Pin.OUT)
seg_h=machine.Pin(7,machine.Pin.OUT)
7セグメントLEDを表示する際に出力するGPIOピンを割り当てます。
pled.off()
buzzer.off()
kaisuu = 0
動作前にそれぞれの状態を初期化します。
seg_a.value(0)
seg_b.value(0)
seg_c.value(0)
seg_d.value(1)
seg_e.value(0)
seg_f.value(1)
seg_g.value(1)
seg_h.value(1)
seg_aa.value(1)
seg_bb.value(1)
seg_cc.value(0)
seg_dd.value(1)
seg_ee.value(1)
seg_ff.value(1)
seg_gg.value(1)
seg_hh.value(0)
7セグメントLEDを点灯させます。
上記パターンは「On」表示です。
buzzer.value(1)
ブザーを鳴らします。
utime.sleep(0.2)
0.2s保持します。
buzzer.value(0)
ブザーを止めます。
utime.sleep(2)
2s保持します。
while( tr.value() == 1 ):#0
GPIOピンが1(入力あり)の時以下を実行
seg_a.value(1)
seg_b.value(1)
seg_c.value(1)
seg_d.value(1)
seg_e.value(1)
seg_f.value(0)
seg_g.value(1)
seg_h.value(0)
7セグメントLEDを点灯
上記パターンは「0」を表示
utime.sleep(0.2)
0.2s保持する。
while( tr.value() == 0 ):
utime.sleep(0.2)
GPIOピンが0になったとき0.2s保持する。
チャタリング・バウンシングによる複数回入力を防ぐため。
while( tr.value() == 1 ):#0
kaisuu = kaisuu+1
9から10へ繰り上がる際に「kaisuu」という変数に1を足す。
pled.value(1)
utime.sleep(0.2)
LEDを点灯させ0.2s保持
pled.value(0)
LEDを消灯
seg_a.value(1)
seg_b.value(1)
seg_c.value(1)
seg_d.value(1)
seg_e.value(1)
seg_f.value(0)
seg_g.value(1)
seg_h.value(0)
カウント的には10だが1の位の「0」を出力する。
if( tr.value() == 1 ):
break
ループから脱出する。
if kaisuu == 1:
「kaisuu」が1の時以下実行する。
seg_aa.value(1)
seg_bb.value(0)
seg_cc.value(0)
seg_dd.value(0)
seg_ee.value(0)
seg_ff.value(0)
seg_gg.value(1)
seg_hh.value(0)
10の位の表示を「1」とする。
else:
「kaisuu」の値が1から9のいずれでもない場合以下を実行する。
seg_a.value(0)
seg_b.value(0)
seg_c.value(0)
seg_d.value(1)
seg_e.value(0)
seg_f.value(1)
seg_g.value(1)
seg_h.value(1)
seg_aa.value(0)
seg_bb.value(1)
seg_cc.value(1)
seg_dd.value(1)
seg_ee.value(1)
seg_ff.value(1)
seg_gg.value(0)
seg_hh.value(0)
7セグメントLEDにて「En」を表示する。
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
0.2s毎にブザーを鳴動させる。