フライトコントローラーの設定
フライトコントローラーのシャッター信号(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は次のような電圧パルスを発生します。
パルス幅はシャッターオンの定義で変更可能です。
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”が出力されます。