センサー・アクチュエータ

カメラモジュール

映像を取得するイメージセンサーモジュール。

概要

カメラモジュールは、イメージセンサー(光を電気信号に変換する半導体素子)とレンズ、信号処理回路(ISP: Image Signal Processor)を一体化したモジュールです。組み込みシステムに接続して映像・静止画の取得を可能にします。

組み込み向けカメラモジュールの主な接続インターフェースは以下の通りです。

  • MIPI CSI-2(Camera Serial Interface 2): スマートフォンやRaspberry Piなどで標準的に使われる高速シリアルバス。数十〜数百MHz相当の帯域でRAWデータを転送。
  • DVP(Digital Video Port / Parallel): 8〜16ビット並列データバス。低速・低コストだがピン数が多い。旧世代マイコンカメラ接続に使われた。
  • USB: UVCクラスに対応したUSBカメラ。ホスト機器との接続性が高いが、小型組み込みには不向きな場合も。
  • SPI: 超低速・小型(VGA以下)な組み込みカメラに使われる(例:ArduCAM mini)。

イメージセンサーの種類はCMOS(Complementary Metal-Oxide-Semiconductor)が現在の主流です。かつてはCCD(Charge-Coupled Device)が高画質の標準でしたが、消費電力・サイズ・コストの面でCMOSに置き換わりました。

歴史・背景

CCDイメージセンサーは1969年にベル研究所のウィラード・ボイルとジョージ・スミスが発明し(2009年ノーベル物理学賞)、1970年代から業務用ビデオカメラに採用されました。1980〜90年代にはデジタルカメラ・天体観測用途で普及しましたが、製造コストと消費電力の課題がありました。

CMOSイメージセンサーは1990年代に実用化が進み、特に1993年にNASAジェット推進研究所のエリック・フォッサムがアクティブピクセルセンサー(APS-CMOS)技術を開発。製造コストの低さとCPUと同一プロセスでの製造が可能という利点から、2000年代以降急速に普及しました。

スマートフォンへのカメラ搭載は2000年のSony Ericssonが先駆けで、2007年のiPhone登場を境にモバイルカメラの高画素化競争が加速。それに伴い小型・高性能のMIPI CSI-2対応カメラモジュールが普及しました。

組み込み開発向けには、2013年にRaspberry Pi Camera Module(500万画素、OV5647搭載)が登場し、低価格・高品質のカメラモジュールが入手しやすくなりました。現在ではRaspberry Pi Camera Module 3(Sony IMX708)、ArduCAM等多数の選択肢があります。

技術仕様

代表的な組み込みカメラモジュールの比較

モジュールセンサー解像度I/FFPS備考
RPi Camera Module 3Sony IMX70812MPMIPI CSI-2120fps(1080p)AF/HDR対応
RPi Camera Module V2Sony IMX2198MPMIPI CSI-290fps(720p)定番・廉価
RPi HQ CameraSony IMX47712.3MPMIPI CSI-2120fps(1080p)Cマウントレンズ対応
OV7670OmniVision OV76700.3MP(VGA)DVP(8bit並列)30fpsマイコン向け廉価
ArduCAM Mini 5MPOV56425MPSPI + I2C15fpsArduino/SPI対応
ESP32-CAMOV26402MPDVP 8bit60fps(SVGA)ESP32内蔵、WiFi付き
Raspberry Pi Global ShutterSony IMX2961.6MPMIPI CSI-260fpsグローバルシャッター

イメージセンサーの主要スペック

パラメータ説明
解像度有効画素数(例:1920×1080 = 2.07MP)
ピクセルサイズ1画素の大きさ(μm)。大きいほど低ノイズ・高感度
光学フォーマットセンサーサイズ(1/2.3型、1/4型等)。大きいほど高画質
シャッタータイプローリング(一般)/ グローバル(高速移動体向け)
色フィルターベイヤー配列(RGB)/ モノクロ
感度(ISO)低照度での最大感度
ダイナミックレンジ明暗の記録範囲(dB)
出力フォーマットRAW(Bayer)/ YUV / JPEG
インターフェースMIPI CSI-2, DVP, USB
消費電力フル動作時の消費電流

MIPI CSI-2 プロトコル概要

MIPI CSI-2はカメラとSoC間を接続する高速シリアルインターフェースです。

MIPI CSI-2 構成:
・CLK差動ペア × 1
・DATA差動ペア × 1〜4(レーン数)
・D-PHY物理層(最大2.5Gbps/レーン)

2レーン構成の帯域:
2 × 2.5Gbps = 5Gbps
RAW10 フォーマット、1920×1080@60fps のデータレート:
1920 × 1080 × 60 × 10bit ≈ 1.24Gbps → 2レーンで十分

I2C(SCCB)での制御:
センサーレジスタ設定(解像度、フレームレート、露出等)は
I2C互換のSCCBプロトコルで行う

動作原理

CMOSイメージセンサーの仕組み

CMOSイメージセンサーは、フォトダイオードとピクセル回路(アクティブピクセルセンサー)を格子状に配置した半導体デバイスです。

1ピクセルの構造(3T APS の例):
・フォトダイオード: 光→電荷変換
・リセットトランジスタ: 電荷のリセット
・増幅トランジスタ: 電荷→電圧変換・増幅
・選択トランジスタ: 行選択

動作シーケンス:
① リセット: フォトダイオードを空にする
② 露光: 光に応じて電荷が蓄積(露出時間)
③ 読み出し: 蓄積電荷を電圧として読み出す
④ ADC: アナログ電圧をデジタル値に変換(12〜16bit)

ベイヤー配列とデモザイク

カラーカメラのイメージセンサーは各ピクセルにRGB3色のうち1色しかフィルターがありません(ベイヤー配列)。2×2の4ピクセル単位でRGGB(赤1・緑2・青1)の配置が標準です。

ベイヤー配列(2×2繰り返し):
R G R G R G ...
G B G B G B ...
R G R G R G ...
G B G B G B ...

デモザイク処理:
各ピクセルの欠けている色成分を周辺ピクセルから補間
→ 全ピクセルでRGBが揃う(フルカラー画像)

デモザイクアルゴリズム:
・最近傍補間(高速・低品質)
・双線形補間(汎用)
・AHD(Adaptive Homogeneity-Directed)(高品質)
・機械学習ベース(近年の高品質)

ISP(Image Signal Processor)の役割

ISPはRAWデータを人間が見やすい画像に処理する専用プロセッサです。

ISPパイプライン:
RAW → BLC(Black Level Correction:暗電流補正)
    → LSC(Lens Shading Correction:周辺光量落ち補正)
    → デモザイク(ベイヤー→RGB変換)
    → AWB(Auto White Balance:色温度補正)
    → CCM(Color Correction Matrix:色再現)
    → Gamma補正(人間の視覚特性への変換)
    → NR(Noise Reduction:ノイズ除去)
    → シャープネス強調
    → YUV変換 / JPEG圧縮

用途・ユースケース

機械視覚(Machine Vision)・品質検査

工場の生産ラインで製品の外観検査、寸法測定、バーコード・QRコード読み取りに使われます。グローバルシャッターカメラが高速移動体の歪みなし撮影に必要です。NVIDIA JetsonやFPGAと組み合わせた高速画像処理が一般的です。

ドローン・ロボットのビジョン

障害物検知、経路計画、着陸地点の判断にカメラ映像が使われます。深度推定には双眼カメラ(ステレオビジョン)またはRGB-Dカメラ(深度センサー統合)が使われます。

スマートホーム・セキュリティカメラ

Raspberry PiESP32にカメラを接続したDIYセキュリティカメラ。顔認識・動体検知・クラウドへの映像ストリーミングが可能です。

医療・内視鏡

超小型CMOSカメラモジュール(数mm角)が内視鏡先端に搭載され、消化管・気管支の内部を映像化します。高解像度・高フレームレートが要求されます。

自動車(ADAS)

フロントカメラによる車線検知・歩行者検知・標識認識。リアカメラでのバックモニター(法規制で搭載義務化)。複数カメラによるサラウンドビュー(俯瞰モニター)。

スマートフォン・タブレット

現代スマートフォンのカメラシステムは、超広角・広角・望遠・深度センサーの複数カメラを組み合わせ、AIによるセンサーフュージョンで高品質な写真・動画を実現します。

実装・開発のポイント

Raspberry Pi Camera Module(Python、Picamera2)

from picamera2 import Picamera2
import time

# カメラモジュール初期化
camera = Picamera2()

# 静止画設定(最大解像度)
config = camera.create_still_configuration(
    main={"size": (4608, 2592), "format": "RGB888"}
)
camera.configure(config)
camera.start()

time.sleep(2)  # オートフォーカス・自動露出の安定待ち

# 静止画撮影
camera.capture_file("photo.jpg")
print("撮影完了")
camera.stop()
# ビデオストリーミング(リアルタイム処理)
from picamera2 import Picamera2
import cv2
import numpy as np

camera = Picamera2()
config = camera.create_video_configuration(
    main={"size": (1280, 720), "format": "RGB888"}
)
camera.configure(config)
camera.start()

while True:
    # フレーム取得(NumPy配列)
    frame = camera.capture_array()
    
    # OpenCVで処理(例:グレースケール変換)
    gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
    
    # エッジ検出(Canny)
    edges = cv2.Canny(gray, 100, 200)
    
    cv2.imshow("Edge Detection", edges)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

camera.stop()
cv2.destroyAllWindows()

ESP32-CAM(Arduino/C++)

#include "esp_camera.h"
#include "Arduino.h"

// ESP32-CAM AI-Thinker モジュールのピン定義
#define PWDN_GPIO_NUM  32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM  0
#define SIOD_GPIO_NUM  26  // I2C SDA(SCCB)
#define SIOC_GPIO_NUM  27  // I2C SCL(SCCB)
#define Y9_GPIO_NUM    35
#define Y8_GPIO_NUM    34
// ... その他データピン

bool init_camera() {
    camera_config_t config;
    config.ledc_channel = LEDC_CHANNEL_0;
    config.ledc_timer   = LEDC_TIMER_0;
    config.pin_d0 = Y2_GPIO_NUM;
    // ... ピン設定省略
    config.xclk_freq_hz = 20000000;       // 20MHz クロック
    config.pixel_format = PIXFORMAT_JPEG; // JPEG出力
    config.frame_size   = FRAMESIZE_SVGA; // 800×600
    config.jpeg_quality = 12;             // 0〜63(低いほど高品質)
    config.fb_count     = 1;
    
    esp_err_t err = esp_camera_init(&config);
    return (err == ESP_OK);
}

void capture_and_process() {
    camera_fb_t *fb = esp_camera_fb_get();  // フレームバッファ取得
    if (!fb) { return; }
    
    // fb->buf: JPEGデータ
    // fb->len: データサイズ [bytes]
    Serial.printf("JPEG size: %d bytes\n", fb->len);
    
    // 処理後にバッファを返却
    esp_camera_fb_return(fb);
}

OV7670(マイコン直結DVP)の初期化

OV7670はVGA解像度の低価格カメラで、8bitパラレルDVPインターフェースを持ちます。STM32等のDCMI(Digital Camera Interface)ペリフェラルで受信します。

// STM32 HAL + DCMI でのOV7670フレーム受信(概要)
extern DCMI_HandleTypeDef hdcmi;
extern DMA_HandleTypeDef hdma_dcmi;

uint8_t frame_buffer[640 * 480 * 2];  // RGB565: 2バイト/ピクセル

void camera_start_capture(void) {
    // DCMIでDMA連続キャプチャ開始
    HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS,
                        (uint32_t)frame_buffer,
                        640 * 480 / 2);  // 32bit単位なので/2
}

// フレーム完了コールバック
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) {
    // frame_bufferに1フレームのRGB565データが格納された
    process_frame(frame_buffer, 640, 480);
}

露出・ゲイン制御(AE: Auto Exposure)

# Picamera2 での手動露出設定
from picamera2 import Picamera2
from libcamera import controls

camera = Picamera2()
camera.start()

# 自動露出ON(デフォルト)
camera.set_controls({"AeEnable": True})

# 手動露出設定
camera.set_controls({
    "AeEnable": False,
    "ExposureTime": 10000,  # 露出時間 [μs](10ms)
    "AnalogueGain": 2.0,    # アナログゲイン(1.0〜最大)
})

他技術との比較

CMOSセンサー vs CCDセンサー

比較項目CMOSCCD
消費電力低い高い(全電荷転送)
コスト安価(標準CMOSプロセス)高価(専用プロセス)
ノイズ中(ピクセル間ばらつきあり)低い(均一な転送)
読み出し速度高速(各ピクセル独立)低速(逐次転送)
グローバルシャッター可能(Global Shutter CMOS)標準
ダイナミックレンジ向上中(HDR技術)高い
現在の主流圧倒的多数天文・科学計測の一部

ローリングシャッター vs グローバルシャッター

比較項目ローリングシャッターグローバルシャッター
露光タイミング行ごとに順次全ピクセル同時
高速移動体歪み(Jello Effect)発生歪みなし
コスト安価高価(メモリ追加)
フレームレート高い比較的低い
用途一般撮影・スマートフォン産業カメラ・ドローン

カメラモジュール vs 個別ToFセンサー(深度計測比較)

比較項目ステレオカメラ(2眼)ToFカメラ(深度センサー)
深度計測原理視差(三角測量)光の往復時間
精度距離に依存(近距離高精度)均一(距離依存性低)
照度依存性高い(テクスチャなし→失敗)低い(アクティブ照射)
レンジ0.1m〜10m0.3m〜5m
処理負荷高い(ステレオマッチング)低い(ハードウェア計算)
コスト安〜中(2カメラ)中〜高

関連用語

参考リンク