鳥人間コンテスト2023滑空機部門に出場した,東京理科大学鳥人間サークル鳥科の電装のまとめです.サークル内部の開発用資料,引き継ぎ資料でもあります.
はじめに
東京理科大学鳥人間サークル鳥科23代電装班長のブログです.
鳥科では電装系がロステクしていたため,今後の電装のベースとなるように必要十分な機能を癖なく普通に作るということを心がけました.
サークル内の開発・引き継ぎ用資料でもあり,情報量が多くまとまりきっていない部分もありますが全て公開します.
要求定義
特に滑空機では電装は無くても飛びはしますが,電装があるとちょっと嬉しいので頑張ります.
要求は上から順に優先です.フライトデータの取得が最低なのは飛ぶことを優先するためです.
- システムの要求
- パイロットの操作でラダーを制御する
- プラットホーム上で姿勢を確認する
- パイロットに対地高度・対気速度を伝達する
- フライトデータを取得する
- 電装班運営の要求
- 必要な技術を継承する
要件定義
共通事項
非機能要件
- 信頼性
- 故障による直接的な機能の喪失は認めるが,優先度が低いものの故障が高いものに影響を与えないような設計にする
- 無線通信が混信しても他に影響を与えない
- メイン電装のマイコンが停止しても操舵系は機能を維持する
- SDカードが脱落しても他の機能は動作する
- ソフトウェアのバグ,コクピフレームとの接触による短絡,通信線の切断などの故障を想定する
- システムが複雑になるため基本的に冗長は組まず,予備部品の用意で対応する
- 故障による直接的な機能の喪失は認めるが,優先度が低いものの故障が高いものに影響を与えないような設計にする
- 安全性
- 着水時に発煙・発火しない
- パイロットの頭部付近に電装を配置しない
- 稼働時間
- 着水までバッテリーが持つ
- 電圧の監視が可能である
- バッテリーに最後にアクセスできるのはフライト前日の機体組立て開始時
去年は理科大でコクピを組んだためバッテリーを入れていった
- 着水までバッテリーが持つ
- 環境
- 機体が直射日光にあたり温度が上昇しても動作する
- 多少の水滴では故障せず動作し続ける
- (直射日光下で)LEDを見る必要なく運用できる
- トラックで輸送する場合,振動や熱に耐えられる
- 機体の金属やCFRPの粉,琵琶湖の砂の対策がされている
- 運用
- プラットフォーム上で電装の電源を起動できる
- プラホ上での電装作業を最小限にする
- 開発環境・メンテナンス
- 琵琶湖で機体を組んだ状態で電装のプログラムを変更できる
- デバッグに必要な情報をなるべく多く出力する
- 拡張性
- とりあえず考えない
制約条件
- 電気的制約
- SPIは通信速度が速く,I2Cはプルアップが不安定なため基板内のみで使用
- 基板間の通信はUARTおよびそれに近い規格(RS422など)
- マイコンの動作電圧は多くのセンサーに合わせて基本3.3V
- 技術(力)的制約
- Arduinoを使用し,自力でライブラリを書かなくて良い構成とする
- CANはなるべく使用せず,UARTによる文字列送受信を行う
- チップ部品は使用しない
- ケーブルの圧着はせず,既製品を使用する
操舵
そもそもワイヤーリンケージかフライバイワイヤーかはチームにノウハウがあるかで決めていいと思うので,鳥科では電装の仕事
- パイロットの操作でラダーを制御する
- 入力を読む
- アナログ入力を読むためジョイスティックを使用する
- 不感帯を含む,任意のカーブを設定できる
- サーボモータを動かす
- 十分なトルクがある
- 風対策
- 信号・電力の減衰が起きない
- ケーブルが断線しない
- ケーブルの電圧降下が小さい
- テールまでの長いケーブルで問題なく信号伝達ができる
- 十分なトルクがある
- 入力を読む
- その他の要件
- トラブル時ニュートラルでフライトできる(これは機構側で担保)
- プログラムを変更せずに琵琶湖でニュートラル調整が可能である(操舵範囲は事前調整)
- テールを軽くする
- バッテリーはコクピに搭載
- 軽量なサーボを使用
- 機体内通信を含む,無線通信で操舵を行ってはならない(大会ルール)
テレメトリ
- プラホからの発進時に姿勢などを確認できるようにする
以下のデータをダウンリンクするロール・ピッチ対気速度
- 受信機はポケットに入る程度のサイズにする
- PC・タブレットは大きくてプラットホームで扱いづらい(特に雨天時)
- デバッグのため,全センサーデータをダウンリンクする
高度速度計
これホントに役に立つの?という話はありますが,テレビのネタになるという大きなメリットがあります.
- パイロットに対地高度・対気速度を伝達する
- 対地高度を推定する
- 測定精度は0.1m単位を要求
- 技術的な制約
- 高高度では気圧高度を,低高度では超音波高度を信用すべき
- 気圧高度は湖面からの絶対高度は分からない
- 超音波は(ほとんどのセンサーで)高高度からでは届かない
- 気圧センサ
- 動圧・ハッチの衝撃によるセンサーの外れ値を弾く
- 中央値を取るために違う場所に3つの気圧センサを配置する
- 超音波センサ
- 水面付近は気圧高度より信用できる
- 高高度では気圧高度を,低高度では超音波高度を信用すべき
- 対気速度を測定する
- 記録方法は後述
- パイロットに情報を伝達する
- 視覚は前方に集中するのでモニター等は使えない(テープLEDはアリかも)
- 触覚は操縦に影響するので使えない
- 使えるのは聴覚のみ
- 対地高度を推定する
- その他の要件
- フェールセーフ
- センサーデータが取得できない場合,異常だと検知した場合は読み上げを行わない
- フェールセーフ
ロガー
- 下記のデータを記録する
優先度 | 測定値 | 備考 |
---|---|---|
高 | GPS | ある程度信頼できるため冗長の必要はない |
高 | 超音波高度 | 超音波が干渉するため一つだけ搭載する |
高 | 気圧高度 | 高度計の信頼性を確保できる分だけ搭載する |
中 | ラダー操作量 | ラダー操作に影響を与えないように |
中 | 9軸・姿勢 | 複数搭載なら異種のセンサーを搭載する |
中 | 対気速度 | 様々な測定方法があるので後述 |
低 | AoA(Angle of Attack)・迎え角 | 水面付近は上下方向の風は基本なく,ピッチの測定で十分 |
低 | AoS(Angle of Slip)・滑り角 | 代替手段がなく,AoAと同じく製作が高難度で今回は見送り |
- データを同期した状態で記録する
- 着水時にデータをロストしない
- 大型の滑空機で急速な動きはしないことを念頭に置いてデータレートを決定する
- 無人機・ロケット界隈のアビオ屋の感覚よりはデータレートは下げても良い(10~20Hz程度)
- 要求に完全に合わせるよりもマイコンのスペックで実現可能なものを実装する流れになるので定量的な要求は出さない
スケジュール
- BBM : ブレッドボードモデル,試作
- EM : エンジニアリングモデル,FM同等品なのでPM(プロトタイプモデル)寄りかも
(23代電装では省略したが,結果的にはFMを作り直したので一回目のFMがEM扱い) - FM : フライトモデル,本番用
基本設計
全体像
初期案からの変更点(独立したエアデータ電装部の構成は参考)
- テレメトリのためTWELITEを追加
- カメラを廃止
- SDカードをDue直結ではなくスプーリング用のXIAO経由に変更(詳細)
- GPSとTWELITEをセットにした基板を製作済みだったので,操舵角計測でRXを使っているポートのTXをSD用に使用し,これらのポートは115200bpsにした.
- RX側はGPSが460800bpsまでで操舵角が115200bps(頑張れば変更可),TX側はTWELITEが230400bpsまでで,SDにはなるべく早いボーレートを使いたい.このため本来はGPSとSD,操舵角とTWELITEの組み合わせが良い.
- エアデータ電装部・機体下電装部はSD書き込み以外のタスクもあるため460800bpsにしたが,SD書き込みのみは115200bpsで足りた.
癖のある設計はしてないつもりなので,要求から設計への落とし込みの根拠について特記事項のみ↓
- 各コンポートの必要性
- 機体下:超音波センサを機体下部に搭載する必要
- エアデータ:センサーを機体外部に搭載する必要
- ジョイスティック:アナログジョイスティックのすぐ近くに配置する必要
- 電源部:防水が必要な区画を最小限にするため独立
- スピーカー:聞きやすい位置に配置するため独立
- ラダー:垂直尾翼の機構にサーボのみ配置
- 無線ハブ:Arduino Dueのシールドのフットプリントに入らなかったので独立
- メイン:スペース的にどのコンポーネントにも統合できないので独立
- メインマイコンはArduino Due一択
- マイコンの駆動電圧は3.3V(センサーの制約)
- UARTがたくさんほしい
- 有名なArduino互換ボードでこれらを満たすのはDueのみ
- 選定時点でRaspberry Pi Picoはわりと新製品でDueしかなかった
- 他のマイコンは小さいのでSeeed Studio XIAO
- ラダーのサーボモーターは鳥科で代々使ってる近藤科学のKRS-4034HV ICS
- トルクについて定量的な要求を出すのは難しいが,前年これで不足しなかった
- 前年と同じアルミのサーボホーンが使えるため機構の設計が楽
- テールヘビーを避けるため軽量なものが良い
- ケーブルが長くなるのでPWMではなくシリアル通信が良い
- (まず無いけど)水平尾翼を電装制御したくなった場合でも,複数のサーボをデイジーチェーン接続できるので電装の設計変更が少ない
- ジョイスティック電装部と機体下電装部は搭載位置が近くても統合しない
- 操舵系はクリティカルなため余計な機能を混ぜない
- エアデータ電装部は有線接続(電源通信両方)
- メイン電装と独立させると楽だけど,
- パイロットにリアルタイムで対気速度を繋げたい
- 他と同期してデータを取りたい(GPS時刻を使うのもアリ)
- TWELITEはスループット,レイテンシともに不足
- 電装班の技術力的に通信は有線の方が安心
(Bluetooth/WiFiは経験が無かったから避けた) - 電源は独立でも良いが,通信は有線なのでまとめて有線
- メイン電装と独立させると楽だけど,
姿勢取得のためにカメラを搭載センサーデータを使うよりカメラ映像の方が確実
カメラから翼の上下がほとんど見えなかったので削除
- 電源設計
- サーボモータ用に3セルのLiPoバッテリーを搭載
- 火災防止のためサーボに過電流保護を挟んで供給,逆接保護は省略
- 電源はサーボ用のLiPoバッテリーのみで,ロガー系もこれから供給する
- それぞれのマイコンには独立した過電流保護を挟んで供給する
- ロガー系からの波及故障のリスクよりも,電源を分散させる手間の方が大きいと判断
- 舵角計測のため操舵系の信号線がロガー系に繋がっているため,電源を完全に分離してまで波及故障を防ぐのは意味がない
- 電源を分散させると,各機器の起動タイミングによる問題・各バッテリーの残量管理の手間・電源投入の手間が増える
- 姿勢モニタの受信側のデバイスはスマホのシリアルモニタ
- 液晶・7segを使うのは技術的にダルい
- スマホアプリの開発は面倒だけど,シリアルモニタならアプリがあるから楽
物理的な配置
メイン電装部には電装ハッチを用意- ジョイスティック電装部はパイロットが操作しやすい位置に
- 機体下電装部は超音波センサを湖面に垂直に向けることができれば場所は任意
- スピーカー部は場所は任意(音が聞こえるならメイン電装部に統合も可)
- エアデータ電装部は
コクピ上- 設計陣との調整で翼から生やすことになった
- 三面図提出時点で左翼に配置で確定
- 重量バランスはダミーウェイトで調整する(同じものを2つ作るのは非常に難易度が高く,UARTのポートも空いてない)
質量概算
コンポーネント | 寸法[mm] | 質量[g] | memo |
---|---|---|---|
メイン電装部 | 100×150×70 | 300~600 | Lipoが60g,Dueが60g,防水をちゃんとやると+300g |
エアデータ電装部 | あざみ野ぐらい | 40 | ピトー管含めた電装部品のみの質量,AoA・AoS無し |
機体下部電装部 | 50mm四方の基板一枚 | 20 | ロケットのノーズが20g |
ジョイスティック電装部 | 50mm四方の基板一枚+ジョイスティック | 30 | ジョイスティックのサイズに依存 |
ラダー部 | 43×32×33 | 60 | サーボモータのみ |
スピーカー部 | 直径50ぐらい | 50 | 音量を求めると重くなるかも |
詳細設計・製作
電装は作ってみないと設計が固まらないので詳細設計と製作はほぼ同じ.
とにかく要求を満たすものを作れれば良いので,手を動かしていろいろ試しつつ,設計の根拠はしっかり記録に残す.
全体
UARTフォーマット
桁が固定されていない小数をカンマ区切りで送信し,改行コードLF(\n)をつける. ボーレートは115200bpsとする. 通信速度が足りなかったので460800bps.
機体下電装部->メイン電装部気圧[hPa],温度[deg],気圧高度[m],超音波高度[m]
エアデータ電装部->メイン電装部気圧[hPa],温度[deg],気圧高度[m],差圧[Pa],対気速度[m/ss]
メインマイコンからは,SD用マイコン・機体下電装部・エアデータ電装部のmicro SDに保存する文字列を直接送信する.
SD用マイコンはデータを受信するだけで,舵角計測でRXを使っているUARTポートのTXを使うので115200bps.
コネクタ・ケーブル
- すべて手で圧着はせず,コネクタ付きのケーブルやアッセンブリワイヤーなどを使用する.
ケーブル同士の接続には基本的には半田スリーブを使用する.ただし芯線が細かったりヒートガンが使えない場所では,普通にはんだ付けして熱収縮チューブで保護する.
フラックスを使っても半田が芯線にのらなかったので(特に細いケーブル),半田付けは手で行うことにした.ただし,細いケーブルでも被膜にスリーブを固定できるのでホットメルト接着剤リングは有用だった.半田付けは手で行った上で半田スリーブを熱収縮チューブとして使用する.- 半田スリーブ(白)
- AWG26-24用らしいけど22までは使える
- コネクタ選定
どれも意外と挿抜回数は少ないので注意.- 汎用:JST-XHコネクタ
- 2,3,4,5ピンの在庫がある
- PAコネクタのほうが抜き挿ししやすいけど入手性が悪い
- 半田スリーブを使うと2.0mmピッチは狭い,XHは2.5mmピッチ
- XHアッセンブリワイヤー
- 中継:JST-SMコネクタ
- サーボの差し込み部分のコネクタ
- サーボ専用の端子はアッセンブリワイヤーがないから使わない
- サーボに付属する専用のケーブルを切って半田付けして接続する
- 汎用:JST-XHコネクタ
- ピン配置
短絡などの事故を防ぐため,電源とGNDは常に同じ位置に配置する.- 4P TORICA-UART
- 1 黒 GND シールド
- 2 赤 5V
- 3 緑 Due TX - XIAO RX DTXR
- 4 白 Due RX - XIAO TX DRXT
- 5P ICS-UART
- 1 黒 GND
- 2 赤 5V
- 3 緑 ICS TX - XIAO RX ITXR
- 4 白 ICS RX - XIAO TX IRXT
- 5 青 EN
- 4P JOYSTICK
- 1 黒 GND
- 2 赤 3.3V
- 3 緑 X
- 4 白 Y
- 4P サーボ
- 黒 GND
- 赤 LiPo VCC
- 白 ICS
- 青 シールド
- 4P TORICA-UART
- ケーブル
- シールドの扱い
- すべて静電シールドなので,電源に近い方側でシールドをGNDに接続する
- サーボケーブルも近くに他の信号線はないので,ノイズを漏らさない電磁シールドケーブルではなく周囲からのノイズを防ぐ静電シールドケーブル
- サーボ・電源用ケーブル
FA用300V電源・低速移動屈曲配線ケーブルシールド有- 3芯・シールドあり・AWG22(QIコネクタ,2550コネクタの最大)・3m以上
- 坂東電線 軟質マイクコード スーパーフレックス VSVC 3芯
- 3Aが流せるなかで一番細いAWG24に変更
- その他信号用ケーブル
- シールド付きスリムロボットケーブル
- ↑とモノタロウでまとめて買ってもいいけど千石でも売ってる
- シールドの扱い
ブートローダー小噺
Arduinoにはブートローダーというものがある.他にも役割があるが,PCと通信を行いフラッシュメモリにプログラムを書き込む役割を持つ.
- Arduino Due
- ブートローダーはチップ内蔵のROMに書かれていて,フラッシュメモリが消去されるとプログラムを書き込めるようになる.ROMなので破壊はされない.
- メインのマイコンがAT91SAM3X8Eで,Programming Portからの書き込みを担当するATmega16U2はAT91SAM3X8EのEraseピンとハードウェアで接続されているため,AT91SAM3X8Eがクラッシュしていてもフラッシュメモリを消去して書き込みを行うことができる.
- Programing PortはAT91SAM3X8EのUART0を使用するため,これとは別にNative Portからの書き込み方法も用意されている.これはAT91SAM3X8EのUSBポートを使用したものでソフトウェア的にフラッシュメモリを消去して書き込みを行う.AT91SAM3X8EがクラッシュしているとNative Portからの書き込みはできない.
- Seeed Studio XIAO RP2040
- RP2040のバイナリ書き込みはチップ内のROMに書かれていて,BOOTボタンを押して接続してuf2ファイルをアップロードする方式の書き込みを担う.
- arduino-picoを使用してBOOTボタンを押さずにArduino IDEからアップロードする方式に対応するブートローダーはチップ外付けのフラッシュに書き込まれ,これは破壊されうるがBOOTボタンを押した書き込みで復活できる.
- Seeed Studio XIAO SAMD21
- チップはSAMD21G18で,このフラッシュメモリにブートローダーが書かれている.USBからの書き込みはこれが壊れると他に手段はなくなる.ブートローダーの書き込み時にここを書き込み禁止に設定できるが,工場出荷時はこの設定がされていないらしい.
配列外参照をしたり割り込み関連で事故ったりするとブートローダーを含むフラッシュのプログラムが壊れるリスクがあり,XIAO SAMD21の場合はこれが回復不能なダメージとなる.
復活させる方法もあるが,かなり面倒なので同じフォームファクタのXIAO RP2040を使うことにした.
- (参考)メモリの種類
- ROM(Read Only Memory)
- 工場で書き込まれた後,ユーザーは書き換えられないメモリ
- パソコンで例えるとBIOSあたり
- RAM(Random Access Memory)
- マイコンが動作するために必要なメモリ
- パソコンで例えると16GBとかのメモリ
- フラッシュメモリ
- プログラムを書き込むためのメモリ
- パソコンで例えるとSSDとか
- ROM(Read Only Memory)
コンポーネントごと
電源部
- サーボの過電流保護
- リセッタブルヒューズを挟む
- 【ポリスイッチとは】ヒューズとの違いは?
- 普通のヒューズは交換が面倒
- トリップ電流(遮断しうる最小電流):6.0A > サーボの最大消費電流
- 遮断電流(瞬時に遮断する電流):40A
- 保持電流(遮断後に流れ続ける電流):3.0A
- 温度上昇でディレーティングしても(保持1.56A/トリップ3.12A@85℃)なのでセーフ
- 【ポリスイッチとは】ヒューズとの違いは?
- サーボの最大消費電流は3.1A
- リセッタブルヒューズを挟む
- 電源スイッチ
- サーボ無しでも200mA程度消費するので,なんらかの電源スイッチは必要
- サーボの最大負荷を想定し,12V5A定常的に流せる回路を作る
- 半導体スイッチを使うフライトピンは電気的に複雑になので不採用(参考)
- 電源スイッチはレバーロック式のトグルスイッチを使う
- 電圧電流計
- バッテリーの電圧監視のために電圧計DE-2645-02をつける
- 短絡,モータの過負荷が分かるように電流も測定できるものを選定
- 電源BOX
- バッテリー本体とヒューズのみを防水し,他は面倒なので対策しない(SDカードもOK)
- 防水にはロック付きのタッパーを使う
- 透明なのは必須
搭載するバッテリーはKypom K6 11.1V 2200mAh 35C70CEclatと同じ
軽量化のためKypom K6 11.1V 850mAh 35C70Cを搭載
- 以下のケーブルをケーブルグランドを使って出す
(どちらも同じ量の電流が流れる)- メイン電装に供給する電源ケーブル
- 電源スイッチにつなぐケーブル
- ケーブルグランドPG7
- 選定は適合ケーブル径だけ見れば基本OK
- 防水等級はIPX7で良い.IPX8はいらない.
- これの取付穴径(ドリルで開ける穴)は12.7mm
- ケーブルグランドつけてもコネクタのせいで結局取り外しはできないので,シーリング材で固定しても良い
- 今回は鳥科に在庫あって見た目もいいから採用
- ケーブルの長さの調整ができるのがややメリット?
- 選定は適合ケーブル径だけ見れば基本OK
- マイコンへの電源供給
- それぞれにM78AR05-0.5を使用
- 過電流保護を搭載(入力側にスパイクがないことを確認済み・自動復帰あり)
- 電源に近い部分に過電流保護を持たせるため,DCDCはメイン基板に搭載し5Vをケーブルで配電する
- 基本的にDCDCはM78ARシリーズがおすすめ
- (出力側からの逆流対策が甘いので改善が必要)
- コンデンサ配置
- Arduino Dueの回路図参考
- VINに47uFついてる.
- DCDCで5Vに落とす.VIN側に10uF,5.5V側に47uFついてる.
- 5Vからレギュレータで3.3Vに落とす.3.3V側に10uFついてる.
- GPSとスピーカーの消費電流が大きいので,5Vラインにコンデンサを外付けする.
- XIAOが載った基板にはコンデンサを外付けする.
- Arduino Dueの回路図参考
メイン電装部
ハードウェア
部品 | 個数 | 価格 |
---|---|---|
Arduino Due | 1 | 6,920 |
Seeeduino XIAO RP2040 | 1 | 830 |
マイクロSDカードスロットDIP化キット | 1 | 300 |
9軸センサ BNO055 | 1 | 2,450 |
気圧センサ DPS310 | 1 | 1,408 |
GPS(GT-902PMGG) | 1 | 2,480 |
M78AR05-0.5 | 3 | 480 |
整流ダイオード1N4007-B | 4 | 100 |
音声合成LSI ATP3012F6-PU | 1 | 1,100 |
セラミック発振子 CSTLS16M0X53-B0 | 1 | 35 |
TWELITE RED DIP | 1 | 3,030 |
アンテナ TWE-AN-D85 | 1 | 550 |
アンテナケーブル | 1 | 550 |
抵抗内蔵5mm青色LED | 1 | 200 |
トグルスイッチ 1回路2接点 | 1 | 90 |
トグルスイッチ 2回路2接点 | 1 | 100 |
- 気圧センサ
- 調べた限り気圧センサはDPS310が一番高精度
9軸センサ
- 姿勢計算までやってくれるのでBNO055を使う
- 加速度角速度磁気だけの場合はマイコン側でカルマンフィルタなりMadgwickフィルタなりを回す必要がある
GPS
- GPSはu-bloxが一番信頼できる
- GPSは受信RXだけ,TWELITEは送信TXだけのため,1つのUARTポートで処理を行える
micro SD
音声合成用スピーカー
- アンプつきスピーカー候補(可変抵抗による音量調整機能付き)
- 結局音量が足りなかったのでアンプとスピーカーをバラで購入
- PAM8012使用2ワットD級アンプモジュール 電源と信号いれてスピーカーに繋げるだけ
- スピーカーユニット 5cm 8Ω0.5W ネジ穴があり結束バンド固定が可能
TWELITE
スイッチ
- サーボの通信線と計測用のArduino Dueの間の接続をトラブル時に切れるようにトグルスイッチを使用する
- Programming Portとエアデータ電装部の通信を切れるようにトグルスイッチを使用する
- 万一パイロットが接触しても問題ないよう,トグルスイッチは機体後方に倒れる向きが通常となるようにする
ソフトウェア
SDカードの書き込みに時間がかかり,ダブルバッファを使って書き込むデータを管理してSD書き込み以外を割り込みで処理しようとしたが,起動から数分後にマイコンがハングアップする問題が解決できなかった.SDアクセス中もUART受信割り込みなどは動作しているはずで,SDカードアクセスに使用する割り込みとタイマ割り込みの優先度の問題やリソースの競合が原因と考えているが,ダブルバッファの実装が原因の可能性も否定はできず,デバッグに時間がかかりそうだったのでハードウェアの仕様変更により解決した.
[廃止]タイマ割り込みを使ったスケジューリング
- 用意するタイマ割り込み
- 100Hz
- 200Hz
- I2Cセンサーの計測
- I2C接続のセンサーとの通信は一連の送受信が高速に行われるためプリエンプションを認めない.
- プリエンプションを認めないため,優先度の高いタイマ割り込みで処理を行う.
- ISRの起動周期は100Hzとする.
- BNO055は通信時にデータを計測し,100Hzで取れる.
- DPS310は32Hzでデータを計測し,ISRで最新値を取得する.
- I2Cの速度はBNO055の最大の400kHzとする(DPS310はMHzクラス).
- UART送信
- 機体下部電装部・エアデータ電装部のmicro SD記録用のデータ送信はISRに合わせて100Hzで行う.
- UART接続のGPS・マイコン(機体下電装部・エアデータ電装部・ジョイスティック電装部)の受信
- UART受信データはマイコン内のバッファに貯まるため,プリエンプション(中断)されることを認める.
- I2Cセンサーの処理を優先させるため,そのISRより高い優先度にはしない.
- ISRの起動周期は
500Hz200Hzとする.500200の根拠は最大250の2倍(サンプリング定理の気持ち).ペリフェラルにはアクセスせずマイコン内の処理で完結するので500Hzの高速起動で問題ない(と思っていたが,micro SDへの書き込み量が増えるためデータ量は落とさないとダメだった).- UARTの受信周期は以下の通り
- ICS
250Hz100Hz - エアデータ電装部
100Hz32Hz - 機体下部電装部
100Hz32Hz - GPS 10Hz
- ICS
- UARTの受信周期は以下の通り
- SDへの書き込み
- SDカードへのアクセスは時間がかかるため,SPIをSDカード専用バスとする.
- SDカードへのアクセスはプリエンプションを認める.
- 優先度が低いためメインループで処理を行う.
- TWELITEでのダウンリンク
14Hzでダウンリンクを行う.(体感で読みやすい速度に調整)- 頻度が低いのでloop内で
millis()
を使ってタイミングを管理して4Hzで実行する.1 2 3 4 5 6
uint32_t now_time = millis(); static uint32_t last_time = 0; if (now_time - last_time >= FUNCTION_PERIOD) { last_time = now_time; some_function(); }
- 頻度が低いのでloop内で
- 割り込み含めてを全ての初期設定を終えたあと全データを一度だけダウンリンクする.
- ただしGPSはロックまで時間がかかるのでダウンリンクしない.
- 大量のデータを一度に送信するとマイコン側の処理が詰まるのである程度時間を分けてダウンリンクする必要がある.
- 音声合成IC
- 秋月商品ページ
- 音声合成ICとの通信はプリエンプションしても問題ないが,プリエンプションを認めないI2Cセンサーと独立させるためにI2C1に接続する.
- 通信で厳密なリアルタイム性を求めないことは音声合成ICのタイミングチャートで確認した.
- 優先度が低いためメインループで処理を行う.
- I2C関連
- I2C概要
- ArduinoでI2C
- I2Cの速度はICの最大の400kHzとする.
タスク名 | 起動周期 | 優先度 | 中断 | 概要 |
---|---|---|---|---|
ISR_100Hz() | 100Hz | 14 | 禁止 | メインマイコン内のセンサーデータ取得,機体下部電装部・エアデータ電装部・GPSからのデータ受信,機体下部電装部・エアデータ電装部へのSD保存文字列送信 |
ISR_200Hz() | 200Hz | 15 | 許可 | ジョイスティック電装部からのデータ受信 |
main_SD.flash() | — | loop() | 許可 | SDカードへの書き込み |
TWE_downlink() | 4Hz | loop() | 許可 | TWELITEへのダウンリンク |
callout_altitude() | TBD | loop() | 許可 | 高度の読み上げ |
- タイマ割り込み詳細
- 優先度含めた割り込みの設定,タイマ以外のセンサーなどの初期設定を全て終えてから割り込みをスタートさせる.
- タイマ割り込みにはDueTimerを使用した上で優先度を設定する.優先度は0(最高)~15(最低)で表される.
- TC1ブロックに含まれるTimer3をISR_100Hzに,Timer4をISR_200Hzに割り当てる.
DUEでは標準ではTC1のブロックは使用していないらしい 参照
- SysTick(delay()やmillis()に利用)の優先度(デフォルト15)の優先度をタイマ割り込みより高くする.
- ISR_100Hz()のTimer3の優先度を,ISR_200Hz()のTimer4の優先度より高くする.
- UARTの処理をISRで行うため,タイマの優先度をUART受信割り込み(優先度不明)より低くする.とりあえずめっちゃ低く.
- 優先度はNVIC_SetPriority()により設定する.TC3_IRQnはTC3のことではなく,Timer3のことである.参照
1 2 3 4 5
Timer3.attachInterrupt(ISR_100Hz).start(10000); Timer4.attachInterrupt(ISR_200Hz).start(5000); NVIC_SetPriority((IRQn_Type)SysTick_IRQn, 13); NVIC_SetPriority((IRQn_Type)TC3_IRQn, 14); NVIC_SetPriority((IRQn_Type)TC4_IRQn, 15);
- DueTimer
- 割り込みの優先度詳解
- データシート該当部
- Seeed Studio XIAO SAMD21もArduino Dueと同じARMアーキテクチャを採用したAtmel社のSAMシリーズのマイコンで,割り込みの設定はほぼ同じ.割り込みを管理するNVICはARMアーキテクチャに含まれるもので,ここで優先度を設定する.ただし割り込みの優先度の深さはXIAOの場合は4まで.
SDアクセスのスプーリング用にXIAO RP2040を追加して,エアデータ電装部・機体下電装部へと同様にUARTで保存する文字列を送信する仕様にした.
通常マルチタスクを行う場合,割り込みを用いて実行中のタスク切り替えて複数の処理を実行する.割り込みを使う場合,基本的には頻度の高いタスクに高い優先度を割り当てれば良く,レートモノトニックスケジューリングとなる.デッドラインが早い順に高い優先度を割り当てるEarliest Deadline First方式もあるが,この規模ではレートモノトニックスケジューリングの方がシンプルで制御しやすい.素のArduinoで限界の場合はFreeRTOSなどのRTOSを使うのも良いかもしれない.
今回はSDカードアクセス中にタイマ割り込みを使用したときマイコンがハングアップする問題が解決できなかった.このため割り込み無しのノンプリエンプティブマルチタスクを行った.ノンプリエンプティブマルチタスクではCPUを独占しないように各タスクの実行時間を最小限にしてタスクを早い周期で順番に実行することが必要である.当然だがdelay()
を使わずにmillis()
などの時間関数でスケジューリングを行う.UARTの送信は複数回に分けることで実行時間を短く分割できたが,SDカードアクセスには時間がかかり解決できなかったため,ハードウェアを変更した.
基本的には100Hzで各処理を行い,独自のスケジューリングが必要なものはloop()
から直接呼び出す.行儀は悪いが,data_マイコン名_センサー名_データ種類_単位
と命名規則は統一したうえでグローバル変数に格納する.
|
|
BNO055詳細
read_main_bno()
DPS310詳細
read_main_dps()
- Arduinoライブラリ
- データシート
- データレートとオーバーサンプリングの設定は以下の通り
- ここらへんを参考に,データレートと精度のちょうど良いバランスを決めた.
- 気圧と温度のデータレートは同じがいいらしい
- 温度は気圧に比べればそこまでの精度はいらない
1 2
dps.configurePressure(DPS310_32HZ, DPS310_16SAMPLES); dps.configureTemperature(DPS310_32HZ, DPS310_2SAMPLES);
- 気圧計算
UART受信
polling_UART()
- UARTは全て
polling_UART()
で読み出す. loop()
で高速でポーリングするよりfunc_100Hz()
内で10ms単位でまとめて読みだした方がスループットが高い.レイテンシは十分確保できる.- 操舵角度計測
- TORICA_ICSの
ics.read_Angle()
でサーボモーターへの指令値を取得する. - コマンドヘッダを検知し,ポジションデータの上位7ビットと下位7ビットを結合して指令値を計測する.(参考)
- サーボとの通信は100Hz以上の頻度で行われるため,
read_Angle()
はUART受信バッファを全て読み出すまで繰り返して最新値を返すようになっている.
- TORICA_ICSの
- 機体下電装部・エアデータ電装部
- TORICA_UARTの
UART_read()
で受信した値を取得する. - TORICA_UARTの使い方はREADME参照.内部実装は以下を参照.
- 死活監視はここで行う.
- TORICA_UARTの
- GPS
- 秋月商品ページ
- u-center
- 通信速度を115200bpsに
- データレートを10Hzに
- 時刻緯度経度高度が含まれるセンテンス(GGA)のみ出力
- コンフィグ保持
- GPSのQ&A
- u-center
- NMEAセンテンス選択
- Arduinoライブラリ
- UARTは全て
SD記録
send_SD()
データ種類に応じて10~100Hzで記録しようと考えていたが,100Hzでの記録は間に合わなかったので全てまとめて20Hzで記録する仕様にした.
[廃止]種類別
TYPE,経過時間[ms],値,値,…
GPS,経過時間[ms],hh,mm,ss.f,緯度[udeg],経度[udeg],アンテナ海抜高度[m]
PRESSURE,経過時間[ms],気圧[hPa],温度[deg],気圧高度[m]
IMU,経過時間[ms],X[m/ss],Y[m/ss],Z[m/ss],qW,qX,qY,qZ
RUDDER,経過時間[ms],角度
UNDER,経過時間[ms],気圧[hPa],温度[deg],気圧高度[m],超音波高度[m]
AIR,経過時間[ms],気圧[hPa],温度[deg],気圧高度[m],差圧[Pa],対気速度[m/ss]
20Hzで全データをするため,100Hzで実行される
send_SD()
の中で記録データを5回に分けてUARTに流す.保存する桁数に注意してフォーマット指定子を記述する.
- 必要な精度で記録されるように小数点以下の桁数を設定.
- GPS測位の有無に関わらずデータ量が変わらないようにリーディングゼロを設定.
テレメトリダウンリンク
TWE_downlink()
- 4秒に1回全データをダウンリンクする.
- TWELITEは一度に大量のデータを送信できないため,5回に分けてデータを送信する.
- 機体下電装部・エアデータ電装部は接続が途絶えても最後の値が残り続けるため,直近1秒でデータが受信できているかという死活監視の結果もダウンリンクする.
対地高度・対気速度読み上げ
- フライトフェーズ判断
determine_flight_phase()
以下のフェーズを判定する.PLATFORM プラホ上 TAKEOFF 発進中(超音波が測定範囲外or気圧高度の変化を検知) HIGH_LEVEL 水平飛行(離陸から3秒たったとき) MID_LEVEL 超音波センサの測定レンジ内(5m以下になったとき) LOW_LEVEL 1m以下,速度と高度を交互に読み上げ - 高度推定
calculate_altitude()
GNSSは信用できず,気圧は対地高度を直接測ることはできず,超音波は高い所では測定範囲外になる.高いところでは気圧高度を,低いところでは超音波高度を使うことで解決できそうだが,超音波高度にノイズがある(後にセンサーの故障と判明)ため単純に切り替えるだけではうまくいかなかったので以下のように実装した.- 3つの気圧センサーの中央値をとり,気圧高度を取得する.
MID_LEVEL
以下のフェーズで,気圧高度と超音波高度のオフセットを計算し,気圧高度から引いて対地高度を計算する.- オフセットについて4秒間の中央値を計算することで,超音波センサのノイズの影響を無くす.
- 超音波による補正は3秒かけて段階的に開始する.
- 合成音声読み上げ
callout_status()
- 基本的にピトー管の対気速度を読み上げる.
- 対地高度が1m下がるごとに,「コウド,ロクテンゼロ」などと読み上げる.
- 対地高度が1mを切ると対気速度と対地高度を交互に読み上げる.
- HILS(Hardware In the Loop Simulator)
実際の高度や速度を与えて電装の動作確認をすることはできない.
テストなしでコードを書くのは無理があり,テスト用のハードウェアを雑でいいので用意する.- HILSの仕様
- エアデータ電装部・機体下電装部のダミーデータをRaspberry Pi Picoを用いてメイン電装に送信する.
- 読み上げに使うセンサーデータのうち,メイン電装の気圧高度のみダミーデータを送ることは難しいが,3つのデータの中央値を取るためエアデータ電装部・機体下電装部の2つのデータで十分でSILS(Software In the Loop Simulator)は用意しない.
- 以下のようにダミーデータを変更してテストする.
- 水平飛び出し・ダイブの違い
- 気圧高度の正負の違い
- 気圧高度と超音波高度の食い違いの調整
- HILSの仕様
- フライトフェーズ判断
ジョイスティック電装部
ハードウェア
ジョイスティック候補(選定はパイロット)
可変抵抗を用いてニュートラル調整
- 抵抗値は10kΩ
- あまり小さいと消費電流が大きく,あまり大きいと誤差が大きくなる
- ジョイスティックに合わせて10kΩを選定
- 抵抗値は10kΩ
サーボとICS基板との接続
- UARTをICS変換基板で半二重通信に変換してサーボと通信する
- ICS基板の接続
- ICS変換基板自体は電源のためメイン電装基板に搭載
大電流を消費するため,サーボのあいてるコネクタにコンデンサを配置
部品 | 個数 | 価格 |
---|---|---|
KRS-4034HV ICS | 1 | 17,600 |
アルミローハイトサーボホーン | 1 | 1,100 |
ICS変換基板 | 1 | 1,980 |
Seeeduino XIAO RP2040 | 1 | 830 |
小型アナログジョイスティック | 1 | 528 |
ジョイスティック基板 | 1 | 319 |
可変抵抗 | 1 | 50 |
ソフトウェア
- サーボモータ
- ドキュメント
- KRS-4034HV ICSの「市販のマイコンボード,小型PCボードから制御する」を参考に
- Arduinoライブラリ
- Hardware Serialを使うのでライブラリはIcsClass_V210
- ライブラリの使い方
- ライブラリの詳細リファレンス
- 角度制御
- フライト時はジョイスティックを読んで
setPos()
で角度を指定するだけ
- フライト時はジョイスティックを読んで
- サーボ詳細設定(未実装)
- 以下の詳細設定をEEPROMに書き込んでおく.専用のプログラムを使ってサーボモータに対して一度書き込めば終わり.
- ストレッチ
- スピード
- パンチ
- デッドバンド
- レスポンス
- ダンピング
- プロテクション
- リミッタ
- 温度制限
- 電流制限
- フラグ
- 以下の詳細設定をEEPROMに書き込んでおく.専用のプログラムを使ってサーボモータに対して一度書き込めば終わり.
- ドキュメント
- ジョイスティックまわりの関数
stick_normalized()
でジョイスティックの値を-1~+1の小数として計測する.- ジョイスティックは可変抵抗の分圧でアナログ電圧が出力される仕組みで,
analogRead()
で測定できる. analogRead()
は念のためオーバーサンプリングすると良い.analogReadResolution(12);
の詳細はXIAOのwiki- XY二方向あるので,三角関数っぽい計算をして-1~+1の小数に変換する.
- ジョイスティックは可変抵抗の分圧でアナログ電圧が出力される仕組みで,
control_curve_deg()
で-1~+1を角度に変換する.- 不感帯やカーブはここで設定する.
- 中心では繊細に動かして端では大きく動かすようなカーブを設定するのがこの関数の役割.
read_offset_deg()
でニュートラル調整用の可変抵抗の値を読んでオフセット角度(トリム)を計測する.servo_write()
で角度とオフセットを足してサーボに送信する.
機体下部電装部
ハードウェア
部品 | 個数 | 価格 |
---|---|---|
Seeeduino XIAO RP2040 | 1 | 830 |
マイクロSDカードスロットDIP化キット | 1 | 300 |
超音波センサー URM37 V4.0 | 1 | 1,870 |
DPS310 | 1 | 1,408 |
ソフトウェア
[廃止]XIAO SAMD21での設計
- メインループで行う処理
- SDカードへの書き込み
- 書き込みに時間がかかるのでメインループ
- 超音波高度の取得
- 測定に時間がかかるのでメインループ
- SDカードの書き込みより早く測定できることはないのでメインループでOK
- SDカードへの書き込み
- 割り込みで行う処理(XIAOは割り込み一つ)
- メイン電装へのUART送信
- UARTフォーマットにのっとって,気圧・温度・気圧高度・超音波高度を送信する
センサーの測定レートはバラバラだがUART送信は100Hzで行う.それぞれのセンサーについて測定できたタイミングで値をグローバル変数に書き込み,ISR内で100Hzで送信する.- 処理時間がシビアなので,DPS310の32Hzの測定タイミングに合わせて送信する.グローバル変数を使うのは同じ.
- メイン電装からのUART受信
- 文字列を受信し,そのままmicro SDに書き込む.
- 文字列をバッファに入れるだけで,SDへの書き込み自体はメインループで行う.
- 気圧センサのデータ取得
- メインループで行うと測定レートが遅くなるので割り込み内で行う.
- 100Hzで最新の値を取れるわけではないので,最新値が取得できたときだけグローバル変数に書き込む.
- メイン電装へのUART送信
関数名 | 起動タイミング | 概要 |
---|---|---|
loop() | メインループ | 超音波高度の取得・SDカードへの書き込み |
ISR_100Hz() | 割り込み100Hz | メイン電装へのUART送受信・気圧センサのデータ取得 |
割り込みを下手にやると事故るので,RP2040のマルチコアをうまく使う.ただしvolatile
には注意.
- CORE0で行う処理(32Hz over)
- 気圧センサのデータ取得
- 32Hzで最新値が取得できる.
- 測定できたらグローバル変数に書き込む.
- メイン電装へのUART送信
- UARTフォーマットにのっとって,気圧・温度・気圧高度・超音波高度を送信する.
- DPS310の32Hzの測定タイミングに合わせて送信する.グローバル変数から測定データを取得する.
- メイン電装からのUART受信
- 文字列を受信し,そのままmicro SDに書き込む.
- SDカードへの書き込みも32Hzには収まることが確認できたのでCORE0のループで行う.
- 気圧センサのデータ取得
- CORE1で行う処理(超音波センサーに合わせて遅くてOK)
- 超音波高度の取得
- サンプルコード
- 測定に時間がかかるので別コアで処理する.
- そもそも測定距離に応じて測定時間が変化する.
- 自動で25Hz程度で測定されるが,TRIGにパルスを入力するとそれに関係なく測定を開始する.
- 測定エラー時は50000usが返ってくる.最大測定距離の500cmでは25000usが返ってくるのでこれを上限としてグローバル変数の測定結果に書き込む.
- 超音波高度の取得
関数名 | 起動タイミング | 概要 |
---|---|---|
loop() | CORE0のループ | 気圧センサのデータ取得・メイン電装へのUART送受信・SDカードへの書き込み |
loop1() | CORE1のループ | 超音波高度の取得 |
LED | 制御CORE | 点灯タイミング |
---|---|---|
白(独立3色合成) | CORE1 | 超音波測定トリガ送信中 |
赤(NeoPixel) | CORE0 | UART受信中 |
青(NeoPixel) | CORE0 | 気圧センサ通信中(32Hz) |
エアデータ電装部
ハードウェア
- 校正は非常に難しいため,以下の方法は選択肢から外した.校正済みの既製品が入手できるなら問題ない.
- 五孔ピトー管
- 風車
- 測定精度の観点だと超音波式風向風速計は性能が良いが,高価で空気抵抗が大きいことから除外した.
- 熱式風向風速計は応答速度が低く,屋内での風環境測定を想定した製品で飛行機向きではない.
- AoAはピッチ測定で代用し,風見鶏を付ければ校正なしで計測可能なAoSは加工面での製作難易度の高さから見送った.風見鶏を作る場合は応答性に注意.
以上の理由でピトー管のみで製作した.差圧センサはSensirionのSDPを使用する.公式でArduinoライブラリが用意されていて使いやすい.他にも温度補正の効くセンサーとしてHoneywell RSCシリーズがあり,これらはピトー管係数が1から大きく外れないと言われている.
製品 | 方式 | 振動 | ドリフト | チューブでの圧損 |
---|---|---|---|---|
Honeywell RSC | ダイヤフラム | 影響あり | あり | 影響なし |
Sensirion SDP | 流量 | 影響なし | なし | 影響あり |
方式と設計方針の選択肢
- ピトー管からチューブを伸ばして翼の安定した部分にダイヤフラム式のセンサを配置する
- ピトー管のそばに流量式のセンサを配置する
今回は流量式のセンサを使用する
- ドリフトの調整を省略できる
- チューブの圧損は設計で確定するが,フライト時の振動は想定しづらい
SDPの中のSDP810-500PAを採用
- ノイズに弱いアナログではなくI2C通信
- 125Paで14~15m/sなので,念のため500Paのレンジ
- 簡単に手半田可能なパッケージ
- SDP811はI2Cアドレスが違うだけ
CFRPのパイプに全部いれる
- 強度はいらないけど軽いパイプがほしい
- センサは(削れば)内径30mmに入る
- マイコン・気圧センサも30mmに入る
- もともと内径30mmだったけどCFRPのラインナップの都合で外径30mmに変更して基板とセンサを削った
- 露出する唯一の電装であり,テレビの映像として使われやすいので見た目はこだわったほうが良い
部品 | 個数 | 価格 |
---|---|---|
Seeeduino XIAO RP2040 | 1 | 830 |
マイクロSDカードスロットDIP化キット | 1 | 300 |
SDP810-500PA | 1 | 5,261 |
ピトー管 | 1 | 1,397 |
DPS310 | 1 | 1,408 |
CFRPパイプ | 1 | 4,264 |
ソフトウェア
[廃止]XIAO SAMD21での設計
SDカードに書き込み(数十ms)を行いつつ100HzレベルでUART通信を行うため,SDカード書き込み中にUART処理を割り込む必要がある.print()
の処理に割り込みが使用される関係で,素朴なタイマ割り込みルーチン内でprint()
を使うと問題が発生する(そしてXIAOで変なことするとブートローダーが壊れる).Arduino Dueと同様にタイマ割り込みの優先度を下げることで対応する.
- メインループで行う処理
- SDカードへの書き込み
- 書き込みに時間がかかるのでメインループ
- SDカードへの書き込み
- 割り込みで行う処理(XIAOは割り込み一つ)
- メイン電装からのUART受信
- 文字列を受信し,そのままmicro SDに書き込む.
- 文字列をバッファに入れるだけで,SDへの書き込み自体はメインループで行う.
- メイン電装へのUART送信
- UARTフォーマットにのっとって,気圧・温度・気圧高度・超音波高度を送信する
- センサーの測定レートはバラバラだがUART送信は100Hzで行う.それぞれのセンサーについて測定できたタイミングで値をグローバル変数に書き込み,ISR内で100Hzで送信する.
- 気圧センサのデータ取得
- メインループで行うと測定レートが遅くなるので割り込み内で行う.
- 100Hzで最新の値を取れるわけではないので,最新値が取得できたときだけグローバル変数に書き込む.
- 差圧センサのデータ取得
- メインループで行うと測定レートが遅くなるので割り込み内で行う.
- 100Hzでグローバル変数に書き込む.
- メイン電装からのUART受信
関数名 | 起動タイミング | 概要 |
---|---|---|
loop() | メインループ | SDカードへの書き込み |
ISR_100Hz() | 割り込み100Hz | (気圧センサが取得できたタイミングで)気圧センサのデータ取得・差圧センサのデータ取得・メイン電装へのUART送受信 |
- CORE0で行う処理(32Hz over)
- 気圧センサのデータ取得
- 32Hzで最新値が取得できる.
- 測定できたらグローバル変数に書き込む.
- 差圧センサのデータ取得
- データレートが十分高いので,DPS310の測定タイミングに合わせて測定を行う.
- 測定できたらグローバル変数に書き込む.
- メイン電装へのUART送信
- UARTフォーマットにのっとって,気圧・温度・気圧高度・差圧・対気速度を送信する.
- DPS310の32Hzの測定タイミングに合わせて送信する.グローバル変数から測定データを取得する.
- メイン電装からのUART受信
- 文字列を受信し,そのままmicro SDに書き込む.
- SDカードへの書き込みも32Hzには収まることが確認できたのでCORE0のループで行う.
- 気圧センサのデータ取得
関数名 | 起動タイミング | 概要 |
---|---|---|
loop() | CORE0のループ | 気圧センサのデータ取得・差圧センサのデータ取得・メイン電装へのUART送受信・SDカードへの書き込み |
LED | 制御CORE | 点灯タイミング |
---|---|---|
白(独立3色合成) | CORE0 | SD書き込み中(sd.flash のみ) |
赤(NeoPixel) | CORE0 | UART受信中(sd.add_str 含む) |
青(NeoPixel) | CORE0 | 気圧センサ通信中(32Hz) |
カメラ
~~部品 | 個数 | 価格~~ |
---|---|---|
メリット姿勢,翼のたわみ具合,垂直尾翼の角度などのデータが確実に取得できる
デメリットツルツルのカウルに突起ができる
配置の詳細
メイン電装部
緑のところのコクピフレームに固定する
- 他だとダメな理由
- 着水時にPに当たる可能性があって危ない(発泡に埋め込むのはメンテだるい)
- (パイプの隙間に配置)Pの腕とかで邪魔そう
- 重心調整で桁を動かすから邪魔
- 足で蹴られそう
- ハッチの邪魔
- ハッチの邪魔
- 他だとダメな理由
固定は桁ではなくフレーム側
- 他の電装がフレームにつくから
- サーボは胴体桁ではなくテール桁なので桁に電装があるメリットなし
- 詳細な固定方法は電装の実物ができてから検討
胴体桁の左右にバッテリー,メイン電装,GPSモジュールを分けて配置する
搭載スペース
- 左右160mm×上下方向60mm×前後300mm が左右で2つある
- 電装本体はこれより小さい(バッテリーGPS除いて60×30×120)
実際に取り付けた様子
- 板ごと取り外しできるのでメンテナンスしやすいが,重量はもったいない
- 板ごと取り外しできるのでメンテナンスしやすいが,重量はもったいない
サーボのケーブル
- 胴体桁部分は桁の外側を通す
- 桁の外側でコネクタを繋ぎ,テール桁に接続する
- コネクタは脱着のため外に出ていると良い
画像の左側が胴体桁,それに接合された右側がテール桁
- コネクタは脱着のため外に出ていると良い
- テール桁の側面に穴を開け,ケーブルを埋め込む
- サーボがテール桁に埋め込まれるからケーブルも埋め込む
ジョイスティック電装部
- ジョイスティックに近いフレームに結束バンドで固定
- 取り付け後もUSBケーブルがさせるような向きでマイコンを搭載した
スピーカー
- フレームに結束バンドで固定
機体下電装
- メイン電装部の画像の黄色の部分に配置する
- 後方だと蹴られる
- 高度取得のため機体の一番下に取り付けたいので桁や翼には配置したくない
- フレームではなくカウルに基板を固定する
- カウルに超音波センサ用の穴を開けてを埋め込みたい
- フレームにセンサを取り付けるとカウルの取付精度に制約が生じる
- 重量はケーブル含め50g程度なので問題ない
- カウルに中継ケーブルを這わせておき,カウルをフレームに取り付けたあと,青部分でフレームのケーブルと接続する
- カウルをフレームに取り付けてから基板を取り付けるのは,パイロットが乗る板やハッチと干渉するため困難
- テグスもここまで這わせてフレームに縛り付ければロスト対策もOK
エアデータ電装部
- 左BC間に固定する
- ABは理科大で先に接合しておくため,露出するちょうど良い接合部はBC間
- 基板を全てCFRPの内径30mmのチューブ内にまとめ,チューブの底面からケーブルを出す
- チューブを桁に固定する専用フランジを作り,チューブは専用フランジに予め固定しておく
- 桁同士を接続するフランジに追加工をすると強度が心配なので,専用のフランジを使用する
- 専用フランジと桁は養生テープで固定する(何周かすれば強度は十分)
カメラ
主翼桁の前の養生の発泡の上に埋め込む胴体桁軸上に配置したいフライト直前にアクセスできる位置に読売からNOGOが出ればダミーロードを載せられるようにカメラはケーブル繋がないので埋め込んでOK
テグスでロスト対策はする
製作のポイント
電装基礎知識
このブログの担当範囲は鳥人間の電装についてで,電子工作の技術はまた別のお話
- これ
- 有識者のTwitter
ソフトウェアの管理
- GitHub
- organizationはTORICA-23th
- コンポーネントごとにリポジトリを作る(ブランチ説明したくないしconflictさせたくない)
- どうせ引き継ぎはどこかで失敗するので23代だけのorganizationにした.
- 同じ理由でリポジトリはすべてPublic.
- GitHubの使い方
- 複数のマイコンで使用する自前ライブラリは全てTORICA_libで共有
- 丁寧にブランチ切ってプルリク飛ばしてレビューしてって体制が理想だけど,班員全員の作業を班長が見てるのでmainブランチに直push.
- organizationはTORICA-23th
基板設計
- 基板設計はKiCadを使う.
- KiCad ことはじめ
- 全体像はこれの10ページが分かりやすい
- KiCad 6.0 動画解説
- 基本的に動画解説の流れにそって進めればOK
- KiCad ことはじめ
- ソフトウェアと同じGitHubで管理する.
- リポジトリは分ける.
- Tips
- 参考:パッド寸法
- Arduinoシールド
- Arduino Dueは外形が同じなのでMegaのシールド(マイコンボードの拡張基板)のテンプレートが使える
- XIAO KiCadライブラリ
- シンボル自作方法
- フットプリント自作方法
- 基板外形
- 自動配線ツール
- KiCadのPCBエディタでパターンを引くのは機械任せにできる
- JLCPCB発注方法
- 寸法図など
基板実装
- はんだ付けに関しては↓を見ればOK
- 部品を両面に実装する場合などは部品を取り付ける順番に要注意
- 防塵・防水
- 金属・CFRPのカケラが基板に落ちて短絡するなどを防ぐ必要がある
- 樹脂によるポッティングは不可逆なので避けたい
- カプトンテープをペタペタ貼って保護する
- 防水のため防湿コーティング剤を使うのもありかも
テスト
時間が無く十分なテストはできなかった.
共通事項
- フライトまでバッテリーが持つ
- ロングラン試験
- 着水時に発煙・発火しない
- サーボモータ部分を短絡させ,発熱発火しないこと,短絡復帰後に動作することを確認する.
- フェールソフト
- 機体下部電装部のコネクタを引き抜いたうえで短絡させ,ログと操舵が動作し続けることを確認する.
- エアデータ電装部のコネクタを引き抜いたうえで短絡させ,ログと操舵が動作し続けることを確認する.
- 操舵系のみの電源供給ができることを確認する.
- SDを引き抜いても操舵が動作し続けることを確認する.
- メンテナンス性
- 機体を組んだ状態で電装の電源を起動できる
- 機体を組んだ状態で電装のプログラムを変更できる
- 機体下電装部・エアデータ電装部もUSBケーブルを伸ばしておくべきだったかも
- 耐候性
- 各コンポーネントを接続し,50℃以上30分以上の動作を確認する.リポバッテリーは防爆バックに,他は黒い紙で覆って直射日光に曝す.
- BBM,EMで水没試験を行う.
短絡故障はしないことが確認できた.波形はかなり歪む.
- 電気的制約
- 機体に取り付けた状態で,波形を確認する.
操舵
- 基本
- 操縦桿を動かし,ラダーを動かせる.
- 手でトルクをかけ,ラダーが動作することを確認する.
- その他の要件
- 可変抵抗を操作し,ニュートラルの位置を変更できる.
- 操舵系のみの電源供給,操舵系以外のみの電源供給の両方が選択可能である.
テレメトリ
- スマホでテレメトリを受信できることを確認する.
- 通信距離を確認する.
高度速度計
- ハッチを閉じたとき気圧高度の取得に影響がないことを確認する.
- ハッチを閉じたとき,気圧高度の中央値にスパイクが表れないことを確認する.
ロガー
- 全てのデータをタイムスタンプつきで記録できることを確認する.
- 着水時にデータをロストしない
- SDを抜いてデータがロストしないことを確認する.この試験はTBD回行う.
最終的な仕様
概要
全体像は基本設計から変更なし
実測重量
- メイン電装全体 670g
- 木の板 190g
- 基板類 280g
- 電源BOX 200g
- バッテリー 70g
- エアデータ電装部 170g
- CFRPの筒 123g
- ピトー管と差圧センサ 17g
- 基板 20g
- ケーブル 12g
- 機体下電装部 31g
- ジョイスティック電装部 20g
コンポーネント詳細
UARTのプルアップを忘れたので各基板にUARTのRXにプルアップ抵抗を違法建築した.
メイン基板
無線ハブ基板
テレメトリ受信機
ジョイスティック電装部
機体下部電装部
エアデータ電装部
運用
琵琶湖の持ち物
コクピに取り付け済みの部品
- 組み立て手順参照
翼に取り付け済みの部品
- エアデータ電装部用の翼内のケーブル
取り付けしていない部品
- 基板・ケーブル(青ダンボール)
- サーボ胴体桁ケーブル
- 機体下部電装部(超音波)
- フォーマット済みmicro SD取り付け済み
- 機体下電装部カウル中継ケーブル
- 機体下電装部SD保護スポンジ
- テグス
- 基板・ケーブル(青ダンボール)
エアデータ電装部(ピトー管)
- フォーマット済みmicro SD取り付け済み
- テグス取り付け済み
- ピトー管カバー
防爆バッグ LayLax GIGA TEC PSEリポ セーフティーバッグ
- リポバッテリーFM 850mAh(12.53V)
- リポバッテリーFM予備 850mAh(12.56V)
- リポバッテリー予備 2200mAh(12.51V)
- リポバッテリー予備 2200mAh(12.00V)
- 回収用ミニ防爆バッグ
交換部品(茶ダンボール大)
- サーボモータ予備
- ジョイスティック電装部予備基板
- ジョイスティック予備
- エアデータ電装部予備基板
- 差圧センサ・ピトー管予備
- 機体下電装部予備基板
- 機体下電装部SD保護スポンジ予備
- メイン電装部予備基板
- Arduino Due予備
- バッテリータッパー蓋予備
予備部品(茶ダンボール小)
- 電圧電流計予備
- リセッタブルヒューズ予備
- ラズピコ(HILS予備)
- デバッグ用ケーブルもろもろ
- 死んだ基板(部品取り)
- トグルスイッチ
ソフトウェア書き換えセット(ポリ袋)
- USB A-A延長ケーブル
- USB A-Cケーブル
- USB C-Cケーブル
- USB A-micro Bケーブル
- ラズピコ(HILS)
- デバッグ用スピーカー
線材予備(ポリ袋)
- SM5ピン
- SM4ピン
- サーボケーブル たくさん
- みじかいサーボ延長ケーブル
- シールド付スリムロボットケーブル4芯 3m × 2
- AWG22 耐熱ワイヤー 10本
- AWG24 耐熱ワイヤー 10本
- XHアッセンブリワイヤ各色10本
- 電源用VHケーブル
- エナメル線
その他(ポリ袋)
- マスキングテープ
- カプトンテープ 6mm幅
- カプトンテープ 15mm幅
- 結束バンド
- ビニールテープ
工具セット(ヒートガンダンボール)
- はんだごて FX-600
- はんだ
- ハンダ吸い取り器
- ハンダ吸い取り線
- フラックス
- ラジオペンチ
- ニッパー
- ワイヤーストリッパー
- ドライバー
- マステ
リポ充電セット
- 充電器の箱
- リポバッテリー充電器本体 G-FORCE GMD660P DC Charger G0344
- リポ用ケーブル(XT60-T型ディーンズコネクタ)
- 12V用ケーブル(XT60-ワニ口)
- USB PD 12V変換基板
- 12V2.0A ACアダプタ 変換DCジャック付き
- 充電器の箱
部物ポケットテスター
テレメトリ受信機 C-Cケーブルつき
AC100V延長コード
メイン電装防水カバー
私物
パソコン
- 全リポジトリclone済み・依存関係インストール済み
PC用バッテリー
オシロスコープ
- 本体(HDS272S)
- プローブ2本・テストリード2本
- テストピンケーブル2本・ジャンパー線2本
ポケットに入れるもの
- SDカードケース
- ポケットテスター
- マスキングテープ
- ミニ養生テープ
- ハサミ
全組・TF運用
6/4 全組
- エアデータ電装部の基板のハードウェア故障
- 前日まで動作していたエアデータ電装部が動作しなくなった.後日解析すると気圧センサーとの通信に失敗して停止していることが分かったが,根本原因の特定はできなかった.
- エアデータ電装部の取付時の馬(機体を乗せる台)との干渉
- 接合時は馬にB側の桁を乗せるので,C側に取り付けることにした.
6/11 全組
- エアデータ電装部のトラブルシュートができておらず,重心に関してはエアデータ電装部は左右バランスにしか影響しないので接続しなかった.
- スピーカーの信号線のノイズによる動作不良の可能性を潰すためにスピーカーとサーボを同時に動作させ,トラブルが発生しないことを確認した.
- サーボはひとまず動いたが,レンジ調整が必要だった.サーボをテール桁にエポで固定した後に調整する.
6/18 TF
- まだサーボの固定をしていなかったので垂直尾翼なし.
- 全データの取得を確認し,発進時の加速度等のデータを得た.
7/02 全組
- 垂直尾翼の動作,全データの取得を確認.
- このときは超音波センサ用の穴をカウルに開けていなかった.
7/09 TF
- 強風のため中止.
7/22 全組
- 超音波センサの問題が発覚した.
組み立て
各チェックボックスごとに写真を撮影すること!
テール桁事前準備
- サーボモータをテール桁に埋め込む.
- テール桁サーボケーブルを中子に通し,マステで仮止めする.
- 中継コネクタを引きながら,中子をテール桁に押し込む.
- サーボモータにコネクタをさし,テール桁に埋め込む.
- サーボをエポキシで固定する.
コクピ事前準備
- コクピフレームへの基板・ケーブル配置
以下のケーブルが取り付けられていることを確認する.- スピーカー
- スピーカー・スピーカーケーブル
- 操舵
- ジョイスティック(基板とフレームに板を挟んで接着剤でつけたうえでテグス固定)
- ジョイスティックアナログケーブル(両端XHコネクタだがピン配置が異なる)
- ジョイスティック電装部(基板とフレームに板を挟んで結束バンド固定)
- ジョイスティックICSケーブル
- エアデータ(コクピ内の配線は無し)
- 機体下
- 機体下電装部フレーム中継ケーブル
- スピーカー
- メイン電装部の組み立て
- 板の下から8個全てのネジの合いマークを見て緩みがないことを確認する.
- 無線ハブ基板とメイン電装部がケーブルで接続されていることを確認する.
- メイン電装部の取り付け
- 吊り具を使って電装の板をコクピフレームに固定する.可動域の中で一番前方に
- micro USBコネクタ2つに緩みがないことを確認する.
- コクピ内ケーブルをメイン電装部に接続する.
- 機体下電装部フレーム中継ケーブル
- ジョイスティックICSケーブル
- スピーカーケーブル
A翼B翼の接合
- 翼の接合
- (接合班)A翼とB翼を接合する.作業中,電装班はケーブルに負荷がかからないかチェックする.
- ケーブルの接続
- AとBの中継コネクタを接続する.
- 導通チェック
- ジャンパー線で片方のコネクタの2端子を接続し,もう片方のコネクタの該当端子をテスターで導通しているかチェックする.
- フタサット(翼の接合部を埋めるカバー)付け
- (翼班)フタサットを取り付ける.
—-↑ここまで理科大,↓ここから琵琶湖—-
電装の検品・バッテリー準備
- 緩みの確認
- 電装固定ネジ8箇所
- メインSD
- メイン電装コネクタ
- ジョイスティックコネクタ
- ジョイスティック電装部コネクタ
- バッテリー搭載
- バッテリーの電圧をテスターで測定し,12.5V以上であることを確認する.
- バッテリーのコネクタを接続し,タッパーに入れる.
- 動作確認
T字桁へのフレーム取り付け
- エアデータ電装部ケーブル
- Z翼のリブから出るエアデータ電装部のケーブルを翼の上に置く.
- (コクピ班)T字桁にフレームを吊り具で固定しする.
- エアデータ電装部のケーブルをメイン電装部に接続する.
- ケーブルの余った部分を養生テープでT字桁に固定する.
- サーボケーブル
- サーボケーブルをメイン電装部に接続する.
- カウル1を取り付ける.
- カウル2の穴にサーボケーブルを通す.
- カウル2を取り付ける.
- サーボケーブルを胴体桁に養生テープで仮止めする.
機体下電装部の接続
- カウルへの機体下電装部の取り付け
- 機体下電装部をカウルに取り付ける.
- 基板のネジ穴にテグスを結びつけ,テグスをカウルの前方にマステで仮止めする.
- [] 機体下電装部カウル中継ケーブルを接続し,コネクタをカウルの前方にマステで仮止めする.
- カウルの取り付け
- (コクピ班)カウルを取り付ける.
- 接続
- 機体下電装部カウル中継ケーブルと機体下電装部フレーム中継ケーブルを接続する.
- 機体下電装部のテグスをフレームに取り付ける.
エアデータ電装部の接続
- 翼の接合
- (接合班)A翼をコクピのZ翼に接合する.作業中,電装班はケーブルに負荷がかからないかチェックする.
- (接合班)B翼をC翼に接合する.作業中,電装班はケーブルに負荷がかからないかチェックする.
- ピトー管の取り付け
- (接合班)エアデータ電装部をフランジに取り付ける.筒の中心がリブの印に重なるような角度で取り付ける.
- ケーブルの接続
- AとZの中継コネクタを接続する.
- Bとピトー管の中継コネクタを接続する.
- 動作確認
- テレメトリ受信機を用意してから電源スイッチをONにし,エアデータ電装部と通信できていることを確認してから電源を切る.
- フタサット付け
- (翼班)フタサットを取り付ける.
尾翼の接続
- テール桁の接合
- (接合班)テール桁を接合する.
- ケーブルの接続
- テール桁の中継コネクタを接続する.
- 動作確認
- 電源スイッチをONにし,尾翼を操舵できることを確認して電源を切る.
(いつでも)動作確認
- 仮接続
- 動作確認用エアデータケーブルを用いて,Z翼の中継コネクタに直接ピトー管のケーブルを接続する.
- ピトー管の穴に付いているマスキングテープを剥がす.
- 動作確認用4P中継ケーブルを使用して,機体下電装部カウル中継ケーブルと機体下電装部フレーム中継ケーブルを接続する.
- 予備のサーボモータを接続する.
- 動作確認
- テレメトリ受信機をスマホに接続し,シリアルモニタで通信を開始する.
- メイン電装部の電源スイッチをONにする.
- 起動直後のダウンリンクデータが取得できていることを確認する.
- 超音波センサを手で遮り,スピーカーが鳴ることを確認する.
- 超音波センサから地面までの距離を変化させ,超音波高度が変化することを確認する.
- ピトー管に息を吹き込み,対気速度が変化することを確認する.
- ジョイスティックを動かし,サーボモータが適切に動作することを確認する.
- 取り外し
- 電源スイッチをOFFにする.
- 動作確認用エアデータケーブル,エアデータ電装部を取り外す.
- ピトー管カバーを付ける.
- 機体下電装部カウル中継ケーブル,機体下電装部を取り外す.
- 予備のサーボモータを取り外す.
トラブルシュートマニュアル
メイン電装の書き込み
Arduino DueはProgramming PortとNative Portの2つのUSBポートが存在する.マイコンがハングアップしているとNative Portからは書き込みができないが,Programming PortはSerial(エアデータ電装部に接続)と共通のポートを使用しているため,書き込み時はSerialには接続しないでおく必要がある.
あらかじめProgramming PortとNative Portの両方にUSBケーブルを接続しておき,必要であれば琵琶湖でもUSBケーブルを延長してPCから書き込みを行う.通常時はNative Portから書き込みを行い,問題が起きたときはエアデータ電装部のスイッチを切ってProgramming Portから書き込みを行う.
操舵系トラブル
以下のテストは全てメイン電装の電源を入れた状態で行う.
当日の運用・取得データ
シーケンス
7/29 フライト前日
時間 | 作業 |
---|---|
7:17 | トラックからテント物品積み下ろし |
8:05 | 全員トラック駐車場到着 |
8:21 | ブリーフィング |
8:33 | テント組立て班,機体積み下ろし班に分かれる |
8:35 | テント班,テントを持ってトラック駐車場出発 |
9:01 | テント到着,組立て開始 |
9:06 | 機体組到着 |
9:28 | 機体仮設置場所用意 |
9:35 | テントにトラック到着 |
9:47 | トラックから機体積み下ろし完了 |
10:12 | テント組立て完了 |
10:34 | テント配置完了,テントへ機体搬入開始 |
10:51 | 機体搬入完了 |
10:54 | 機体保持,コクピアセンブリ,翼チェック,電装検品開始 |
11:05 | 左AB倒れる |
11:10 | 讀賣インタビュー |
11:29 | 電装検品完了 |
11:32 | フレームのT字への取り付け完了 |
11:37 | 機体下電装部のカウルへの取り付け完了 |
11:40 | 昼休憩開始 |
12:00 | 昼休憩終了 |
12:02 | 機体後部カウル取り付け完了 |
12:37 | コクピ養生完了,主翼接合開始 |
13:28 | ピトー管取り付け完了 |
13:30 | 機体審査開始 |
13:46 | 機体審査完了,垂直動作確認開始 |
13:58 | 垂直動作確認完了 |
14:00 | 機体解体開始 |
14:38 | 機体解体完了 |
15:03 | 機体下電装ケーブルテグス接続完了 |
16:00 | 讀賣カメラ作業開始 |
16:59 | 夜間保持組ホテルへ移動開始 |
17:53 | 讀賣カメラ作業終了 |
18:42 | 電装班長撤収 |
7/30 フライト当日
フライト順は最後から3番目
時間 | 作業 |
---|---|
5:24 | 夜間保持組で機体組み立て開始 |
5:55 | T字配置完了(当日は湖岸に平行) |
6:14 | テール接合 |
6:19 | 水平取り付け |
6:40 | 左AB接合 |
7:32 | 組み立て完了,機体移動開始 |
8:27 | 電装班長機体前到着,もろもろテスト |
8:59 | 垂直サーボ付近銀シート取り付け完了 |
9:24 | ピトー管銀シート取り付け完了 |
12:56 | 桟橋へ移動開始 |
13:25 | 桟橋垂直尾翼チェック完了 |
14:06 | フライト |
14:19 | 機体回収作業開始 |
14:41 | フライトデータ確認 |
取得データ
メイン電装部・機体下電装部・エアデータ電装部について,基板が脱落することなく全て回収できた.micro SDカードのデータも全て回収できた.
- 対気速度はプラホ上でも手持ちの風速計に比べて0.5 ~ 0.8程度遅かった
- ロールピッチはオフセットが±1程度あるかも(一応補正済み)
- 高度全般
- 5mから降下する時の超音波高度がメイン気圧と機体下気圧と一致しているので,この2つは信用できそう.気圧高度は着水後が0mになるように初期値を12mに設定してグラフにした.離陸滑走時の気圧高度のノイズはダイヤフラムの振動が原因と考えられる.
- エアデータ気圧に関して,ピトー管で測定した動圧を引いた値と生の値の中間にメイン気圧と機体下気圧があるので信頼性が低い.ピトー管を取り付けた翼の穴から風が回り込んで動圧がかかり高度が下がること,翼がたわんで高度が上がることの両方が考えられ,その影響具合を評価できない.
- GPS高度はもともと信頼性が低いが,傾向は問題なかった.
- 気圧高度が時間経過とともに上昇した.
- フライト中は短いため分かりづらいが,フライト前のデータでは顕著だった.
- フライト直前にコクピの銀シートを外したため,コクピ内部の温度が上昇,気圧が低下していく傾向にあったのが原因と思われる.
- 全組は屋内で,屋外のテストフライトではカウルをつけなかったため問題が発覚しなかった.
- 気圧高度だけでなく気圧と温度の生データを保存したので解析が可能だった.(生データは必ず記録すること)
- 対策は難しそう.
- 早めに銀シートを外してコクピを暑い平衡状態にするとパイロットが大変.
- 気圧センサを外部に露出させると動圧がかかる.
- 超音波高度の問題
- 最終全組で超音波センサの外れ値問題に気づく.
- 単発の外れ値は問題ないようにソフトの対策は事前に行った.
- フライト当日に0m付近の値を連続して出力する問題に気づく.
- 湖岸移動中の動作確認で発覚し,平らな板としてPCを砂浜に置くと正常に動作したため,砂浜との相性問題の可能性が考えられた.
- 連続した外れ値の対策は,アクセスが容易なメイン電装部ではなく,カウルを取り外してアクセスする機体下電装部で行う必要があった.
- 水面では動作する可能性が0ではなく,フライトを遅延させる可能性があり,パイロットには高度計の値が信頼できない可能性を伝えたうえでデバッグはしなかった.
- 超音波の外れ値により発進判定が誤作動した.
- 外れ値が連続したため誤作動した.
- 偽陰性よりは偽陽性の方がマシなので,誤作動を強く防ぐロジックは組まなかった.
- そもそもソフトに頼らずパイロットによるスイッチ操作を実装するべきだった.
- 外れ値の原因はセンサーの特性ではなくハードウェアの故障だった.
- 事前にセンサーの特性を試験していれば,外れ値が故障だと判断できた.
- 事前の試験がなくても,予備基板で試験を行って問題が起きているFMと比較することはできたはず.
- 姿勢が乱れたときに高度測定ができなかったが,これはしょうがない.
- 最終全組で超音波センサの外れ値問題に気づく.
運用面の反省
悪かったこと
- 機体を組み立てるマニュアルは作っておいたが,テントから移動を開始しプラホから飛ぶまでのマニュアルが無かった.
- SDカードケース・LiPoの防爆バッグを回収班に渡すのを忘れた.
- 熱対策の具体的な方法を事前に考えていなかった.
- サーボモータ
- 唯一サーマルシャットダウン機能がある部品で,重点的に保護した.
- テール桁のサーボの前後の部分に氷をあて,タオルで巻いて養生テープで固定した.(移動5時間で3回交換)
- サーボ本体は結露を防ぐため氷はあてず,銀シートを巻いて直射日光が当たらないようにした.
- コクピ
- 銀シートをコクピ上に被せた
- エアデータ電装部
- 銀シートを被せた.
- サーボモータ
- GPSの測位状態をダウンリンクしていなかったため,電源を入れるコクピ保持の人に1PPSのLEDを見てもらう手間があった.
- 湖岸でインターネットが使えなかった.
- データシートはダウンロードできないし,このオンラインのページも見れない.
- 全リポジトリは最新にして,必要な資料はローカルに落とす.
- docomoとauが輻輳,SoftBankと楽天はヌルヌルで人力部門のサーバーアップもOKだったらしい.
- 読売の通信網にSoftBankがついてるので,SoftBankユーザーを把握しておくと良い.
- 予備のケーブルを作っておかなかった.
- 材料はあるから前日に気づいたら作れるし,当日に断線したら諦めて飛ばすし,まあいいかって気持ちだった.
- (予備を作ると予備を作ってないところが壊れるジンクス)
- 超音波センサーの保護カバーをつけておくべきだった.
- 今年は必須ではなかったが,雨だったら必須.
良かったこと
- Twitterで他チームの電装情報を見てサーボの熱対策ができた.
- Meisterさんのサーマルシャットダウンのツイート見てなかったら危なかった.
- LINEの自分だけのグループでシーケンスを記録した.
- ほぼマニュアルに沿って運用できた.
- 動作不良による"電装待ち"が無かった.
- 直さなくても飛べるバグ(今回は超音波の問題)なら見逃す判断も大事.
- ポケットに入るハサミと養生テープが便利だった.
- ポケットたくさんある空調服は神.
評価
サクセスクライテリア成否
操舵
サクセスレベル | 内容 | 成否 |
---|---|---|
Minimum | プラホ上のラダー動作チェックでGo | ✅ |
Full | 飛行中に操舵し,動画などで確認する | ✅ |
Advanced | 操舵角のデータを回収する | ✅ |
テレメトリ
サクセスレベル | 内容 | 成否 |
---|---|---|
Minimum | 組立て時やプラホ上での電装の動作確認に使用する | ✅ |
Full | プラットフォーム上で姿勢を確認する | ✅ |
Advanced | フライト中にテレメトリを受信する | ✅ |
高度速度計
サクセスレベル | 内容 | 成否 |
---|---|---|
Minimum | 飛行中に高度と速度を読み上げる | ✅ |
Full | 読み上げた高度と速度が異常な値でない | ❌ |
Advanced | 発進判定を正常に行う | ❌ |
ロガー
サクセスレベル | 内容 | 成否 |
---|---|---|
Minimum | 飛行中の一つ以上のデータを回収する | ✅ |
Full | 全ての種類の着水までの全データを回収する | ✅ |
Advanced | Fullを満たし,全てのデータが信頼できる値である | ❌ |
評価点
マネジメント系
- 設計の根拠が記録に残っているため,仕様変更のときに判断がしやすかった.
- 全組・TFで班長が不在のときがあったが,マニュアルに沿って運用できた.
ハードウェア系
- バスはRS-485やCANにする必要はなく,スター型のUARTで必要十分だった.
- インジケータLEDやテレメトリにより電装の状態が分かりデバッグがしやすかった.
- 機体回収時,メイン電装を外さずにSDカードだけ簡単に回収できる設計だった.
ソフトウェア系
- 定期的にリファクタリングしてコードの可読性を保った.
- 直pushしかしていないとはいえ,GitHub Desktopでdiffを確認してからコミットできるので便利だった.
- マイコンの種類がDueとXIAOで異なるが,同じSAMシリーズで割り込みの優先度設定が同じようにできた.
- 結局割り込みは使わずXIAOもRP2040に変えた.
- 来年は全てRP2040統一が良さそう.
反省点
マネジメント系
- テストを多く行うべきだった.
- 全組やTFなどの各タイミングに必要な最低限の機能を揃えるという意識になってしまったため,テストが十分にできなかった.
- センサー等,コンポーネント単位で早めにロングラン試験を行う.
- 部品を壊す可能性があるものも含めテストをEMで徹底的に行う.
- 長い時間が取れる全組・TFの機会を無駄にしない.
- 実機が一つしかないため,ソフトウェア開発で専有されてハードウェアのテストが十分行えなかった.
- EMとBBM,FMとEMなどの組み合わせで両方の作業を同時に行う.
- 可能であれば
TORICA_lib
のテストコードを書く,
- 全組やTFなどの各タイミングに必要な最低限の機能を揃えるという意識になってしまったため,テストが十分にできなかった.
- 新入生教育と電装製作の両立が難しかった.
- 一応来年の役割分担を見据えて仕事は振ったつもり.
- 超音波センサのトラブル対応に問題があった.
- 超音波の不具合に関して,外れ値を出すハードをソフトでどうにかするという発想しかなかった.
- あらゆるトラブルについて,それを抱えたま対処方法を考える人と根本原因を探る人を分けて対応するべき.
- 琵琶湖で緊急度の高いインシデントが起きたときも,インシデント管理と問題管理の人員を分ける.
ハードウェア系
- 超音波高度センサが故障した.
- 温度上昇による気圧高度変化を除き,サクセスクライテリア未達の原因は全てこれ.
- ハードウェアの故障だと判断して交換することができなかった.正常性バイアスもあるかも.
- センサーの特性試験を行うべきだった.
- 既製品より自分の組んだハード・ソフトの方が信用ならない経験ばかりだったので,既製品のテストの優先度が低く手が回らなかった.
- 事前に特性試験をしていれば外れ値を出すことが故障だと判断できたはず.
- そもそも測定レンジが足りるか精度が問題ないかの試験もデータシートを鵜呑みにせず行うべき.
- 機体下電装部を交換しづらい位置に配置してしまった.
- 画像の5より後方なら交換できた.
- コクピのイメージができていない時期に場所を決定したため,ハッチやパイロットの足との干渉を心配して避けてしまった.
- 徹底的にメンテナンス性を考えて設計を常に見直すべき.
- 重量がかさむ固定方法になってしまった.
- 電装班としてはかなり便利だったので,設計変更時はメンテナンスや運用の視点も忘れずに.
- 翼のケーブルのはんだ付けが職人技すぎる.
- 翼を馬においた状態で,リブから出たケーブルに半田付けするのが慣れてないと相当難しい.
- 半田スリーブに頼る予定だったが,あまり良い製品ではなかった.
- 翼内のケーブルなど高難度の半田付けはもっと練習を重ねるべき.
- ラダーのコントローラをよく選定したい.
- アナログ入力を読むためジョイスティックを使用したが,実際はアナログではなくPWMのような操舵を行った.
- 今回のジョイスティックは小さく操作が繊細で,フルスイングで振るならスイッチの方が適しているはず.
- メイン電装をRaspberry Pi Picoにするべき.
- 開発を始めた当時はラズピコがあまり普及しておらずArduino Dueの方が安定していると判断したが,今はもうOK.
- DueではUARTのポート数に余裕がなかったが,RP2040ではPIOでUARTを増やせる.
- Arduino Dueより小型化できる.
- 他のXIAO RP2040と同じチップなのでソフトウェアの移植が容易.
- デュアルコアが便利.
- DCDC周辺の回路が雑で,出力側からの逆流に対して脆弱.
- メイン電装との接続を切ってからUSBケーブルを繋ぐよう運用でカバーしてたので対策が必要.
- サーボモータの詳細設定作業が終わらなかった.
- トラブルが起きてもサーボを交換できないためテール桁に埋め込んだ後は作業を行わなかった.
- サーマルシャットダウンに関する設定もあるのでEEPROMの設定は変えておきたい.
- 今年はトラブルは起きていないが,部品の表面処理と半田の材質(鉛フリーかどうか)を合わせた方が良さそう.
- 基板にデカップリング・コンデンサをつけ忘れた.気づいたけど修正するのを忘れて発注してしまった.
- UARTのRX側にプルアップ抵抗をつけ忘れた.
ソフトウェア系
SDアクセス中に割り込みできるようにし,スケジューリングの自由度をあげたい.
部品のロングラン試験ができるコードを早く書く.
記録したcsvからグラフを生成するpythonコードを書く.
- データの確認を簡単にしてテストをしやすくする.
自力でライブラリを書かないことを目標にしたものの,TORICA_libがそれなりに難しい実装だった.
- 難しい部分をライブラリに押し込むことはできたが,結局低レイヤーの難しさは排除できなかった.
XIAOのブートローダーの仕様が致命的だった.
- FM製作後に気づいてしまった.BBM段階でソフトウェアを完成させることが非常に重要.
GPSモジュールから出力される対地速度を保存するべきだった.
- 今回は緯度経度から対地速度を計算した.
来年の方針
(無責任な老害が考えたことなので判断は現役に任せます)
似た部品を使うハイブリッドロケット電装の経験がありスムーズ(?)に開発できましたが,来年は以下のことを意識すると良いと思います.
- 設計は流用しつつ,今年の反省点を参考に改善する
- 流用できるとはいえ,設計の根拠まで理解して使用する
- BBM2回,EM1回,FM1回を作れるスケジュールで動く
- 経験値をつけるためには手を動かして失敗するしかない
- 役割分担を明確にする
- ハードからソフトまでやることが多く,幸い班員も多いので分担できる
- 各担当にそれぞれの責任を果たせている感覚を持ってもらう
- 真に人海戦術ができる場合を除き,基本的に一つの仕事は一人でやる
(相互にレビューはするべき) - 誰かの仕事を待っている人は,明確に休み期間にするor別の仕事をはっきり割り当てる
- 真に人海戦術ができる場合を除き,基本的に一つの仕事は一人でやる
教育・役割分担
一年で全領域を一人でマスターするのは厳しいので役割分担をした方が良さそう.基本的には以下のような役割分担で進める.サーボモータ・超音波センサ・電源回路など,狭いスコープを徹底的に詰める人が他にいてもいいかも.
- マネジメント
- 全体の進捗管理,設計のレビュー,テストケースの作成を行う
要求を満たすものを期日までに完成させるのがマネージャーの目標 - マネージャーはソフトウェアのスキルを持っているとうまく回るはず
最後にソフトウェアが詳細な仕様を決定するので(諸説)
- 全体の進捗管理,設計のレビュー,テストケースの作成を行う
- ソフトウェア開発・回路設計
- ブレッドボードでの試作,KiCad上での回路図作成,ソフトウェア開発を行う
- 組み込みソフトなので回路設計とソフトウェアは分担しない
当然ここが一番キツい仕事
- ハードウェア設計
- 設計済みの回路図からKiCadで基板設計を行う
- 他の班と調整し,基板の形状や搭載方法の設計も行う
- ハードウェア製作
- はんだ付けなど全てのハードウェアの組立てを行う
- ただの単純作業ではなく,品質を担保するためには高度な技術が必要
- テスト
- 製作側は手一杯になるので,別の人が念入りにテストを行う
- センサーのテストを通してソフト回路全般の知識をつける
スケジュール
電装は製作物が一点物で単純作業が無く,教えながら作業するのがまず不可能.
4月以降は新入生教育に専念できるように3月にはロールアウトできるスケジュールを目指す.
(今年のガントチャートは何をやるか,この来年のガントチャートは誰がやるかで区切ってます)
回路設計 新部品BBM回路・ソフト :compo , 2023-09-01,2023-10-01 統合BBMの回路設計 :bbm , 2023-09-01,2023-11-01 BBMでソフト開発 :em2 , 2023-10-01,2023-12-01 EMの回路設計 :em , 2023-11-01,2023-11-14 EMでソフト開発 :em2 , 2023-12-21,2024-03-01 FMの回路設計 :fm , 2024-02-01,2024-02-14 FMでソフト開発 :fm2 , 2024-03-14,2024-04-14 section ハード設計 基板の搭載方法については適宜設計陣と調整 :hw , 2023-09-02,2023-09-01 Lチカ基板設計 :pcb , 2023-09-01,2023-10-01 マイコン練習用基板設計 :pcb2 , 2023-10-01,2023-11-01 EM基板設計 :em , 2023-11-14,2023-12-01 搭載位置・方法確定 :hw2 , 2023-12-01,2024-01-01 FM基板設計 :fm , 2024-02-14,2024-03-01 section ハード製作 ケーブルはんだ付け箇所試作 :cable , 2023-09-01,2023-10-01 Lチカ基板実装 :pcb , 2023-10-07,2023-10-14 センサー単体テスト用基板作成 : unit , 2023-10-14,2023-11-01 マイコン練習用基板実装 :pcb2 , 2023-11-07,2023-11-14 EMケーブル作製 :em , 2023-11-14,2023-12-01 EM基板実装 :em , 2023-12-14,2023-12-21 FMケーブル作製 :fm , 2024-02-14,2024-03-01 FM基板実装 :fm , 2024-03-07,2024-03-14 section テスト センサーのみの回路ソフトの理解 : learn , 2023-09-01,2023-11-01 センサー単体テスト : unit , 2023-11-01,2023-12-01 BBM統合テスト : bbm , 2023-12-01,2024-01-01 EM統合テスト : em , 2024-02-01,2024-03-01 FM統合テスト : fm , 2024-04-14,2024-05-14
参考資料
電装系の資料は無限にあるので,鳥コンの電装の資料のみ
- Avionics for HPA 人力飛行機の電装系の製作日誌 Team’F’の電装の方のブログ
- Interface 2023年2月号~ 連載 舞いあがれ人力飛行機 ↑と同じ方の連載
さいごに
嬉しいよね