目次
はろーわーるど:音楽家の朝比奈幸太郎です。
金田式バランス電流伝送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 以上の耐圧を確保し ビンテージ機器のノイズからマイコンを保護。
必要なものリスト(実物名・型番付き)
作業手順【超具体的】
① SSR〜DINプラグ側ケーブルを作る(B77接続部)
🔌 使用ケーブル例:
- 2芯シールド線 × 3本(または5芯マルチケーブル)
- 端子側:DINプラグ(ハンダ式)
- 反対側:SSR出力(端子ねじ or ピン)
🧰 手順:
- DINプラグ(ハンダ式)を用意 → ピン番号1〜6が刻印されている。
B77では以下を使う:
- ケーブルを必要本数用意(5芯シールド or 2芯×3本) → DINプラグのピンに1本ずつハンダ付け(丁寧に!)
- ハンダ後、熱収縮チューブで絶縁保護 → 最後にプラグのシェルを組み立てて完了
② ESP32〜SSRの配線(制御部)
🔌 使用ケーブル例:
- ジャンパーワイヤー(メス–メス) or
- AWG24撚り線 + ピンヘッダはんだ済み
🧰 手順:
- ESP32 の GPIOピン(例:GPIO12〜GPIO26)から SSR モジュールの IN端子へ接続(GND共通)
- SSR の出力端子(NO/NC)から、上記で作成した DINプラグの該当ピンへ接続
- 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背面に挿して完了!参考コード(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)に接続。
スマホ操作の全体像
① スマホの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に接続していれば、どのスマホでも使えます(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 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)
- ESP32 ファイルシステムツール(Arduino ESP32FS)を導入
- スケッチと同じフォルダに data/ ディレクトリを作成
- 上記 index.html manifest.json sw.js icon-*.png を格納
- Arduino IDE のメニュー 「ツール → ESP32 Sketch Data Upload」 を実行 → LittleFS にファイルが書き込まれる
- つづけて通常のスケッチ書込み (main.cpp) を実行
3️⃣ GPIO 割り当てと配線
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モード(アクセスポイント)」で動かせば問題ありません。
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が立ち上がる
🎒 モバイルスタジオ/ロケ録音にも完全対応できます!



