0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PMW3901オプティカルフローセンサ × Raspberry Pi セットアップ&サンプル実行手順

Last updated at Posted at 2025-07-11

✅ 概要

本記事では、Raspberry Pi に PMW3901 センサを接続し、Python で動作確認を行うまでの手順を説明します。仮想環境を利用して依存関係を安全に管理し、1秒ごとの移動距離をmm単位で取得するサンプルコードも紹介します。


🧰 準備

使用したセンサ

PMW3901オプティカルフローセンサモジュール
スイッチサイエンスで購入
https://www.switch-science.com/products/9141?_pos=1&_sid=82eac1542&_ss=r

ハードウェア接続(GPIOピン)

PMW3901端子 Raspberry Pi (BCM GPIO) 物理ピン番号
VCC 3.3V または 5V 1 または 2
GND GND 6
SCK GPIO 11 (SPI SCLK) 23
MOSI GPIO 10 (SPI MOSI) 19
MISO GPIO 9 (SPI MISO) 21
CS GPIO 7 (SPI CS0) 26
INT GPIO 19(任意) 35 など

PXL_20250711_204403150.jpg


🔧 ソフトウェア設定手順

1. SPI を有効にする

sudo raspi-config
  • [3 Interface Options] → [P4 SPI] → Yes を選択 → 再起動:
sudo reboot

確認:

ls /dev/spidev*
# → /dev/spidev0.0 が見えればOK

2. 依存パッケージのインストール

sudo apt update
sudo apt install -y python3-venv python3-pip git

3. 仮想環境を作成・有効化

python3 -m venv ~/lidar-env
source ~/lidar-env/bin/activate

4. 必要な Python ライブラリのインストール

pip install gpiod gpiodevice

5. PMW3901 ライブラリのインストール

git clone https://github.com/pimoroni/pmw3901-python.git
cd pmw3901-python
pip install .

🚀 サンプルコードの実行

1. 動作確認用スクリプトの作成

任意のディレクトリで以下を保存:pmw3901_test.py

from pmw3901 import PMW3901
import time
import math

# センサの床からの高さ (mm)
SENSOR_HEIGHT_MM = 100
PIXEL_TO_MM = 0.0017 * SENSOR_HEIGHT_MM

def main():
    print(f"センサ高さ: {SENSOR_HEIGHT_MM}mm, 変換係数: {PIXEL_TO_MM:.4f} mm/pixel")
    try:
        sensor = PMW3901()
        print("PMW3901 初期化完了。動作を開始します。")
    except Exception as e:
        print("センサ初期化に失敗しました:", e)
        return

    total_dx_mm = 0.0
    total_dy_mm = 0.0
    last_summary_time = time.time()

    try:
        while True:
            dx, dy = sensor.get_motion()
            dx_mm = dx * PIXEL_TO_MM
            dy_mm = dy * PIXEL_TO_MM

            total_dx_mm += dx_mm
            total_dy_mm += dy_mm

            now = time.time()
            if now - last_summary_time >= 1.0:
                total_distance = math.sqrt(total_dx_mm**2 + total_dy_mm**2)
                print(f"1秒間の移動距離 → dx: {total_dx_mm:.2f}mm, dy: {total_dy_mm:.2f}mm, 合成距離: {total_distance:.2f}mm")
                total_dx_mm = 0.0
                total_dy_mm = 0.0
                last_summary_time = now

            time.sleep(0.01)

    except KeyboardInterrupt:
        print("\nテストを終了しました。")

if __name__ == '__main__':
    main()

2. スクリプトの実行

仮想環境が有効な状態で:

python3 pmw3901_test.py

✅ 出力例

センサ高さ: 100mm, 変換係数: 0.1700 mm/pixel
PMW3901 初期化完了。動作を開始します。
1秒間の移動距離 → dx: 14.29mm, dy: 6.44mm, 合成距離: 15.68mm
1秒間の移動距離 → dx: -18.05mm, dy: 2.55mm, 合成距離: 18.23mm

🔚 備考

  • 高さに応じて SENSOR_HEIGHT_MM を変更すれば変換精度を調整できます。
  • より正確な距離測定にはキャリブレーション(実測による補正)が推奨されます。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?