Slide 1

Slide 1 text

スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 atsuki_seo 2026年9月13日(日) iOSDC Japan 2026 1

Slide 2

Slide 2 text

自己紹介 ● 名前:瀬尾 敦生(せお あつき) ● 出身:広島県福山市 ● 職業: – 主)iOSアプリエンジニア – 副)弓削商船高専 非常勤講師 昨年は船 x iOSのテーマで 発表しました 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 2

Slide 3

Slide 3 text

これは何でしょう? ・・・ーーー・・・ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 3

Slide 4

Slide 4 text

SOS ・・・ーーー・・・ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 4

Slide 5

Slide 5 text

今回は光 x モールス信号のiOSアプリを テーマに40分話します。 モールス信号とは? なぜ光を選んだのか? どうやって信号を送受信するのかについてお話します 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 5

Slide 6

Slide 6 text

モールス信号の歴史から現代の利用方法、 総務省の省令(≒仕様)をざっくり抑えて iOSアプリのプロトタイプ再現を目指す話です。 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 6

Slide 7

Slide 7 text

退屈な話も多いかもですが、ゆっくりしていってね! 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 7

Slide 8

Slide 8 text

目次 ● 自己紹介 ● 歴史 -電気通信のはじまり〜モールス信号について- ● 仕様 -モールス信号- ● 事前検証 -光モールス信号iOSアプリの開発に向けて- ● 設計 -光モールス信号iOSアプリ- ● まとめ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 8

Slide 9

Slide 9 text

歴史 -電気通信のはじまり〜モールス信号について- 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 9

Slide 10

Slide 10 text

[引用] 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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

[引用] https://www.power-academy.jp/sp/electronics/familiar/fam02100.html 歴史解説 -電気通信のはじまり● これまでの通信:腕木通信 – 各地に観測台を立て、台上の木を関節で つなげたものを、決まった形に曲げる ● ● 数km 間隔程度で設置 問題点 – (物理的な)設置コスト – (時間的な)送受信にかかるコスト 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 12

Slide 13

Slide 13 text

[引用] https://ja.wikipedia.org/wiki/サミュエル・モールス 歴史解説 -電気通信のはじまり● アメリカのサミュエル・モールスさんが 電信を開発 – 絵を遠方で書いていて、 妻の最後を看取れなかった くやしさから。 – 高速長距離通信の研究開発 ● 電気を使えば課題解決できる と考えた 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 13

Slide 14

Slide 14 text

[引用] https://www.power-academy.jp/sp/electronics/familiar/fam02100.html 歴史解説 -電気通信のはじまり、電信機の開発● 電気 → 電磁石の性質を 使い自動で動くペンの ような仕組みを作る – 紙テープにペンで書く (刻む)電信機の開発 ● 文字を綺麗に書くのも 伝送するのも難しい – 「・」と「ー」なら可能 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 14

Slide 15

Slide 15 text

[引用] 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

Slide 16

Slide 16 text

[引用] 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

Slide 17

Slide 17 text

歴史解説 -モールス信号の歴史● 1999 GMDSSの運用 – Global Maritime Distress and Safety System – 一定規模以上の国際航海に従事する船 (主に大型の商船・旅客船)は 自動受信・自動警報機能を持つ衛星通信・ VHF無線設備・GPSを使った航海が必須化 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 17

Slide 18

Slide 18 text

[引用] https://pl.wikipedia.org/wiki/Racon 歴史解説 -モールス信号の歴史● モールス信号の現在: 航海業界 – 航海業界でギリ現役 – レーダーに反応して情報を返す ● ● ● RACON(レーコン) 電波のON/OFFで モールス信号パターンを再現し レーダーに送り返す 反射波のみを表示する レーダー受信機にも 多様な情報を表示できる 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 18

Slide 19

Slide 19 text

[引用] https://ja.wikipedia.org/wiki/超短波全方向式無線標識 [引用] https://tokyonewsmedia.com/archives/4643 歴史解説 -モールス信号の歴史● モールス信号の現在: 航空業界 – 航空業界でも現役 – 航空路への進入を補助する情報の コールサインに使われる ● – VOR、NDB、ILS アンテナで受信している情報が どの陸上局からの情報かは 音 + モールス信号で確認する 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 19

Slide 20

Slide 20 text

[引用] 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

Slide 21

Slide 21 text

[引用] https://ja.wikipedia.org/wiki/超短波全方向式無線標識 [引用] https://tokyonewsmedia.com/archives/4643 歴史解説 -モールス信号の歴史● モールス信号の現在 – アンテナで受信している情報が どの陸上局からの情報かは 音 + モールス信号で確認する – GPSやADS-Bの発達と共に 縮小傾向 ● GPS衛星自体に障害が起きた場合、 代替手段がなくなるリスク 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 21

Slide 22

Slide 22 text

人と人がモールス信号で通信する時代はほぼ終わった。 しかし、仕組みは未だ現役。 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 22

Slide 23

Slide 23 text

モールス信号が普段から使えたら・・・ 緊急時や災害時に役に立つかもしれない? 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 23

Slide 24

Slide 24 text

仕様 -モールス信号無線局運用規則より 令和8年7月23日 施行 無線局(基幹放送局を除く。)の開設の根本的基準等の一部を改正する省令(令和八年総務省令第九十号) 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 24

Slide 25

Slide 25 text

モールス信号は無線で運用する前提で 送受信に一定のルールが総務省で用意している。 今回は無線で利用するわけではないが、 一定参考になるので確認していきたい。 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 25

Slide 26

Slide 26 text

モールス信号や無線に関する ITU = 国際電気通信連合のRecommendation(勧告)も 存在する。 ただし、総務省の省令のほうがより具体的なので こちらをベースに話します。 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 26

Slide 27

Slide 27 text

e-govの内容をベースにモールス信号の部分を 抜粋して話します。 詳細が気になる方はe-govの内容を見てみてください。 https://laws.e-gov.go.jp/law/325M50080000017? occasion_date=20260723 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 27

Slide 28

Slide 28 text

[引用] https://www.jrc.co.jp/casestudy/column/04 仕様 -モールス信号 符号表 欧文● 以下のモールス符号を用いる – 一線(長点)の長さ:3点 – 一符号内の線・点の間隔:1点 – 二符号(文字)の間隔:3点 – 二語(単語)の間隔:7点 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 28

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

[引用] https://www.benricho.org/symbol/morse.html 仕様 -モールス信号 符号表 和文● 符号表 ● 和文の規定 – 欧文にイロハ ニホヘトを 機械的に割り 当てただけ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 30

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

S O S ・・・ーーー・・・ ※ SOS=遭難、救助を表す1つの単語のため余白なし 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 32

Slide 33

Slide 33 text

仕様 -モールス信号 送信速度● 前提:相互の技量、受信状態に合わせて通信速度を調整する ● 目安1:標準速度(1分間) ● – 和文:75字 – 欧文:20語 目安2:遭難・緊急・安全通信での上限(1分間) – 和文:70字 – 欧文:16語 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 33

Slide 34

Slide 34 text

仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例1. 呼び出し(送信側):「▲▲さん、こちら〇〇です。どうぞ」 2. 応答(受信側):「〇〇さん、こちら▲▲です。どうぞ」 3. 通報の有無(送信側):「送りたい用件が1通あります」 4. 通報の送信(送信側):「〜〜(本文)。どうぞ」 :「他に送るものはありません。どうぞ」 5. 受信証(受信側):「確かに受け取りました、1通」 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 34

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例1.呼び出し(送信側):「付近の方、こちら〇〇です。どうぞ」 • なお、通信可能の範囲内にある全ての無線局を一括して呼び出す場合は CQ 例)CQ DE 〇〇 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 36

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例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

Slide 43

Slide 43 text

仕様 -モールス信号 送信手順:〇〇さん(送信側)と▲▲さん(受信側)の例5.受信証の送信(受信側):「確かに受け取りました、1通」 • { R }:「確かに受け取りました」 • { 1... }:N通の部分 • 例)〇〇 DE ▲▲ R 1 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 43

Slide 44

Slide 44 text

モールス信号の送受信に関する基本の流れは以上です。 ここからはスマートフォンにモールス信号を 実装する話をしていきます。 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 44

Slide 45

Slide 45 text

事前検証 -光モールス信号iOSアプリの開発に向けて- 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 45

Slide 46

Slide 46 text

検討 -光モールス信号 x iOSアプリ● iPhoneの機種によらず使える通信手段 – 電波:Wi-Fi, Bluetooth ● – 音:スピーカー ● – 通信距離:〜数10m 通信距離:〜数m 光:LEDライト ● 通信距離:〜数km ※時間帯や環境に依存する前提 ※別途機材が不要な範囲での比較 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 46

Slide 47

Slide 47 text

事前検証1 -スマートフォンの光が見えるか● ● スマートフォンのLEDライトが 見える距離を検証 – 島to島、海岸の端から端 – 両パターンとも距離400m程度、日没以降 光の検出・自動認識をする場合 スマホカメラの性能にも寄る – 検証自体は大昔(iPhone 5C,5Sの頃)に 実施している。 今のスマートフォンだと改善があるかも? 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 47

Slide 48

Slide 48 text

事前検証2 -iPhoneのLED制御パフォーマンスの調査● ● iPhoneのLED制御は ハードウェア制御のため、 一定の誤差を必ず含むはず。 受信側の誤差も考慮すると、 LEDの長さ制御の時点で2倍を超えると、 短点と長点が間違えられるリスク↑ – (仮説) 目標値の1.2倍ぐらいに収まったら、 安定して使えるのでは? 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 48

Slide 49

Slide 49 text

事前検証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

Slide 50

Slide 50 text

事前検証2 -iPhoneのLED制御パフォーマンスの調査● ● 光の明滅をコードで再現する以下の流れになる – ON:lockFor > setTorchModeOn(level:) > unlockFor – OFF:lockFor > torchMode=.off > unlockFor これを指定した周期で実施できるか?の簡単な検証をしてみた。 – Task.sleep などを使った時間制御のコード 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 50

Slide 51

Slide 51 text

事前検証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

Slide 52

Slide 52 text

DEMO 光モールス信号の送信 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 52

Slide 53

Slide 53 text

DEMO 光モールス信号の受信 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 53

Slide 54

Slide 54 text

設計 -光モールス信号iOSアプリ- 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 54

Slide 55

Slide 55 text

設計 -光モールス信号iOSアプリ● 設計1:モールス信号の符号化・復号化について ● 設計2:光の送信 -「・」の長さ- ● 設計3:光の受信 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 55

Slide 56

Slide 56 text

設計1:モールス信号の符号化・復号化について 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 56

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

設計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

Slide 59

Slide 59 text

設計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

Slide 60

Slide 60 text

設計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

Slide 61

Slide 61 text

設計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

Slide 62

Slide 62 text

設計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

Slide 63

Slide 63 text

設計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

Slide 64

Slide 64 text

設計1 -モールス信号の復号化について● ざっくりいうと、符号化の手順を逆順で処理していくイメージ ● ただし、和文の場合は注意が必要 – 濁点や半濁点を受信した際は直前の文字との合成を行う – 例)か → ゛と受信したら、「が」にする 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 64

Slide 65

Slide 65 text

設計2:光の送信 -「・」の長さ- 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 65

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

設計2:光の送信 -「・」の長さ● ● ● ソースコードの話(再掲) – iPhoneのLEDライトを光らせる:AVCaptureDevice – ON:lockFor > setTorchModeOn(level:) > unlockFor 要は点滅パターンに合わせて、上記コードで ON / OFFを切り替えればOK ただし、「・」が何秒かを決める必要がある 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 67

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

設計2:光の送信 -「・」の長さ● 今回は話をシンプルにするため、以下のように設計 – ● 単位 = 短点 = 57ms LEDの制御パフォーマンス的にも余裕を持って扱えるため、 このまま採用した 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 71

Slide 72

Slide 72 text

「・」の長さの考え方:改良の余地① 75文字 / 分で送る前提なら・・・ 送る文章の単位数を算出し、 今やったような計算を毎回しても良さそう。 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 72

Slide 73

Slide 73 text

「・」の長さの考え方:改良の余地② 75文字 / 分で送る前提なら・・・ (ソースがあるなら) 日本語文章の出現頻度をもとにした単位数の算出もあり 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 73

Slide 74

Slide 74 text

設計3:光の受信 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 74

Slide 75

Slide 75 text

設計3:光の受信 ● iPhoneのカメラを扱う:AVFoundation AVCapture~~ – AVCaptureSession:撮影セッション – AVCaptureDevice:カメラ・カメラ設定(露出・ISO・fps) – AVCaptureDeviceInput:カメラ → セッションをつなぐ – AVCaptureVideoDataOutput :セッション → 生の画素 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 75

Slide 76

Slide 76 text

設計3:光の受信 iPhoneを光センサにするためのカメラ設定 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 76

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

[引用] 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

Slide 79

Slide 79 text

[引用] 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

Slide 80

Slide 80 text

[引用] 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

Slide 81

Slide 81 text

設計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

Slide 82

Slide 82 text

設計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

Slide 83

Slide 83 text

設計3:光の受信 ● カメラ設定を調整し、iPhoneを光センサにする ● ホワイトバランス・ピントの固定: – ホワイトバランス:周辺光の色に伴う明暗の変化がないようにする device.whiteBalanceMode = .locked – ピント:合焦動作による明暗の変化がないようにする (いわゆる、ピント合わせ) device.focusMode = .locked 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 83

Slide 84

Slide 84 text

設計3:光の受信 ● カメラ設定を調整し、iPhoneを光センサにする ● 不要な設定を切る 1/2: – HDR:光の識別に明暗の階調情報を増やしても意味がない device.automaticallyAdjustsVideoHDREnabled = false device.isVideoHDREnabled = false – トーンの調整:HDRの件含め、明暗のトーン調整を切る device.isGlobalToneMappingEnabled = false 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 84

Slide 85

Slide 85 text

設計3:光の受信 ● カメラ設定を調整し、iPhoneを光センサにする ● 不要な設定を切る 2/2: – 暗所補正を切る:自動の明るさ補正による、明暗の情報の変更を避ける device.automaticallyEnablesLowLightBoostWhenAvailable = false – 被写体検知:変化を検出したら、露出とピントを合わせ直す機能を止める device.isSubjectAreaChangeMonitoringEnabled = false 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 85

Slide 86

Slide 86 text

設計3:光の受信 ● カメラ設定を調整し、iPhoneを光センサにする ● デジタルズームの固定: – デジタルズームを等倍にする:画素の補完、それに伴う明暗の変化をさせない device.videoZoomFactor = 1 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 86

Slide 87

Slide 87 text

設計3:光の受信 光の明滅を検出する処理 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 87

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

[引用] https://dexonsystems.com/blog/rgb-yuv-color-spaces 設計3:光の受信 -光を検出する処理● 動画で広く対応されてる色空間:YUV の考え方 – 光の受信はY成分だけ取得できれば可能そう 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 89

Slide 90

Slide 90 text

設計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

Slide 91

Slide 91 text

設計3:光の受信 -光を検出する処理● 撮影映像全体をマス目ごとに分割し、 輝度の値を1つに畳む – 光源の場所は事前にはわからない。 – ROI(関心領域)を決まった位置に設定し、 特定の領域だけ畳む対象にすることもできるが、 以下のような課題がある。 – 課題1:「この枠に光を入れてね」みたいな UIになる。 – 課題2:モールス信号が別の光源から 同時に来ると処理しづらい 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 91

Slide 92

Slide 92 text

設計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

Slide 93

Slide 93 text

設計3:光の受信 -光を検出する処理● ● 相手はこちらの都合を待たずに信号を送り始める。 ただし、こちらは明滅を見つけ復号してに数秒かかる。 信号を検知したら、遡ってモールス信号を復号化するため 輝度の記録だけは毎回実施する 時間 遡ってデコード 遡ってデコード 2026年9月13日(日) 信号検知 信号検知 iOSDC Japan 2026 信号消失 モニタ停止 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 93

Slide 94

Slide 94 text

設計3:光の受信 -光を検出する処理● ● 信号を検知したら、遡ってモールス信号を復号化するため 輝度の記録だけは毎回実施する リングバッファを用意してデータの記録を実施している 時間 遡ってデコード 遡ってデコード 2026年9月13日(日) 信号検知 信号検知 iOSDC Japan 2026 信号消失 モニタ停止 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 94

Slide 95

Slide 95 text

設計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

Slide 96

Slide 96 text

設計3:光の受信 -光を検出する処理● マス目ごとの輝度の動き(~= 振れ幅)を算出し、明滅判定 – 前スライドのspreadメソッドを使う – minimumSpread(最低限の輝度の振れ幅)としては 64を定義 – ● LEDライトを想定すると、200~256(最大)の輝度が来る予想 ● ノイズが一定混入したとしても、これ以上の振れ幅は来るはず そのマス目が最も明るいときと暗いときの差が一定以上なので明滅と判断する let isLit = spread(of: candidate.cell, in: slots) >= minimumSpread 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 96

Slide 97

Slide 97 text

設計3:光の受信 -光を検出する処理● 明滅してるマスの、直近数秒の輝度の最小値・最大値を取る – (フレア対策とかをする場合はヒストグラムを取り、両端N番目を取る) – その2値の間にON側のしきい値、OFF側のしきい値の線を2本引く – それぞれのしきい値を持って、ON判定・OFF判定をする ● ● 信号光学の話になってきたので、詳細は割愛 明滅してるマスのON / OFFが出たら、 モールス信号の復号化を試す。 → 前述のモールス信号の話へ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 97

Slide 98

Slide 98 text

まとめ 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 98

Slide 99

Slide 99 text

まとめ ● ● ● モールス信号のなりたち、無線で使う際の省令、 省令の内容を参考にしたiPhone x 光 x モールス信号の実装例を 部分的に紹介した。 アルゴリズム、しきい値などをより練ることができるはず。 今後も検証と改善をほそぼそとやっていきたい モールス信号ではない、 電子機器間前提の可視光通信アプリも面白そう 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 99

Slide 100

Slide 100 text

A Ray of Hope — Morse Code App https://github.com/atsuki-seo/MorseApp 2026年9月13日(日) iOSDC Japan 2026 スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜 100