{"id":46841044,"url":"https://github.com/ryoheihashimoto/pi-obd-meter","last_synced_at":"2026-06-10T04:00:38.126Z","repository":{"id":342174983,"uuid":"1173118227","full_name":"RyoheiHashimoto/pi-obd-meter","owner":"RyoheiHashimoto","description":"OBD-2車載燃費メーター — Raspberry Pi 4 + ELM327で速度・RPM・瞬間燃費をリアルタイム表示。Google Sheetsに走行記録を自動送信","archived":false,"fork":false,"pushed_at":"2026-06-07T12:55:38.000Z","size":942,"stargazers_count":0,"open_issues_count":24,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-07T14:16:58.490Z","etag":null,"topics":["car-meter","elm327","fuel-economy","golang","obd2","raspberry-pi"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RyoheiHashimoto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-05T02:57:33.000Z","updated_at":"2026-04-16T16:31:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/RyoheiHashimoto/pi-obd-meter","commit_stats":null,"previous_names":["ryoheihashimoto/pi-obd-meter"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/RyoheiHashimoto/pi-obd-meter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyoheiHashimoto%2Fpi-obd-meter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyoheiHashimoto%2Fpi-obd-meter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyoheiHashimoto%2Fpi-obd-meter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyoheiHashimoto%2Fpi-obd-meter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RyoheiHashimoto","download_url":"https://codeload.github.com/RyoheiHashimoto/pi-obd-meter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyoheiHashimoto%2Fpi-obd-meter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34136112,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["car-meter","elm327","fuel-economy","golang","obd2","raspberry-pi"],"created_at":"2026-03-10T13:08:18.063Z","updated_at":"2026-06-10T04:00:38.119Z","avatar_url":"https://github.com/RyoheiHashimoto.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pi-obd-meter\n\n**OBD-2 / CAN 直結 車載メーター + 走行記録 + スマホダッシュボード**\n\nRaspberry Pi 4 + CAN HAT で速度・RPM・スロットル・インマニ圧・瞬間燃費を5インチLCDにリアルタイム表示。\n走行距離・メンテナンス状態を Google Sheets に自動記録し、スマホから給油記録・ODO補正・メンテナンス管理ができる。\n\n描画は **WPE WebKit (cog)** を Wayland コンポジタ **labwc** 上で実行するキオスク構成。SVG `\u003cuse\u003e` ベースの fake bloom で\n軽量かつグローのある質感、オープニングアニメ Phase 1〜3、ACC 時の全体消灯、フリーズ自動復帰の watchdog 内蔵。\n\n## 対応車種\n\n**CAN 11bit 500kbaud (標準的な OBD-2 CAN) の車ならほぼ全車対応。** 2000年代半ば以降の国産車であれば大抵動く（日本車のOBD-2義務化は2010年、CAN 義務化は2008年）。ELM327 Bluetooth モードはフォールバック。\n\n### 推奨: CAN 直結 (SocketCAN)\n\nCAN HAT (例: Waveshare RS485 CAN HAT, PiCAN2 等) を Pi の GPIO に接続し、OBD ポートから CAN High/Low を直結。SocketCAN (`can0`) でカーネルが全フレームをパッシブ受信する。\n\n- **レイテンシ極低** (Bluetooth なし = 数ms で値更新)\n- **全 CAN フレーム可視** (ECU 間通信、AT 制御、BCM 等も取れる)\n- **対応 PID が多い** (OBD クエリに頼らず CAN 生フレーム直読み)\n\nDYデミオ (DBA-DY3W) での検出内訳:\n\n| CAN ID | 内容 | 周期 |\n|---|---|---|\n| 0x201 | RPM + 車速 + エンジン負荷 | 100Hz |\n| 0x230 | ギア + ギア比 + トルク要求 | 40Hz |\n| 0x231 | レンジ (P/R/N/D/S/L) + HOLD + TC ロックアップ + 変速中 | 40Hz |\n| 0x420 | 水温 + 距離パルス | 10Hz |\n| 0x430 | オルタ負荷 + 電圧 + 大気圧 | 20Hz |\n| 0x4B0 | 4輪個別速度 | 71Hz |\n| OBD PID | MAF / 燃料トリム / 点火タイミング / 吸気温度 / O2 等 18 種 | クエリ時 |\n\n### フォールバック: ELM327 Bluetooth\n\nClassic Bluetooth (SPP) で `/dev/rfcomm0` 経由。CAN HAT がない環境での簡易構成。対応 PID は少なく、レイテンシは 50-100ms/PID。\n\n### 対応できない車\n\n- EV / HV の電動走行モード（エンジン回転なし）\n- 1996年以前の旧車（OBD-2未搭載）\n\n### 動作確認済み車種\n\n| 車種 | 型式 | エンジン | プロトコル | 検出PID数 |\n|------|------|----------|---------------|-----------|\n| マツダ DYデミオ | DBA-DY3W | ZJ-VE 1.3L | CAN 11bit 500kbaud | 28 |\n\n## 機能\n\n### 車載メーター (5インチ LCD)\n- 速度の270° SVGアークゲージ（速度帯で色が変化）\n- スロットル開度アーク（内側、HSLグラデーション）\n- RPMアーク（外側、レッドゾーン背景付き）\n- ゲージ左上にレンジ、右上にギア番号、HOLD/LOCKラベル\n- 右パネル: バキューム計 (-1.0〜0 Bar) + 4行インジケーター (ECO/TEMP/TRIP/OIL)\n- **fake bloom** による軽量な光の尾 (針は 0.6s 残像追従、アークは静的幅広グロー)\n- 大数値 (speed/RPM/MAP) にオフセット影で立体感\n- **オープニングアニメ** Phase 1 (針 sweep out) → Phase 2 (sweep back) → Phase 3 (テキストフェードイン) → 通常\n- **ACC 検出** (CAN エンジン ECU 1秒無通信) で全体フェードアウト、再接続で自動復帰\n- **フリーズ watchdog** (rAF 3秒停止で `location.reload()`) + エラー自動ロギング\n- WebSocket 優先 (/ws/realtime) + HTTP フォールバック\n- 60fps、時刻ベース自動輝度調整\n- 画面3秒長押しでキオスク終了\n\n### 自動記録 (Google Sheets)\n- **トリップ記録**: 走行距離・最高速度・平均速度・走行時間・アイドル時間・燃料消費量\n- **メンテナンス状態**: 走行距離/日付ベースのリマインダー（エンジン始動時 + 5分間隔で送信）\n- **燃費推定**: MAF \u003e MAP (Speed-Density) \u003e 負荷×RPM の優先順位で自動選択\n\n### スマホダッシュボード (GAS Webアプリ)\n- 給油記録（日付・距離・給油量 → 燃費自動算出）\n- ODO補正（メーター実値との差分を補正）\n- メンテナンス進捗確認・リセット\n- ダークテーマ、ホーム画面追加対応\n\n## アーキテクチャ\n\n![アーキテクチャ](docs/architecture.svg)\n\n### データフロー\n\n```\nECU ──CAN──\u003e CAN HAT ──SocketCAN──\u003e pi-obd-meter (Go)\n                                      ├──WebSocket──\u003e meter.html (cog/WPE WebKit on labwc)\n                                      └──HTTPS──────\u003e GAS Webhook ──\u003e Google Sheets\n                                                        ↕\n                                   スマホブラウザ ──\u003e GAS doGet (給油記録/ODO補正/メンテ管理)\n```\n\n### キオスク構成\n\n```\nsystemd ──\u003e greetd (autologin as laurel)\n              └─\u003e labwc (Wayland compositor)\n                   ├─\u003e swaybg (黒背景)\n                   └─\u003e cog --ozone-platform=wayland --kiosk http://localhost:9090/meter.html\n```\n\n- `greetd` がユーザー自動ログイン、`labwc` が Wayland コンポジタ、`cog` が WPE WebKit ランチャ\n- X11/lightdm/Chromium は使わない (Wayland 白フラッシュ回避、低メモリ)\n- フロントは HTML+CSS+SVG+JS、埋め込み (go:embed) で単一バイナリ配信\n\n### 通信構成\n\n![通信構成図](docs/communication-diagram-v2.svg)\n\n## ハードウェア\n\n### パーツリスト (CAN 直結構成)\n\n| # | パーツ | 選定品 | 目安価格 |\n|---|--------|--------|---------|\n| 1 | CAN HAT | Waveshare RS485 CAN HAT (MCP2515) | ~2,000 |\n| 2 | Raspberry Pi | Pi 4 Model B 2GB (技適あり) | ~7,000-9,200 |\n| 3 | ケース | GeeekPi アルミケース (デュアルファン) | ~2,000 |\n| 4 | ディスプレイ | ELECROW 5インチ IPS HDMI (800x480) | ~5,699 |\n| 5 | microSD | SanDisk MAX ENDURANCE 32GB | ~1,200 |\n| 6 | モニター固定 | スマホホルダー | ~300-1,000 |\n| - | 電源 | シガーソケット USB-C (5V/3A) | - |\n| - | OBD ケーブル | OBD-II to DB9 or 直結線 | ~500 |\n\n**合計: 約18,000-20,000円**\n\n### 選定理由\n\n- **CAN HAT MCP2515**: SPI 接続、12MHz クリスタル (実装差に注意、詳細 [docs/configuration.md](docs/configuration.md))。BT より遥かに低レイテンシ・高情報量\n- **Pi 4 2GB**: ARM64, WiFi/BT内蔵。WPE WebKit + labwc の常駐負荷に耐える\n- **アルミケース+デュアルファン**: ダッシュボード上は79-85°Cに達するため\n- **MAX ENDURANCE**: 書込耐久15,000時間。journald/状態ファイル/auto-update での摩耗に耐える\n- **ELECROW 5インチ IPS**: HDMI接続、IPSパネル(178°広視野角)、Pi USBから給電可\n\n## セットアップ\n\n詳細は [docs/setup-guide.md](docs/setup-guide.md) を参照。\n\n### クイックスタート (CAN 直結)\n\n```bash\n# 1. CAN HAT 有効化 (Pi 側)\n# /boot/firmware/config.txt に:\n#   dtparam=spi=on\n#   dtoverlay=mcp2515-can0,oscillator=12000000,interrupt=25\n# /etc/network/interfaces.d/can0 で ip link up can0 bitrate 500000 を設定\n\n# 2. 初回セットアップ（ディレクトリ作成 + systemd登録 + swap無効化）\n./scripts/deploy.sh setup\n\n# 3. Google Apps Script のセットアップ\n#    GASエディタでwebhook.gsを貼り付けてデプロイ\n#    → URLをconfigs/config.json の webhook_url に設定\n#    ※ 以降の更新は make deploy-gas または git push で自動反映\n\n# 4. デプロイ\nmake deploy\n```\n\n### キオスク関連パッケージ\n\n```bash\nsudo apt install -y greetd labwc cog swaybg wlr-randr\n```\n\n### ディスプレイ設定\n\nELECROW 5インチ用に `/boot/firmware/config.txt` へ追記:\n\n```\nhdmi_force_hotplug=1\nmax_usb_current=1\nhdmi_drive=1\nhdmi_group=2\nhdmi_mode=87\nhdmi_cvt 800 480 60 6 0 0 0\n```\n\n## 車両設定\n\n`configs/config.json` で車両ごとのパラメータを設定する。全パラメータの詳細は [docs/configuration.md](docs/configuration.md) を参照。\n\n```json\n{\n  \"can_interface\": \"can0\",\n  \"serial_port\": \"/dev/rfcomm0\",\n  \"webhook_url\": \"https://script.google.com/macros/s/XXXXXX/exec\",\n  \"engine_displacement_l\": 1.3,\n  \"max_speed_kmh\": 180,\n  \"initial_odometer_km\": 98000,\n  \"fuel_rate_correction\": 1.3,\n  \"throttle_idle_pct\": 1,\n  \"throttle_max_pct\": 197,\n  \"fuel_tank_l\": 40,\n  \"obd_protocol\": \"6\",\n  \"poll_interval_ms\": 50,\n  \"local_api_port\": 9090,\n  \"maintenance_reminders\": [\n    { \"id\": \"oil_change\", \"name\": \"エンジンオイル交換\", \"type\": \"distance\", \"interval_km\": 3000, \"warning_pct\": 0.8 }\n  ]\n}\n```\n\n`can_interface` が空文字列だと ELM327 (`serial_port`) フォールバック。CAN 直結時は `\"can0\"` を指定。\n\n他車種への適用時に必要なチューニング項目は [docs/calculation-logic.md](docs/calculation-logic.md) を参照。\n\n## プロジェクト構成\n\n```\npi-obd-meter/\n├── cmd/\n│   ├── pi-obd-meter/         # メインアプリ（車載）\n│   │   ├── main.go           #   エントリポイント + graceful shutdown + SSH 復旧\n│   │   ├── app.go            #   アプリケーションロジック\n│   │   ├── api.go            #   ローカル HTTP API (/api/realtime, /api/client-error 等)\n│   │   ├── can_loop.go       #   CAN 直結ループ (SocketCAN)\n│   │   ├── obd_loop.go       #   ELM327 ループ (フォールバック)\n│   │   ├── config.go         #   設定読み込み + バリデーション\n│   │   ├── fuel.go           #   燃費計算 (MAF / MAP / 負荷×RPM)\n│   │   ├── filter.go         #   OBDスパイク除去フィルター\n│   │   └── update.go         #   自動更新 (go-selfupdate)\n│   └── pi-obd-scanner/       # PIDスキャナー（診断用）\n├── internal/\n│   ├── can/                  # SocketCAN ラッパ + フレームデコーダ\n│   ├── obd/                  # ELM327通信、PID定義、DTC\n│   ├── trip/                 # トリップ追跡（車速積分、燃料積算、状態永続化）\n│   ├── sender/               # GAS Webhook送信（リトライキュー）\n│   ├── display/              # 画面輝度制御（時刻ベース、wlr-randr）\n│   ├── maintenance/          # メンテナンスリマインダー\n│   └── atomicfile/           # アトミックファイル書き込み\n├── web/\n│   ├── embed.go              # go:embed でstatic/をバイナリに埋め込み\n│   └── static/\n│       ├── meter.html        # メーター画面HTML\n│       ├── meter.css         # CSS (Custom Properties + ACC フェード + 起動アニメ)\n│       ├── js/\n│       │   ├── main.js       # エントリ + WebSocket + watchdog + エラー通知\n│       │   ├── gauge.js      # 速度ゲージ + fake bloom + 針残像 + オフセット影\n│       │   └── indicators.js # 右パネル バキューム + 4行インジケーター + アイコン bloom\n│       └── fonts/            # Orbitron, ShareTechMono\n├── gas/\n│   ├── webhook.gs            # Google Apps Script（記録 + Webダッシュボード）\n│   ├── .clasp.json\n│   └── appsscript.json\n├── configs/\n│   ├── config.json           # 実機 config\n│   ├── config.mac.json       # Mac ローカル demo 用\n│   ├── pi-obd-meter.service  # systemd メインサービス\n│   ├── cog-kiosk.sh          # cog キオスク起動スクリプト (labwc autostart から)\n│   ├── kiosk.sh              # (互換: 旧 Chromium 版)\n│   ├── auto-update.service   # systemd 自動更新 (oneshot)\n│   └── auto-update.timer     # systemd 自動更新タイマー (2分間隔)\n├── scripts/\n│   ├── deploy.sh             # 開発・デプロイスクリプト\n│   ├── auto-update.sh        # Pi 自動更新スクリプト\n│   ├── capture-screenshots.sh\n│   └── drive-test.sh         # 実走テスト (candump + スクショ)\n├── docs/                     # ドキュメント\n├── .github/workflows/        # CI/CD (ci.yml, deploy-dev.yml, release.yml, deploy-gas.yml)\n├── CLAUDE.md                 # AI開発支援用プロジェクト説明\n└── go.mod\n```\n\n## 開発\n\n詳細は [docs/development.md](docs/development.md) を参照。\n\n### ローカル Demo (Mac)\n\n```bash\n# CAN 接続を disable した Mac 用 config を使用\ngo run ./cmd/pi-obd-meter -demo -config configs/config.mac.json\n\n# Safari で開く (WPE WebKit と同じエンジン = 実機に近い挙動)\nopen -a Safari http://localhost:9090/meter.html\n```\n\n### Make ターゲット\n\n```bash\nmake deploy          # ビルド + rsync転送 + サービス再起動\nmake logs            # リアルタイムログ表示\nmake ssh             # ラズパイにSSH接続\nmake status          # サービス状態確認\nmake restart         # サービス再起動（転送なし）\n\nmake test            # テスト実行\nmake lint            # golangci-lint\nmake check           # lint + test\nmake build           # ローカルビルド\n\nmake deploy-gas      # gas/webhook.gs を GAS に push\nmake release         # パッチ自動インクリメント (develop → main PR)\nmake release V=v1.1.0  # バージョン明示指定\n```\n\n### CI/CD\n\n![CI/CD パイプライン](docs/cicd.svg)\n\n| ワークフロー | トリガー | 内容 |\n|---|---|---|\n| **CI** | push / PR (main, develop) | lint + test + build (host + ARM64) |\n| **Deploy Dev** | CI成功 (develop) | ARM64ビルド → `dev-latest` pre-release |\n| **Release** | タグ `v*` push | ARM64ビルド → GitHub Release |\n| **Deploy GAS** | push (main, develop) + `gas/` 変更 | ESLint → clasp push → clasp deploy |\n| **Claude Review** | PR open / `@claude` メンション | AIコードレビュー |\n\n**main ブランチは保護されており**、CI (`test` ジョブ) の通過が必須。\n\n### Pi 自動更新\n\n`auto-update.timer` (systemd) が 2分間隔で GitHub Releases をポーリング。\n新ビルド検出時にダウンロード → バイナリ + `web/static/` 差し替え → サービス再起動を自動実行。\n\n1. Stable release (`latest`) を優先チェック\n2. なければ dev build (`dev-latest` pre-release) をチェック\n\n### 起動時間\n\nNetworkManager 遅延起動 (10s timer) + plymouth 削除 + 不要サービス停止で、\n`systemd-analyze` 上 **約 7 秒 (kernel 2.2s + userspace 4.8s)**。\n\nメーター表示完了まで ~9-10s (cog + WebKit 起動含む)。詳細は #109。\n\n## ドキュメント\n\n| ドキュメント | 内容 |\n|---|---|\n| [docs/setup-guide.md](docs/setup-guide.md) | Raspberry Pi 初期セットアップ、CAN HAT 設定、ディスプレイ、GAS設定 |\n| [docs/development.md](docs/development.md) | ブランチ戦略、CI/CD、リリースフロー、デプロイ |\n| [docs/configuration.md](docs/configuration.md) | config.json 全パラメータ、車種チューニング |\n| [docs/calculation-logic.md](docs/calculation-logic.md) | 燃費推定・インジケーター・閾値の算出ロジック |\n| [docs/wifi-troubleshooting.md](docs/wifi-troubleshooting.md) | Wi-Fi 接続問題の診断・復旧手順 |\n\n## ライセンス\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryoheihashimoto%2Fpi-obd-meter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryoheihashimoto%2Fpi-obd-meter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryoheihashimoto%2Fpi-obd-meter/lists"}