✅ 概要
本記事では、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 など |
🔧 ソフトウェア設定手順
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
を変更すれば変換精度を調整できます。 - より正確な距離測定にはキャリブレーション(実測による補正)が推奨されます。