
2026/09/15 22:20
Show HN: 20 ドルの 4G ワイヤレスホットスポットをテキストメッセージ機器へハッキングする
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
著者は、OpenStick フレームワークに基づいた単一のカスタムデバイスとして、AliExpress の 4G モデム、Clicks キーボード、Adafruit SHARP ディスプレイという多様な電子機器を統合することに成功した。3 つの異なるシャーシオプションからスタートしたが、標準アダプターで見つかった配線エラーを修正した後に MF800 モデルを選択した。主要な技術的課題として、Qualcomm ドライバーを Linux 用に適応させる問題があった;従来の Android メソッドである
adb を使っても EDL モードのアップデートをフラッシュできなかったため、著者は rohm,dh2228fv ドライバーとの互換性を活用した回避策を実装した。コスト削減と美観向上のために、ビルドでは標準の GC9107 ディスプレイをより優れた動画ダITHERing を提供するものに置き換えた(動画に Atkinson、静止画に Floyd-Steinberg を使用)とともに、カスタム PCB を 2 面から片面に再設計した。物理的な改修としては、PCB のトリミング、新しいロジックに対応するために USB コネクタを切断し、バッテリー接続をパッチングすることなどがあった。これらの成功にもかかわらず、このデバイスには現在、スリープモードへの進入不能やヘルパー PCB のカバータブの欠落という重大な欠陥が存在する。今後のステップとしては、タッチ入力の統合、サウンドと振動の実装、および飛び込みのある縁やディスプレイ遮蔽の問題を修正するための物理的なエンクロージャーの改良が含まれる。本文
乱雑な机と「穴熊脳」から始まる OpenStick プロジェクト:4G モデム×キーボード×シャープディスプレイの自作体験記
背景とモチベーション
私は物を整理するのが苦手です。努力を重ねているにもかかわらず、机の上には以下のような物が積み重なっていました。これが今回のプロジェクト発端です。
- OpenStick 互換品
- MF800: 実際に使用した機体
- UZ801: サイズは適合したが、バッテリーや GPIO ピンが不足していた
- USB ドライブ形状のモデル: 他の問題により断念
- iPhone 16 Pro Max Clicks キーボード: 親戚からの贈り物(※適切な iPhone が入手できていないのが課題)
- Adafruit SHARP メモリ表示ボード
私は「穴熊脳」でこれらの要素を組み合わせていました。特に以下の情報を事前に知っていたことが、プロジェクトの条件づけとなりました。
- sqfmi による Beepy
- Playdate
コアコンポーネント:モデム・ディスプレイ・キーボード
モデム(4G 通信機能)
サプライチェーンの奇跡により、Wi-Fi/Bluetooth を搭載し、ディスプレイ付き、完全バッテリー駆動の解凍済み OpenStick が送料込みで20 ドル以下で購入できました。これがプロジェクトの中核です。
- 機種選定: ディスプレイ付きモデルを採用(ディスプレイなしモデルは LED 交換のみで対応可能)
- OS 環境: 標準 Android だが、ADB を介して EDL モードへ入ることで Linux 書き換えが可能
- 参考リソース
- OpenStick (公式サイト)
- github openstick.de
- wvthoog.nl ブログ
- 起動用カーネル:
extowerk.com
⚠️ 重要: Linux 化ではドライバとデブツリー(Device Tree)の扱いが最大の難所です。稼働中のデバイスからデブツリーを抽出して参考にするのがおすすめです。
キーボード
Clicks キーボードは使い心地が良いですが、価格は高額です(※切り出しが必要なため)。
- 接続方式: MFi 認証済み Apple 固有エンドポイント付き USB キーボード実質
- 制御: Clicks モバイルアプリによる設定・更新必須
- チップ: CH32V203 など(カスタムコードは現在不要)
ディスプレイ
コントラストが高く、メッセージング専用デバイスに適した Adafruit SHARP メモリ表示ボードを使用。
自作基板(アダプタ用 PCB)と加工
MF800 はオンボードに 5V 昇圧器が搭載されていないため、カスタム PCB の追加が必要でした。また、物理サイズに合わせて USB コネクタの切断も必要です。
PCB 搭載チップリスト
- TUSB320: USB ホスト/デバイスモード切り替え
- SN74LVC8T245: レベルシフタ
- MCP1640: 5V 昇圧器
- TPS22917 (高側・低側): VBUS/VBAT チェンジ管理
- コネクタ: USB、FPC (ディスプレイ)
- テストパッド: MF800 接続用
加工プロセス
- PCB と組立を並行して発注(2 面組立は高価なため片面設計へ妥協)
- カット作業は予想以上に成功し、重要配線が通っていないことが確認
- USB ビア(貫通孔)の状態に少し懸念あり
配線と接続の試行錯誤
ワイリング No.1:初回接続
再利用した旧ディスプレイのパッドを使用しましたが、後から考えると愚かな選択でした。
- プロセス:
- 電源供給部をテスト(独立して確認可能)
- USB 部分のテスト
- ラップトップ
でデバイス検知確認dmesg
- 驚きの発見: High-Speed USB の動作。配線長不足ではなく、配線同士を強くねじることで即席的に動作!
ワイリング No.2:ディスプレイ SPI 接続
デブツリー(Device Tree)の再構成を確認し、Qualcomm ドライバと互換性を持たせるための設定を行いました。
spi@78b9000 { compatible = "qcom,spi-qup-v2.2.1"; reg = <0x78b9000 0x500>; // ... (他パラメータ略) spidev@0 { compatible = "rohm,dh2228fv"; // ドライバ回避策 reg = <0>; spi-max-frequency = <16000000>; spi-cs-high; }; };
- 試行錯誤:
ユーティリティで MOSI/CLK 電圧変化確認(オシロスコープなし)spi-pipe- ドライバの CS ピン処理不具合への対応:
を使用して手動トグルを試行libgpiod - 安易な接続後にディスプレイが一瞬だけ点灯し、壊れると勘違いしたが実際には正常動作
再ワイリング:完全リセット
信号線(MOSI/CLK)やグラウンド配線に不具合があったため、全てを再配線しました。
- 変更点: 磁気線を信号線と電源線に使用(太く、曲がり後も位置が固定)
- 除外項目: USB データラインはメインボードパッドの不安定性のため未再配線
ディスプレイ用カーネルドライバの実装
Python スクリプトでの簡易テストを経て、本格的な動作にはDRM ドライバが必要です。今回は Ardangelo の
sharp-drm-driver を採用しました。
採用理由
- 動画再生(mpv など)への直接出力可能
- X / Wayland 環境の実行が容易
- デスクトップ環境での遊び要素が可能
- 部分更新機能の実装余地あり
最終デブツリー設定
CS ロジックをドライバ側で処理する構成にしました。
spi@78b9000 { // ... (SPI ブロック定義略) sharp_drm@0 { compatible = "sharp-drm"; reg = <0>; spi-max-frequency = <4000000>; cs-gpios = <0x49 18 1>; // CS ピン定義 }; };
ビルドとパッチ
- カーネル:
(モジュール有効化済み)6.12.1-msm8916 - 追加機能: デュイニング(ダithering)を追加
- 動画用: Atkinson アルゴリズム
- スティル画像用: Floyd-Steinberg アルゴリズム
⚠️ 現状の課題: 閾値に基づいて黒/白に変換する処理があり、汎用的な用途では外観が悪化するためダithering が有効化されています。詳細は GitHub リポジトリをご覧ください。
エンクロージャと最終組み立て
設計プロセス
Apple の USB-C コネクタまでの距離非公表のため、標準ケーブルで測定し補間を行いました。3D プリンティングによる検証も実施しましたが、部品不足によりカバー部分に欠損があります。
暫定的な最終エンクロージャ
工具類の一時利用不能により、クリップ式ではなく**ホットグール(高温融着)**での組み立てに切り替えました。
- 解決策: ケースの切り欠きやプンパーボタンは、小さな穴とピンで代替
- キーボードケースカット: 工具なしでの手作業実施(端部の整地を後から行う予定)
- 追加部品: 4G フレキシブル PCB アンテナ、ミニ SIM カードスロット
機能設定と未解決課題
バッテリー設定
Android デブツリーからコピーした高度な設定を採用。しかし、ドライバからは電圧と充電フラグのみが提供されるため、パーセント値計算はアプリ側で行う方針です。
- 充電機能: USB パススルーポートでも動作可能(※デバイス起動必須)
未解決の問題(Missing)
最大の課題は睡眠モードの実装です。
- 理由: モデム常時オン時のテスト不足、電源ボタンの欠如
- 将来予定: メッセージング本番運用前に高速化対応を行う予定
追加機能の検討事項
- タッチスクリーン・スクロールホイール(実装コスト低)
- 音声・振動機能(増幅器用スペース確保可能)
不整(The Ugly)と今後の展望
現状の不具合
- 接着剤問題: 電源ボタンが配置できない
- バッテリー固定: ケース外で落下するためテープ留め
- ケース形状: ギザギザな端部のやすり処理必要
- ディスプレイアライメント: FPC カードの張力により PCB が浮く、カバータブの欠落
- 表示歪み: ケース縁で 1〜2 ピクセル覆われている
まとめ
視覚的な面ではさらなる改善の余地がありますが、プロジェクト全体としては非常に気に入っています。再現や類似製作を検討されている方は、GitHub リポジトリから詳細情報を入手可能です。
📝 ソフトウェアについて 本記事からは意図的にソフト面の詳細を省いています。なぜなら、実際の使用を通じた修正が必要であり、「未完了だが放置していない状態」でのリリースは好まないからです。既にメモリリークの発見とパッチ公開を行っているためです。
連絡先:
veggie_privacy_8y@icloud.com