オープンリール

Revox B77をwifiで遠隔操作できるよう改造(加筆中)

はろーわーるど:音楽家の朝比奈幸太郎です。

金田式バランス電流伝送DC録音のアナログテープ録音は改造のしやすいB77を使っています。

せっかくなので、他の試してみたかった改造、つまりB77の遠隔操作をやってみようと思うわけです。

昨今は安価で性能のよいチップがたくさん売られていますので、そこまで難しくないと思います。

電子接点が採用されているB77なので、比較的簡単にできそう・・・とトライしてみます。

物理スイッチのA77でも、REMOTE端子が搭載されているモデル(MKⅡからは基本的に搭載)だとそこまで難しくないと思います。

今回は、wifiに対応しているESP32(ESP32 DevKitC)を使います。

※現在加筆中で、こちらの記事は現状アイディアのメモになります。実装しましたら追記します。

全体像を整理

┌────────────┐      Wi-Fi      ┌─────────────┐
│ スマホなど  │  ←――――――――→   │  ESP32 MCU  │
└────────────┘                └─┬────────────┘
                                  │GPIO (3.3 V)
                                  ▼
                        ┌─────────────────┐
                        │  SSR / Opto     │  5 V駆動
                        └─┬─┬─┬─┬─┬─┬────┘
                          │ │ │ │ │ │
      7-pin DIN REMOTE ───┘ │ │ │ │ │
 (Pin1=GND, Pin2=STOP, …)   │ │ │ │ │
                            ▼ ▼ ▼ ▼ ▼
                       B77 Tape Transport

全体像と前提を把握しておきましょう。

B77は背面に「7 pin DINのREMOTE端子」を標準装備

  • ここに無電圧の短絡信号(いわゆる「ドライ接点」)を与えるだけで
    PLAY/STOP/FF/REW/REC を切り替え可能。
  • したがって 内部配線を切らずに 制御できるのが最も安全・確実。

また、流れとしてはスマホを使うのが手近にあるデバイスとしては有効だと考えます。

スマホ → Wi-Fi/BLE → ESP32 → ソリッドステートリレー(SSR)

  • ESP32 は低価格・Wi-Fi内蔵・GPIO豊富。
  • SSR で DIN 端子の各ピンを GND に短絡するだけで操作完了。
  • WebUI/MQTT どちらでも実装可。

B77 と ESP32 は完全に絶縁

  • フォトカプラ or SSR で 600 V 以上の耐圧を確保し
    ビンテージ機器のノイズからマイコンを保護。

必要なものリスト(実物名・型番付き)

種類品名・型番用途備考
✅ ESP32マイコンESP32-DevKitC制御の中心Amazonで入手可
✅ SSRモジュールAQW210、または 4ch SSRボード(3.3V対応)接点の絶縁制御無音&長寿命
✅ ケーブル(信号線)AWG 24〜26の撚り線 or ジャンパーワイヤーESP32 → SSR間基板ピンに直刺し or はんだ
✅ ケーブル(制御線)オーディオ用シールド線(2芯 or 5芯)SSR → B77 REMOTE端子外部ノイズに強い線を推奨
✅ コネクタDIN 7ピン プラグ(ハンダ式)B77のREMOTE端子に接続秋月電子などで入手可
✅ はんだごて30W程度の温調式DINプラグの組み立てには必須精密用推奨(goot CXR-41など)
✅ 熱収縮チューブφ1.5〜2.0mmはんだ部分の絶縁保護絶対おすすめ
✅ ケースタカチ UC5-10-3N 等ESP32とSSRを収納絶縁&見た目もスマート

作業手順【超具体的】

① SSR〜DINプラグ側ケーブルを作る(B77接続部)

🔌 使用ケーブル例:

  • 2芯シールド線 × 3本(または5芯マルチケーブル)
  • 端子側:DINプラグ(ハンダ式)
  • 反対側:SSR出力(端子ねじ or ピン)

🧰 手順:

  1. DINプラグ(ハンダ式)を用意
     → ピン番号1〜6が刻印されている。B77では以下を使う:
機能DINピン色例(自分で決めてOK)
GND共通Pin 1
PLAYPin 3
STOPPin 2
REWPin 5
FFPin 4
RECPin 6
  1. ケーブルを必要本数用意(5芯シールド or 2芯×3本)
     → DINプラグのピンに1本ずつハンダ付け(丁寧に!)
  2. ハンダ後、熱収縮チューブで絶縁保護
     → 最後にプラグのシェルを組み立てて完了

② ESP32〜SSRの配線(制御部)

🔌 使用ケーブル例:

  • ジャンパーワイヤー(メス–メス) or
  • AWG24撚り線 + ピンヘッダはんだ済み

🧰 手順:

  1. ESP32 の GPIOピン(例:GPIO12〜GPIO26)から SSR モジュールの IN端子へ接続(GND共通)
  2. SSR の出力端子(NO/NC)から、上記で作成した DINプラグの該当ピンへ接続
  3. DINピン1(GND)と、SSR出力側の共通GNDは必ず1本で接続!

📦 接続全体図

[ESP32 GPIO]──(ジャンパー)──▶[SSR入力]
[SSR出力]──(撚り線 or AWGシールド)──▶[DINプラグ]
DINピン:
  1 → GND(黒)← SSR出力GND共通
  2 → STOP(青)
  3 → PLAY(赤)
  4 → FF(黄)
  5 → REW(緑)
  6 → REC(白)

→ DINプラグをB77背面に挿して完了!
接続箇所はんだ必要?理由
DINプラグ✅ 必須プラグがハンダ式(信頼性あり)
ESP32→SSR⭕ or ❌ジャンパーワイヤーなら不要/撚り線なら必要
SSR→DIN線⭕ or ❌ネジ端子式なら不要/直配線なら必要

参考コード(Arduino/ESP32)

/**
 * B77 Remote Wi-Fi Bridge (ESP32) – example
 * API: http://<ip>/cmd?key=play  …etc.
 */
#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "YourSSID";
const char* pass = "YourPass";

WebServer server(80);

// GPIO → SSR (Active-HIGH)
const int pinPlay = 12;
const int pinStop = 13;
const int pinFF   = 14;
const int pinREW  = 27;
const int pinRec  = 26;

void handleCmd() {
  String key = server.arg("key");
  int dur = 250;  // ms

  auto pulse = [&](int gpio){
    digitalWrite(gpio, HIGH);
    delay(dur);
    digitalWrite(gpio, LOW);
  };

  if (key == "play") pulse(pinPlay);
  else if (key == "stop") pulse(pinStop);
  else if (key == "ff")   pulse(pinFF);
  else if (key == "rew")  pulse(pinREW);
  else if (key == "rec")  pulse(pinRec);

  server.send(200, "text/plain", "OK");
}

void setup(){
  pinMode(pinPlay, OUTPUT); pinMode(pinStop, OUTPUT);
  pinMode(pinFF,   OUTPUT); pinMode(pinREW,  OUTPUT);
  pinMode(pinRec,  OUTPUT);

  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) delay(100);
  server.on("/cmd", handleCmd);
  server.begin();
}

void loop(){ server.handleClient(); }

※GPIO番号は基板と環境に合わせて変更してください。
※リセット時にブートピンへ影響しないGPIOを選択。

具体的な接続方法

ここからESP32とB77を繋ぎます。

ESP32は「SSR(無電圧リレー)」を介して、B77背面のREMOTE端子(7ピンDIN)に接続

項目内容理由
ESP32 GPIO(デジタル出力)SSR(ソリッドステートリレー) → B77直接短絡では危険なので絶縁が必要
SSRの出力側→ B77 REMOTE端子の「GND ↔ 各操作ピン」を短絡B77の設計仕様に従った「無電圧接点制御」
接点の種類フォトカプラ or フォトMOS SSR接点スパークなし。動作音なし。長寿命
ピン番号接続先操作ESP32対応GPIOSSR CH
1GND全操作共通
2STOP停止命令GPIO 13SSR 2
3PLAY再生命令GPIO 12SSR 1
4FAST FORWARD早送りGPIO 27SSR 4
5REWIND巻き戻しGPIO 14SSR 3
6RECORD録音命令GPIO 26SSR 5
7未使用 or メーカー別機能

スマホ操作の全体像

① スマホのWi-Fi設定
 ↓
② ブラウザでアドレス入力(例:http://192.168.1.100)
 ↓
③ Web画面が開く(↓例)
 ┌──────────────┐
 │  🎛 REVOX B77 Controller │
 │  ───────────── │
 │  ▶︎ PLAY               │
 │  ■ STOP               │
 │  ⏪ REWIND            │
 │  ⏩ FAST FORWARD      │
 │  ⬤ RECORD             │
 └──────────────┘
 ↓
④ ボタンをタップするとリアルにB77が反応!

実装方法:Web UIの仕組み

ESP32には簡易Webサーバを内蔵させ、スマホから操作できるHTML画面を提供させます。

ESP32内に格納されるファイル構成例として

main.cpp         ← Arduinoコード
index.html       ← Web UI画面(操作ボタン)

となります。

index.html の例(ESP32に埋め込む)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>REVOX B77 Remote</title>
  <style>
    body { font-family: sans-serif; text-align: center; background: #fafafa; }
    h1 { color: #333; }
    button {
      padding: 1em 2em;
      margin: 1em;
      font-size: 1.2em;
      border: none;
      border-radius: 8px;
      background: #007bff;
      color: white;
    }
    button:hover {
      background: #0056b3;
    }
  </style>
</head>
<body>
  <h1>🎛 REVOX B77 Controller</h1>
  <button onclick="send('play')">▶︎ PLAY</button>
  <button onclick="send('stop')">■ STOP</button>
  <button onclick="send('rew')">⏪ REWIND</button>
  <button onclick="send('ff')">⏩ FAST FORWARD</button>
  <button onclick="send('rec')">⬤ RECORD</button>

  <script>
    function send(cmd) {
      fetch(`/cmd?key=${cmd}`);
    }
  </script>
</body>
</html>

実際の手順としては、次のようになります。

手順内容
スマホを ESP32と同じWi-Fiネットワークに接続(自宅Wi-Fiなど)
スマホのブラウザ(Safari / Chrome)を起動
アドレスバーに http://192.168.1.100(※ESP32のIPアドレス)を入力
上記の操作画面が表示され、ボタンタップでB77を操作可能

※ESP32がWi-Fiに接続していれば、どのスマホでも使えます(PWA対応でアイコン化も可能)

ESP32のIPアドレスが変動すると、スマホからアクセスできなくなるので注意!
 → IP固定化またはmDNS(例:http://revox.local)で回避可能

PWA化アプリ風 UI

/data               ← LittleFS 用アップロードフォルダ
 ├─ index.html      ← メイン画面(レスポンシブ)
 ├─ manifest.json   ← PWA メタ情報
 └─ sw.js           ← Service Worker(オフライン対応)
main.cpp            ← ESP32 ファームウェア

index.html をスマホのブラウザで開くとホーム画面追加ボタンが表示され、インストールすると全画面・アイコン付き“ネイティブアプリ風”に変身します。

参考までに簡単なHTMLのサンプルをと各種ファイルをメモしておきます。

index.htmlサンプル

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <link rel="manifest" href="/manifest.json">
  <title>REVOX B77 Remote</title>
  <style>
    :root { --pri:#007bff; --bg:#fafafa; --txt:#222; }
    body { font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
           text-align:center; margin:0; background:var(--bg); color:var(--txt);}
    h1   { font-size:1.5rem; padding:1rem 0; }
    .btn { display:block; width:80%; max-width:300px; margin:1rem auto;
           padding:1rem; font-size:1.2rem; border:none; border-radius:12px;
           background:var(--pri); color:#fff; box-shadow:0 4px 8px #0001;
           transition:transform .15s ease;}
    .btn:hover{ transform:translateY(-3px); }
  </style>
</head>
<body>
  <h1>🎛 REVOX&nbsp;B77 Controller</h1>
  <button class="btn" onclick="send('play')">▶︎ PLAY</button>
  <button class="btn" onclick="send('stop')">■ STOP</button>
  <button class="btn" onclick="send('rew')">⏪ REW</button>
  <button class="btn" onclick="send('ff')">⏩ FF</button>
  <button class="btn" onclick="send('rec')">⬤ REC</button>

<script>
if ('serviceWorker' in navigator) navigator.serviceWorker.register('/sw.js');
// API 送信関数
function send(cmd){ fetch(`/cmd?key=${cmd}`); }
</script>
</body>
</html>

manifest.jsonサンプル

{
  "name": "REVOX B77 Remote",
  "short_name": "B77 Remote",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#fafafa",
  "theme_color": "#007bff",
  "icons":[
    { "src": "/icon-192.png", "sizes":"192x192", "type":"image/png" },
    { "src": "/icon-512.png", "sizes":"512x512", "type":"image/png" }
  ]
}

sw.js(最小オフラインキャッシュ)

self.addEventListener('install',e=>{
  e.waitUntil(caches.open('b77-cache').then(c=>
    c.addAll(['/', '/index.html','/manifest.json'])
  ));
});
self.addEventListener('fetch',e=>{
  e.respondWith(caches.match(e.request).then(r=>r||fetch(e.request)));
});

ESP32 への HTML 格納手順(Arduino IDE)

  1. ESP32 ファイルシステムツール(Arduino ESP32FS)を導入
  2. スケッチと同じフォルダに data/ ディレクトリを作成
  3. 上記 index.html manifest.json sw.js icon-*.png を格納
  4. Arduino IDE のメニュー 「ツール → ESP32 Sketch Data Upload」 を実行
    → LittleFS にファイルが書き込まれる
  5. つづけて通常のスケッチ書込み (main.cpp) を実行

3️⃣ GPIO 割り当てと配線

B77機能GPIO番号SSR(フォトMOS)出力DINピン備考
PLAY12CH13
STOP13CH22
REW14CH35
FF27CH44
REC26CH56安全のため長押し0.5 s設定

GND は GPIO 側と DIN Pin1 を一点接地
SSR 出力は無電圧短絡なので B77 内部回路に負担をかけません。


4️⃣ main.cpp ― 完全コード(Arduino/ESP32)

/**
 * REVOX B77 Wi-Fi Remote  v1.0
 * ◇ GPIO → SSR パルスで 7-pin DIN Remote を短絡
 * ◇ LittleFS から PWA ファイル群を配信
 *
 * 2025/07  作成例
 */
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <LittleFS.h>

const char* SSID = "YourSSID";
const char* PASS = "YourPass";

// ==== GPIO 定義 ====
const int PIN_PLAY = 12;
const int PIN_STOP = 13;
const int PIN_REW  = 14;
const int PIN_FF   = 27;
const int PIN_REC  = 26;

AsyncWebServer server(80);

//------------------------
// 接点を 250 ms パルスで短絡
void pulse(int gpio, uint16_t ms=250){
  digitalWrite(gpio, HIGH);
  delay(ms);
  digitalWrite(gpio, LOW);
}
//------------------------
void handleCmd(AsyncWebServerRequest* req){
  if(!req->hasParam("key")) { req->send(400,"text/plain","NG"); return; }
  String k = req->getParam("key")->value();
  if      (k=="play") pulse(PIN_PLAY);
  else if (k=="stop") pulse(PIN_STOP);
  else if (k=="rew")  pulse(PIN_REW);
  else if (k=="ff")   pulse(PIN_FF);
  else if (k=="rec")  pulse(PIN_REC, 500);  // REC は長押し
  req->send(200,"text/plain","OK");
}
//------------------------
void setup(){
  // GPIO 初期化
  pinMode(PIN_PLAY, OUTPUT); pinMode(PIN_STOP, OUTPUT);
  pinMode(PIN_REW , OUTPUT); pinMode(PIN_FF  , OUTPUT);
  pinMode(PIN_REC , OUTPUT);
  // オフ状態
  digitalWrite(PIN_PLAY, LOW); /* …他も同様 */

  // LittleFS マウント
  LittleFS.begin();

  // Wi-Fi 接続
  WiFi.begin(SSID, PASS);
  while(WiFi.status()!=WL_CONNECTED) delay(200);
  Serial.println(WiFi.localIP());

  // 静的ファイル配信
  server.serveStatic("/", LittleFS, "/").setDefaultFile("index.html");
  // 操作 API
  server.on("/cmd", HTTP_GET, handleCmd);
  server.begin();
}

void loop(){}

ESP32をSoft-APモードで動かす

仮に現場に母艦となるwifiシステムがない場合はどうすればいいでしょうか?

Wi-Fiがない現場でも、ESP32を「Soft-APモード(アクセスポイント)」で動かせば問題ありません。

ステップ操作内容
電源ON(USB給電)するとESP32がWi-Fiを発信(例:SSID「B77-Remote」)
スマホのWi-Fi設定画面を開き、表示された「B77-Remote」に接続
スマホのブラウザで http://192.168.4.1 にアクセス
操作画面(PWA UI)が開き、B77を操作できる(PLAY / STOPなど)

Soft-APモードの設定方法

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <LittleFS.h>

AsyncWebServer server(80);

void setup() {
  // ① Soft-APとして起動(自前でWi-Fi発信)
  WiFi.softAP("B77-Remote", "revox123");  // SSID, PASS

  // ② LittleFSをマウント(Web UIファイルを読む)
  LittleFS.begin();

  // ③ Web UI配信
  server.serveStatic("/", LittleFS, "/").setDefaultFile("index.html");
  server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest* req){
    String key = req->getParam("key")->value();
    // GPIO制御などここに実装
    req->send(200, "text/plain", "OK");
  });
  server.begin();
}

void loop(){}

スマホ側の設定(iOS / Android 共通)

📲 Wi-Fi接続設定

  • 設定アプリ → Wi-Fi → 「B77-Remote」を選択
  • パスワード(例:revox123)を入力して接続
  • ※ スマホは「インターネットがないWi-Fi」に警告を出すがそのまま続行OK

🌐 アクセスURL

  • ブラウザ(Safari / Chromeなど)で
     → http://192.168.4.1 を直接入力
  • 初回アクセス時にPWA画面がキャッシュされてオフライン使用OKに

🔋 給電方法(再確認)

  • USBモバイルバッテリー(1A以上出力)
  • 電源ONで自動でWi-Fiが立ち上がる

🎒 モバイルスタジオ/ロケ録音にも完全対応できます!

朝比奈幸太郎

音楽家:朝比奈幸太郎

神戸生まれ。2025 年、40 年近く住んだ神戸を離れ北海道・十勝へ移住。
録音エンジニア五島昭彦氏より金田式バランス電流伝送 DC 録音技術を承継し、 ヴィンテージ機材で高品位録音を実践。
ヒーリング音響ブランド「Curanz Sounds」でソルフェジオ周波数音源を配信。
“音の文化を未来へ”届ける活動を展開中。