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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

367閲覧

rasberry piでコールバックをしようとすると最初に呼び出された方と違うものが呼び出されない

mochimochi_

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2022/08/15 01:53

編集2022/08/15 04:12

イメージ説明###前提
ラズパイで17ピンに入力があると12ピンからパルスが,
22ピンに入力があると13ピンからパルスがでるようなプログラムを作成したいです

実現したいこと

①17ピン:オン→12ピン:パルス→17ピン:オフ→12ピン:パルスストップ
②22ピン:オン→13ピン:パルス→22ピン:オフ→13ピン:パルスストップ
17ピンと22ピンは外部からの電圧を受け取り,①,②の状況を作り出せるようにしたいです.
17ピンと22ピンが同時にオンになることはありません,同時にオフになることはあります.

発生している問題・エラーメッセージ

一回目で発生させた方のパルスしか発生しなくなります.

ex)
一回目で12ピンの方で出力させるとそれ以降13ピンからは出力されません.
12ピンの出力は17ピンのオンオフによってパルス出力→ストップは可能です.

該当のソースコード

Python

1import pigpio 2import time 3 4pwm_pinCW = 12 #赤 5pwm_pinCCW = 13 #オレンジ 6input_pinCW = 17 #黄色 7input_pinCCW = 6#紫 8 9freq1 = 1000 10freq2 = 1000 11duty =50 12cnv_dutycycle = int((duty*1000000/100)) 13 14pi = pigpio.pi() 15 16pi.set_mode(pwm_pinCW,pigpio.OUTPUT) 17pi.set_mode(pwm_pinCW,pigpio.OUTPUT) 18pi.set_pull_up_down(input_pinCW,pigpio.PUD_DOWN) 19pi.set_pull_up_down(input_pinCCW,pigpio.PUD_DOWN) 20 21def pulse_generatorCW(pwm_pinCW): 22 global freq1 23 print("CWstart") 24 while True: 25 detect_pin = pi.read(input_pinCW) 26 if detect_pin==0: 27 freq1 = 1000 28 print("break") 29 break 30 else: 31 if freq1<10000: 32 freq1 += 100 33 pi.hardware_PWM(pwm_pinCW,freq1,cnv_dutycycle) 34 time.sleep(0.01) 35 print(freq1) 36 else: 37 freq=10000 38 print("return") 39 return 40 41def generatorCW(input_pinCW,level,tick): 42 pulse_generatorCW(pwm_pinCW) 43 44 45 46def pulse_generatorCCW(pwm_pinCCW): 47 print("CCW") 48 global freq2 49 50 while True: 51 detect_pin = pi.read(input_pinCCW) 52 if detect_pin==0: 53 freq2 = 1000 54 print("break") 55 return 56 else: 57 if freq2<10000: 58 freq2 += 20 59 pi.hardware_PWM(pwm_pinCCW,freq2,cnv_dutycycle) 60 time.sleep(0.000000001) 61 print(freq2) 62 else: 63 freq2=10000 64 print("retrun") 65 return 66 67 68def generatorCCW(input_pinCCW,level,tick): 69 pulse_generatorCCW(pwm_pinCCW) 70 71 72def stop(): 73 global freq1 74 global freq2 75 76 pi.write(pwm_pinCW,0) 77 pi.write(pwm_pinCCW,0) 78 79 80def main(): 81 cl = pi.callback(input_pinCW,pigpio.RISING_EDGE,generatorCW) 82 cb = pi.callback(input_pinCCW,pigpio.RISING_EDGE,generatorCCW) 83 detect_pinCW = pi.read(input_pinCW) 84 detect_pinCCW = pi.read(input_pinCCW) 85 print("CW",pi.read(input_pinCW)) 86 print("CCW",pi.read(input_pinCCW)) 87 88 if detect_pinCW ==0 and detect_pinCCW ==0: 89 stop() 90 print("STOP") 91 92 93try: 94 while True: 95 main() 96 97except KeyboardInterrupt: 98 print("finish") 99 pi.write(input_pinCW,0) 100 pi.write(input_pinCCW,0) 101 pi.stop()

試したこと

この実行結果から
・17ピン・22ピンは正しくオンオフを感知できている
・ピンをオフにしたあとbreak,returnがprintされているので関数から抜け出している
・一回目に関数から抜け出した以降,ピンがオフ時でも(例として)CWstartがprintされているので勝手に関数が呼び出されている
・もう片方の関数はピンをオンにしても呼び出されていない
がわかりました.

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

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

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

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

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

y_waiwai

2022/08/15 02:54

回路図を提示しよう
guest

回答2

0

ベストアンサー

time.sleep(0.000000001)
0.000000001秒=1ns = 1/1GHz なんてどういう動作を期待しているのかと思ってしまうけれど、それよりも、

Python

1def main(): 2 #略 3 while True: 4 main()

というのがものすごい勢いで再帰呼び出しでスタックを潰して異常動作を引き起こすような気がする。

投稿2022/08/15 06:29

thkana

総合スコア7629

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

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

mochimochi_

2022/08/16 05:30

1GHzはうち異間違いでした. thkanaさんの提示してくださったことが正しかったらしく,main()のあとにtime.sleep(0.5)を加えることで正常に動作するようになりました. ありがとうございます. 他に興味のある方がいらっしゃるかどうかわかりませんが,0.1では動作しませんでした.
thkana

2022/08/16 09:28

なにをどう「打ち間違える」と0.000000001になるのでしょう? まぁいいけど。 > 提示してくださったことが正しかったらしく,main()のあとにtime.sleep(0.5)を加える どういうロジック展開でそうなるのかしら... 関数を呼び出すときには、呼び出す毎に、処理が終わって戻る場所を「スタック」という場所に保存していきます。その領域は通常1MBとか2MBしか確保されないのですが、そのプログラムではものすごい勢いで(多分毎秒数千回とか数万回とか)繰り返しmain()が呼び出されます。たとえ一回のメモリ使用量が数バイトだったとしても、あっという間にその領域を使い尽くして、その後どう動くかは予想できない、という状況になりかねません。 つまり、main()の中から(呼ばなくなる条件を設定せずに)main()を呼ぶという構造自体がおかしいんじゃないか、と言っているのですが。
guest

0

else: freq=10000

これかな。

投稿2022/08/15 03:28

y_waiwai

総合スコア87747

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

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

mochimochi_

2022/08/15 04:14

理解力が低くて申し訳ないのですがこの文がどのように悪さを引き起こしているのかがよくわかりません. ひとまずこの文を消して再度実行してみましたが特に変化がありませんでした.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問