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だけが反応した時に撮影するようになってます。
お願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。