ArduinoからカラオケDAMを操作する方法 (赤外線)

# カラオケDAMを赤外線で操作したい

カラオケを自分で選曲ツールを作って操作したいと思ったことはありませんか。
今回は、実際にカラオケリモコン「DAM-RM50」を購入し仕様を解析した結果を書いていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/8ad75add-fe04-2340-7468-7cfdf5b20b21.png)

「LIVEDAM STADIUM」など現行の機種でも使える方法なので、ぜひみなさんもArduinoでカラオケをお楽しみください！！

選曲はデンモクの方がよいという方も、演奏中止や予約取消などのコマンドを赤外線で送信してみませんか。リモコン画面を出したり、取り消し確認画面を操作したりする手間をスキップできるので、一発で操作できて大変便利です。

# コマンド送信のための下準備

赤外線LEDとArduinoさえ用意すればコマンドを送信できます。

**赤外線LEDは、波長が950nm(940nm)のものを選んでください。**最初、850nmのものを使っていた所、反応しなくて悩んでいました。リモコン用の赤外線LEDといえばNEC、MITSUBISHI、SONYなどのフォーマットに関わらず、基本は950nmのものが主流のようです。[秋月電子なら、この辺のものを購入してください。](https://akizukidenshi.com/catalog/g/gI-03261/)

# コマンド一覧と仕様例

DAMのリモコンは、NECフォーマットを利用しています。

NECのフォーマットでは最初の16ビットにメーカーコード、次の8ビットにデータ、最後の8ビットにデータを2進数で反転させた合計32ビットのデータが入ります。

DAMでは、選曲などの長いデータのときも、この32ビットのデータを複数回送ることで表現しているようです。

フォーマットについて知りたい方は、こちらのサイトがとても参考になります。
http://elm-chan.org/docs/ir_format.html

また、このサンプルではArduino用のライブラリIRremoteを利用して送信を行なっています。
https://github.com/z3t0/Arduino-IRremote

## カラオケ選曲に関するコマンド

メーカーコード: `0x8BB4` (最初の16ビットに固定)

各種キーコード:

1つ目にキーコード、2つ目にメーカーコードと反転データを追加した32ビットの完全な送信データを記載しています。

予約転送開始 - `0x10` `0x8BB410EF`
予約転送終了 - `0x90` `0x8BB4906F`

0 `0x0C` `0x8BB40CF3`
1 `0x8C` `0x8BB48C73`
2 `0x4C` `0x8BB44CB3`
3 `0xCC` `0x8BB4CC33`
4 `0x2C` `0x8BB42CD3`
5 `0xAC` `0x8BB4AC53`
6 `0x6C` `0x8BB46C93`
7 `0xEC` `0x8BB4EC13`
8 `0x1C` `0x8BB41CE3`
9 `0x9C` `0x8BB49C63`
A `0x5C` `0x8BB45CA3`
B `0xDC` `0x8BB4DC23`

### 例

[選曲番号3712-40の曲](https://www.clubdam.com/karaokesearch/songleaf.html?requestNo=3712-40)を予約するには、次のようにします。

```c
#include <IRremote.h>
IRsend irsend;

void setup()
{
  irsend.sendNEC(0x8BB410EF,32); // 予約転送開始
  delay(100);
  irsend.sendNEC(0x8BB4CC33,32); // 3
  delay(100);
  irsend.sendNEC(0x8BB4EC13,32); // 7
  delay(100);
  irsend.sendNEC(0x8BB48C73,32); // 1
  delay(100);
  irsend.sendNEC(0x8BB44CB3,32); // 2
  delay(100);
  irsend.sendNEC(0x8BB42CD3,32); // 4
  delay(100);
  irsend.sendNEC(0x8BB40CF3,32); // 0
  delay(100);
  irsend.sendNEC(0x8BB4906F,32); // 予約転送終了
  delay(1000);
}

void loop() {

}
```

## 各種操作用コマンド

## 単発操作

スタート/やり直し `0x80` `0x8BB4807F`
予約確認 `0x50` `0x8BB450AF`
予約取消 `0xE0` `0x8BB4E01F`
演奏中止 `0x00` `0x8BB400FF`

割り込み `0xC0` `0x8BB4C03F`
採点 `0xF8` `0x8BB4F807`
あと回し `0xF4` `0x8BB4F40B`

ガイドメロディ `0xB0` `0x8BB4B04F`
ワイプ `0x30` `0x8BB430CF`
ルビ `0x60` `0x8BB4609F`
バックコーラス `0x0B` `0x8BB40BF4`
予約した曲名を隠す `0xA4` `0x8BB4A45B`

効果音1 `0x7C` `0x8BB47C83`
効果音2 `0xFC` `0x8BB4FC03`
効果音3 `0x05` `0x8BB405FA`

キー上げる `0x20` `0x8BB420DF`
キー下げる `0x4A` `0x8BB4A05F`
テンポ下げる `0x84` `0x8BB4847B`
テンポ上げる `0x04` `0x8BB404FB`

カラオケ音量下げる `0xB5` `0x8BB4B54A`
カラオケ音量上げる `0xF5` `0x8BB4F50A`

DAMボタン `0xB8` `0x8BB4B847`

一時停止 `0xD8` `0x8BB4D827`

### 例

選曲のときと同様に、sendNECコマンドで送信できます。

例えば演奏中止の場合は、`irsend.sendNEC(0x8BB4CC33,32);`でOKです。

## 連続操作

押している間ずっと効果を発揮するコマンドです。

早戻し `0x58` `0x8BB458A7`
早送り `0x38` `0x8BB438C7`

### 例

sendNECStandardを使うことで、sRepeatsの分だけ繰り返すことができます。

```c
uint16_t sAddress = 0x8BB4;
uint8_t sCommand = 0x38;
uint8_t sRepeats = 0;
irsend.sendNECStandard(sAddress, sCommand, sRepeats);
```

# まとめ

DAMは赤外線で簡単にコマンドを送信できます。Arduinoと赤外線LEDのみで簡単にできますので、みなさんもぜひ試してみてください！


--- 

2021年06月21日追記

普段行かないカラオケ店に行ったら、デンモクが赤外線モードになっており、偶然持っていたArduinoと赤外線受信モジュールで調査しました。


## カラオケ選曲に関するコマンド

メーカーコード: `0x2DD1` (最初の16ビットに固定)

各種キーコード:

予約転送開始 - `0x08`
予約転送終了 - `0x09`
割り込み予約 - `0x03` (`0x08`の直前に送信)

0 `0x30`
1 `0x31`
2 `0x32`
3 `0x33`
4 `0x34`
5 `0x25`
6 `0x36`
8 `0x38`
9 `0x39`

`-` `0x3C`

その他キーは近日更新します！