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

スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜

Avatar for Atsuki Seo Atsuki Seo
September 13, 2026

スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜

iOSDC Japan 2026 登壇時の資料になります。

https://fortee.jp/iosdc-japan-2026/proposal/bf3c97ef-0a92-448f-9182-4df7b4a9d792

#iosdc #a

Avatar for Atsuki Seo

Atsuki Seo

September 13, 2026

More Decks by Atsuki Seo

Other Decks in Programming

Transcript

  1. 自己紹介 • 名前:瀬尾 敦生(せお あつき) • 出身:広島県福山市 • 職業: –

    主)iOSアプリエンジニア – 副)弓削商船高専 非常勤講師 昨年は船 x iOSのテーマで 発表しました 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 2
  2. 目次 • 自己紹介 • 歴史 -電気通信のはじまり〜モールス信号について- • 仕様 -モールス信号- •

    事前検証 -光モールス信号iOSアプリの開発に向けて- • 設計 -光モールス信号iOSアプリ- • まとめ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 8
  3. [引用] https://siarchives.si.edu/oldsite/siarchives-old/history/JHPold/joseph21.htm [引用] https://ja.wikipedia.org/wiki/アレッサンドロ・ボルタ [引用] https://ja.wikipedia.org/wiki/ジョセフ・ヘンリー 歴史解説 -電気通信のはじまり• • 1800年代以降、産業革命の時代

    – 電気の発明から、電線 + 有線による通信が発達 – 蒸気船、蒸気機関、紡績機も開発され 効率化、大量生産が求められる時代になる 電池の発明 – イタリアのボルタさんが電池を発明 – アメリカのヘンリーさんが電磁石の原理を発見 – 電気・電磁石を使った長距離通信の可能性が模索されるようになる 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 10
  4. [引用] https://www.power-academy.jp/sp/electronics/familiar/fam02100.html 歴史解説 -電気通信のはじまり• これまでの通信:腕木通信 – 各地に観測台を立て、台上の木を関節で つなげたものを、決まった形に曲げる • 数km

    間隔程度で設置 – 観測者が前の人からの腕木を確認し、 同じ通信を次の人に腕木で送る – 何100km の通信網築いた • フランスのクロード・シャップさんの発明 • 世界各地で腕木通信網が整備、14,000km以上 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 11
  5. [引用] https://www.power-academy.jp/sp/electronics/familiar/fam02100.html 歴史解説 -電気通信のはじまり• これまでの通信:腕木通信 – 各地に観測台を立て、台上の木を関節で つなげたものを、決まった形に曲げる • •

    数km 間隔程度で設置 問題点 – (物理的な)設置コスト – (時間的な)送受信にかかるコスト 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 12
  6. [引用] https://ja.wikipedia.org/wiki/サミュエル・モールス 歴史解説 -電気通信のはじまり• アメリカのサミュエル・モールスさんが 電信を開発 – 絵を遠方で書いていて、 妻の最後を看取れなかった くやしさから。

    – 高速長距離通信の研究開発 • 電気を使えば課題解決できる と考えた 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 13
  7. [引用] https://www.power-academy.jp/sp/electronics/familiar/fam02100.html 歴史解説 -電気通信のはじまり、電信機の開発• 電気 → 電磁石の性質を 使い自動で動くペンの ような仕組みを作る –

    紙テープにペンで書く (刻む)電信機の開発 • 文字を綺麗に書くのも 伝送するのも難しい – 「・」と「ー」なら可能 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 14
  8. [引用] https://www.power-academy.jp/sp/electronics/familiar/fam02100.html [引用] https://www.jrc.co.jp/casestudy/column/03 歴史解説 -電気通信のはじまり、モールス信号• • 電気もON/OFF(その長さ)は 送受信できる 「・」と「ー」を使う通信方式

    – 2値で情報表現する方式を考えた – モールス信号の誕生 • • 電信機以外の箇所でも利用される その後、登場するデジタル通信技術の 先駆け的な存在 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 15
  9. [引用] https://www.cleandenpa.net/museum/gaku/cont/vol3/vol3_2.htm [引用] https://babel.hathitrust.org/cgi/pt?id=uc2.ark:/13960/t80k29264&view=1up&seq=42 歴史解説 -モールス信号の歴史• 1906 ベルリン無線電信規約 – 海上無線でモールス信号を使うことが義務化

    – SOS信号もこのとき策定 • • これまではCQD = CQ: 全局宛て + Distress: 遭難 1912 タイタニック号のエピソード – SOS SOS SOS DE MGY CQD REQUIRE ASSISTANCE POSITION 41.46N 50.14W STRUCK ICEBERG TITANIC • 訳)遭難した。こちらタイタニック。救助を頼む。 位置は北緯 41.46 西経 50.14氷山に衝突した。 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 16
  10. 歴史解説 -モールス信号の歴史• 1999 GMDSSの運用 – Global Maritime Distress and Safety

    System – 一定規模以上の国際航海に従事する船 (主に大型の商船・旅客船)は 自動受信・自動警報機能を持つ衛星通信・ VHF無線設備・GPSを使った航海が必須化 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 17
  11. [引用] https://pl.wikipedia.org/wiki/Racon 歴史解説 -モールス信号の歴史• モールス信号の現在: 航海業界 – 航海業界でギリ現役 – レーダーに反応して情報を返す

    • • • RACON(レーコン) 電波のON/OFFで モールス信号パターンを再現し レーダーに送り返す 反射波のみを表示する レーダー受信機にも 多様な情報を表示できる 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 18
  12. [引用] https://ja.wikipedia.org/wiki/超短波全方向式無線標識 [引用] https://tokyonewsmedia.com/archives/4643 歴史解説 -モールス信号の歴史• モールス信号の現在: 航空業界 – 航空業界でも現役

    – 航空路への進入を補助する情報の コールサインに使われる • – VOR、NDB、ILS アンテナで受信している情報が どの陸上局からの情報かは 音 + モールス信号で確認する 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 19
  13. [引用] https://static.garmincdn.com/gdc/Landing-Pages/Aviation/43930-ADS-B/43930-Solutions-TILE-business-commercial.jpg 歴史解説 -モールス信号の歴史• モールス信号の現在 – アンテナで受信している情報が どの陸上局からの情報かは 音 +

    モールス信号で確認する – GPSやADS-Bの発達と共に 縮小傾向 • ADS-B: VHFアンテナで航空機の位置を やり取りする仕組み 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 20
  14. [引用] https://ja.wikipedia.org/wiki/超短波全方向式無線標識 [引用] https://tokyonewsmedia.com/archives/4643 歴史解説 -モールス信号の歴史• モールス信号の現在 – アンテナで受信している情報が どの陸上局からの情報かは

    音 + モールス信号で確認する – GPSやADS-Bの発達と共に 縮小傾向 • GPS衛星自体に障害が起きた場合、 代替手段がなくなるリスク 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 21
  15. [引用] https://www.jrc.co.jp/casestudy/column/04 仕様 -モールス信号 符号表 欧文• 以下のモールス符号を用いる – 一線(長点)の長さ:3点 –

    一符号内の線・点の間隔:1点 – 二符号(文字)の間隔:3点 – 二語(単語)の間隔:7点 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 28
  16. [引用] https://www.benricho.org/symbol/morse.html 仕様 -モールス信号 符号表 欧文• 符号表 • 欧文の規定 –

    国際規定と 欧文部分は 同じ – よく使う文字 ほど短い 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 29
  17. [引用] https://www.benricho.org/symbol/morse.html 仕様 -モールス信号 符号表 和文• 符号表 • 和文の規定 –

    欧文にイロハ ニホヘトを 機械的に割り 当てただけ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 30
  18. H E ・・・・ ・ W O ・-- L ・-・・ ---

    L O ・-・・ --- / L D R ・-・ ・-・・ -・・ ※ / = 二語の間隔だと思って読んでください。 H→Eの間に3点、HELLOとWORLDの間に7点分の空白があるイメージ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 31
  19. S O S ・・・ーーー・・・ ※ SOS=遭難、救助を表す1つの単語のため余白なし 2026年9月13日(日) iOSDC Japan 2026

    スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 32
  20. 仕様 -モールス信号 送信速度• 前提:相互の技量、受信状態に合わせて通信速度を調整する • 目安1:標準速度(1分間) • – 和文:75字 –

    欧文:20語 目安2:遭難・緊急・安全通信での上限(1分間) – 和文:70字 – 欧文:16語 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 33
  21. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例1. 呼び出し(送信側):「▲▲さん、こちら〇〇です。どうぞ」 2. 応答(受信側):「〇〇さん、こちら▲▲です。どうぞ」 3. 通報の有無(送信側):「送りたい用件が1通あります」 4. 通報の送信(送信側):「〜〜(本文)。どうぞ」

    :「他に送るものはありません。どうぞ」 5. 受信証(受信側):「確かに受け取りました、1通」 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 34
  22. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例1.呼び出し(送信側):「▲▲さん、こちら〇〇です。どうぞ」 1. {相手局の呼び出し符号}:( x 3回まで) 2. {DE}:「こちら〜」、発信者を区切るもの 3.

    {自局の呼び出し符号}:( x 3回まで) • 例)▲▲ DE 〇〇 ※呼び出し符号は、無線免許取得時に指定されるもの 以降の通信には基本的に呼び出し符号をつける 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 35
  23. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例2. 応答(受信側):「〇〇さん、こちら▲▲です。どうぞ」 • (送信側と基本は同じ構成) • (差分)終止符号をつける • {K}:「(相手の番です)、どうぞ」の意味

    • {AS} {1...}:「〜分待ってください」の意味 • 例)〇〇 DE ▲▲ K • 例)〇〇 DE ▲▲ AS 1 ※受信側もDEの前後を入れ替え、同じフォーマットで返す 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 37
  24. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例2. 応答(受信側):「〇〇さん、こちら▲▲です。どうぞ」 • (送信側と同じ構成)以下の構成になっている。 • (差分)終止符号をつける • {K}:「(相手の番です)、どうぞ」の意味

    • {AS} {1...}:「〜分待ってください」の意味 • 例)〇〇 DE ▲▲ K • 例)〇〇 DE ▲▲ AS 1 ※K,AS の終止符号は相手にターンを渡すときの符号 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 38
  25. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例3.通報の有無(送信側):「送りたい用件が1通あります」 • 以下の構成になっている。 • { QTC }:「送りたい用件がN通あります」 •

    { 0... }:N通の部分 --• { QRU }:「送るべき通報がない」 • 例)▲▲ DE 〇〇 QTC 1 • 例)▲▲ DE 〇〇 QRU 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 39
  26. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例3.通報の有無(送信側):「送りたい用件がN通あります」 • 連続で送る場合は、追加でQSG符号を使うになっている。 • { QSG? }: 連続で送ってもいい?

    • 例)▲▲ DE 〇〇 QTC 3 QSG? K ※この場合のみ受信側の同意を必須で求める 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 40
  27. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例3.通報の有無(受信側):「N通、OKです。」 • 連続で送ることを許可する場合は、追加でQSG符号を使うになっている。 • { QSG }:「N通、OKです」 •

    { 1... }:N通の部分 • 例)〇〇 DE ▲▲ QSG 3 K ※この場合のみ受信側の同意を必須で求める 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 41
  28. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例4.通報の送信(送信側):「〜〜(本文)。どうぞ」 • { HR }:1通目の通報の開始符号 • { AHR

    }:2通目以降の通報の開始符号 • { ・-・-・ }:欧文の場合の終止記号 • { ・・・-・ }:和文の場合の終止記号 • { NIL }:(2通以上ある場合)他に送る通報なし • 例)▲▲ DE 〇〇 HR TEST MESSAGE ONE ・-・-・ • 例)▲▲ DE 〇〇 AHR TEST MESSAGE TWO ・-・-・ NIL K 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 42
  29. 仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例5.受信証の送信(受信側):「確かに受け取りました、1通」 • { R }:「確かに受け取りました」 • { 1...

    }:N通の部分 • 例)〇〇 DE ▲▲ R 1 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 43
  30. 検討 -光モールス信号 x iOSアプリ• iPhoneの機種によらず使える通信手段 – 電波:Wi-Fi, Bluetooth • –

    音:スピーカー • – 通信距離:〜数10m 通信距離:〜数m 光:LEDライト • 通信距離:〜数km ※時間帯や環境に依存する前提 ※別途機材が不要な範囲での比較 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 46
  31. 事前検証1 -スマートフォンの光が見えるか• • スマートフォンのLEDライトが 見える距離を検証 – 島to島、海岸の端から端 – 両パターンとも距離400m程度、日没以降 光の検出・自動認識をする場合

    スマホカメラの性能にも寄る – 検証自体は大昔(iPhone 5C,5Sの頃)に 実施している。 今のスマートフォンだと改善があるかも? 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 47
  32. 事前検証2 -iPhoneのLED制御パフォーマンスの調査• • iPhoneのLED制御は ハードウェア制御のため、 一定の誤差を必ず含むはず。 受信側の誤差も考慮すると、 LEDの長さ制御の時点で2倍を超えると、 短点と長点が間違えられるリスク↑ –

    (仮説) 目標値の1.2倍ぐらいに収まったら、 安定して使えるのでは? 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 48
  33. 事前検証2 -iPhoneのLED制御パフォーマンスの調査• iPhoneのLEDライトを光らせる:AVCaptureDevice – .lockForConfiguration / unlockForConfiguration • – 排他制御の設定、解除

    .setTorchModeOn(level:) • Level 引数に0.0 ~ 1.0 でライトの強さを指定する • .maxAvailableTorchLevel – – 端末の熱状態を鑑みて、今指定できる最大のパワーを指定する .isTorchActive • 現在LEDが点灯してるかを確認するフラグ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 49
  34. 事前検証2 -iPhoneのLED制御パフォーマンスの調査• • 光の明滅をコードで再現する以下の流れになる – ON:lockFor > setTorchModeOn(level:) > unlockFor

    – OFF:lockFor > torchMode=.off > unlockFor これを指定した周期で実施できるか?の簡単な検証をしてみた。 – Task.sleep などを使った時間制御のコード 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 50
  35. 事前検証2 -iPhoneのLED制御パフォーマンスの調査• 光の明滅の周期をコードで指定し、実際にかかった時間の表(100回ずつ計測) • Stalls = 目標周期の2倍以上時間がかかった数 target avg 95%タイル

    stalls 500ms 520.32ms 535.50ms 0 200ms 210.49ms 216.16ms 0 100ms 106.52ms 109.52ms 0 50ms 54.56ms 56.01ms 0 20ms 24.06ms 25.13ms 1 10ms 12.45ms 13.11ms 0 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 51
  36. 設計 -光モールス信号iOSアプリ• 設計1:モールス信号の符号化・復号化について • 設計2:光の送信 -「・」の長さ- • 設計3:光の受信 2026年9月13日(日) iOSDC

    Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 55
  37. 符号化:SOS → ・・・ーーー・・・ 復号化:・・・ーーー・・・ → SOS として説明します。 2026年9月13日(日) iOSDC Japan

    2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 57
  38. 設計1 -モールス信号の符号化について• 符号表は以下のような構造で表現する // ・(dot) / ー(dash) enum Element {

    case dot, dash } // Sign型までを変換表としてライブラリ内にハードコードする let signH = Sign(elements: [.dot, .dot, .dot, .dot], label: "H") // 符号表の1行 = いわゆる1文字 struct Sign { let elements: [Element] let label: String // ex: "A", "イ" } let signE = Sign(elements: [.dot], label: "E") let signL = Sign(elements: [.dot, .dash, .dot, .dot], label: "L") 2026年9月13日(日) let signO = Sign(elements: [.dash, .dash, .dash], label: "O") let signW = Sign(elements: [.dot, .dash, .dash], label: "W") let signR = Sign(elements: [.dot, .dash, .dot], label: "R") let signD = Sign(elements: [.dash, .dot, .dot], label: "D") iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 58
  39. 設計1 -モールス信号の符号化について• 送りたい情報については以下のように表現する // 符号間隔(3点)で区切られる単位 struct Symbol { let signs:

    [Sign] } // 7点で区切られる単位 struct Word { let symbols: [Symbol] } // 文全体 struct Message { let words: [Word] } 2026年9月13日(日) let message = Message(words: [ // ex) HELLO WORLD Word(symbols: [ Symbol(signs: [signH]), Symbol(signs: [signE]), Symbol(signs: [signL]), Symbol(signs: [signL]), Symbol(signs: [signO]) ]), Word(symbols: [ Symbol(signs: [signW]), Symbol(signs: [signO]), // ...(割愛)... ]) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 59
  40. 設計1 -モールス信号の符号化について• SOSのような1符号として送信する場合の表現も可能 // 符号間隔(3点)で区切られる単位 struct Symbol { let signs:

    [Sign] } // 7点で区切られる単位 struct Word { let symbols: [Symbol] } // 文全体 struct Message { let words: [Word] } 2026年9月13日(日) let message = Message(words: [ // ex) SOS Word(symbols: [ // 符号間隔で区切りたくないので、 // 1シンボルとして扱う Symbol(signs: [signS, signO, signS]), ]), ]) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 60
  41. 設計1 -モールス信号の符号化について• LEDのON / OFF列を作るロジック -単位の長さを定義- // 「・」「ー」の定義を拡張し // 単位の長さも定義する

    extension Element { var units: Int { switch self { case .dot: 1 case .dash: 3 } } } // 各空白の定義 enum Spacing { static let element = 1 // 1符号内 static let symbol = 3 // 符号間 static let word // 語間 2026年9月13日(日) iOSDC Japan 2026 } =7 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 61
  42. 設計1 -モールス信号の符号化について• • LEDのON / OFF列を作るロジック -点灯パターンの導出Message → Word →

    Symbol → Sign → Element extension Message { func unitSequence() -> [(isOn: Bool, units: Int)] { var out: [(Bool, Int)] = [] for (wi, word) in words.enumerated() { if wi > 0 { out.append((false, Spacing.word)) } // 7 for (si, symbol) in word.symbols.enumerated() { if si > 0 { out.append((false, Spacing.symbol)) } // 3 var isFirst = true for sign in symbol.signs { for element in sign.elements { と入れ子を取り出すと、 if !isFirst { out.append((false, Spacing.element)) } // 1 信号列に変換できる構造 isFirst = false out.append((true, element.units)) 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 62
  43. 設計1 -モールス信号の符号化について• • • LEDのON / OFF列を作るロジック -実行後のイメージisOn = true

    の場合に LEDを点灯させる unitsの値をもとに 光らせる時間を変更する // H = ・・・・ (isOn: true, units: 1), (isOn: false, units: 1), (isOn: true, units: 1), (isOn: false, units: 1), (isOn: true, units: 1), (isOn: false, units: 1), (isOn: true, units: 1), // ・ // // ・ // // ・ // // ・ (isOn: false, units: 3), // ← Symbol 間(HとEの間) // E = ・ (isOn: true, units: 1), // ...(後略)... 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 63
  44. 設計1 -モールス信号の復号化について• ざっくりいうと、符号化の手順を逆順で処理していくイメージ • ただし、和文の場合は注意が必要 – 濁点や半濁点を受信した際は直前の文字との合成を行う – 例)か →

    ゛と受信したら、「が」にする 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 64
  45. 設計2:光の送信 -「・」の長さ• ソースコードの話(再掲) • iPhoneのLEDライトを光らせる:AVCaptureDevice • 光の明滅をコードで再現する以下の流れになる – ON:setTorchModeOn(level:) –

    OFF:torchMode=.off 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 66
  46. 設計2:光の送信 -「・」の長さ• • • ソースコードの話(再掲) – iPhoneのLEDライトを光らせる:AVCaptureDevice – ON:lockFor >

    setTorchModeOn(level:) > unlockFor 要は点滅パターンに合わせて、上記コードで ON / OFFを切り替えればOK ただし、「・」が何秒かを決める必要がある 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 67
  47. 設計2:光の送信 -「・」の長さ• 今回は話をシンプルにするため、以下のように設計 – 和文と欧文で同じ送信速度を使う • • 和文側は文字を1分で何文字送るかというシンプルな指定 – 和文48字

    + 濁点 + 半濁点が均一に出る前提で、 単位数(短点分の数)の平均が10.92(短点10個分の信号を使う) – 各文字ごとに短点3つ分の空白が入るため、+3 単位数の平均 = 13.92 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 68
  48. 設計2:光の送信 -「・」の長さ• 今回は話をシンプルにするため、以下のように設計 – • • 単位数の平均 = 13.92 1分に75文字を送る速度が目安

    1分の間に扱う単位数(短点分の数)として考えると 75 * 13.92 = 1044 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 69
  49. 設計2:光の送信 -「・」の長さ• • 今回は話をシンプルにするため、以下のように設計 – 1分の間に扱う単位数(短点分の数) – 75 * 13.92

    = 1044 これを秒単位にならすと 60 / 1044 = 0.05747 sec – 単位 = 短点 = 57ms 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 70
  50. 設計2:光の送信 -「・」の長さ• 今回は話をシンプルにするため、以下のように設計 – • 単位 = 短点 = 57ms

    LEDの制御パフォーマンス的にも余裕を持って扱えるため、 このまま採用した 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 71
  51. 設計3:光の受信 • iPhoneのカメラを扱う:AVFoundation AVCapture~~ – AVCaptureSession:撮影セッション – AVCaptureDevice:カメラ・カメラ設定(露出・ISO・fps) – AVCaptureDeviceInput:カメラ

    → セッションをつなぐ – AVCaptureVideoDataOutput :セッション → 生の画素 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 75
  52. 設計3:光の受信 -iPhoneを光センサにしたい• • 周辺光の状況によらず、 右図の枠内のように ライトの光だけを検出したい iPhoneのカメラを 映像撮影ではなく、 光センサとして使えるように チューニングする

    2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 77
  53. [引用] https://nij.nikon.com/nicostop/entry/camera_guide/howto/2022/03/22/1?srsltid=AfmBOopdK7xG7j0OpHGbeBL8XugLPkQ-AIbSUjRQJAIQ9CoHqdceepQ3 設計3:光の受信 -iPhoneを光センサにしたい• • • 一般的なカメラは 右の仕組みになっている。 絞りを調整し、 シャッターを上げ下げして、

    決まった時間だけ光を取り込み、 イメージセンサに光をあてて 画像にする カメラの露出設定という 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 78
  54. [引用] https://nij.nikon.com/nicostop/entry/camera_guide/howto/2022/03/22/1?srsltid=AfmBOopdK7xG7j0OpHGbeBL8XugLPkQ-AIbSUjRQJAIQ9CoHqdceepQ3 設計3:光の受信 -iPhoneを光センサにしたい• 以下のようによく言われる • 絞り – • シャッター速度

    – • F値 1/N秒 ISO感度 – イメージセンサの光に対する感度 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 79
  55. [引用] https://nij.nikon.com/nicostop/entry/camera_guide/howto/2022/03/22/1?srsltid=AfmBOopdK7xG7j0OpHGbeBL8XugLPkQ-AIbSUjRQJAIQ9CoHqdceepQ3 設計3:光の受信 -iPhoneを光センサにしたい• • シャッター速度を早くし、 ISO感度を低くすると、 周辺光はセンサまで あまり届かなくなる LEDライトなどの強い光は

    白飛び的な形ではあるが センサ上に映る 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 80
  56. 設計3:光の受信 • カメラ設定を調整し、iPhoneを光センサにする • フレームレート:120FPS – let duration = CMTime(value:

    1, timescale: 120) // Min, Max に同じ値を設定することで120FPSで動作させる – device.activeVideoMinFrameDuration = duration – device.activeVideoMaxFrameDuration = duration 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 81
  57. 設計3:光の受信 • カメラ設定を調整し、iPhoneを光センサにする • 露出設定 シャッター速度:1/1000 – let requested =

    CMTime(seconds: settings.shutter.seconds, preferredTimescale: 1_000_000) – let upper = CMTimeMinimum(format.maxExposureDuration, device.activeVideoMinFrameDuration) – let duration = CMTimeMaximum(format.minExposureDuration, CMTimeMinimum(requested, upper)) 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 82
  58. 設計3:光の受信 • カメラ設定を調整し、iPhoneを光センサにする • ホワイトバランス・ピントの固定: – ホワイトバランス:周辺光の色に伴う明暗の変化がないようにする device.whiteBalanceMode = .locked

    – ピント:合焦動作による明暗の変化がないようにする (いわゆる、ピント合わせ) device.focusMode = .locked 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 83
  59. 設計3:光の受信 • カメラ設定を調整し、iPhoneを光センサにする • 不要な設定を切る 1/2: – HDR:光の識別に明暗の階調情報を増やしても意味がない device.automaticallyAdjustsVideoHDREnabled =

    false device.isVideoHDREnabled = false – トーンの調整:HDRの件含め、明暗のトーン調整を切る device.isGlobalToneMappingEnabled = false 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 84
  60. 設計3:光の受信 • カメラ設定を調整し、iPhoneを光センサにする • 不要な設定を切る 2/2: – 暗所補正を切る:自動の明るさ補正による、明暗の情報の変更を避ける device.automaticallyEnablesLowLightBoostWhenAvailable =

    false – 被写体検知:変化を検出したら、露出とピントを合わせ直す機能を止める device.isSubjectAreaChangeMonitoringEnabled = false 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 85
  61. 設計3:光の受信 • カメラ設定を調整し、iPhoneを光センサにする • デジタルズームの固定: – デジタルズームを等倍にする:画素の補完、それに伴う明暗の変化をさせない device.videoZoomFactor = 1

    2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 86
  62. [引用] https://dexonsystems.com/blog/rgb-yuv-color-spaces 設計3:光の受信 -光を検出する処理• 動画で広く対応されてる色空間:YUV – 人間は色成分の変化より輝度成分の変化に敏感という データから考案された考え方 – 輝度(Y)

    + 青色の輝度差(U) + 赤色の輝度差(V) 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 88
  63. 設計3:光の受信 -光を検出する処理• AVCaptureVideoDataOutput からピクセルバッファを取る – 各ピクセルの塊を取る:CVPixelBuffer let base = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer,

    0) // 輝度 let bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0) let plane = base.assumingMemoryBound(to: UInt8.self) let row = plane + y * bytesPerRow // 輝度のバイト列をメモリから取得 let value = row[x] 2026年9月13日(日) // 0…255 の輝度、そのまま iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 90
  64. 設計3:光の受信 -光を検出する処理• 撮影映像全体をマス目ごとに分割し、 輝度の値を1つに畳む – 光源の場所は事前にはわからない。 – ROI(関心領域)を決まった位置に設定し、 特定の領域だけ畳む対象にすることもできるが、 以下のような課題がある。

    – 課題1:「この枠に光を入れてね」みたいな UIになる。 – 課題2:モールス信号が別の光源から 同時に来ると処理しづらい 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 91
  65. 設計3:光の受信 -光を検出する処理• 撮影映像全体をマス目ごとに分割し、輝度の値を1つに畳む – 光源の大きさで値が薄まることを避けるため、上位4画素のみの平均を取る var first: UInt8 = 0,

    second: UInt8 = 0, third: UInt8 = 0, fourth: UInt8 = 0 for y in ... { for x in ... { let value = line[x] if value <= fourth { continue } // 大半の画素はここで終わる if value > first { fourth = third; third = second; second = first; first = value } else if value > second { fourth = third; third = second; second = value } else if value > third { fourth = third; third = value } else { fourth = value } }} // このマスの輝度。輝度を1つの値に畳んだ結果 cells[row * columns + column] = UInt8((Int(first)+Int(second)+Int(third)+Int(fourth)) / 4) 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 92
  66. 設計3:光の受信 -光を検出する処理• マス目ごとの輝度の動き(~= 振れ幅)を算出し、明滅判定 – 前述のマスごとの各輝度値を使う private func spread(ofIndex index:

    Int, in slots: [Int]) -> Double { var low = UInt8.max var high = UInt8.min for slot in slots { // このマス目の数秒分の輝度値 let value = values[slot * cellCount + index] // このマス目の輝度値 low = Swift.min(low, value) high = Swift.max(high, value) } return Double(high) – Double(low) // 輝度の振れ幅を見る } 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 95
  67. 設計3:光の受信 -光を検出する処理• マス目ごとの輝度の動き(~= 振れ幅)を算出し、明滅判定 – 前スライドのspreadメソッドを使う – minimumSpread(最低限の輝度の振れ幅)としては 64を定義 –

    • LEDライトを想定すると、200~256(最大)の輝度が来る予想 • ノイズが一定混入したとしても、これ以上の振れ幅は来るはず そのマス目が最も明るいときと暗いときの差が一定以上なので明滅と判断する let isLit = spread(of: candidate.cell, in: slots) >= minimumSpread 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 96
  68. 設計3:光の受信 -光を検出する処理• 明滅してるマスの、直近数秒の輝度の最小値・最大値を取る – (フレア対策とかをする場合はヒストグラムを取り、両端N番目を取る) – その2値の間にON側のしきい値、OFF側のしきい値の線を2本引く – それぞれのしきい値を持って、ON判定・OFF判定をする •

    • 信号光学の話になってきたので、詳細は割愛 明滅してるマスのON / OFFが出たら、 モールス信号の復号化を試す。 → 前述のモールス信号の話へ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 97
  69. まとめ • • • モールス信号のなりたち、無線で使う際の省令、 省令の内容を参考にしたiPhone x 光 x モールス信号の実装例を

    部分的に紹介した。 アルゴリズム、しきい値などをより練ることができるはず。 今後も検証と改善をほそぼそとやっていきたい モールス信号ではない、 電子機器間前提の可視光通信アプリも面白そう 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 99
  70. A Ray of Hope — Morse Code App https://github.com/atsuki-seo/MorseApp 2026年9月13日(日)

    iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 100