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

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

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

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

Python

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

Q&A

解決済

1回答

3390閲覧

ラズパイ&pythonで人感センサーを使ってサーボモータを動かしたいです

python6180

総合スコア1

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2021/08/16 11:52

編集2021/08/16 12:18

前提・実現したいこと

こんばんは、ラズパイ&Python初心者です。
ラズパイ4とサーボモータ(SG92R)と人感センサ(SE-10)を利用して、
人感センサに人の手を近づけるとサーボモータを90度回転しすぐに元に戻す(-90度)
という動きをさせたく、以下プログラムを記述し実行したのですが、
人感センサに関係なくモータが90度回転しすぐに元に戻る動きをしてしまい、
以下ソースコードのどの記述をどのように修正すればよいかわからず教えていただけると助かります。
接続図もおそらく間違っていると思われるため、接続図も添付しますので、アドバイスいただけると幸いです。
お手数ですがよろしくお願いいたします。

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

人感センサーに関係なくサーボモータが動作してしまう。

該当のソースコード

python

1import RPi.GPIO as GPIO 2from time import sleep 3 4# ポート番号やサーボモータ、人感センサの情報を指定 --- (*1) 5SV_PORT = 18 6SV_FREQ = 50 # 20ms(50Hz) 7SV_DUTY_OFFSET = 0.025 8SV_DUTY_RES = (2.4 - 0.5) / 20 / 180 9SENSOR_PORT = 27 10 11# GPIOの設定 --- (*2) 12GPIO.setmode(GPIO.BCM) 13GPIO.setup(SENSOR_PORT, GPIO.IN) 14GPIO.setup(SV_PORT, GPIO.OUT) 15 16# PWMを利用する準備 --- (*3) 17servo = GPIO.PWM(SV_PORT, SV_FREQ) 18servo.start(0) 19 20# 角度を計算し変更する関数 --- (*4) 21def set_angle(angle): 22 degree = angle + 90 23 duty = (SV_DUTY_OFFSET + SV_DUTY_RES * degree) * 100 24 print("angle=",angle,"duty=", int(duty)) 25 servo.ChangeFrequency(SV_FREQ) 26 servo.ChangeDutyCycle(duty) 27 28# 人感センサが反応したら角度を変える --- (*5) 29while True: 30 v = GPIO.input(SENSOR_PORT) 31 if v == GPIO.HIGH: 32 GPIO.output(SV_PORT, GPIO.HIGH) 33 try: 34 set_angle(90) 35 sleep(1) 36 37 set_angle(-90) 38 sleep(1) 39 except KeyboardInterrupt: 40 break 41 42GPIO.cleanup() 43

試したこと

ここに問題に対して試したことを記載してください。

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

以下接続図になります。
イメージ説明
人感センサの接続方法および以下プログラムの記載に問題があると思っています。人感センサが反応したらサーボモータを90度回転しすぐに元に戻す(-90度)、人感センサが反応しない場合はサーボモータは動作しない、という
プログラムを書きたいです。お手数ですがアドバイスのほうよろしくお願いいたします。

while True:
v = GPIO.input(SENSOR_PORT)
if v == GPIO.HIGH:
GPIO.output(SV_PORT, GPIO.HIGH)
try:
set_angle(90)
sleep(1)

set_angle(-90)
sleep(1)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/16 12:01

まず、Pythonのソースコードを<code>ボタンを押して出てくる記号の間に挟みましょう。Pythonはインデント位置でコードの意味が変わってくるためです。これがないとみてもらえる人にも見てもらいにくくなります。
python6180

2021/08/16 12:19

fourteenlength様、上記ご指摘いただきどうもありがとうございます。 該当箇所を修正いたしましたのでご確認いただけると幸いです。
shinami

2021/08/16 12:31 編集

人感センサーはこれですか? https://akizukidenshi.com/catalog/g/gM-02471/ であるなら、データシートの応用例2がそれに該当すると思います。 ラズパイは使ったことないですが何故人感センサーの電源+線が8番へ? 8番ピンから5Vが出てくる仕組みでしょうか? 普通に考えるとこのセンサーはDC5V~DC12Vの電源を必要とするので 2か4番ピンに赤線をつなぐと思うのですが。 抵抗と黒の線も違いますのでデータシートを見てみましょう。
python6180

2021/08/16 12:48

shinami様 回答いただきどうもありがとうございます。はい、人感センサーはご連絡いただいものになります。回路図を改めて確認したところ、5V電源は8番ピンではなく、4番ピンが正解でした。また、抵抗は10kΩでしたね、、ご指摘いただいた箇所を修正し再度実行していみたいと思います。ありがとうございました。
guest

回答1

0

ベストアンサー

Python

1while True: 2 v = GPIO.input(SENSOR_PORT) 3 if v == GPIO.HIGH: 4 GPIO.output(SV_PORT, GPIO.HIGH) #これは必要? 5 try: #ifの支配下になるようインデント 6 set_angle(90) 7 sleep(1) 8 9 set_angle(-90) 10 sleep(1) 11 except KeyboardInterrupt: 12 break

だったりしないでしょうか。
これだけで期待の動作になるかというのはともかく。

投稿2021/08/16 12:32

thkana

総合スコア7703

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

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

python6180

2021/08/17 12:26

thkana様 回答いただきありがとうございます。 >GPIO.output(SV_PORT, GPIO.HIGH) #これは必要? については確かに不要ですね。 あとは人感センサーに人の手を近づけた場合のみサーボモータが動作し、 人感センサーが反応しない場合はサーボモータは動作させないようにしたいです。 その書き方がいろいろ調べたのですがなかなか出てこないため、アドバイスいただけると助かります。 tryのインデントについては修正いたします。 よろしくお願いいたします。
thkana

2021/08/17 13:09

> 人感センサーが反応しない場合はサーボモータは動作させない 普通(ちゃんと作れば)そうなっていると思いますが? それと、焦電センサは「近づける」ではなく、「変化する」ことに反応すると思います。近づけた状態で手を止めればセンサは反応しなくなるでしょうし、近づいた状態で手を振ったりさらに近づけたりすればまた反応するでしょう。それはセンサの性質ですから、焦電センサを使う以上どうしようもないでしょう。 やりたいことによっては超音波や光による距離センサを使ったほうがいいかもしれません。これはこれで「人間(温かいもの)」以外にも反応しますけれど。
python6180

2021/08/19 10:23

返信遅れてすみません、コメントいただきありがとうございます。 再度接続方法見直して実行してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問