概要
カメラモジュールは、イメージセンサー(光を電気信号に変換する半導体素子)とレンズ、信号処理回路(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/F | FPS | 備考 |
|---|---|---|---|---|---|
| RPi Camera Module 3 | Sony IMX708 | 12MP | MIPI CSI-2 | 120fps(1080p) | AF/HDR対応 |
| RPi Camera Module V2 | Sony IMX219 | 8MP | MIPI CSI-2 | 90fps(720p) | 定番・廉価 |
| RPi HQ Camera | Sony IMX477 | 12.3MP | MIPI CSI-2 | 120fps(1080p) | Cマウントレンズ対応 |
| OV7670 | OmniVision OV7670 | 0.3MP(VGA) | DVP(8bit並列) | 30fps | マイコン向け廉価 |
| ArduCAM Mini 5MP | OV5642 | 5MP | SPI + I2C | 15fps | Arduino/SPI対応 |
| ESP32-CAM | OV2640 | 2MP | DVP 8bit | 60fps(SVGA) | ESP32内蔵、WiFi付き |
| Raspberry Pi Global Shutter | Sony IMX296 | 1.6MP | MIPI CSI-2 | 60fps | グローバルシャッター |
イメージセンサーの主要スペック
| パラメータ | 説明 |
|---|---|
| 解像度 | 有効画素数(例: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 PiやESP32にカメラを接続した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センサー
| 比較項目 | CMOS | CCD |
|---|---|---|
| 消費電力 | 低い | 高い(全電荷転送) |
| コスト | 安価(標準CMOSプロセス) | 高価(専用プロセス) |
| ノイズ | 中(ピクセル間ばらつきあり) | 低い(均一な転送) |
| 読み出し速度 | 高速(各ピクセル独立) | 低速(逐次転送) |
| グローバルシャッター | 可能(Global Shutter CMOS) | 標準 |
| ダイナミックレンジ | 向上中(HDR技術) | 高い |
| 現在の主流 | 圧倒的多数 | 天文・科学計測の一部 |
ローリングシャッター vs グローバルシャッター
| 比較項目 | ローリングシャッター | グローバルシャッター |
|---|---|---|
| 露光タイミング | 行ごとに順次 | 全ピクセル同時 |
| 高速移動体 | 歪み(Jello Effect)発生 | 歪みなし |
| コスト | 安価 | 高価(メモリ追加) |
| フレームレート | 高い | 比較的低い |
| 用途 | 一般撮影・スマートフォン | 産業カメラ・ドローン |
カメラモジュール vs 個別ToFセンサー(深度計測比較)
| 比較項目 | ステレオカメラ(2眼) | ToFカメラ(深度センサー) |
|---|---|---|
| 深度計測原理 | 視差(三角測量) | 光の往復時間 |
| 精度 | 距離に依存(近距離高精度) | 均一(距離依存性低) |
| 照度依存性 | 高い(テクスチャなし→失敗) | 低い(アクティブ照射) |
| レンジ | 0.1m〜10m | 0.3m〜5m |
| 処理負荷 | 高い(ステレオマッチング) | 低い(ハードウェア計算) |
| コスト | 安〜中(2カメラ) | 中〜高 |