ここまで
でハードウェアの準備をし、
で、ソフトウェアの研究を積み重ねてきました。
あらためて全体のシナリオを確認します。
- GCSやプロポのスイッチからフライトコントローラーへカメラシャッターを要求する信号が飛びます。
- フライトコントローラーはAUX GPIOをHighにすることでRaspberry Piにシャッターコマンドを中継します。
- Raspberry PiはあらかじめGoProとhttpでの交信を確立していて、GoProにシャッターコマンドを送ります。
最終的なプログラムは次のとおりとなります。
前提はOpen GoProのインストールが必要です。
pip install open-gopro
同時に30秒おきにKeepAliveを送っています。
""" gopro-fc.py This program scenario is; 1. establish connection to GoPro 2. wait for GPIO(SIGNAL_PORT) 3. Send Shutter command to GoPro 4. Frequently send keep alive command to GoPro Therefore this program has infinite loop 10/12/2023 First Edition. By Tsukasa Takao """ import requests import time import json import threading import RPi.GPIO as GPIO SIGNAL_PORT = 26 GOPRO_BASE_URL = "http://10.5.5.9:8080/" def request_shutter(pin): if pin == SIGNAL_PORT: response = requests.get(GOPRO_BASE_URL +"/gopro/camera/shutter/start", timeout=3) # request_cmd("/gopro/camera/shutter/stop") # release response.raise_for_status() time.sleep(3) response = requests.get(GOPRO_BASE_URL +"/gopro/camera/shutter/stop", timeout=3) response.raise_for_status() print("Shutter command sent") else: pass def request_alive(): # loop as ohter thread while True: response = requests.get(GOPRO_BASE_URL +"/gopro/camera/keep_alive", timeout=3) response.raise_for_status() resp = response.json() print("Keep Alive") time.sleep(30) if __name__ == '__main__': # Setup GPIO.setmode(GPIO.BCM) GPIO.setup(SIGNAL_PORT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Try photo mode. response = requests.get(GOPRO_BASE_URL+ "/gopro/camera/presets/set_group?id=1001", timeout=3) # request_cmd("/gopro/camera/shutter/stop") # release # if not good, throw error. response.raise_for_status() # OK. generate keep alive thread thread_A = threading.Thread(target=request_alive) thread_A.start() # GPIO event listner GPIO.add_event_detect(SIGNAL_PORT,GPIO.RISING, callback=request_shutter, bouncetime=300) # Loop while True: time.sleep(10) thread_A.join() # wait until thread_A
テストする時はGoProのWIFI APに繋がなければなりません。
もしRaspiとSSH接続をしている場合、有線LANか、USBキーボード+HDMIディスプレイに切り替えておかないとテストできなくなります。
ピッという音と共にモードが切り替わり、Mission Plannerで「シャッタートリガー」を押すとGoProで写真が取れます。
ターミナルをオフにしてもプログラムを動かし続けるためには
nohup gopro-fc.py &
でいけると思います。
このプログラムはGoPro WiFiを止めると、httpがエラーを起こしますから止まります。