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

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

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

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

Q&A

解決済

2回答

521閲覧

ラズパイ pythonをアプデしたら、前に実行できたプログラムが実行できなくなった

shuppi

総合スコア47

Raspberry Pi

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

0グッド

1クリップ

投稿2017/09/15 02:20

編集2017/09/15 02:22

Raspberry Pi 3 Model B Ver 1.2を使っています。
忘れてしまいましたが、python2.7.?からpython3.5.3にアップデートしました。
それから、下記のプログラムがをはいて、起動できなくなりました。
もしかしたら、アップデート前にすこしいじっていたのかもしれないです。

動きは、人感センサ四つを使い、動きを感知したら、カメラで撮影を行うようにしています。
東西南北は人感センサ二つで検知範囲が重なるところで判断しています。
あと、カメラのプレビューも、モニターに表示しています。

#!/usr/local/bin/python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time #Cursesの文字化け対策 import curses import locale #カメラ import picamera import threading SLEEPTIME = 1 #撮影画像サイズ PIC_WIDTH = 800 PIC_HEIGHT = 600 #撮影画像保存場所 SAVEDIR = "/home/pi/kaihatsu/picture/" #人感センサ SENSOR1_PIN = 17 SENSOR2_PIN = 18 SENSOR3_PIN = 27 SENSOR4_PIN = 22 #LED LED1_PIN = 23 LED2_PIN = 24 LED3_PIN = 25 LED4_PIN = 8 GPIO.setmode(GPIO.BCM) #人感センサピンの設定 GPIO.setup(SENSOR1_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(SENSOR2_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(SENSOR3_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(SENSOR4_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) #LEDピンの設定 GPIO.setup(LED1_PIN, GPIO.OUT) GPIO.setup(LED2_PIN, GPIO.OUT) GPIO.setup(LED3_PIN, GPIO.OUT) GPIO.setup(LED4_PIN, GPIO.OUT) #Cursesの文字化け対策 locale.setlocale(locale.LC_ALL, "") cam = picamera.PiCamera() cam.resolution = (PIC_WIDTH, PIC_HEIGHT) #cam.hflip = True cam.vflip = True # カメラのプレビュー def test(): cam.start_preview() thread1 = threading.Thread(target = test) # main if __name__ == "__main__": while True: thread1.start() try: stdscr = curses.initscr() curses.noecho() stdscr.clear() stdscr.addstr(1, 0, '北東:%s:' % GPIO.input(SENSOR1_PIN)) stdscr.addstr(2, 0, '南東:%s:' % GPIO.input(SENSOR4_PIN)) stdscr.addstr(3, 0, '南西:%s:' % GPIO.input(SENSOR3_PIN)) stdscr.addstr(4, 0, '北西:%s:' % GPIO.input(SENSOR2_PIN)) stdscr.addstr(6, 2, '北 :') stdscr.addstr(7, 2, '東 :') stdscr.addstr(8, 2, '南 :') stdscr.addstr(9, 2, '西 :') #人感センサ1 (北東) if(GPIO.input(SENSOR1_PIN) == GPIO.HIGH): stdscr.addstr(1, 8, '動物を感知しました') stdscr.refresh() #人感センサ2 (北西) if(GPIO.input(SENSOR2_PIN) == GPIO.HIGH): stdscr.addstr(2, 8, '動物を感知しました') stdscr.refresh() #人感センサ3 (南西) if(GPIO.input(SENSOR3_PIN) == GPIO.HIGH): stdscr.addstr(3, 8, '動物を感知しました') stdscr.refresh() #人感センサ4 (南東) if(GPIO.input(SENSOR4_PIN) == GPIO.HIGH): stdscr.addstr(4, 8, '動物を感知しました') stdscr.refresh() #人感センサ1 & 2 (北) if(GPIO.input(SENSOR1_PIN) == GPIO.HIGH and GPIO.input(SENSOR2_PIN) == GPIO.HIGH): GPIO.output(LED4_PIN, GPIO.HIGH) stdscr.addstr(9, 8, '動物を感知しました') stdscr.refresh() elif(GPIO.input(SENSOR1_PIN) == GPIO.LOW and GPIO.input(SENSOR2_PIN) == GPIO.LOW): GPIO.output(LED4_PIN, GPIO.LOW) #人感センサ1 & 4 (東) if(GPIO.input(SENSOR1_PIN) == GPIO.HIGH and GPIO.input(SENSOR4_PIN) == GPIO.HIGH): GPIO.output(LED1_PIN, GPIO.HIGH) stdscr.addstr(6, 8, '動物を感知しました') stdscr.refresh() filename = time.strftime("%Y%m%d%H%M%S") + ".jpg" save_file = SAVEDIR + filename cam.capture(save_file) elif(GPIO.input(SENSOR1_PIN) == GPIO.LOW and GPIO.input(SENSOR4_PIN) == GPIO.LOW): GPIO.output(LED1_PIN, GPIO.LOW) #人感センサ3 & 4 (南) if(GPIO.input(SENSOR3_PIN) == GPIO.HIGH and GPIO.input(SENSOR4_PIN) == GPIO.HIGH): GPIO.output(LED2_PIN, GPIO.HIGH) stdscr.addstr(7, 8, '動物を感知しました') stdscr.refresh() elif(GPIO.input(SENSOR3_PIN) == GPIO.LOW and GPIO.input(SENSOR4_PIN) == GPIO.LOW): GPIO.output(LED2_PIN, GPIO.LOW) #人感センサ2 & 3 (西) if(GPIO.input(SENSOR2_PIN) == GPIO.HIGH and GPIO.input(SENSOR3_PIN) == GPIO.HIGH): GPIO.output(LED3_PIN, GPIO.HIGH) stdscr.addstr(8, 8, '動物を感知しました') stdscr.refresh() elif(GPIO.input(SENSOR2_PIN) == GPIO.LOW and GPIO.input(SENSOR3_PIN) == GPIO.LOW): GPIO.output(LED3_PIN, GPIO.LOW) time.sleep(SLEEPTIME) except KeyboardInterrupt: cam.stop_preview() thread1.join() GPIO.cleanup() finally: curses.echo() curses.endwin()

拙いプログラムですみません。

自分ではどこがおかしいのかわかりません。

pythonをアプデしたことで、プログラムの書き方が変わってしまったのでしょうか。

↓エラー内容です。
イメージ説明

よろしくお願いします。

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

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

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

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

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

Tak1wa

2017/09/15 02:36

2.7 から 3.5 へは単純な移行は出来なかったと思いますが移行作業はしたのですか?
guest

回答2

0

ベストアンサー

エラーメッセージからpython2.7上で動作していると思います。
また、threads can only be~から過去質問ラズパイ3 スレッドについて
と同じ原因だと思います。
上記の質問は解決していることから、コード自体に誤りがあるので修正が必要だと思います。

投稿2017/09/15 02:33

can110

総合スコア38234

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

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

shuppi

2017/09/15 04:11

すみません;;修正前のファイルでした ご指摘ありがとうございました
guest

0

質問のコードでは、

while True: thread1.start()

というようにthread1を何度も開始していますが、thread1がjoinされるのはKeyboardInterrupt:の時だけなので、実行中のスレッドをスタートさせることになります。そのため

threads can be started only once (スレッドをスタートできるのは1度だけ!)

というエラーが起こります。明らかにコードの誤りです。
ループの最後でスレッドの終了を確認する(joinする)ようにすれば、直るはず。

=====

su nano thread1.py

の後(テキストエディタ nano でthread1.pyを修正した後)で、出てくるエラーが変わっています。

thread1.pyをどのように修正したのか判らないので、原因は判りません。

This channel is already used のエラーの原因が知りたいのなら、修正後のthread1.pyのコードを提示してください。

投稿2017/09/15 03:01

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問