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 つしか含まれていない場合、機能しないことです。