もりねずみーのやつ

インターネット上でしか生きられません

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は使える)っていう 状態になったのかなぁ…?(うろ覚え)

まとまりの無い記事で申し訳ないです。

f:id:aburos:20140818223834j:plain