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

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

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

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

Raspberry Pi

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

Q&A

解決済

1回答

1528閲覧

超音波センサを動かしながらLED点灯させることができません

KRSugar

総合スコア16

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2019/07/31 14:21

前提・実現したいこと

Python3で、超音波センサで距離測りながら、LEDを点灯させたいと思っています。
以下のサイトを参考にさせていただきました。
http://make.bcde.jp/raspberry-pi/%E8%B6%85%E9%9F%B3%E6%B3%A2%E8%B7%9D%E9%9B%A2%E3%82%BB%E3%83%B3%E3%82%B5hc-sr04%E3%82%92%E4%BD%BF%E3%81%86/

上のサイトにあるプログラムに手を加えながらやっているのですが、どうしてもエラーメッセージが出て前に進めません。どうしたらよいのでしょうか

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

File "/home/pi/cansat.py", line 41, in pulse_in GPIO.setmode(GPIO.BOARD) ValueError: A different mode has already been set!

該当のソースコード

Python3

1import threading 2import RPi.GPIO as GPIO 3import time 4import sys 5import os 6from time import sleep 7import datetime as dt 8import datetime 9 10 11def ledmain(): 12 stopstr1 = " " 13 while True: 14 if ( stopstr1 != " "): 15 GPIO.cleanup() 16 sys.exit() 17 18 19#INTERRUPT Thread 20def stopinput(): 21 global stopstr1 22 23def pulse_in(pin, value=GPIO.HIGH, timeout=1.0): 24 25 LED1 = 18 26 PIR = 11 27 28 GPIO.setmode(GPIO.BOARD) 29 GPIO.setup(LED1, GPIO.OUT) 30 GPIO.setup(PIR, GPIO.IN) 31 32 start_time = time.time() 33 not_value = (not value) 34 GPIO.output(LED1, True) 35 sleep(2.0) 36 GPIO.output(LED1, False) 37 38 39 # 前のパルスが終了するのを待つ 40 while GPIO.input(pin) == value: 41 if time.time() - start_time > timeout: 42 return 0 43 44 # パルスが始まるのを待つ 45 while GPIO.input(pin) == not_value: 46 if time.time() - start_time > timeout: 47 return 0 48 49 # パルス開始時刻を記録 50 start = time.time() 51 52 # パルスが終了するのを待つ 53 while GPIO.input(pin) == value: 54 if time.time() - start_time > timeout: 55 return 0 56 57 # パルス終了時刻を記録 58 end = time.time() 59 60 return end - start 61 62def init_sensors(trig, echo, mode=GPIO.BCM): 63 64 GPIO.cleanup() 65 GPIO.setmode(mode) 66 GPIO.setup(trig, GPIO.OUT) 67 GPIO.setup(echo, GPIO.IN) 68 69 70def get_distance(trig, echo, Temp=20): 71 72 73 # 出力を初期化 74 GPIO.output(trig, GPIO.LOW) 75 time.sleep(0.3) 76 # 出力(10us以上待つ) 77 GPIO.output(trig, GPIO.HIGH) 78 time.sleep(0.000011) 79 # 出力停止 80 GPIO.output(trig, GPIO.LOW) 81 82 # echo からパルスを取得 83 dur = pulse_in(echo, GPIO.HIGH, 1.0) 84 85 # ( パルス時間 x 331.50 + 0.61 * 温度 ) x (単位をcmに変換) x 往復 86 # return dur * (331.50 + 0.61 * temp) * 100 / 2 87 return dur * (331.50 + 0.61 * Temp) * 50 88 89if __name__ == "__main__": 90 91 GPIO_TRIG = 26 92 GPIO_ECHO = 20 93 94 init_sensors(GPIO_TRIG, GPIO_ECHO) 95 while True: 96 print("距離:{0} cm".format(get_distance(GPIO_TRIG, GPIO_ECHO))) 97 time.sleep(0.011) 98 99 100th=threading.Thread(target=stopinput) 101th.start() 102th2=threading.Thread(target=ledmain) 103th2.start() 104

補足情報)

Raspberry Pi zeroです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ValueError: 別のモードがすでに設定されています。

ということなんで、GPIO.setmodeは最初の一回だけにしときましょう

投稿2019/08/01 00:17

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問