Upgrade to Pro — share decks privately, control downloads, hide ads and more …

セキュリティ・キャンプ全国大会2024 S17 探査機自作ゼミ 事前学習・当日資料

sksat
August 12, 2024

セキュリティ・キャンプ全国大会2024 S17 探査機自作ゼミ 事前学習・当日資料

セキュリティ・キャンプ全国大会2024 開発コースで開講した「探査機自作ゼミ」の事前学習と当日に使った資料です。
ゼミ概要:https://www.ipa.go.jp/jinzai/security-camp/2024/camp/zenkoku/program/kaihatsu.html#s17

sksat

August 12, 2024
Tweet

More Decks by sksat

Other Decks in Education

Transcript

  1. 講師自己紹介 ・sksat(えすけーさっと) ・ArkEdge Space Inc. コンピューティング基盤部 / 筑波大学情報科学類(休学中) ・宇宙オタク -> パソコンオタク ->

    宇宙パソコン野郎 ・やってた: OS、x86エミュレータ、数値計算、小型ハイブリッドロケット、自宅サーバ ・やってる: (超小型人工衛星の)OS/Framework、シミュレーション基盤、CI/CD、姿勢制御系、社内システム ・趣味: 自宅サーバのオーバーエンジニアリング、VRChat ・気持ちがあるところ: 実在する複雑性の咀嚼と妥当な対処の案組み ↖これ中指じゃないです
  2. 注意事項: このゼミでの sksat のふるまい ・sksat は立場上は「講師」ですが、別に偉い人ではありません ・sksat は「答えを知っている人」ではありません(「答え」はまだ存在しないかもしれません!) ・sksat は以下のようにふるまいます

    ・セキュリティ・キャンプ2024の講師: ゼミとしての連絡や、当日の物品の用意などをします。 ・調整相手: 親機や地上局ハードウェアの担当者です。 ・探査機のハードウェア開発の主担当: 時間などの都合上 HW はある程度準備しています。 ・便利な経験者: 宇宙開発や組み込み Rust の経験者です。叩くと便利な情報が出がちです。 ・座学的な話をする時もどちらかというとこのふるまいと思ってください
  3. 開発の準備 ・GitHub organization ・要確認: みなさん GitHub 使えますか?(規約など的に) ・Rust 開発環境 ・rustup

    ・VSCode ・エディタの強制はしません(なんなら僕も普段は Neovim です) ・それはそれとして最近はかなり便利なので、知っておくと手札が増えます
  4. 宇宙機の開発スタイル ・BBM(Bread Board Model):初期段階の試作 ・EM(Engineering Model):詳細は詰め切っていないが実機と同等の仕様の試作 ・FM(Flight Model):実際に飛ばすやつ ・BBM ->

    EM -> FM と開発を進める ・必ずしもこの通りではない(PM とか PFM とか EFM とかも出てくる) ・規模が大きくとも(大きいからこそ)試作してみないとわからない、という性質が色濃く出ている ・(なお、予算や開発期間の都合で圧縮されることもよくある)
  5. 今回の HW 設計:要件定義 ・安価 ・組み立てが容易 ・再現性の確保 ・拡張性の確保 ・ローバーとして駆動できる ・サンプル採取のための機構 ・無線通信できる

    ・時系列データを保存できるストレージ ・Embedded Rust がこなれているマイコン ・事前学習期間中ははんだ付け不要 ・sksat が隙間時間で選定、設計できる(重要) sksat:HW 主担当ロール
  6. 今回の HW 設計:技術選定 ・ローバー部分: 楽しい工作シリーズ No.1 クローラタイプ ・電源: 乾電池 ・マイコン:

    Raspberry Pi Pico(RP2040) ・センサ: 超音波、加速度、温湿度、照度、赤外線、カメラ ・無線通信: TWE-Lite(特小2.4GHz) ・データ保存: MicroSD ・基本的に DIP 部品のみ ・プリント基板(ピンソケット付けまくる、GPIO, i2c 引き出せる) sksat:HW 主担当ロール
  7. 今回の HW 設計:基本設計 ・タミヤのクローラタイプを流用 ・二層化する  ・メイン層: ・ローバ駆動系 ・データハンドリング(保存・送信)系  ・ミッション層 ・アーム系

    ・センサ系 タミヤの板 メイン基板 タミヤの板 進行方向 ギヤボックス ギヤボックス 超音波 (距離計測) 電池ボックス カメラ 赤外線 micro SD TWE- Lite 無線通信(2.4GHz) モータ ドライバ Pico sksat:HW 主担当ロール
  8. 今回の HW 開発状況(2024/06/15) ・メイン基板 ・成立性確認用基板:開発完了 -> 基板の分割・2層構造の設計に確定 (+ sksat の基板設計能力習得) ・部品選定:完了

    ・EM:開発完了(送付予定) ・FM:開発中(キャンプ当日使用) ・ミッション基板 ・部品選定:ほぼ完了(気持ちがあればまだ変えられる) ・EFM:開発中(キャンプ当日使用) ・to SW チーム:事前学習期間中の SW 開発は BBM でお願いします sksat:HW 主担当ロール
  9. 今回の HW 設計:メイン基板 ・電源 ・乾電池 ・主電源とモータ電源のポートは分割 ・マイコン:Raspberry Pi Pico ・モータドライバ:DRV8833(2個)

    ・左右輪用とアーム用 ・無線通信機:TWE-Lite(特定省電力無線 2.4 GHz) ・親機接続ピン ・接続検出ピン ・拡張用2ピン sksat:HW 主担当ロール ・GPIO 引き出し用ピンソケット:BBM 的にも使用可能 ・ミッション基板間接続:UART ・i2c 引き出し用ピンソケット:拡張性のため ・超音波距離計:HC-SR04 ・ストレージ:microSD ・9軸センサ:BNO055 ・照度センサ:(3個)
  10. 今回の HW 設計:ミッション基板 ・電源:乾電池 ・マイコン:Raspberry Pi Pico もしくは Seeduino XIAO

    RP2040(小型化のため検討中) ・メイン基板間接続:UART ・カメラ:選定中 ・赤外線アレイセンサ:AMMG8833 Grid-EYE ・温湿度センサ:DHT20 ・地磁気センサ:AE-BM1422AGMV ・サンプルアーム用測距センサ:GP2Y0A21YK sksat:HW 主担当ロール
  11. 今回の HW 設計:論理的接続 sksat:HW 主担当ロール メイン基板 ミッション基板 モータドライバ モータドライバ 超音波距離計

    9軸センサ 無線機 microSD UART UART SPI I2C センサ類 I2C カメラ SPI 無線機 地上局 UART 無線(2.4GHz)
  12. ソフトウェアの柔軟性 ・ソフトウェアはレイヤー構造 ・重要な性質:インターフェースが同じであれば同じように扱える ・ex: 標準入出力やファイルは Windows でも macOS でも Linux

    でも同様に使える ・今回の場合、Rust で書いたロジックは実機にも移植できる(embedded Rust) ・no_std 対応なものであればライブラリも結構使える 移植 このインターフェースが 揃っていれば移植できる!!!
  13. 普通のOSが無い、という不便さ ・たとえば、今回使う Raspberry Pi Pico ・RAM は 264KB、フラッシュメモリは2MB ・Windows などは動かない!!!(そもそもメモリに載らない)

    ・OS がやってくれていたことを自分でやる必要がある(or スペック的にできない) ・メモリ管理、HW の直接操作、...etc ・例えば「標準出力に “Hello, World!” と出力する」とかができない ・まずターミナルアプリが無い(画面も無い)
  14. まずはLチカ ・Hello, World! できないならまず何をするのか ・LED をチカチカさせる ・Wokwi: https://wokwi.com/projects/401288015258586113 ・まずは Arduino(マイコン用フレームワーク)でやってみる

    ・言語としてはほぼC言語※1 ※1: 正確には勝手に Arduino.h が include される C++ だが、少なくとも初期設定は C++03 がちだし ちょっとヘンなC言語、ぐらいに思っておくのがちょうどよい
  15. Lチカに必要なこと ・光らせる時:LED に電気が突っ込まれている ・消す時:LED に電気が突っ込まれていない ・↑の2つの状態を繰り返す(これでチカチカする) ・↑の2状態の間で待ち時間を設ける(Arduino では delay() が使えます)

    ・マイコンとはいっても人間に知覚不可能なレベルで高速に動作している(133MHz) →待ち時間を入れないと爆速でチカチカして人間が点滅を知覚できない(光り続けているように見える)
  16. 結局何をやったのか? ・HIGH とか LOW とかってなに? ・ピンの電圧を設定した(HIGH:3.3V、LOW:0V) ・”HIGH” が何Vかはマイコンが何Vで動作しているかによる(ラズピコは3.3V) ・HIGH と

    LOW の2値が設定できるので、”digitalWrite” ・察せられること1:digital があるなら analog もあるのでは? ・察せられること2:Write があるなら Read もあるのでは?
  17. デジタル信号 ・HIGH と LOW の2値があると書いたが、世界はそんなに綺麗ではない ・実際は「だいたい3.3V」「だいたい0V」みたいなかんじになる ・もし完璧な HIGH と LOW

    を出せても、切り替わる瞬間は中途半端な電圧になる ・実際はしきい値を決めて「~Vより高いと HIGH」「~Vより低いと LOW」と定義する ・2値を定義できた → どちらかを1、どちらかを0とすると2進数として扱える → digitalWrite() して別のマイコンで digitalRead() したら2進数として情報を送ることができる!!! José Luis Gálvez - Dibujo propio (Own drawing), CC 表示-継承 3.0
  18. シリアル通信とパラレル通信 ・シリアル通信:1本の線で1bit ずつピコピコ送って読む ・実装がシンプル、配線数が少なくて済む ・SATA、UART、SPI、I2C など ・パラレル通信:1本の線で1bit が表現できるならN本線を並べたら Nbit 表現できるじゃん

    ・配線数は多くなるが一度にたくさんデータを送ることができる ・CPU の内部バス、ATA、PCI など FPGA入門ブログ ~初心者がSPI通信を設計してみた ~その1~ - 半導体事業 - マクニカ より引用
  19. UART ・2本の線をそれぞれピコピコして通信する規格(シリアル通信) ・1対1での通信 ・送信側が TX※1、受信側が RX ・ピコピコする部分は UART コントローラがやってくれる ・使うときに2進数をガチャガチャやる必要は無い

    ・よく文字列の送受信に使われる ・デバッグに便利 ※1:つくばエクスプレスのことではない 画像は Reverse engineering UART to gain shell | by Shubham Golam | Medium より引用
  20. Arduino ってなんなん ・「全部自分でやらないといけない」割には簡単では? ・Arduino は簡単なモノを簡単(easy)に作るためのフレームワーク ・今回みたいな入門や、雑な試作にはよい ・裏側で何やってるかわからない(気になったら読んでみよう) ・性能を出せない(Arduino core やライブラリの実装のパフォーマンスは大抵かなり低い)

    ・C言語:効率のよい/安全性の高い抽象化ができない、ライブラリを使い回しにくい ・このゼミの主題は「組み込み Rust をやること」ではないので、適宜使って OK(Arduino に限らず) ・Rust だとこういうこともできるよ(+ Cだとこれはできないよ)、みたいな話は適宜します
  21. 組み込み Rust ・Rust の利便性:rustup で一発で環境構築、cargo で一発でビルドとパッケージ管理 ・Rust のエコシステム:no_std な crate、ドキュメントの自動生成、組み込みコミュニティ

    (embedded-hal など) ・所有権:「どのメモリを誰が持っているか」を厳密にコンパイラがチェックしてくれる ・強い静的型 ・Option 型や Result 型:「エラーの時は -1 を返す」とはおさらば ・代数的データ型:「複数種類の型/関数を void* で抽象化」とはおさらば ・ゼロコスト抽象化:↑のようなコードにも最適化が効く ・相互運用性:C言語のライブラリを持ってきてくっつけられる
  22. 組み込み Rust のはじめかた ・ラズピコ + wokwi + Rust のテンプレ: sksat/pico-wokwi-playground/hello-blinky-rs

    ・たぶん、Arduino より行数が多くてギョッとするはず ・これは Arduino(core)が裏で勝手にやっていたことが少し表に出てきているから ・もちろん大半はライブラリの中にある → 重要なので裏側に隠しすぎたらよくないところ ・ライブラリのリポジトリの example(rp-pico)を見ながらガチャガチャ弄ってみよう ・ライブラリのドキュメント(rp2040-hal など)やデータシート(ラズピコ、RP2040)を見てみよう ・The Embedded Rust Book を見てみよう ・sksat や他のゼミの講師に聞いてみよう(#rust でもいいかも)
  23. レンタル品 ・Raspberry Pi 3B ・Raspberry Pi 3B 電源 ・ブレッドボード(小) ラズパイは

    GPIO が生えてる便利な Linux マシンとして自由に使ってください(ex: 地上局)
  24. main board 超音波センサ 照度センサ (接続先) モータ (接続先) モータドライバ (接続先) 主電源

    (接続先) モータ電源 (接続先) ラズピコ (接続先) リセットスイッチ BNO055 (接続先) microSD スロット (接続先) 親機接続ピン 無線機 (接続先) mission board 接続 詳しい接続は 回路図などを参照
  25. UART 出力を見たい ・見たい!!! ・現代の PC にはシリアルポートが生えてない(残念!) ・UART は UART なので、直接

    PC からやりとりできない!!! ・Raspberry Pi 3B は直接やりとりできるので便利 ・でも PC から見たい -> USB シリアル変換基板を使う ・PC から直接シリアルデバイスとして見えるようになる ・Windows の場合:COM ポートとして見える ・Linux などの場合:デバイスファイル(ex: /dev/ttyUSB0)として見える
  26. ・必要な物:Pico、USBシリアル変換、ジャンパワイヤ(メス-メス) ・TX と RX を配線する ・USB シリアル変換を PC に繋ぐ UART

    出力を見る TX RX やってみよう   ・出力が見えている状態でそれぞれの線を抜き刺し   ・入力
  27. 講師自己紹介 ・sksat(えすけーさっと) ・ArkEdge Space Inc. コンピューティング基盤部 / 筑波大学情報科学類(休学中) ・宇宙オタク -> パソコンオタク ->

    宇宙パソコン野郎 ・やってた: OS、x86エミュレータ、数値計算、小型ハイブリッドロケット、自宅サーバ ・やってる: (超小型人工衛星の)OS/Framework、シミュレーション基盤、CI/CD、姿勢制御系、社内システム ・趣味: 自宅サーバのオーバーエンジニアリング、VRChat ・気持ちがあるところ: 実在する複雑性の咀嚼と妥当な対処の案組み ↖これ中指じゃないです
  28. 気付いていること・理解していること Unknown Unknowns 知らないことを知らない Known Unknown 知らないと知っている Unknown Knowns 知っていると知らない

    Known Knowns 知っていると知っている 理解している 気 付 い て い る どんどん気付く どんどん知る
  29. シンプルに作る ・複雑な目的や状況 -> すぐに解決も複雑になる ・「アレをああしてこうするとコレもソレもできる!!!」 ・それって結局なにをどう解決してるんだっけ? ・最適化の法則:「まだするな!」 ・認知負荷が大きい -> コンテキストスイッチのコストが大きくなる

    ・ex: 次の日、別の人に託す、「次」のイテレーション、開発 -> 運用 のときに困る ・複雑なことも、まずはじめはシンプルに ・ex: ブレッドボードでやる、ユニットテスト、 Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet.
  30. 「やること」は DAG ・「やること」は1次元のリストではない!!! ・それぞれに依存関係がある ・依存が被らない実行経路が発生する/作ることができる →複数人で並列実行できる ・ex: B->C と B->D

    は同時にできる ・実行中にノードや依存関係を増やすこともできる(タスクの分割/解像度が上がった) ・並列度の高いタスク分割ができると、チームの「実行効率」を高められる ・こういうグラフに所要時間を描くアローダイアグラム(PRET 図)というものもある