【python】ワンショット信号の作り方

作りたい信号

↑こんなん。立ち上がりエッジを検出して一発パスってなる。

なんでこんな信号つくりたいんだっけな。。。。何か入力信号が変化したら動作するみたいなやつを作りたいときに一回だけ動く信号としてワンショットあればなぁ。みたいな感じかな。

作り方

まずdelay信号を作る。そんでone shot = input && ~delayとしたら

input = 1、delay = 0のときだけoneshot=1になる。

作った

import time
import sys
import threading
import queue
from datetime import datetime, timedelta

#入力信号を作る関数
def test_input(event, q_event):
    time.sleep(0.1)
    event = 1
    q_event.put(event)
    time.sleep(1)
    event = 0
    q_event.put(event)
    time.sleep(1)
    event = 1
    q_event.put(event)
    time.sleep(1)
    event = 0
    q_event.put(event)
    event = 1
    q_event.put(event)
    time.sleep(1)
    event = 0
    q_event.put(event)

#入力信号を受ける関数StopRequestがTrueになったら終わる。
def recv(event, q_event, StopRequest, q_StopRequest):
    StopRequest = q_StopRequest.get()
    event_delay = 0
    i = 0
    while StopRequest == False:
        if not q_event.empty():
            event = q_event.get()
        i = i + 1
        
        oneshot = event & ~event_delay

        if not q_StopRequest.empty():
            StopRequest = q_StopRequest.get()
        print(i,"   Event:", event,"   1shot:", oneshot)
        time.sleep(0.1)
        event_delay = event

#シミュレーションの時間を数える関数
def test1(StopRequest, q_StopRequest):
    print("##############simulation START##############")

    StopRequest = False
    q_StopRequest.put(StopRequest)

    starttime = datetime.now()
    endtime = starttime + timedelta( seconds = 5)
    i = 1
    while endtime > datetime.now():
        now = datetime.now()
        i = i + 1
        time.sleep(1)

    StopRequest = True
    q_StopRequest.put(StopRequest)
    time.sleep(0.1)
    print("##############simulation END##############")
    sys.exit()

def main():

    q_event = queue.Queue()
    event = 0
    q_StopRequest = queue.Queue()
    StopRequest = False

    #スレッドを開始
    thread_test1 = threading.Thread(target=test1, args=(StopRequest, q_StopRequest))
    thread_testin = threading.Thread(target=test_input, args=(event, q_event))
    thread_recv = threading.Thread(target=recv, args=(event, q_event, StopRequest, q_StopRequest))
    thread_recv.start()
    thread_test1.start()
    thread_testin.start()

    
if __name__ == "__main__":
    main()

基本は以下の記事で書いている内容のまま

↓これがoneshotを作っている。

oneshot = event & ~event_delay

実行結果

Eventが立ち上がった時に1shotだけぱちって1になってるから。OK。

おわりんご。

この記事が気に入ったらサポートをしてみませんか?