「印刷」を使用しないとループが機能しない


11

このコードは、LEDのオンとオフを切り替えません。

import  RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(21,GPIO.OUT)
for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
GPIO.cleanup()

しかし、ループで数値を出力すると、うまくいきます:

import  RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(21,GPIO.OUT)
for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    print(number)
GPIO.cleanup()

それはなぜですか?



2
@catビンゴ、「ハイゼンバグは、出力ステートメントの挿入など、プログラムをデバッグする一般的な試みが原因で発生します」
tazboy

1
「このコードは、LEDをオンまたはオフにしません。」- 失礼ですが同意できません。
marcelm 2017年

回答:


22

あなたを交換してみてくださいprintによるtime.sleep(0.05)。GPIO.outputが設定/検出/表示するには、HIGHからLOWへの切り替えが速すぎるため、この奇妙な動作が発生する可能性があります。プログラムが正常に機能し(増加)、十分に速く(減少)するまで、スリープ期間を増減します。

import  RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(21,GPIO.OUT)
for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    time.sleep(0.05)
GPIO.cleanup()

うん。それは理にかなっている。
tazboy

51

ループを展開して、ここで何が起こっているのかを理解します。

for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)

になる:

    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    # [and so on]

ご覧のとおり、ピンをハイにした直後に、ピンをローに設定すると(近くに)従います。実際には、ほとんどの場合、LEDは1つの状態(つまり、肉眼で認識できる状態)のままです。

次のように修正します(50:50のデューティサイクルの場合)。

for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    time.sleep(1)

ワオ。それは今とても明白なようです。見せてくれてありがとう。
tazboy

4
これは受け入れられる答えになるはずです。実際に何が起こったのかを説明しています

2
またprint()、元のコードが機能する原因は、画面への書き込みがめちゃくちゃ遅いプロセスであり、本質的にsleep(1)提案どおりに動作しているためです。
Jacobm001

この答えはそれを分解するのにより良い仕事をしますが、それは私の問題に対する最初の書かれた解決策だったので、私は他の答えを選びました。全体的な投票により、より適切な回答が決まります。
tazboy 2017年

1
「受け入れ答え」に関する任意の特定の選択に圧力をかけている自分を感じるする必要はありません@tazboy
Ghanima
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.