OpenCCVoice for DVSwitch 構築・導入・設定 マニュアル
OpenCCVoice for DVSwitch 構築・導入・設定マニュアル
~ Bookworm + DVSwitch-Server 版の手引き ~
自動音声応答(デジピーター)システム — Bookworm + DVSwitch-Server 版
このマニュアルの位置づけ
Raspberry Pi Zero 2 W(Raspberry Pi OS Bookworm 32-bit)上に DVSwitch-Server を構築し、DMR ネットワーク(TGIF)で自動音声応答を行うシステム「OpenCCVoice for DVSwitch」の、新規構築から運用までを通しで再現できる実務マニュアルです。
すべて実機(ホスト名 OCV)で検証済みの手順に基づきます。手順とその理由を簡潔に記載し、設計思想・開発秘話・試行錯誤の背景は別冊『開発ノート(ブログ材料)』に分離しています。
対象構成:
- OS: Raspberry Pi OS (Legacy, 32-bit) Lite — Debian Bookworm ベース
- ホスト名:
OCV/ユーザー名:ocv(ホームは/home/ocv、ファイル所有権はocv:ocv。配布ドキュメントのpi-starはocvに読み替え) - Bot: デーモン本体
dvswitch_bot.py+設定ツールbot_setup.py(分離構成) - スクリプト配置:
/opt/dvswitch_bot/bin/に集約 - 接続先:TGIF Network
凡例:✅ 検証済み / ⚠️ 要注意(実機の値が正)/ 🔴 重大(外すと成立しない)

目次
第1章:準備
第2章:OS と DVSwitch-Server
第3章:設定と確認
- 9. スクリプト一式の取得
- 10.
dvs_config.shで TGIF 用の値を確定 - 11. サービス起動確認と
md380-emu修正 - 12. Monit Service Manager(:2812)の表示修正
- 13. DVSwitch Dashboard(:80)の表示設定
第4章:音声と Bot
第5章:運用
付録
- 付録A:トラブルシューティング早見表
- 付録B:固定 WAV の個別コマンド生成
- 付録C:DVSwitch 側 ini の手動編集(参照用)
- 付録D:ダッシュボードの Platform 表示を正す
- 付録E:クイックリファレンス
最短ルート(クリーン構築):5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 → 13 → 14 → 15 → 16 → 17 → 18。付録は参照用。
第1章:準備
1. システムの全体像
dvswitch_bot.py (USRP パケット生成)
│ USRP (UDP 51000)
▼
┌─────────────────────┐
│ Analog_Bridge │ ← 音声プロトコル変換ゲートウェイ
└──────────┬──────────┘
│ AMBE 変換 (UDP 2470)
▼
┌─────────────────────┐
│ md380-emu │ ← PCM ⇔ AMBE ソフトウェア変換
└──────────┬──────────┘
▼
┌─────────────────────┐
│ MMDVM_Bridge │ ← TGIF ネットワークへの橋渡し
└──────────┬──────────┘
│ DMR (UDP 62031)
▼
TGIF Network| コンポーネント | 役割 | 重要度 |
|---|---|---|
dvswitch_bot.py | ログ監視・カーチャンク検知・WAV 送信 | 🔴 必須 |
analog_bridge | 音声プロトコル変換ゲートウェイ | 🔴 必須 |
md380-emu | PCM ⇔ AMBE ソフトウェアコーデック | 🔴 必須 |
mmdvm_bridge | TGIF(DMR ネットワーク)接続中核 | 🔴 必須 |
webproxy | ダッシュボード補助 | 補助 |
bot の動作:
- MMDVM_Bridge のログを tail -f で監視
- 特定パターン(カーチャンク信号)を検出
- USRP パケットで Analog_Bridge に WAV データを送信
- Analog_Bridge → md380-emu → MMDVM_Bridge → TGIF 経由で DMR 送信
- 毎正時の時報(任意で毎 30 分の案内も追加可。TIME_SIGNAL_MODE で切替)
- 起動アナウンス(起動の数秒後に「起動しました。」を 1 回送出)
- 定時メッセージ(001/002 を交互送出)
- ナイトモード(夜間は時報・定時を抑制。カーチャンク応答は 24 時間動作)
- ログローテーション自動追従(日付が変わっても監視を継続)
- watchdog 擬似終端救済(SFR 中継で終端が落ちた送信も拾ってカーチャンク応答)
2. 事前準備チェックリスト
ハードウェア
- ☐ Raspberry Pi Zero 2 W(起動・SSH 接続可)
- ☐ microSD カード(16 GB 以上、Class 10 推奨)
- ☐ 電源(5 V 2.5 A 以上)
資格・登録
- ☐ アマチュア無線技士免許(第三級以上推奨)
- ☐ DMR ID の登録(https://radioid.net/)
- ☐ TGIF Network アカウント(https://tgif.network/)
知識・準備
- ☐ SSH でラズパイに接続できる
- ☐
sudoコマンドが使える - ☐ ラズパイの IP アドレスを把握している
3. 専門用語ミニ辞典
| 用語 | 意味 |
|---|---|
| DMR | Digital Mobile Radio。デジタル業務無線規格を流用したアマチュア無線方式 |
| AMBE | DMR で使われる音声圧縮方式(特許あり) |
| USRP | DVSwitch 内で使われる音声転送プロトコル名。bot → Analog_Bridge 間で使用 |
| PCM | 生(無圧縮)のデジタル音声データ |
| Analog_Bridge | DVSwitch の中核。音声プロトコルを変換 |
| MMDVM_Bridge | MMDVM 系プロトコルを DVSwitch に橋渡しし、DMR ネットワークに接続 |
| md380-emu | MD-380 ファームを利用した AMBE ソフトウェア変換器 |
| カーチャンク | 短時間の PTT 操作(「ブッ」というキー操作) |
| TG(トークグループ) | DMR の通話グループ |
| ESSID | DMR ID に付ける 2 桁の枝番号 |
4. 構築の急所
再現時に必ず意識すべき決定的ポイント。詳細は各章で扱う。
- 🔴
md380-emuを動かすには 2 つの必須操作がある(別問題・両方必要)。- (a)
qemu-user-staticを 5.2(Bullseye 版)にダウングレードしapt-mark holdで固定(qemu 7.2 では SEGV) - (b)
md380-emuバイナリにchmod +xで実行権限を付与(無いと Permission denied)
- (a)
- ⚠️ USRP ポートは
rxPort=51000/txPort=51001。bot の送信先は 51000。 - ⚠️ Open JTalk の辞書パスは
/var/lib/mecab/dic/open-jtalk/naist-jdic(open-jtalk/を含む)。 - ⚠️ OS は Bookworm に固定する。
sources.listが trixie を指していないか確認。 - 🔴
dvsの「01 初期設定」完走が ini 生成の前提条件。これを通さないと/opt/Analog_Bridge/の ini が生成されず、dvs_config.shが前提を満たせない。 - ⚠️ 「Does not exist」は monit の httpd 無効が主因。OS 世代とは無関係。
- 🔴 Bot は「設定ツール+デーモン本体」構成を使う。対話設定内蔵の旧版は systemd 常駐で
EOFError停止する。
第2章:OS と DVSwitch-Server
5. OS 準備
5-1. OS 書き込み・初回起動 ✅
Raspberry Pi Imager で 「Raspberry Pi OS Lite (Legacy, 32-bit)」(”A port of Debian Bookworm …” と表示されるもの)を選び、microSD に書き込む。”Legacy” の付かない最新版は trixie の可能性があるため選ばない。SSH・WiFi・ロケール等の初期設定の際、ユーザー名を「ocv」に設定する(Raspi 初回起動時)。設定を済ませてから起動する。なお、Imager の事前設定(OS カスタマイズ)が使えない古いイメージ(FTP サイト等から取得した .img.xz 等)を書き込む場合は、初回起動後に 付録F:raspi-config 操作手順 に従ってユーザー ocv の作成・ホスト名(OCV)の変更・SSH 有効化・固定 IP・タイムゾーンを設定する。
OS イメージ直リンク(Imager から取れない場合)
本検証で使用したのは 2025-05-13-raspios-bookworm-armhf-lite.img.xz(約 493 MB)。ファイル名に bookworm を含むものを必ず選ぶ。
# JAIST(北陸先端大)ミラー — 国内・高速 https://ftp.jaist.ac.jp/pub/raspberrypi/raspios_lite_armhf/images/raspios_lite_armhf-2025-05-13/2025-05-13-raspios-bookworm-armhf-lite.img.xz # 公式(Raspberry Pi 財団) https://downloads.raspberrypi.com/raspios_lite_armhf/images/raspios_lite_armhf-2025-05-13/2025-05-13-raspios-bookworm-armhf-lite.img.xz
リンク切れ時:各ミラーの raspios_lite_armhf/images/ 配下から、ファイル名に bookworm を含む ...-armhf-lite.img.xz を選ぶ。stable が trixie に切り替わった後は raspios_oldstable_lite_armhf/ 側で bookworm を探す。
起動後に確認:
uname -a # ... armv7l を確認
5-1b. SSH(sshd)の有効化 ✅
初回起動後、raspi-config コマンドを実行し、Interface Options のメニューから SSH を有効にする。設定後はリブートが入る。
sudo raspi-config # Interface Options → SSH → Enable → Finish → リブート
5-2. 🔴 sources.list が bookworm であることを確認 ✅
apt upgrade の前に、リポジトリが bookworm を指していることを確認する。trixie だとアップグレードで OS 世代が上がり、monit 等の挙動が手順と食い違う。
grep -rE "bookworm|trixie" /etc/apt/sources.list /etc/apt/sources.list.d/ cat /etc/os-release | grep VERSION_CODENAME # bookworm であること
出力がすべて bookworm で、trixie が一つも無いことを確認する。
5-3. システム更新 ✅
sudo apt update && sudo apt upgrade -y sudo reboot
再起動後、apt update の出力に bookworm のみが出て trixie が出ないことを確認する。
⚠️ HDMI とキーボードを接続して作業することを推奨
nmtui で IP アドレスを固定し、SSH 接続が確立できるまでは、HDMI モニターとキーボードを Raspberry Pi に接続した状態で作業を行うこと。
6. ネットワーク(固定 IP)
無人運用するため、IP アドレスを固定しておくと管理しやすい。Bookworm は NetworkManager が既定のため、nmtui(テキスト UI)で設定するのが簡単。
sudo nmtui
[Edit a connection] → 使用中の接続を選択 → [IPv4 CONFIGURATION] を [Manual] にして、アドレス(例 192.168.x.x/24)・ゲートウェイ・DNS を入力 → 保存。反映:
sudo systemctl restart NetworkManager # または再起動 ip addr # 設定した IP を確認
⚠️ Bullseye 時代の dhcpcd.conf 方式は Bookworm では標準で効かない。nmtui/nmcli または /etc/NetworkManager/system-connections/ を使う。
7. DVSwitch-Server インストール
7-1. リポジトリ登録 ✅
cd /tmp wget http://dvswitch.org/bookworm cat bookworm # 中身を確認(GPG キー取得とリポジトリ追加のみ) chmod +x bookworm sudo ./bookworm
Verified: Valid DVSwitch Keyring (72147EC1E788D4C3) と Finished DVSwitch repository install が出れば成功。
🔴 OS 世代に合った 1 本のスクリプトを使う。Bookworm なら bookworm、Bullseye なら buster を流用する。公式手順に「bookworm を実行してから buster へ切替」のような二段階は存在しない。誤った codename を実行した場合は、dvswitch.list と関連キーリングを削除し、正しいスクリプトを実行し直して再生成させる。
7-2. 本体インストール ✅
sudo apt install dvswitch-server -y
Error, YSFHosts.txt file does not seem to be validは 無害(YSF 未使用時)。Could not execute systemctl(chroot 起因)も実機起動後は問題なし。
8. dvs の初期設定(ini 生成)と TGIF 切替
8-1. 🔴 初期設定メニュー(ini 生成のために必須) ✅
メニューの実体は /usr/local/dvs/dvs(dvswitch-menu ではない)。
sudo /usr/local/dvs/dvs
🔴 この初期設定(01)を一度完走しないと /opt/Analog_Bridge/ の ini が生成されない。ini が無いまま後段の dvs_config.sh を実行すると [ERROR] 見つかりません で止まる。
⚠️ ここで入れる値の多くは後で dvs_config.sh が上書きする。この時点では値の厳密さより「一度完走させて ini を生成すること」が目的。ポート・パスワードはデフォルトのまま通してよい。
画面遷移(Menu Script v1.61)
各ステップの コード体 は画面に実際に表示されるプロンプト、「→」の右が入力値。
- メインメニュー →
01 初期設定を選択 初めに行う設定→ [Yes]Callsign→ 例YOUR_CALLSIGNCCS7/DMR ID ?→ 例YOUR_DMRID(7 桁)CCS7/DMR ID + 2桁の数(00〜99)?→ 例YOUR_DMRID + ESSID(DMR ID + ESSID)Dstar module ? (A〜Z)→ 例B(D-STAR 未使用でも入力を求められる)USRP ポート→51001/51000(Analog_Bridge をtxPort=51001/rxPort=51000にする)Analog_Bridge.ini確認 → [Yes](デフォルト値。後で上書きされる)ローカル BM サーバー選択→ 任意(TGIF 運用では後で上書き)Brandmeister のパスワード→ デフォルトのまま Enter で可Hardware Vocoder (AMBE)→4 ハードウェア Vocoder を使わない(ソフトウェア Vocoder を使う)を選択入力終了→ [Yes]
完了後、再起動する。これで /opt/Analog_Bridge/Analog_Bridge.ini 等が生成される。
8-2. ⚠️ 詳細設定で DMR サーバーを TGIF に切替 ✅
sudo /usr/local/dvs/dvs
- メインメニュー →
02 詳細設定 - →
24 その他の DMR ネットワーク - → TGIF を選択(または手入力)
- → 戻って終了
特定の TG に接続したい場合は以下のコマンドを使う:
/opt/MMDVM_Bridge/dvswitch.sh tune 44833 # 数字は接続したい TG 番号(例:44833)。発出すると当該 TG に接続する。
第3章:設定とサービス
9. スクリプト一式の取得
9-0. 🔴 ツール置き場 /opt/dvswitch_bot/bin/ を作り、全スクリプトを取得 ✅
本システムで使う 5 本のスクリプトは、すべて /opt/dvswitch_bot/bin/ に集約する。スクリプト(実行ファイル)は bin/、bot が読む WAV・設定 JSON は /opt/dvswitch_bot/ 直下、という役割分担。
# 置き場を作成 sudo mkdir -p /opt/dvswitch_bot/bin sudo chown -R ocv:ocv /opt/dvswitch_bot # 5 本を bin/ に一括取得 cd /opt/dvswitch_bot/bin BASE=https://raw.githubusercontent.com/ji2tab/OpenCCVoice-For-DVSwitch/main for f in dvs_config.sh create_wav.sh test_send.py dvswitch_bot.py bot_setup.py; do curl -fsSL "$BASE/$f" -o "$f" done chmod +x *.sh *.py ls -la /opt/dvswitch_bot/bin/
| スクリプト | 役割 |
|---|---|
dvs_config.sh | DVSwitch ini を TGIF 用に一括設定(第 10 章) |
create_wav.sh | 固定 WAV を対話生成(第 15 章) |
test_send.py | USRP 単発送信テスト(第 16 章) |
dvswitch_bot.py | 自動応答デーモン本体(第 17 章) |
bot_setup.py | bot 設定ツール(第 17 章) |
✅ 5 本が並び実行権(x)が付いていれば取得完了。以降の各章はここで取得済みのものを使う。
10. dvs_config.sh で TGIF 用の値を確定
🔴 必須。dvs の初期設定で ini が生成されたら、dvs_config.sh でコールサイン・DMR ID・TGIF パスワード・送信 TG・USRP ポートを一括設定する。
cd /opt/dvswitch_bot/bin # バックアップ先フォルダを事前に作成(無いとバックアップ時にエラーになる) sudo mkdir -p /opt/dvswitch_bot/bak/ini /opt/dvswitch_bot/bak/wav sudo chown -R ocv:ocv /opt/dvswitch_bot/bak sudo ./dvs_config.sh
このツールがすること:
- 編集前に
/opt/dvswitch_bot/bak/ini/YYMMDDHHMMSS/へ 3 つの ini を自動バックアップ - 対話入力 5 項目:
callsign/dmrid(7 桁)/essid(2 桁)/password(TGIF)/txTg - 固定セット:
- MMDVM:
[DMR] Enable=1、[DMR Network] Enable=1、Address=tgif.network - Analog:
[USRP] txPort=51001/rxPort=51000/usrpAudio=AUDIO_USE_GAIN/tlvAudio=AUDIO_USE_GAIN
- MMDVM:
Id(MMDVM)とrepeaterID(Analog)は dmrid(7 桁)+ essid(2 桁)で組み立てるgatewayDmrId(Analog)は dmrid(7 桁)をセット
| 項目 | 入力例 | 備考 |
|---|---|---|
| Callsign | YOUR_CALLSIGN | 自局コールサイン |
| DMR ID(7 桁) | YOUR_DMRID | 自局 DMR ID |
| ESSID(2 桁) | 52 | サブ番号 |
| TGIF Password | (TGIF の値) | TGIF サイトで発行 |
| 送信 TG(txTg) | 44833 | ボット音声が乗る DMR TG |
確認画面で [y] で保存。オプション:
sudo ./dvs_config.sh -r # バックアップから復元 sudo ./dvs_config.sh -d # /opt/dvswitch_bot/bak/ini/ 配下を全削除 sudo ./dvs_config.sh -h # ヘルプ
設定反映と TGIF ログイン確認
sudo systemctl restart analog_bridge mmdvm_bridge sudo tail -40 /var/log/mmdvm/MMDVM_Bridge-$(date +%Y-%m-%d).log
dvs_config.sh は DVSwitch.ini を変更しない(バックアップのみ)。exportTG を明示設定したい場合は付録 C を参照。
TGIF が TG 4000 に戻る件:TGIF 側で Static 設定が無いと一定時間でデフォルト(4000)へ戻る。受信を継続したい場合は TGIF ダッシュボードで対象 TG を Static 登録する。
11. サービス起動確認と md380-emu 修正
11-1. サービス一覧の確認 ✅
sudo systemctl list-units --all | grep -E "analog|mmdvm|md380|bridge|webproxy"
analog_bridge/mmdvm_bridge/webproxyがactive (running)であることmd380-emuがactivating (auto-restart)になっていないか(なっていれば次節で対処)
11-2. 🔴🔴 md380-emu の SEGV と qemu ダウングレード ✅
症状:TGIF 等から信号が入り AMBE デコードが走った瞬間、md380-emu.service: ... status=11/SEGV を吐いて auto-restart を繰り返す。
原因:Bookworm 標準の qemu-user-static 7.2.x が md380-emu の ARM バイナリと非互換。Bullseye の qemu 5.2.x では正常動作する。
対処(一括実行版):
wget http://archive.raspbian.org/raspbian/pool/main/q/qemu/qemu-user-static_5.2+dfsg-11+deb11u5_armhf.deb -O /tmp/qemu52.deb && sudo systemctl stop md380-emu && sudo dpkg -i /tmp/qemu52.deb && sudo apt-mark hold qemu-user-static && sudo chmod +x /opt/md380-emu/md380-emu && sudo systemctl restart md380-emu && sleep 3 && sudo systemctl status md380-emu --no-pager && qemu-arm-static --version
🔴 必須操作は 2 つ。両方やらないと動かない。
- qemu を 5.2 へダウングレード(+
apt-mark holdで固定)… SEGV を止める chmod +xで実行権限を付与 … Permission denied を止める
この 2 つは独立した別問題。qemu-arm-static --version が 5.2.x であることを確認。
⚠️ この段階の running 表示は「起動できた」確認に過ぎない。SEGV は実デコード時に出るため、最終確認は第 16 章の送信テスト後に行う。
12. Monit Service Manager(:2812)の表示修正
対象:http://<IP>:2812/(サービス監視画面。DVSwitch Dashboard の :80 とは別物)。目的:赤字「Does not exist」(典型は Quantar_Bridge)を緑の「OK」にする。原因(2 つ。OS 世代は無関係):① monit の httpd(:2812)が無効、②プロセス自体が停止・自動起動オフ。
ステップ 1:症状確認 ✅
sudo monit status
Error receiving data -- Connection reset by peer が出れば monit の Web 機能が無効。
ステップ 2:monit の Web 機能を開通させる 🔴
行番号を確認(環境で前後する):
sudo grep -nE "set httpd|use address|allow localhost|allow admin" /etc/monit/monitrc
標準では次の 4 行がコメントアウトされている。grep の行番号に合わせて置き換える(例 159〜162):
sudo sed -i '159,162c\
set httpd port 2812 and\
use address 0.0.0.0\
allow localhost\
allow 192.168.1.0/24' /etc/monit/monitrc⚠️ 自分の LAN が 192.168.1.0/24 以外なら変更する。use address 0.0.0.0 にすること(localhost のままだと外部 IP から開けない)。パスワードを掛けたい場合は allow 192.168.1.0/24 の代わりに allow admin:monit を使う。
書き換え結果を確認:
sudo sed -n '159,162p' /etc/monit/monitrc
ステップ 3:止まっているプロセスを起動 🔴
sudo systemctl enable --now quantar_bridge
対象が他のサービスなら、その systemd ユニット名に置き換える。
ステップ 4:monit に反映させて「OK」を確認 ✅
sudo systemctl restart monit && sleep 8 && sudo monit reload && sleep 12 && sudo monit status Quantar_Bridge
status OK と出れば成功。
ハマりどころ:monit は状態収集に時間がかかる。reload 後は十数秒待ってから確認する。使わないプロセスが「Does not exist」のままでも、使う予定がなければ実害はない。
13. DVSwitch Dashboard(:80)の表示設定
対象:http://<IP>/(DVSwitch Dashboard。:2812 とは別物)。初期状態は Apache のデフォルトページが出るので、DocumentRoot を DVSwitch の実体に変える。
sudo sed -i 's|DocumentRoot /var/www/html|DocumentRoot /usr/share/dvswitch|' \ /etc/apache2/sites-enabled/000-default.conf sudo systemctl restart apache2
http://<IP>/ で「DVSwitch Dashboard」が表示されれば成功。
DocumentRoot が変わって見える件:DVSwitch 導入で VirtualHost が追加・有効化され、DocumentRoot が /usr/share/dvswitch に切り替わるのは想定どおりの挙動。競合する場合は apache2ctl -S で有効な VirtualHost を確認し、不要なサイト定義を a2dissite <名>.conf で無効化して sudo systemctl reload apache2。
補足:Zero 2 W + SD カードでは初回表示が重い。top で wa(I/O 待ち)が高い場合は SD のランダムアクセス遅延が主因。
第4章:音声と Bot
14. 音声合成環境(Open JTalk + SoX)
14-1. パッケージ導入 ✅
sudo apt-get install -y open-jtalk open-jtalk-mecab-naist-jdic \ hts-voice-nitech-jp-atr503-m001 sox unzip
14-2. 高品質音声「メイ」導入 ✅
cd ~ wget -L --content-disposition \ https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.8/MMDAgent_Example-1.8.zip ls *.zip* # 実ファイル名を確認 unzip 'MMDAgent_Example-1.8.zip'* sudo mkdir -p /usr/share/hts-voice/mei sudo cp MMDAgent_Example-1.8/Voice/mei/mei_normal.htsvoice /usr/share/hts-voice/mei/ rm -rf MMDAgent_Example-1.8 'MMDAgent_Example-1.8.zip'*
14-3. 🔴 動作確認(辞書パスに注意) ✅
⚠️ 辞書パスは /var/lib/mecab/dic/open-jtalk/naist-jdic(open-jtalk/ を含む)。
echo "テスト、動作確認。" | open_jtalk \ -m /usr/share/hts-voice/mei/mei_normal.htsvoice \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -ow /tmp/test.wav && \ sox /tmp/test.wav -r 8000 -c 1 -b 16 /tmp/test_8k.wav && echo OK
OK が出れば成功。Cannot open ... naist-jdic が出る場合はパスが誤り(不明なときは find /var/lib/mecab -name "sys.dic" で実体を確認)。
15. 固定 WAV の作成
固定 WAV は対話式スクリプト create_wav.sh で生成する。出力先は /opt/dvswitch_bot/ 直下。
cd /opt/dvswitch_bot/bin sudo ./create_wav.sh
対話入力の流れ:
- コールサイン(例
YOUR_CALLSIGN)→ 自動カナ変換結果を確認・修正 - 設置場所の地名(例
おわりあさひ。確実に読ませたいときはひらがな推奨) - 定時メッセージ 1 → カナ確認・修正
- 定時メッセージ 2 → カナ確認・修正
- 確認プロンプトで [Y]
生成されるファイル:
| ファイル | 用途 |
|---|---|
fixed_intro.wav | カーチャンク応答イントロ |
fixed_outro.wav | カーチャンク応答アウトロ |
time_intro.wav | 時報イントロ |
001.wav / 002.wav | 定時メッセージ |
💡 自動バックアップ/復元:create_wav.sh は上書き直前に既存 WAV を /opt/dvswitch_bot/bak/wav/YYMMDDHHMMSS/ へ自動退避する。失敗したら sudo ./create_wav.sh -r で前のセットに戻せる(-d 全削除 / -h ヘルプ)。bot は送出のたびに WAV を読むため、上書きは再起動なしで次の送出から反映される。
確認:
ls -la /opt/dvswitch_bot/ soxi /opt/dvswitch_bot/*.wav # 全ファイル 8000 Hz / 1ch / 16-bit を確認
手動で個別生成する方法(検証済み文面)は付録 B を参照。
16. 送信テスト
16-1. 実行 ✅
python3 /opt/dvswitch_bot/bin/test_send.py /opt/dvswitch_bot/001.wav
TGIF の対象 TG で音声が出れば 経路開通。
第 10 章でサービスは反映済みなので、ここでの再起動は不要。bot が常駐している場合は二重送信になるため、テスト時は sudo systemctl stop dvswitch-bot で止める。
16-2. 🔴 md380-emu SEGV の最終確認 ✅
sudo journalctl -u md380-emu -n 20 --no-pager # SEGV が出ていないこと sudo systemctl status md380-emu --no-pager # active (running) のまま
SEGV が再発する場合は qemu が 7.2 に戻っていないか確認(qemu-arm-static --version が 5.2.x、apt-mark で hold 済みか)。
17. Bot 本体と設定ツールの導入
| ファイル | 役割 |
|---|---|
bot_setup.py | 対話で設定を作り /opt/dvswitch_bot/bot_config.json に保存 |
dvswitch_bot.py | デーモン本体。起動時に JSON を読むだけ(対話しない) |
🔴 デーモン本体は、設定が無い/壊れている/値が不正なら起動を拒否する(フェイルセーフ)。そのため常駐させる前に必ず設定ツールを実行する。
17-1. パラメータの確認 ✅
grep -nE "^UDP_IP|^UDP_PORT|^DICT_PATH|^CONFIG_PATH|^MY_CALLSIGN" /opt/dvswitch_bot/bin/dvswitch_bot.py
| 変数 | 正しい値 |
|---|---|
UDP_IP | 127.0.0.1 |
UDP_PORT | 51000(Analog_Bridge の rxPort と一致) |
DICT_PATH | /var/lib/mecab/dic/open-jtalk/naist-jdic |
CONFIG_PATH | /opt/dvswitch_bot/bot_config.json |
MY_CALLSIGN | 自局(既定 JJ2YYK) |
MY_CALLSIGN を変える場合:
sudo sed -i 's/^MY_CALLSIGN = .*/MY_CALLSIGN = "YOUR_CALLSIGN"/' /opt/dvswitch_bot/bin/dvswitch_bot.py
17-2. 🔴 設定ツールで bot_config.json を作成 ✅
sudo python3 /opt/dvswitch_bot/bin/bot_setup.py
| 項目 | 内容 | 既定 |
|---|---|---|
| 最小受信時間(秒) | これ未満は無視 | 0.5 |
| 最大受信時間(秒) | これ以上はカーチャンクとしない(通常 QSO 扱い) | 3.9 |
| 放送回数 | 1 時間あたりの定時メッセージ回数(有効範囲は時刻案内モード依存。下記参照) | 2 |
| ナイトモード(y/n) | 夜間の時報・定時メッセージ抑制 | y |
| N1(開始時) | この時刻の時報まで送出 → 以降抑制 | 22 |
| N2(終了時) | この時刻まで抑制 → N2+1 時の時報で再開 | 5 |
時刻案内モード(TIME_SIGNAL_MODE)— V1.64〜
時報の頻度を bot_config.json の TIME_SIGNAL_MODE で選べる(任意キー。未設定の旧設定は従来動作=モード 1)。
| モード | 動作 |
|---|---|
| 0 | 時刻案内なし |
| 1 | 毎正時のみ「○○時です」(従来動作) |
| 2 | 毎正時「○○時です」+毎 30 分「○○時 30 分です」 |
放送回数の有効範囲はモードに依存する(正時/30 分は時刻案内が占有するため):モード 0→0/1/2/3/4、モード 1→0/1/2/3、モード 2→0/2。
⚠️ 送出音量 TX_GAIN(手動設定・上級者向け)— V1.68〜
bot が出す全音声の音量を線形倍率 TX_GAIN(1.0=等倍、主用途は減衰)で一律調整できる。bot_config.json の任意キーで、無ければ等倍。値が不正でも送出は止めず 1.0 にフォールバックする(有効範囲: 0 より大〜5.0 以下)。
重要: TX_GAIN は現状 bot_setup.py とダッシュボード(app.py)が認識しない。これらで設定を保存し直すと消えるため、手動で JSON に追記する前提の上級設定として扱うこと。
確認:
sudo python3 /opt/dvswitch_bot/bin/bot_setup.py -s # 表示+有効性チェック cat /opt/dvswitch_bot/bot_config.json
17-3. 手動起動で動作確認 ✅
python3 /opt/dvswitch_bot/bin/dvswitch_bot.py
Config loaded /opt/dvswitch_bot/bot_config.jsonが出ればフェイルセーフ通過- 設定が無い/不正だとここで止まる(その場合は 17-2 をやり直す)
- カーチャンクを送って応答が返るか確認 → 「Ctrl + C」で停止 → 第 18 章へ
18. 常駐化(systemd)
🔴 前提:17-2 で bot_config.json を作成済みであること。未作成だとフェイルセーフで起動を拒否し、Restart=on-failure で再起動を繰り返す(設定漏れに気づける意図した挙動)。
sudo tee /etc/systemd/system/dvswitch-bot.service > /dev/null << 'EOF' [Unit] Description=DVSwitch Bot (OpenCCVoice, daemon V1.69) After=network.target analog_bridge.service mmdvm_bridge.service md380-emu.service Wants=analog_bridge.service mmdvm_bridge.service md380-emu.service [Service] Type=simple ExecStart=/usr/bin/python3 /opt/dvswitch_bot/bin/dvswitch_bot.py Restart=on-failure RestartSec=10 User=ocv StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF
別ユーザーで運用する場合は ExecStart のパスと User= を読み替える。
sudo systemctl daemon-reload sudo systemctl enable --now dvswitch-bot sudo systemctl status dvswitch-bot --no-pager
active (running) で、ログに Config loaded と Bot ready が出ていれば成功。
⚠️ activating (auto-restart) を繰り返す場合は設定ファイル不正の可能性。sudo journalctl -u dvswitch-bot -n 30 --no-pager で Config error を確認し、bot_setup.py で作り直す。
第5章:運用
19. 設定変更・音声差し替え・バックアップ
19-1. 動作設定を変える
sudo python3 /opt/dvswitch_bot/bin/bot_setup.py # 対話で bot_config.json を更新 sudo systemctl restart dvswitch-bot # 再起動して反映
19-2. 音声を作り直す
cd /opt/dvswitch_bot/bin sudo ./create_wav.sh # 対話で WAV を再生成(自動バックアップ付き) sudo ./create_wav.sh -r # 失敗したら前のセットに戻す
19-3. DVSwitch 設定(コールサイン・TG 等)を変える
cd /opt/dvswitch_bot/bin sudo ./dvs_config.sh # 編集前に自動バックアップ。最後にサービス再起動を確認 sudo ./dvs_config.sh -r # 失敗したら ini を戻す
19-4. ログの見方
常駐化すると出力は journal に集約される。
sudo journalctl -u dvswitch-bot -f # リアルタイム監視(常用) sudo journalctl -u dvswitch-bot -n 50 --no-pager # 直近 50 行 sudo journalctl -u dvswitch-bot --since today --no-pager sudo systemctl status dvswitch-bot --no-pager # 稼働状態
19-5. 手動起動に戻して画面で見たいとき
sudo systemctl stop dvswitch-bot # 常駐を一時停止 python3 /opt/dvswitch_bot/bin/dvswitch_bot.py # 画面出力で手動起動(Ctrl+C で終了) sudo systemctl start dvswitch-bot # 確認後、常駐に戻す
19-6. バックアップの所在
| 種類 | 場所 | 作るツール |
|---|---|---|
| ini バックアップ | /opt/dvswitch_bot/bak/ini/<日付>/ | dvs_config.sh |
| WAV バックアップ | /opt/dvswitch_bot/bak/wav/<日付>/ | create_wav.sh |
システムに関するものはすべて /opt/dvswitch_bot/ 配下に集約されている。
20. 運用上の注意と法令遵守
20-1. 電波法の遵守
- ☐ アマチュア無線技士の免許を保有していること
- ☐ コールサインを正しく送出していること(システムは応答時に必ず自局コールサインを送出する設計)
- ☐ 自動運用に関する規定を理解していること(長時間の常時無人運用は所轄の総合通信局に相談を推奨)
20-2. 推奨される運用
- 応答後の抑制時間(既定 15 秒)は短くしすぎない
- 応答頻度をログで定期的に確認する
- 他局が交信中の TG に割り込まないよう確認する
20-3. ハードウェアの保護
- SD カードの寿命:一時ファイルは
/dev/shm(RAM)に書いているが、ログは定期削除を設定推奨 - 温度管理:ヒートシンク推奨(
vcgencmd measure_temp。70℃ 超は要注意) - 電源:5 V 2.5 A 以上。電源不足はファイル破損の原因
21. システム全体のバックアップとリストア
21-1. 設定ファイルのバックアップ
mkdir -p ~/dvswitch_backup && cd ~/dvswitch_backup sudo cp /opt/Analog_Bridge/Analog_Bridge.ini ./ sudo cp /opt/MMDVM_Bridge/MMDVM_Bridge.ini ./ cp /opt/dvswitch_bot/bin/dvswitch_bot.py ./ cp /opt/dvswitch_bot/bin/bot_setup.py ./ sudo cp /etc/systemd/system/dvswitch-bot.service ./ 2>/dev/null || true cp /opt/dvswitch_bot/bot_config.json ./ cp /usr/share/hts-voice/mei/mei_normal.htsvoice ./ sudo chown -R $USER:$USER ~/dvswitch_backup cd ~ && tar czf dvswitch_backup_$(date +%Y%m%d).tar.gz dvswitch_backup/
このファイルを別の PC やクラウドに保管する。
21-2. SD カード全体のバックアップ(推奨)
ラズパイをシャットダウンし、SD カードを別 PC に挿して:
sudo fdisk -l # デバイス名を必ず確認(/dev/mmcblk0 や /dev/sdc 等)
⚠️ 次のコマンドはデータを上書きします。/dev/sdb のデバイス名が正しいことを fdisk -l で確認してから実行してください。
sudo dd if=/dev/sdb of=~/backup_$(date +%Y%m%d).img bs=4M status=progress gzip ~/backup_*.img
21-3. リストア(新しい Pi で再構築)
- 第 5 章〜第 18 章を順に実施
- バックアップを展開して設定ファイルを戻す:
cd ~ && tar xzf dvswitch_backup_YYYYMMDD.tar.gz sudo cp ~/dvswitch_backup/Analog_Bridge.ini /opt/Analog_Bridge/ sudo cp ~/dvswitch_backup/MMDVM_Bridge.ini /opt/MMDVM_Bridge/ sudo mkdir -p /opt/dvswitch_bot/bin sudo cp ~/dvswitch_backup/dvswitch_bot.py ~/dvswitch_backup/bot_setup.py /opt/dvswitch_bot/bin/ sudo chmod +x /opt/dvswitch_bot/bin/*.py sudo cp ~/dvswitch_backup/dvswitch-bot.service /etc/systemd/system/ sudo cp ~/dvswitch_backup/bot_config.json /opt/dvswitch_bot/ sudo chown -R ocv:ocv /opt/dvswitch_bot sudo systemctl daemon-reload sudo systemctl restart analog_bridge mmdvm_bridge md380-emu sudo systemctl enable --now dvswitch-bot
- 第 16 章の動作確認を実施
21-4. 定期バックアップの自動化(cron)
crontab -e
# 毎週日曜 3:00 に DVSwitch 設定をバックアップ 0 3 * * 0 tar czf /home/ocv/dvswitch_backup_$(date +\%Y\%m\%d).tar.gz /opt/Analog_Bridge/Analog_Bridge.ini /opt/MMDVM_Bridge/MMDVM_Bridge.ini /opt/dvswitch_bot/bin/dvswitch_bot.py /opt/dvswitch_bot/bin/bot_setup.py /opt/dvswitch_bot/bot_config.json
付録
付録A:トラブルシューティング早見表
| 症状 | 原因 | 対処 |
|---|---|---|
md380-emu が Permission denied | 実行ビット無し | sudo chmod +x /opt/md380-emu/md380-emu |
md380-emu が status=11/SEGV を繰り返す | qemu 7.2 の不具合 | qemu 5.2 へダウングレード+apt-mark hold(第 11 章) |
Open JTalk が Cannot open ... naist-jdic | 辞書パス誤り | /var/lib/mecab/dic/open-jtalk/naist-jdic を使う |
http://<IP>/ が Apache 既定ページ | DocumentRoot 未変更 | /usr/share/dvswitch に変更(第 13 章) |
| 音声は出るが TG が 4000 に戻る | TGIF 側 Static 未設定 | TGIF ダッシュボードで対象 TG を Static 登録 |
| ボット音声が無音 | md380-emu 停止 or Analog 設定ミス | md380-emu 稼働確認、USRP ポート確認 |
| 音声がプツプツ・ケロケロ | UDP ドリフト | bot が time.monotonic() ベースの絶対時刻同期か確認 |
dvswitch-bot が activating (auto-restart) | 設定ファイル不正/未作成 | journalctl で確認 → bot_setup.py で作成 |
手動起動の bot が Config error で停止 | bot_config.json 不正/欠落 | bot_setup.py で作成。-s で検証 |
| Quantar_Bridge 等が「Does not exist」 | monit httpd 無効+未起動 | 第 12 章:httpd 有効化+enable --now+monit reload |
sudo monit status が Connection reset by peer | monit httpd 無効 | 第 12 章 ステップ 2 |
| :2812 が外部から開けない | use address localhost | 0.0.0.0 に変更して monit reload |
monit reload 後も「Does not exist」 | データ収集待ち | 十数秒待って再確認 |
| SFR 中継でカーチャンクに反応しない | 終端パケット落ちで end が記録されない | V1.67 以降に更新。ログに watchdog pseudo-end が出れば救済動作中(watchdog ignored (high loss) はロス過大で対象外) |
| 30 分案内が出ない | TIME_SIGNAL_MODE が 2 でない | bot_config.json の TIME_SIGNAL_MODE を 2 に(放送回数の有効範囲も変わる・第 17 章) |
| TX_GAIN が効かない/消えた | bot_setup.py・ダッシュボードが非対応 | TX_GAIN は手動キー。保存ツールで消えるため再追記(第 17 章)。不正値は等倍にフォールバック |
付録B:固定 WAV の個別コマンド生成
スクリプトを使わず手動で作る場合の検証済み文面。各ファイルは 8 kHz / mono / 16 bit PCM。fixed_* は単純変換、time_intro / 001 / 002 は前後無音トリム付き。
# fixed_intro.wav echo "こちらは、ジェイジェイツーワイワイケー、です。" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice -ow /tmp/temp_intro.wav && sudo sox /tmp/temp_intro.wav -r 8000 -c 1 -b 16 /opt/dvswitch_bot/fixed_intro.wav # fixed_outro.wav echo "カーチャンクです。" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice -ow /tmp/temp_outro.wav && sudo sox /tmp/temp_outro.wav -r 8000 -c 1 -b 16 /opt/dvswitch_bot/fixed_outro.wav # time_intro.wav(前後トリム) echo "こちらは、ジェイジェイツーワイワイケー、" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice -ow /tmp/time_intro.wav && sox /tmp/time_intro.wav -r 8000 -c 1 -b 16 /opt/dvswitch_bot/time_intro.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse # 001.wav(前後トリム) echo "こちらは、ジェイジェイツーワイワイケー、尾張旭、DMR、デジピーターです。オープン、シーシーヴォイス、フォー、ディーブイスイッチからの音声です。" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice -ow /tmp/001_raw.wav && sox /tmp/001_raw.wav -r 8000 -c 1 -b 16 /opt/dvswitch_bot/001.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse # 002.wav(前後トリム) echo "こちらは、ジェイジェイツーワイワイケー、尾張旭、DMR、デジピーターです。ティージーアイエフ、ヨンヨンハチサンサンと、インターネット接続しています。" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice -ow /tmp/002_raw.wav && sox /tmp/002_raw.wav -r 8000 -c 1 -b 16 /opt/dvswitch_bot/002.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse
付録C:DVSwitch 側 ini の手動編集(参照用)
dvs_config.sh が [WARN] キー ... が見つからず変更できません を出した場合などの参照用。
Analog_Bridge.ini(/opt/Analog_Bridge/Analog_Bridge.ini)
[USRP] address = 127.0.0.1 txPort = 51001 ; Analog_Bridge → 外部(USRP 送信) rxPort = 51000 ; 外部 → Analog_Bridge(ボットはここへ送る) [AMBE_AUDIO] txTg = 44833 ; ★ボット音声が乗る DMR TG txTs = 2 colorCode = 1
DVSwitch v1.6.4 系の特定版では jitterQueueSize / pcmBufferMS がコメントアウトされていないと起動時にクラッシュする。該当行があれば先頭に ; を付ける。
DVSwitch.ini(/opt/MMDVM_Bridge/DVSwitch.ini)
[DMR] address = 127.0.0.1 exportTG = 44833 ; ★エクスポート TG
⚠️ dvs_config.sh はこの DVSwitch.ini を変更しない(バックアップのみ)。
MMDVM_Bridge.ini(/opt/MMDVM_Bridge/MMDVM_Bridge.ini)
[DMR] Enable=1 [DMR Network] Enable=1 Address=tgif.network Password=(TGIF のパスワード)
[General] の Callsign と Id(dmrid + essid)も自局の値にする。反映:
sudo systemctl restart analog_bridge mmdvm_bridge
付録D:ダッシュボードの Platform 表示を正す
ダッシュボードの「Platform」が Unknown ARM based System になるのを、正しい機種名にする。/usr/local/sbin/platformDetect.sh が /proc/cpuinfo の Revision を case 変換しており、Zero 2 W の Revision が載っていないため Unknown に落ちる。/proc/device-tree/model を優先的に使うよう直す。
バックアップ(必須)
sudo cp /usr/local/sbin/platformDetect.sh /usr/local/sbin/platformDetect.sh.bak.$(date +%F)
推奨:device-tree 判定を最小追記
cat > /tmp/dt_block.sh << 'EOF'
# --- device-tree model を最優先で返す(新機種対応・前段に挿入) ---
for __p in /sys/firmware/devicetree/base/model /proc/device-tree/model; do
if [ -r "$__p" ]; then
__dt=$(tr -d '\0' < "$__p" | sed 's/[[:space:]]\+$//')
if [ -n "$__dt" ]; then
echo "$__dt"
exit 0
fi
fi
done
EOF
# /tmp で組み立てて確認してから本番へ
{ head -1 /usr/local/sbin/platformDetect.sh; cat /tmp/dt_block.sh; \
tail -n +2 /usr/local/sbin/platformDetect.sh; } > /tmp/platformDetect.test.sh
chmod +x /tmp/platformDetect.test.sh
/tmp/platformDetect.test.sh # Raspberry Pi Zero 2 W Rev 1.0 が返れば OK
sudo -u www-data /tmp/platformDetect.test.sh # www-data でも同じ結果か
sudo cp /tmp/platformDetect.test.sh /usr/local/sbin/platformDetect.sh
sudo chmod 0755 /usr/local/sbin/platformDetect.shWeb サーバー再起動
⚠️ 本環境は Bookworm / Apache2。lighttpd ではなく apache2 を再起動する。
sudo systemctl restart apache2
ブラウザで http://<IP>/ を開き「Ctrl + F5」。Platform が機種名になれば成功。戻したいときは sudo cp /usr/local/sbin/platformDetect.sh.bak.YYYY-MM-DD /usr/local/sbin/platformDetect.sh。
付録E:クイックリファレンス
ポート番号一覧
| ポート | 用途 | プロトコル |
|---|---|---|
| 51000 | dvswitch_bot.py → Analog_Bridge(USRP 受信) | UDP |
| 51001 | Analog_Bridge からの出力(txPort) | UDP |
| 2470 | Analog_Bridge ⇔ md380-emu(AMBE) | UDP |
| 62031 | MMDVM_Bridge → TGIF(DMR) | UDP |
| 80 | DVSwitch Dashboard(Apache) | TCP |
| 2812 | Monit Service Manager | TCP |
主要ファイルパス一覧
| パス | 内容 |
|---|---|
/opt/Analog_Bridge/Analog_Bridge.ini | Analog_Bridge 設定 |
/opt/MMDVM_Bridge/MMDVM_Bridge.ini | MMDVM_Bridge 設定 |
/opt/MMDVM_Bridge/DVSwitch.ini | DVSwitch 設定(exportTG) |
/var/log/mmdvm/MMDVM_Bridge-*.log | ログ(bot の監視対象) |
/usr/share/hts-voice/mei/mei_normal.htsvoice | 音声モデル |
/var/lib/mecab/dic/open-jtalk/naist-jdic | Open JTalk 辞書 |
/opt/dvswitch_bot/bin/ | スクリプト 5 本 |
/opt/dvswitch_bot/bot_config.json | Bot 設定 |
/opt/dvswitch_bot/*.wav | 固定 WAV |
/opt/dvswitch_bot/bak/{ini,wav}/ | バックアップ |
/etc/systemd/system/dvswitch-bot.service | systemd サービス定義 |
/etc/monit/monitrc | monit 設定 |
/usr/local/sbin/platformDetect.sh | Platform 判定スクリプト |
サービス管理コマンド
# 全サービスまとめて再起動 sudo systemctl restart analog_bridge mmdvm_bridge md380-emu dvswitch-bot # 状態確認 sudo systemctl status analog_bridge mmdvm_bridge md380-emu dvswitch-bot --no-pager # ログ sudo journalctl -u dvswitch-bot -f sudo journalctl -u md380-emu -n 20 --no-pager
OpenCCVoice for DVSwitch 構築・導入・設定 完全マニュアル
対象:Raspberry Pi Zero 2 W / Raspberry Pi OS Bookworm 32-bit / DVSwitch-Server / ocv ユーザー
Bot: dvswitch_bot.py(デーモン版)+ bot_setup.py(設定ツール)
設計思想・開発秘話は別冊『開発ノート(ブログ材料)』を参照
付録F:raspi-config 操作手順
Bookworm 初回セットアップ時に実施する、キーボードレイアウト・ユーザー作成・静的IP・SSH有効化・タイムゾーンの設定手順。
1. キーボードレイアウトの設定(日本語 OADG 109A)
raspi-config の Localisation Options からキーボードレイアウトを日本語配列に設定する。
- sudo raspi-config を起動する
sudo raspi-config
- 5 Localisation Options → L3 Keyboard を選択する
- キーボードレイアウト選択画面でリスト末尾の Other を選択し <Ok> を押す
- 言語一覧から Japanese を選択し <Ok> を押す
- バリアント一覧から Japanese – Japanese (OADG 109A) を選択し <Ok> を押す
以降の画面(AltGr キー・コンポーズキー等)は通常デフォルトのまま <Ok> で進めてよい。
2. 新規ユーザーの作成(ocv)
raspi-config の System Options から新規ユーザー ocv を作成し、パスワードを設定する。
- 1 System Options → S6 User を選択する
(または直接コマンドで作成する場合はsudo adduser ocv) - Please enter new username: に
ocvを入力し <Ok> を押す - パスワードを入力し <Ok> を押す(入力文字は * でマスク表示)
- 同じパスワードを再入力し <Ok> を押す(一致すればユーザー作成完了)
ユーザー作成後、必要に応じて sudo グループへ追加する:sudo usermod -aG sudo ocv
3. 静的 IP アドレスの設定(nmtui)
raspi-config 終了後にリブートし、ocv ユーザーでログインして nmtui を実行する。
- リブート後、コンソールで ocv ログイン。DHCP で払い出された IP アドレスを確認しておく
(例: My IP address is 192.168.X.X) - nmtui を起動する
nmtui
- Edit a connection → Wired connection 1 → <Edit…> を選択する
- IPv4 CONFIGURATION を <Manual> に変更し、各項目を入力する
| 項目 | 設定値(例) |
|---|---|
| Addresses | 192.168.X.X/24 |
| Gateway | 192.168.X.1 |
| DNS servers | 192.168.X.1 |
- [X] Automatically connect と [X] Available to all users にチェックが入っていることを確認し <OK> で保存する
- Quit で nmtui を終了し、リブートして反映する
sudo reboot
(接続だけ再起動する場合:
sudo nmcli connection down "Wired connection 1" && sudo nmcli connection up "Wired connection 1")
4. SSH の有効化
静的 IP 設定後、再度 sudo raspi-config を起動して Interface Options から SSH を有効化する。
- sudo raspi-config を起動する
sudo raspi-config
- 3 Interface Options → I1 SSH を選択する
- 「Would you like the SSH server to be enabled?」で <Yes> を押す
⚠️ デフォルト・脆弱なパスワードはセキュリティリスクとなる旨の警告が出る。強いパスワードを設定済みであることを確認すること。 - 「The SSH server is enabled」の確認画面で <Ok> を押す
これ以降、SSH でリモートアクセスが可能になる。 - I2 RPi Connect を選択し <No> を押す(Raspberry Pi Connect は不要のため無効のままにする)
5. タイムゾーンの設定(JST)
raspi-config の Localisation Options からタイムゾーンを JST(Asia/Tokyo)に設定する。セクション1と同じセッション内でまとめて実施してもよい。
- 5 Localisation Options → L2 Timezone を選択する
- Geographic area: Asia を選択する
- Time zone: Tokyo を選択する
- 設定を確認する
timedatectl
Time zone: Asia/Tokyo (JST, +0900) と表示されれば完了。(コマンドで直接設定する場合:
sudo timedatectl set-timezone Asia/Tokyo)
補足:設定値まとめ
| 項目 | 設定値 |
|---|---|
| キーボードレイアウト | Japanese – Japanese (OADG 109A) |
| タイムゾーン | Asia/Tokyo(JST, UTC+9) |
| 新規ユーザー名 | ocv |
| 静的 IP アドレス | 192.168.X.X/24 |
| デフォルトゲートウェイ | 192.168.X.1 |
| DNS サーバー | 192.168.X.1 |
📝 執筆:JJ2TAB(尾張旭 DMR デジピーター 管理人)
🏛 JJ2YYK あいちデジタルコミュニケーションハムクラブ