Raspberry Pi Model B+(ArchLinux)でカメラモジュールが使えない件
追記(2018/5/23)
ラズパイ2や3では普通に使えて、I2Cも同時に使えています。
ひょっとしたら今のファームウェアならこの問題は解決してるかも?
モデルB+が悪いわけじゃなさそう
モデルB+を入手してからカメラモジュールを接続してraspstillとか使ってもエラーが出て使えなくて、(・3・)アルェーってなってたんだけど、モデルB+だけじゃなくモデルB、モデルAでもうまく行かなくなってた。
使えなくなってたのは、最近Arch Linuxをインストールしたヤツだけだった。
エラーメッセージは以下の通り。
mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM) mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1) mmal: Failed to create camera component mmal: main: Failed to create camera component mmal: Camera is not detected. Please check carefully the camera module is installed correctly
このエラーが出る時って、本当にカメラモジュールが物理的につながってない(カメラモジュールのカメラ本体側の正方形のコネクタがしっかりささってない、FPCケーブルが断線してる)が大半なんだけど、今回問題になったのは、ラズパイ向けLinuxカーネル側の仕様かバグかってところっぽい。
ちなみにカーネルは3.12.26-1-ARCH。
以下の情報を探して右往左往してたところ、コレだっていうのが見つかったんだけど、結局のところよく理解してない。
B+ Camera is not detected (workaround available) - Raspberry Pi Forums
どうやら、spi-bcm2708とi2c-bcm2708モジュールがカーネルにロードされてると、カメラモジュールが競合してるのか、使えなくなってしまうっぽい。
Raspberry Pi + Arch Linuxでカメラモジュールを使う(暫定)
とりあえず、偉大なる先人達のお知恵をお借り(ググってただけ)しながら、使えるようにするまでを、まとめておこうかと思う。 (ただ、恐らくLinuxカーネル側の誤りで、後々修正されて必要なくなるのかもしれない…?)
最新ファームウェア/ツールを入れる
Tutorial for updating R-Pi firmware in ARCH LINUX [obsolete] - Raspberry Pi Forums
ここを頼りに、rpi-updateが使えるようにしておく。
# pacman -Syu # pacman -S git wget # wget http://raw.github.com/Hexxeh/rpi-update/master/rpi-update -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update # pacman -S ca-certificates # pacman -S binutils # pacman -Sy raspberrypi-firmware-bootloader linux-raspberrypi # rpi-update # sync # reboot
vcgencmdが使えるようになり、ラズパイにカメラモジュールが接続されてるか確認出来るようになる。
$ vcgencmd get_camera supported=1 detected=0 $ vcgencmd get_mem arm arm=384M $ vcgencmd get_mem gpu gpu=128M
ラズパイのカメラモジュールを使う前提として、ArchARM公式Wikiにある通り、GPUへのメモリ割り当てに、最低でも128MBが必要というのと、おまじないがあるそうなので、それを/boot/config.txtに書き込む。
$ sudo vi /boot/config.txt --- 以下を追記 --- gpu_mem_512=128 gpu_mem_256=128 start_x=1 start_file=start_x.elf fixup_file=fixup_x.dat
modprobeのblacklistを作成し、ブート時にロードするモジュールを制御する。
$ sudo vi /etc/modprobe.d/raspi-blacklist.conf --- ファイルを新規作成し、以下を追記 --- blacklist spi-bcm2708 blacklist i2c-bcm2708
$ sudo chmod 644 /etc/modprobe.d/raspi-blacklist.conf
再起動
$ sudo reboot
再度、vcgencmdで、カメラモジュールの接続状態を確認
$ vcgencmd get_camera supported=1 detected=1
認識するはず。これで認識しないとなると、spi-bcm2708、i2c-bcm2708モジュールがまだ読み込まれている状態か(lsmodで確認)、ケーブルが死んでるなどで、本当にカメラモジュールが接続されていないかのどちらか。
detectedが1になっていれば、カメラモジュールが使えるはずなので、
$ raspistill -d
や
$ raspivid -o -t 3000 hoge.h264
などで、確認してみるといい。
SPIやI2Cは使えなくなる
上記手順で、spi/i2c-bcm12708モジュールをロードしなくしているため、SPI接続やI2C接続の周辺機器等は使えなくなります。 SPI/I2Cといえば、今月の日経Linuxに載っていたような、AdafruitだったりSainSmartだったり、ST7735など液晶ディスプレイは使えなくなります。 この記事を書いている現時点では、両方使用することは出来ません。
(というかDSI接続のディスプレイはいつになったら…)
おわりに
ぶっちゃけ、今回の手順、僕自身まだちゃんと理解してません。なんとなくはわかるんだけど、ca-certificatesがなんなのかとか、その辺り後でちゃんと調べて覚えておく。とりあえず動かしたかったので。
あと、今回、何故ラズパイ向けのLinuxカーネルがこんな状態になってしまったのかが、よくわからない。凡ミスでした、バグでした、となれば、「なんだ、いつものことか。そして相変わらず修正早ぇwwwArch最高やwwww」ってなるんだけど、SPI/I2CとCSIコネクタのカメラモジュールが競合するというのが解せない。カメラモジュール自体がCSIコネクタのSPI接続ってこと?I2CではフルHDサイズで30fpsのデータを転送することは無理だよなぁ…。(この辺まだあまり詳しくないので、分かる方いたら教えて下さい…)
でも、よくよく考えてみると、ST7735をラズパイのディスプレイとして使うためにビルドしたカーネルって、確かカメラモジュール使えなかったような気がするけど、元々そういう仕様で、今回modprobeにblacklistとなるものが入ってなかったから、カメラモジュールが使えない(SPI/I2Cは使える)っていう 状態になったのかなぁ…?(うろ覚え)
まとまりの無い記事で申し訳ないです。