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

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

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

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

Python

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

Q&A

解決済

1回答

2764閲覧

raspberrypiで近接センサを動かして、ADコンバータで出力を得たい

ysk_snn

総合スコア21

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2019/12/12 06:21

編集2019/12/12 08:52

raspberry piから給電して
・近接センサ_LBR-127HLD
・ADコンバータ_MCP3208
を動かしています。

近接センサのエミッタ側からADコンバータの入力を得ています。
ひとまずちゃんとした出力になっているか、Thonnyで以下のコードを書いて試してみました。
物を近づけたり遠ざけたりすると0~1の間で出力が返ってくるのですが、
30秒程度経つとフリーズしてしまいctrl+cも利かなくなってしまいます。
ただし、raspberry pi自体が操作できない訳ではなく、Interruptのボタンを押すとエラーは出ますがちゃんと終了できます。

コードか配線が間違っているのでしょうか。教えていただけないでしょうか。

pyhton3

1from gpiozero import MCP3208 2import RPi.GPIO as GPIO 3import time 4 5while True: 6 time.sleep(1) 7 print(MCP3208(channel = 0).value)

イメージ説明

<2019/12/12/17:31_追記>
どこでエラーが発生しているか確認するためにあちこちにprint文を入れました。

python3

1from gpiozero import MCP3208 2import RPi.GPIO as GPIO 3import time 4 5GPIO.setmode(GPIO.BCM) 6GPIO.setup(21,GPIO.OUT) 7 8while True: 9 time.sleep(1) 10 print(MCP3208(channel = 0).value) 11 if MCP3208(channel = 0).value > 0.01: 12 GPIO.output(21,GPIO.HIGH) 13 print('low') 14else: 15 print('error') 16 17GPIO.cleanup() 18print('not_true')

shellには以下のように少しだけ動いてからエラーがでました

python3

10.0006104260774020265 2low 30.0006104260774020265 4low 50.0006104260774020265 6low 70.0006104260774020265 8low 90.0023196190941277006 10low 110.004517152972774996 12low 130.0006104260774020265 14low 150.0059821755585398595 16low 170.015993163227933094 18high 190.015016481504089851 20high 210.0006104260774020265 22low 230.0006104260774020265 24low 250.0006104260774020265 26low 270.0006104260774020265 28low 290.0006104260774020265 30low 310.0006104260774020265

ここでフリーズしてしまったのでctrl+cを打つと、

python3

1Exception ignored in: <bound method SharedMixin.__del__ of SPI(closed)> 2Traceback (most recent call last): 3 File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 137, in __del__ 4 super(SharedMixin, self).__del__() 5 File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 122, in __del__ 6 self.close() 7 File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 82, in close 8 old_close() 9 File "/usr/lib/python3/dist-packages/gpiozero/pins/local.py", line 102, in close 10 self.pin_factory.release_all(self) 11 File "/usr/lib/python3/dist-packages/gpiozero/pins/__init__.py", line 85, in release_all 12 with self._res_lock: 13 File "/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py", line 133, in signal_handler 14 raise KeyboardInterrupt("Execution interrupted") 15KeyboardInterrupt: Execution interrupted 16KeyboardInterrupt: Forced reset 17>>>

と表示されました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ysk_snnさん、

以下のコードは、どうでしょうか?

from gpiozero import MCP3208 import RPi.GPIO as GPIO import time ch = MCP3208(channel = 0) while True: time.sleep(1) print(ch.value)

MCP3208のインスタンスを作りまくってるのが原因?

投稿2019/12/12 09:23

mt08

総合スコア1825

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

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

ysk_snn

2019/12/16 01:38

ご回答ありがとうございます! おっしゃるとおりのコードでは正常に動き続けています! 恥ずかしながら「インスタンス」について今回のご指摘をいただいてから調べたのですが、 私のコードのどこでインスタンスの過剰生成が行われているのか良く理解できませんでした... よろしければ再度ご教示いただけないでしょうか。
ysk_snn

2019/12/16 03:01

```python3 from gpiozero import MCP3208 import RPi.GPIO as GPIO import time while True: time.sleep(1) print(MCP3208(channel = 0).value) ``` の場合だと、print文において「MCP3208(channel = 0) = 何か値」というインスタンスを生成するのかな、と考えているのですが、 ```python3 from gpiozero import MCP3208 import RPi.GPIO as GPIO import time ch = MCP3208(channel = 0) while True: time.sleep(1) print(ch.value) ``` とした場合はprint文において「ch = 何か値」というインスタンスを生成することにはならないのでしょうか?
mt08

2019/12/16 05:26

ysk_snnさん、 while True: 内に "MCP3208(channel = 0)" があるので、ループごとに、呼び出されてしまうのが、問題かと。 gpiozeroのサンプルのページ(https://gpiozero.readthedocs.io/en/stable/recipes.html)で、`MCP` で検索してみてください。 どのサンプルもループの前に、変数に代入して、それをループ内でつかってますよね。 ソースがgithubにあるので(https://github.com/gpiozero/gpiozero/blob/master/gpiozero/spi_devices.py)、追ってみるのはどうでしょう?
ysk_snn

2019/12/17 00:35

mt08様 何度もありがとうございます。 サンプルコードのまねをして使ってみようと思います。 メモリやインスタンスの勉強になりました。 またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問