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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Raspberry Pi

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2187閲覧

ラズパイでのセンサ信号による割り込みによるLED点灯のコード記述方法

TANAKA.HIROSHI

総合スコア8

Raspberry Pi

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/08/17 08:41

実現したいこと

Rasuberry Pi 4で人感センサの信号をポーリングと割り込みで検知する方法を比較しています。ポーリングの方は思った通りの動作が確認できました。しかし、割り込みの方法でコードを作成しましたが、Runtime Error: Failed to add edge detectionというエラーメッセージが返ってきます。動作確認できません。

-割り込み機能(ラズパイ上で、PythonとRPi.GPIOを使用して)の実現

前提

使用言語、ライブラリ:Python、RPi.GPIO

人感センサの信号を受けて、LEDを点灯させる」コードで実行時に以下のエラーメッセージが発生しました。

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

Runtime Error: Failed to add edge detection

該当のソースコード

# sample14 Sensor(PIR Motion Detector Module) PIR:Passive Infrared Ray # Operation: Interruption (Event driven) # coriding: utf-8 import RPi.GPIO as GPIO import time import sys import datetime LED1 = 23 # This is for RPi.GPIO LED接続ピン PIR = 4       # センサ接続ピン GPIO.setmode(GPIO.BCM) GPIO.setup(LED1,GPIO.OUT) GPIO.setup(PIR,GPIO.IN) def my_callback(channel): PIR_value = GPIO.input(PIR) GPIO.output(LED1,PIR_value) GPIO.add_event_detect(PIR, GPIO.BOTH, bouncetime=1000) GPIO.add_event_callback(PIR, my_callback) #GPIO.add_event_detect(PIR, GPIO.BOTH,callback=my_callback,bouncetime=1000) #Rasbian OSのときは、この行のコードで動作していました #今回は、WEBページを参考にこの1行を、上記の2行に書き換えました。 print ("Interrupt by event detection of PIR signal") print ("(CTRL-C to EXIT)") GPIO.output(LED1,0) try: while True: time.sleep(10) # Detection regardless of sleep time except KeyboardInterrupt: pass GPIO.cleanup() sys.exit()

試したこと

下記のコード(ポーリングを模擬)は、LEDが点灯するのでピン設定等には問題がないと思われます。

’’’
sample13 Sensor(PIR Motion Detector Module) PIR:Passive Infrared Ray
Operation: Polling
cording: utf-8
’’’
import RPi.GPIO as GPIO
import time
import sys

LED1 = 23 # This is for RPi.GPIO
PIR = 4

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED1,GPIO.OUT)
GPIO.setup(PIR,GPIO.IN)

print ("PIR detection by Polling ")
print ("(CTRL-C to EXIT)")
GPIO.output(LED1,0)

try:
while True:
time.sleep(10) # For short time confirmation
# Please change 30 to confirm the deficit of polling.
PIR_val = GPIO.input(PIR) # Read PIR value
GPIO.output(LED1,PIR_val) # Output PIR value to LED1

except KeyboardInterrupt:
pass
GPIO.cleanup()
sys.exit()

補足情報(FW/ツールのバージョンなど)

ラズパイのOS:lsb_release -a(で確認)
No LSB module are availuable(意味が理解できません)
Distributor ID: Raspbian
Release:11
Codename:bullseye

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

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

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

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

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

guest

回答2

0

自己解決

自己解決ではなく、知人からの回答です。
最初の質問で、ラズパイゼロでは正常、4にしたら動作確認できなかった、というハードの違いを明確に説明すべきでした。質問が不十分であった、と反省しております。回答いただいた方、申し訳ありませんでした。

===========
ラズパイはVerによってGPIOに割り振られているファンクションが異なります。
ラズパイ4のGPIO4は1-wireインタフェースが割り当たっているので、それが有効になっていたら該当のエラーが出ると思います。
以下の手順で1-Wireインタフェースを無効にするか、GPIOを別のにしてみてください。
ターミナルで以下のコマンドを実行
sudo raspi-config
2. 「3 Interface Options」を選択
3. 「I7 1-Wire」を選択
4. 「No」を選択して無効にする。
5. 「Ok」を選択
6. 「Finish」を選択して、再起動を行う

投稿2023/08/21 00:27

TANAKA.HIROSHI

総合スコア8

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

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

0

手元にRasbperyPiがないのでカンで書きます。

理由は分かりませんが、前に動かしていたPythonのプログラムがGPIOピンを押さえてしまっていて、そこに新しく動かしたPythonのプログラムが制御を奪おうとしてRuntime Error: Failed to add edge detectionを起こしている気がします。

GPIOのセットモードをするより前に、GPIO.cleanup()を挿入してください。すでにクリーンナップされている場合には警告が出ますが(気持ち悪いですが)悪さはしませんので放っておいてよいです。警告を消したい場合には、以下のコードを挿入してください。

Python3

1GPIO. setwarnings(False) # 警告を無効化 2GPIO.cleanup() # GPIOをリセットする 3GPIO. setwarnings(True) # 警告を有効化

投稿2023/08/17 21:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

TANAKA.HIROSHI

2023/08/18 00:48

早々のご回答、ありがとうございます。 確かに、 RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warning. と表示されますので、ご回答の通りの現象が生じていることは確かなようです。 Falseにセットすると警告もでなくなりました。 しかし、GPIO.cleanup()をセットの前に挿入しても Runtime Error: Failed to add edge detection は出てきます。 現在、下記の記述(2つの方法共にNG)そのものが問題と思われます。 GPIO.add_event_detect(PIR, GPIO.BOTH,callback=my_callback,bouncetime=1000) あるいは GPIO.add_event_detect(PIR, GPIO.BOTH, bouncetime=1000) GPIO.add_event_callback(PIR, my_callback) 当方でも改めてネットで情報を収集します。 さらにお気づきの点がありましたら、コメント、ご教示いただけると幸いです。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問