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

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

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

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

Python

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

Q&A

解決済

2回答

394閲覧

超音波センサーでの距離測定

pontem

総合スコア8

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2018/09/22 11:58

前提・実現したいこと

超音波センサー(HC-SR04)を使いraspberrypi で0.2秒ずつに距離を測りたいです。よろしくお願いします。

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

File "pi_sensor.py", line 37 print reading(0) ^ SyntaxError: invalid syntax

該当のソースコード

python

1def reading(sensor): 2 import time 3 import RPi.GPIO as GPIO 4 5 GPIO.setwarnings(False) 6 GPIO.setmode(GPIO.BOARD) 7 TRIG = 11 8 ECHO = 13 9 10 11 if sensor == 0: 12 GPIO.setup(TRIG,GPIO.OUT) 13 GPIO.setup(ECHO,GPIO.IN) 14 GPIO.output(TRIG, GPIO.LOW) 15 time.sleep(0.3) 16 17 GPIO.output(TRIG, True) 18 time.sleep(0.00001) 19 GPIO.output(TRIG, False) 20 21 while GPIO.input(ECHO) == 0: 22 signaloff = time.time() 23 24 while GPIO.input(ECHO) == 1: 25 signalon = time.time() 26 27 timepassed = signalon - signaloff 28 distance = timepassed * 17000 29 return distance 30 GPIO.cleanup() 31 print(1) 32 else: 33 print ("Incorrect usonic() function varible.") 34 35for i in range(100): 36 print reading(0) 37 time.sleep(0.2) 38

試したこと

for文がなければ動くのですが入れると動きません

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

Python 3.6.5
anaconda環境

###その他分からないこと

初心者で分からないことが多く恐縮ですが、次のことを教えていただけるとありがたいです。

import time
import RPi.GPIO as GPIO

これを関数の前に出すとエラーは出ないのですが処理が止まって、完了しません。

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

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

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

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

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

y_waiwai

2018/09/22 14:56

うごかない、というのはどういうふうになるのでしょうか
guest

回答2

0

ベストアンサー

まず、

GPIO.output(TRIG, True)

time.sleep(0.00001) GPIO.output(TRIG, False)

time.sleep では10μsecのディレイは無理です
TRIG出力をオシロでみて、適当なパルス幅になるように空ループで時間調節しましょう

そして、ECHO入力ですが、おそらくパルス幅が短すぎて、ラズパイのpythonでの入力で波形捕捉するのは無理かもしれません。
また、ラズパイでのパルス幅の計測は誤差が大きくなりすぎて実用的ではないと思われます。
このECHO入力も、オシロでどういう波形/時間スケールで出てくるのかを確認する必要があります

投稿2018/09/22 15:56

y_waiwai

総合スコア87747

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

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

pontem

2018/09/24 13:44

for i in range(1000) としてみたところ2,3回ほど動いて止まってしまいました。(値にばらつきがあります。3000のような値が出てしまうこともあります。) 強制終了すると前と同じエラーが出ます。オシロスコープは持ち合わせていないのですが、何かいい方法はありますか?(必要ならば買います)
y_waiwai

2018/09/24 13:48

オシロは絶対に必要です。 しかし、そもそもラズパイで(しかもpythonで)パルス幅の時間計測するのは無茶です そこらへんからどーにかしましょう
pontem

2018/09/25 13:38

わかりました
guest

0

python3環境ですか?

python3ではprint「文」はなくなり、代わりにprint「関数」を使うようになりました。

以下のように直してみてください。

python

1for i in range(100): 2 print(reading(0)) 3 time.sleep(0.2)

投稿2018/09/22 13:05

hayataka2049

総合スコア30933

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

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

pontem

2018/09/22 14:15

回答ありがとうございます。エラーは無くなりました。 しかし処理が完了しません。 ```コマンド pi@raspberrypi:~/Desktop/python $ python3 pi_sensor.py ``` このまま止まってしまいます。
hayataka2049

2018/09/22 14:17

ctrl-cで強制終了すると何が出力されますか?
pontem

2018/09/22 14:33

^CTraceback (most recent call last): File "pi_sensor.py", line 37, in <module> print(reading(0)) File "pi_sensor.py", line 23, in reading signaloff = time.time() KeyboardInterrupt これが出力されました。(macでsshです)
hayataka2049

2018/09/22 14:39

GPIO.input(ECHO) == 0がFalseにならないのだと思いますが、心当たりとかは
y_waiwai

2018/09/22 15:45 編集

オシロを用意して、ECHO入力がどうなってるかみてみよう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問