4

Raspberry Pi で Python を使用していくつかのテストを実行しています。ハードウェアは、ラズベリー Pi B の GPIO に接続されたダーリントン アレイ (ULN2803) に接続された一連の SPDT リレーです。

GPIO ピンを高く設定すると、対応するリレーが引きます。低く設定すると解放されます。ループを使用してすべての GPIO: を高く設定し、最後のリレー (?) を除くすべてのリレーをプルすることができます。しかしrun time.sleep()、ループがすべてのピンをハイに設定した後、それらはすべて自動的にローに設定されます。

以下のコードを確認してください。実行すると、8 つの GPIO: を繰り返し処理し、一度に 1 つを High に設定し、それぞれの間で 200 ミリ秒スリープします。これは機能しますが、最後のものはアクティブになりません。その後、1 秒間スリープし、すべてのピンが Low になります。そして、それらを再び逆方向に反復し始め、それらをオフにします。逆方向に開始するとすぐに、最初の反復で、すべてが再び高くなります。何故ですか?ループ内では発生せず、それらの間でのみ発生します。これは、sleep() がループの外で実行されると、プログラムが開始される前の状態にすべてが戻るようなものです。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
iopins = [4,7,8,9,10,11,17,18]

try:
    for x in iopins:
        GPIO.setup(x, GPIO.OUT)
        GPIO.output(x,0)

    while True:
        for x in iopins: #turn on.
            time.sleep(0.2)
            GPIO.output(x, GPIO.HIGH)

        time.sleep(1) #<-- causes all GPIOs to pull low...

        for y in reversed(iopins): #Turning off.
            GPIO.output(y, GPIO.LOW) #<--here all GPIOs pulls high upon first iteration
            time.sleep(0.2)

finally:
    GPIO.cleanup()

もう 1 つの奇妙な点は、配列 IOPINS にエンティティが 1 つしか含まれていない場合、機能しないことです。

4

1 に答える 1

0

最後のリレーを削除するtime.sleep(1)と、すぐにアクティブ化および非アクティブ化されるため、機能しません。最後の for ループで順序を入れ替えることができます。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
iopins = [4,7,8,9,10,11,17,18]

try:
    for x in iopins:
        GPIO.setup(x, GPIO.OUT)
        GPIO.output(x,0)

    while True:
        for x in iopins: #turn on.
            time.sleep(0.2)
            GPIO.output(x, GPIO.HIGH)

        for y in reversed(iopins): #Turning off.
            time.sleep(0.2)
            GPIO.output(y, GPIO.LOW)                

finally:
    GPIO.cleanup()
于 2013-09-17T12:32:28.367 に答える