質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

11797閲覧

パルス入力を積算カウントしたい。

k.horigome

総合スコア12

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2018/01/24 10:14

Python2.7 ```やりたいこと 下記のコードでラズパイ3のGPIO18に入力されたパルス信号を 積算して一定時間毎にCSVに出力したいです。 どのような方法があるかご教示ください。 ```コード import RPi.GPIO as GPIO PIN = 18 GPIO.setmode(GPIO.BCM) GPIO.setup(PIN, GPIO.IN) print('start\n') fp = open("cnt.txt","w") try: while True: value = GPIO.input(PIN) fp.write( str(value) + '\n' ) except(KeyboardInterrupt): fp.close() GPIO.cleanup() print('end\n')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

パルス検出について

  • 以前の入力値を保持しておき、現在の入力値と比較しパルスの立上り(または立下り)を検出します。
  • 検出時、積算値をインクリメントします。

ファイル出力について

  • ファイルは追記モードで開いておきます。
  • 前回の出力時刻を保持しておき、現在時刻と比較して指定時間が経過したら出力するようにします。

以下、概念コードです。

Python

1import time 2 3# 略。GPIOの初期化など 4#fp = open("cnt.txt","a") # 追記モードで開く 5 6VALS = (GPIO_HIGH,GPIO_LOW) = (1,0) 7prevVal = GPIO_LOW 8pulse_cnt = 0 9 10INTERVAL = 10 # ログ出力間隔 [sec] 11prevTime = time.time() 12 13try: 14 while True: 15 # GPIOなどから現在値を取得 16 curVal = int(input('input(0or1):')) 17 if curVal not in (VALS): 18 break 19 20 # パルスの立上り(LOW -> HIGH) を積算する 21 if prevVal == GPIO_LOW and curVal == GPIO_HIGH: 22 pulse_cnt = pulse_cnt + 1 23 24 prevVal = curVal 25 26 # 一定時間経過したら 27 curTime = time.time() 28 if (curTime - prevTime) > INTERVAL: 29 30 # 積算したパルス数をログファイルなどに出力 31 print('pulse_cnt',pulse_cnt) 32 #fp.write( '%d\n' % pulse_cnt) 33 34 prevTime = curTime 35 pulse_cnt = 0 36 37 time.sleep(0.1) # CPU負荷低減のため 38 39except(KeyboardInterrupt): 40 pass 41 42#fp.close() 43# 略。GPIOの後始末など

投稿2018/01/25 01:58

can110

総合スコア38256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k.horigome

2018/01/25 10:55 編集

ご教示いただいたコードを元に下記のようにコードを修正して 走らせたところ、 input(0or1):のように入力待ちになり0または1を入力すると ('pulse_cnt', 1)とそのタイミングで入力されたパルス数?を返して cnt.txtにその値を記録しているようです。 pi@raspberrypi:~ $ sudo python cnt.py input(0or1):1 ('pulse_cnt', 1) input(0or1):1 ('pulse_cnt', 0) input(0or1):21 pi@raspberrypi:~ $ 積算できていないのですが、GPIOの設定や現在値取得に 不備があるのでしょうか? ご教示いただくようお願いします。 (コードをコピペしたらインデントが反映されませんでした。  見にくくて申し訳ありません) 以下、修正したログ---------------------------------------------------- import time import RPi.GPIO as GPIO PIN = 18 GPIO.setmode(GPIO.BCM) GPIO.setup(PIN, GPIO.IN) fp = open("cnt.txt","a") VALS = (GPIO_HIGH,GPIO_LOW) = (1,0) prevVal = GPIO_LOW pulse_cnt = 0 INTERVAL = 1 prevTime = time.time() try: while True: value = GPIO.input(PIN) curVal = int(input('input(0or1):')) if curVal not in (VALS): break if prevVal == GPIO_LOW and curVal == GPIO_HIGH: pulse_cnt = pulse_cnt + 1 prevVal = curVal curTime = time.time() if (curTime - prevTime) > INTERVAL: print('pulse_cnt',pulse_cnt) fp.write( '%d\n' % pulse_cnt) prevTime = curTime pulse_cnt = 0 time.sleep(0.1) except(KeyboardInterrupt): pass fp.close() GPIO.cleanup() print('end\n') ここまで------------------------------------------------------------------
can110

2018/01/25 11:12

私が回答に記載したのは処理の流れを理解するために作成した概念コードです。 GPIOからの入力の代わりに手入力で動作するようにしています。 まずは回答コードをそのまま動かしてみてください。 0または1を入力していくと、10秒間隔でパルス数が表示されます。 いろいろ動かしてみて、動作を理解されたうえで、ご自身のコードに組み込んでください。
k.horigome

2018/01/25 15:41 編集

ご教示ありがとうございます。 まず動作が理解できるよう頑張ります。
k.horigome

2018/01/28 10:02 編集

下記のコードで10秒間隔でGPIO18からのパルス数をカウントすることが できました。動作の理解はまだ不十分ですがさらに学習していきます。 ご教示ありがとうございました。 # -*- encoding:utf-8 -*- import time import RPi.GPIO as GPIO PIN = 18 GPIO.setmode(GPIO.BCM) GPIO.setup(PIN, GPIO.IN) fp = open("cnt.txt","a") VALS = (GPIO_HIGH,GPIO_LOW) = (1,0) prevVal = GPIO_LOW pulse_cnt = 0 INTERVAL = 10 prevTime = time.time() try: while True: curVal = GPIO.input(PIN) if curVal not in (VALS): break if prevVal == GPIO_LOW and curVal == GPIO_HIGH: pulse_cnt = pulse_cnt + 1 prevVal = curVal curTime = time.time() if (curTime - prevTime) > INTERVAL: print('pulse_cnt',pulse_cnt) #fp.write( '%d\n' % pulse_cnt) prevTime = curTime pulse_cnt = 0 time.sleep(0.1) except(KeyboardInterrupt): pass fp.close() GPIO.cleanup() print('end\n')
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問