GoProとフライトコントローラーの中継

プログラミング

フライトコントローラーの設定

フライトコントローラーのシャッター信号(AUX GPIOに出てくる)を監視し、それに応じてRaspberry PIからGoProにシャッター信号を送ればいいわけです。

ミッションプランナーとPixhawkを接続します。

関係するパラメーターは

CAM_TRIGG_TYPE=1

でPWMではなく、リレーのような電圧変化を使うとします。(リレー)

次にどのフライトコントローラーのGPIOピンをシャッターに使うかを定義します。
ここでAUXOUT1-AUXOUT6までが書かれていますが、ここに相当します。
これはミッションプランナーではSERVO09からSERVO14に相当します。

「PixhawkではAUX5とAUX6がデフォルトでGPIOである」という記述があるので、ここではAUX5(SERVO13)を使います。(図の白い番号がAUXの番号です。)

RELAY_PIN = 54 (AUXOUT5)

をセットします。
SERVO13ですから、

SERVO13_FUNCTION = -1 (GPIO)

これらのパラメーターを書き込むことを忘れないで、次に進みます。

「初期設定」-> 「オプションハードウェア」-> 「カメラジンバル」の画面に移動します。

シャッターは「リレー」になっているはずです。

シャッターの押した状態は1800、押した状態は1100を設定します。(ラジオキャリブレーションでチャネル6で得た数値よりも小さく)

プロポのスイッチを割り当てます

RC6_OPTION=9   (Camera Trigger) 

ミッションコントローラーの「フライトデータ」ではServo/Relayがあるので、そこで動作させることはできます。
プロポのスイッチRC6=スイッチBを倒すとメッセージに「Camera Shutter ON] のようなメッセージがでます。

どこにも明記されていませんが、上記設定によりAUX OUT5は次のような電圧パルスを発生します。
パルス幅はシャッターオンの定義で変更可能です。

Camera Controls — Copter documentation

Raspberry Piの設定

まずフライトコントローラーと接続する2Pのケーブルを作成します。
どのピンでON/OFFを受けるかを決めます。
ピンのレイアウトはhttps://pinout.xyz/を見ましょう。

ピン1,3,5,7,9はAQM0802を取り付けた場合には使うので避けます。
ピン6,17はファンのために。
一番端のピン37,39 (GPIO26とGND)を選定しました。

デジタル回路のスイッチ

デジタル回路のスイッチはオンかオフか、一般的には(5Vか3.3V)か, 0Vかどちらかの値を明示的に持たねばなりません。つまり次のような回路が必ず要求されます。

 

普段は電源から数十キロオームの抵抗を介して入力にオンの状態を設定しておきます。
スイッチが押されると、電気は抵抗のないグランドに流れますから0Vとなります。
この抵抗を「吊り上げている抵抗」という意味でプルアップ抵抗といいます。プルアップ抵抗は外部回路と用意しなくても、使われることがわかりきっているのでCPU側であらかじめ用意されていることもあります。

逆にプルダウンというやり方もあります。

普段はアースとGPIOが接続されています。
スイッチが入るとGPIOに電圧が加わります。
抵抗がないと、ショート状態になってしまうことに気づいてください。
この抵抗もCPU側で用意してくれます。

プルダウンはいろいろと問題を含みます。
Raspberry PIもそうですが、完全な0Vは難しいのです。
ノイズが入ったりして、数十ミリボルトくらいの電圧が配線に乗りがちです。

このためデジタル回路はオフとみなす範囲、オンとみなす範囲をもっています。

  • 0-0.8V(0-80mV)くらいまではオフ
  • 0.8V-1.3V 不定
  • 1.3-3.3V オン

そのためスイッチなどではプルアップが好まれますが、信号を送る場合はプルダウンが使われます。

さて、GPIOの電圧検知についてPythonで習作を書きます。

今回は使いませんが、プルアップ抵抗をCPU側に用意させて、スイッチが入った(オフ)らprintされる例

"""
TEST1
"""
import RPi.GPIO as GPIO # RaspiのGPIO
from time import sleep  # sleep使います
TESTIO = 26 # スイッチ対象をGPIO26とします。
GPIO.setmode(GPIO.BCM) # BCMはGPIOでピン番号指定の意味
# プルアップ抵抗を用意させる
GPIO.setup(TESTIO, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
try:
    while True:
            if GPIO.input(TESTIO) == GPIO.LOW: 
            print("GPIO26 LOW detected") 
        sleep(1)

except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()
    print("The end of program")

実行し、ピンをショートさせる(GNDと同じ電圧にする)とprint文が出力されます。

プルダウン抵抗をCPUに用意させて、電圧があがったことを検知するプログラムです。

"""
TEST2
"""
import RPi.GPIO as GPIO
from time import sleep

TESTIO = 26

GPIO.setmode(GPIO.BCM) #ピン番号指定
GPIO.setup(TESTIO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
    while True:
        if GPIO.input(TESTIO) == GPIO.HIGH:
            print("High detected.")
            
        sleep(1)
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()
    print("The end of program.")

これはGPIO26を3.3Vの電源ピンに接触させると動作します。

さらにこのプログラムをGPIOの割り込みで検知するプログラムに改変します。

"""
TEST3
"""
import RPi.GPIO as GPIO
from time import sleep

TESTIO = 26

def main():
    GPIO.setmode(GPIO.BCM) #ピン番号指定
    GPIO.setup(TESTIO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    GPIO.add_event_detect(TESTIO, GPIO.RISING, 
                       callback=callback1, bouncetime=300)

    try:
        while True:
            sleep(1)

    except KeyboardInterrupt:
        pass
    finally:
        GPIO.cleanup()
        print("The end of program")

def callback1(number):
    print("%s is High "%number)
    
if __name__ == "__main__":
    main()

割り込みですから、メインのループでなにをしていても即座に検知されcallback1は実行されます。

GPIO.add_event_detect関数でGPIO.RISINGと指定している点に気をつけてください。
ピンの電圧の変化を検知する時に、電圧が立ち上がっている時と、電圧が立ち下がっている時のどちらで検知するかを決められます。
一般的にはプルアップした状態では、スイッチで電圧が下がった状態を検知するためにGPIO.FALLINGと設定します。
プルダウンした状態では、スイッチで電圧が上がった状態を検知するためにGPIO.RISINGと設定します。
用途により適当なものを選びます。

このプログラムでフライトコントローラーのAUX5をRaspberry Pi GPIO26に繋ぎます。GND同士も接続します。

Mission Plannerのフライト・データ画面でボートをクリックし”カメラトリガー”をクリックすると、AUX5のピンの電圧があがります。Raspberry PIはその変化をピン割り込みを検知し、”26 is high”が出力されます。

 

 

 

タイトルとURLをコピーしました