Raspberry Pi をキヤノン EOS シリーズのリモコンにする

勉強会で Raspberry Pi で制御する赤外線リモコンを組んだ。その回路でキヤノン EOS シリーズのカメラのシャッターを切ることができたので記録しておく。

Raspberry Pi の動作に必要な OS である Raspbian と、赤外線の送受信を行うミドルウェア LIRC (Linux Infrared Remote Control) がすでにインストールされているパッケージをいただいたので、その辺りの手順については割愛する。

この記事では LIRC を使って制御信号をどのように送信するかについて記す。

赤外線送受信の回路図はこの記事が詳しい。

使用器具

リモコン制御専用機として Raspberry Pi Zero を用いることもできるようだ。必要に応じて課題とする。

今回カメラは EOS 60D を用いたが、理屈の上では 1987 年に発売された EOS 650 以降、EF マウントを備えた一眼レフでも使用できるはずだ。またリモコンの付属している「オートボーイ」シリーズのリモコンが EOS デジタルシリーズで使用できるので、コンパクトカメラでも使用できる機種があるかもしれない。

赤外線リモコン信号について

赤外線リモコン信号の規格については次のサイトがわかりやすい。

リモコンのひと続きの命令は、赤外線の点灯と消灯を繰り返すパルス信号として表現されている。命令の先頭にはリーダー信号と呼ばれる点灯・消灯時間の長い信号がつく。

続いてデータ部分は点灯・消灯時間の繰り返しで表現され、よく使われる NEC(家電製品協会)フォーマットでは点灯時間が一定で、消灯時間の違いで 1 と 0 のビットを表現している。

命令の最後にはストップ信号と呼ばれるパルスが一つ付加される。点灯時間はデータ部分と同じで、信号に比べて十分長い消灯時間が定められている。

ここまで点灯・消灯と書いてきたが、実際にはパルスの点灯部分は周波数変調がかかっている。変調のキャリア周波数は多くの場合 38 kHz が使用される。

既存のリモコンの信号を確認する

さてここまで理解したら、手元のリモコンがどのようなパルスを送っているか確認してみよう。

Rasberry Pi に SSH で接続し、mode2 コマンドを使って信号の確認を行う。/dev/lirc0 の部分はハードウェア構成によって読み換えてほしい。

mode2 -d /dev/lirc0

このコマンドを実行すると、次のような数字の羅列が表示される。

space 53385
pulse 3491
space 1699
pulse 443
space 1275
pulse 447
space 1271
pulse 442
space 417
pulse 440

これは赤外線の点灯(pulse)と消灯(space)マイクロ秒単位で表したものである。

昼間、屋外から光が入る場所などでは外光がリモコン信号だと誤認識して出力が流れっぱなしになることがある。その場合は反射率の低い板や布で覆うなど、リモコン以外の赤外線が入らないようにする。

リモコン信号の設定ファイルを記述する

次の内容を EOS.conf というファイルとして保存する。

# EOS IR Remote Control
begin remote

  name  EOS
  flags RAW_CODES
  eps            30
  aeps          100

  frequency 32700
  gap          100000
  toggle_bit_mask 0x0

      begin raw_codes

          name RELEASE
              500 7330 500

          name TIMER
              500 5360 500

      end raw_codes

end remote

各設定を簡単に解説すると

  • begin remote: 機器ごとの設定を記述するブロック
  • name: 機器の名前。送信コマンドで使用する
  • flags: 信号や記述形式の設定。ビット演算子の「|」を使って複数を組み合わせることができる
  • RAW_CODES: パルスの点灯と消灯の時間を μs 単位の数値で記述する
  • frequency: パルスの変調周波数 [Hz]。デフォルトは 38000。キヤノンの EOS シリーズおよび一部のコンパクトカメラでは 32.7 kHz が使用されているので変更している
  • gap: ストップ信号の消灯部の長さ [μs]
  • begin raw_codes: 信号の内容を記述するブロック
  • (raw_codes) name: 命令の名前

設定ファイルを lircd に読み込ませる

作成した設定ファイルの内容を /etc/lirc/lircd.conf にコピーして使う。既存の lircd.conf が空なら単純にファイル自体をコピーしてもよい。

LIRC のデーモンである lircd が起動していない場合は次のコマンドで起動する。

sudo lircd -d /dev/lirc0

lircd がすでに起動している場合や設定ファイルを再読み込みさせたい場合、次のコマンドで lircd を再起動する。

sudo killall lircd && sudo lircd -d /dev/lirc0

もし設定ファイルに不備がある場合は /var/log/syslog に記録される。うまく送信されない場合はここを確認してみよう

リモコン信号を送信する

リモコン信号を送信するには irsend コマンドを使う。代表的な使い方は次の通り。

コマンド 内容
irsend LIST "" "" 機器の一覧を表示する
irsend LIST <機器名> "" 指定した機器の命令一覧を表示する
irsend SEND_ONCE <機器名> <命令名> 指定した命令の信号を送信する

先ほど作成した EOS.conf の場合、次のように使用する。RELEASE が即時撮影、TIMER がタイマー撮影となる。

irsend SEND_ONCE EOS RELEASE
irsend SEND_ONCE EOS TIMER

このコマンドを送信する前に、最近の EOS シリーズではドライブ設定を10秒または2秒のタイマーにする必要がある。また赤外線受光部がグリップ部分に配置されているので指で遮らないよう注意する。