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

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

ただいまの
回答率

90.50%

  • Python 3.x

    9816questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Raspberry Pi

    1065questions

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

pythonを用いて2つのプログラムを同時に動かす

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 258

surarinmon

score 6

ラズベリーパイを用いて下のようにして、LEDの点灯を同時に行おうとしてるのですがうまく時間を合わすことができません。

プログラムの実行時間が毎回ずれるので、別の方法でやろうかと思ったのですが、2つのプログラムを同時に起動する、LEDの起動を同期するといったやりかたはないでしょうか

import time
import picamera
import threading
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)

starttime = time.perf_counter_ns()

def camera():
  with picamera.PiCamera() as camera:
   camera.resolution = (640,480)
   cameratime = time.perf_counter_ns()
   ctime = cameratime - starttime
   print("CAM = {:}ns" .format(ctime))
   camera.capture('/home/pi/cameradata/image.jpg')
   cameratime2 = time.perf_counter_ns()
   ctime2 = cameratime2 - starttime
   print("CAM2 = {:}ns" .format(ctime2))
   camera.stop_preview()

def LED():

 GPIO.output(11,GPIO.LOW)
 GPIO.output(11,GPIO.HIGH)
 LEDtime = time.perf_counter_ns()
 Ltime = LEDtime - starttime
 print("LED = {:}ns" .format(Ltime))
 time.sleep(0.01)
 GPIO.output(11,GPIO.LOW)
 time.sleep(2)

 GPIO.cleanup()


p1 = threading.Thread(target = camera)
p2 = threading.Thread(target = LED)

p1.start()
p2.start() 
p1.join()
p2.join()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

タイマーで時間合わせを行うのではなく、いずれかのスレッドから動かしたいタイミングでイベントを送るなどして動かせばよいかと。

簡単なサンプルを示しますが、使い方の詳細はドキュメントなどで確認してください。

import time
import threading

event = threading.Event()

def a():
    time.sleep(2)
    print("a")
    event.set()

def b():
    event.wait()
    print("b")

th1 = threading.Thread(target=a)
th2 = threading.Thread(target=b)

th1.start()
th2.start()
th1.join()
th2.join()


https://docs.python.jp/3/library/threading.html#threading.Event

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/17 16:33

    試してみたところ、前より精度よく10μs程度の誤差となりましたありがとうございます。

    続けて質問してしまい申し訳ないのですが、これより精度良く、といったことは難しいでしょうか。

    キャンセル

  • 2019/01/17 16:37 編集

    10usは気にしてもしょうがないんじゃないでしょうか。そもそもLED(とその駆動回路)がそんなに早く応答しないと思うのですが

    キャンセル

  • 2019/01/17 16:49

    確かにその通りです...ありがとうございます

    キャンセル

  • 2019/01/17 16:51

    もし「LEDの灯りで画像を撮りたい」というシチュエーションなら、多少早めにLEDを起動するとか、実用上必要になる工夫がいろいろあるかもしれません。そのへんはうまく調整してください。

    キャンセル

  • 2019/01/17 20:00

    誤差は見間違えで200μsでした、いろいろ触ってみたいと思います

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    9816questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Raspberry Pi

    1065questions

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