【Raspberry Pi】サーボモータで赤外線モジュールの角度を変える

※2018/12/11追記
どうもsudo servodを実行していると、aplayというか音声出力系が正常に動作しなくなる模様(再生はしているようだけど、再生時間の割に長く再生してる上に音が全く出なくなる)。
う〜む。これがservoblasterのせいなのか、サーボモータを使っただけでこうなるのか。他の方法でもサーボモータを使ってみたいところ
※追記終わり

引越したので部屋が増えたのですが、それぞれの部屋の照明がリモコン式。
3つのうち1つは手持ちでこれまで音声で赤外線操作してたけど、新たに引越し先で大家さんが設置してくれたものが2台。
こちらの2台はirMagicianで動くことは確認しました。
engetu21.hatenablog.com

なお、機種はCL6DL-5.0
www.irisohyama.co.jp
でした。

で、本題はここからで、irMagicianの設置場所を考えていますが、赤外線の到達距離も考えるとどう考えても3部屋を賄える配置がない。追加で購入(割と高い)するのもな・・・と思って色々考えたんですが、要するに赤外線の届く角度の問題なので、irMagicianの角度が変更できればいいじゃんということに気づきました。
※と言って試したものの、今のところは2部屋の対応で妥協中。

そういうわけで、電子工作もできるラズパイでサーボモータ on irMagicianを実装します。

1.サーボモータ用のプログラムをダウンロードとインストール

ラズパイでサーボモータを動かすにはいくつか方法があるらしい。
ポピュラーな方法のServoBlasterをとりあえずやってみます。

$ git clone git://github.com/richardghirst/PiBits.git
$ cd ~/PiBits/ServoBlaster/user
$ make

gcc -Wall -g -O2 -L/opt/vc/lib -I/opt/vc/include -o servod servod.c mailbox.c -lm -lbcm_host

$ sudo make install
[ "`id -u`" = "0" ] || { echo "Must be run as root"; exit 1; }
cp -f servod /usr/local/sbin
cp -f init-script /etc/init.d/servoblaster
chmod 755 /etc/init.d/servoblaster
update-rc.d servoblaster defaults 92 08
/etc/init.d/servoblaster start

インストールできていればserviceコマンドで見られる。

$ sudo service servoblaster status
● servoblaster.service - LSB: Start/stop servod.
Loaded: loaded (/etc/init.d/servoblaster; generated; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)

/dev配下にservoblasterが追加されています(仮想デバイスファイルが作られる)。

$ ls /dev/servoblaster
/dev/servoblaster

参考サイトを見るとサーボモータ1台目(0番というか0号機)の制御はGPIOポート4番、2台目(1番というか1号機)は17番、といった割り振りになっているらしい。
https://ts628-nxtlego.blogspot.com/2014/11/blog-post.html


サーボモータ1台目を動かすにはGPIOポートの4番で、ラズパイの端子7番に挿せば良いとのこと。なるほど。

実行はデバイスに対してechoするだけ

$ echo 0=130 > /dev/servoblaster

echo 0=130 は、echoコマンドででサーボモータ番号0に対して130度といった感じ。
サーボモータを2つ使う場合は、1号機指定として、echo 1=130といった感じみたいですね。

動かない場合その1として、GPIOがenableになっていない可能性がある。
その場合はラズパイの設定を変更する。

$ sudo raspi-config

f:id:engetu21:20181206223630p:plain
5 Interfacing Optionsを選択

f:id:engetu21:20181206223643p:plain
P8 Remote GPIOを選択

f:id:engetu21:20181206223656p:plain
<はい>を選択

f:id:engetu21:20181206223707p:plain
enableになったので、<了解>で完了。

動かなかった場合その2としては、serviceとしてservoblasterが動いているように見えるけど、実際には動いていない(?)可能性がある。その場合は以下のようにコマンドを打つことでサーボモータが動くようになるはず。

$ sudo servod
Board model: 2
GPIO configuration: P1 (40 pins)
Using hardware: PWM
Using DMA channel: 14
Idle timeout: Disabled
Number of servos: 8
Servo cycle time: 20000us
Pulse increment step size: 10us
Minimum width value: 50 (500us)
Maximum width value: 250 (2500us)
Output levels: Normal

Using P1 pins: 7,11,12,13,15,16,18,22

Servo mapping:
0 on P1-7 GPIO-4
1 on P1-11 GPIO-17
2 on P1-12 GPIO-18
3 on P1-13 GPIO-27
4 on P1-15 GPIO-22
5 on P1-16 GPIO-23
6 on P1-18 GPIO-24
7 on P1-22 GPIO-25