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

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

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

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

Q&A

解決済

1回答

1010閲覧

ラズパイ3 スレッドについて

shuppi

総合スコア47

Raspberry Pi

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

0グッド

2クリップ

投稿2017/07/07 07:19

編集2017/07/07 07:31

Raspberry pi 3 Model B ver1.2を使っています。人感センサを4つ四角い箱の側面にそれぞれ取り付け、そのうちの隣り合う2つが反応したら写真を撮るというものを実験で作っています。

![イメージ説明

反応したらLEDを点ける、写真を撮るというところまでは出来たのですが、カメラに映っている景色?プレビュー?というのでしょうか、それをモニターに映したいのですが、うまくいかずプログラムがすぐに終了してしまいます。

↓エラー文です

Traceback (most recent call last): File "thread1.py", line 69, in <module> thread1.start() File "/usr/lib/python2.7/threading.py", line 739, in start raise RuntimeError("threads can only be started once") RuntimeError: threads can only be started once

thread1.pyという名前のプログラム名です。

人感センサ、撮影は別で、プレビューを常に画面に表示しておきたいです。スレッドを使えばいいのでしょうか?

後、出来ればプレビューのサイズを小さくしたいと思っています。(画面の大半が占拠されるので)

python

1#!/usr/local/bin/python 2# -*- coding: utf-8 -*- 3 4import RPi.GPIO as GPIO 5import time 6 7#Cursesの文字化け対策 8import curses 9import locale 10 11#カメラ 12import picamera 13import threading 14 15SLEEPTIME = 1 16 17#撮影画像サイズ 18PIC_WIDTH = 800 19PIC_HEIGHT = 600 20 21#撮影画像保存場所 22SAVEDIR = "/home/pi/kaihatsu/" 23 24#人感センサ 25SENSOR1_PIN = 17 26SENSOR2_PIN = 18 27SENSOR3_PIN = 27 28SENSOR4_PIN = 22 29 30#LED 31LED1_PIN = 23 32LED2_PIN = 24 33LED3_PIN = 25 34LED4_PIN = 10 35 36GPIO.setmode(GPIO.BCM) 37 38#人感センサピンの設定 39GPIO.setup(SENSOR1_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) 40GPIO.setup(SENSOR2_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) 41GPIO.setup(SENSOR3_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) 42GPIO.setup(SENSOR4_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) 43 44#LEDピンの設定 45GPIO.setup(LED1_PIN, GPIO.OUT) 46GPIO.setup(LED2_PIN, GPIO.OUT) 47GPIO.setup(LED3_PIN, GPIO.OUT) 48GPIO.setup(LED4_PIN, GPIO.OUT) 49 50#Cursesの文字化け対策 51locale.setlocale(locale.LC_ALL, "") 52 53cam = picamera.PiCamera() 54cam.resolution = (PIC_WIDTH, PIC_HEIGHT) 55 56#cam.hflip = True 57cam.vflip = True 58 59#----------------------------------------------------------------------- 60def test(): 61 cam.start_preview() 62 63thread1 = threading.Thread(target = test) 64 65# main 66if __name__ == "__main__": 67 while True: 68 try: 69 thread1.start() 70# cam.start_preview() 71 72 stdscr = curses.initscr() 73 curses.noecho() 74 75 stdscr.clear() 76 77 stdscr.addstr(1, 0, '人感センサ1:%s:' % GPIO.input(SENSOR1_PIN)) 78 stdscr.addstr(2, 0, '人感センサ2:%s:' % GPIO.input(SENSOR2_PIN)) 79 stdscr.addstr(3, 0, '人感センサ3:%s:' % GPIO.input(SENSOR3_PIN)) 80 stdscr.addstr(4, 0, '人感センサ4:%s:' % GPIO.input(SENSOR4_PIN)) 81 82 stdscr.addstr(6, 2, '12時方向 :') 83 stdscr.addstr(7, 2, ' 3時方向 :') 84 stdscr.addstr(8, 2, ' 6時方向 :') 85 stdscr.addstr(9, 2, ' 9時方向 :') 86 87 #人感センサ1 88 if(GPIO.input(SENSOR1_PIN) == GPIO.HIGH): 89 stdscr.addstr(1, 16, '動物を感知しました') 90 stdscr.refresh() 91 #人感センサ2 92 if(GPIO.input(SENSOR2_PIN) == GPIO.HIGH): 93 stdscr.addstr(2, 16, '動物を感知しました') 94 stdscr.refresh() 95 #人感センサ3 96 if(GPIO.input(SENSOR3_PIN) == GPIO.HIGH): 97 stdscr.addstr(3, 16, '動物を感知しました') 98 stdscr.refresh() 99 #人感センサ4 100 if(GPIO.input(SENSOR4_PIN) == GPIO.HIGH): 101 stdscr.addstr(4, 16, '動物を感知しました') 102 stdscr.refresh() 103 104 #人感センサ1 & 4 105 if(GPIO.input(SENSOR1_PIN) == GPIO.HIGH and GPIO.input(SENSOR4_PIN) == GPIO.HIGH): 106 GPIO.output(LED1_PIN, GPIO.HIGH) 107 stdscr.addstr(6, 16, '動物を感知しました') 108 stdscr.refresh() 109 elif(GPIO.input(SENSOR1_PIN) == GPIO.LOW and GPIO.input(SENSOR4_PIN) == GPIO.LOW): 110 GPIO.output(LED1_PIN, GPIO.LOW) 111 112 #人感センサ3 & 4 113 if(GPIO.input(SENSOR3_PIN) == GPIO.HIGH and GPIO.input(SENSOR4_PIN) == GPIO.HIGH): 114 GPIO.output(LED2_PIN, GPIO.HIGH) 115 stdscr.addstr(7, 16, '動物を感知しました') 116 stdscr.refresh() 117 118 filename = time.strftime("%Y%m%d%H%M%S") + ".jpg" 119 save_file = SAVEDIR + filename 120 cam.capture(save_file) 121 elif(GPIO.input(SENSOR3_PIN) == GPIO.LOW and GPIO.input(SENSOR4_PIN) == GPIO.LOW): 122 GPIO.output(LED2_PIN, GPIO.LOW) 123 124 #人感センサ2 & 3 125 if(GPIO.input(SENSOR2_PIN) == GPIO.HIGH and GPIO.input(SENSOR3_PIN) == GPIO.HIGH): 126 GPIO.output(LED3_PIN, GPIO.HIGH) 127 stdscr.addstr(8, 16, '動物を感知しました') 128 stdscr.refresh() 129 elif(GPIO.input(SENSOR2_PIN) == GPIO.LOW and GPIO.input(SENSOR3_PIN) == GPIO.LOW): 130 GPIO.output(LED3_PIN, GPIO.LOW) 131 132 #人感センサ1 & 2 133 if(GPIO.input(SENSOR1_PIN) == GPIO.HIGH and GPIO.input(SENSOR2_PIN) == GPIO.HIGH): 134 GPIO.output(LED4_PIN, GPIO.HIGH) 135 stdscr.addstr(9, 16, '動物を感知しました') 136 stdscr.refresh() 137 elif(GPIO.input(SENSOR1_PIN) == GPIO.LOW and GPIO.input(SENSOR2_PIN) == GPIO.LOW): 138 GPIO.output(LED4_PIN, GPIO.LOW) 139 140 time.sleep(SLEEPTIME) 141 142 except KeyboardInterrupt: 143# cam.stop_preview() 144 thread1.join() 145 GPIO.cleanup() 146 147 finally: 148 curses.echo() 149 curses.endwin() 150 151

きたなくてすみません。スレッドをがんばってみた後がありますが、そこも含めてどうしたらよいかなど教えていただきたいです。
今は試しで、人感センサ3と4だけが反応した時に撮影するようになってます。

お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

コード詳細確認できておらず、picameraは使ったことないのですが1点だけ。

mainの無限ループ毎にスレッド開始しているため、提示のエラーが発生しています。
スレッド開始は1回だけでよいです。

Python

1# 略 2if __name__ == "__main__": 3 thread1.start() # 初回のみ開始でよい 4 while True: 5 try: 6 #thread1.start() # ループ毎にスレッド開始しようとしている 7# 略

投稿2017/07/20 09:35

can110

総合スコア38254

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問