Raspberry Pi をキヤノン EOS シリーズのリモコンにする
勉強会で Raspberry Pi で制御する赤外線リモコンを組んだ。その回路でキヤノン EOS シリーズのカメラのシャッターを切ることができたので記録しておく。
Raspberry Pi の動作に必要な OS である Raspbian と、赤外線の送受信を行うミドルウェア LIRC (Linux Infrared Remote Control) がすでにインストールされているパッケージをいただいたので、その辺りの手順については割愛する。
この記事では LIRC を使って制御信号をどのように送信するかについて記す。
赤外線送受信の回路図はこの記事が詳しい。
使用器具
- Raspberry Pi 3 Model B
- EOS 60D
リモコン制御専用機として 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秒のタイマーにする必要がある。また赤外線受光部がグリップ部分に配置されているので指で遮らないよう注意する。