STM32 Nucleo F446REでSICK社のDT35-B15851測距センサの値を読み取るプログラムです。
- 型番: SICK DT35-B15851
- 測定範囲: 50mm ~ 12,000mm(90%反射率)
- 分解能: 0.1mm
- 出力: アナログ電圧 0-10V(リニア)
- 応答時間: 2.5ms(最小)
- 光源: 赤外線レーザー(クラス1)
- STM32 Nucleo F446RE
- SICK DT35-B15851センサー
- 電圧分割回路用の抵抗
- R1: 6.7kΩ(センサー側)
- R2: 3.3kΩ(GND側)
DT35 Sensor (M12コネクタ)
┌─────────────┐
│ Pin 1: +Vs (12-30VDC) ───→ 電源 +12V ~ +30V
│ Pin 2: OUT (0-10V) ───→ 電圧分割回路へ
│ Pin 3: GND ───→ GND
│ Pin 4: (未使用)
│ Pin 5: (未使用)
└─────────────┘
電圧分割回路
┌──────────────────────────┐
│ Pin 2 (0-10V) │
│ │ │
│ R1 (6.7kΩ) │
│ │ │
│ ├────→ Nucleo A0 │
│ │ │
│ R2 (3.3kΩ) │
│ │ │
│ GND │
└──────────────────────────┘
Nucleo F446RE
┌──────────────────┐
│ A0 ← 分割後電圧 │
│ GND ← GND │
│ USB ← PC │
└──────────────────┘
STM32のADCは最大3.3Vまでしか読めないため、0-10V信号を0-3.3Vに変換する必要があります。
Vout = Vin × R2 / (R1 + R2)
3.3V = 10V × R2 / (R1 + R2)
R1 = 6.7kΩ, R2 = 3.3kΩの場合:
Vout = 10V × 3.3 / (6.7 + 3.3) = 3.3V
DT35/
├── include/
│ └── DT35_Sensor.h # センサードライバのヘッダー
├── src/
│ ├── DT35_Sensor.cpp # センサードライバの実装
│ └── main.cpp # メインプログラム
├── platformio.ini # PlatformIO設定
└── README.md # このファイル
# PlatformIOでビルド
pio run
# ビルドとアップロード
pio run --target upload
# シリアルモニタを開く
pio device monitor#include "DT35_Sensor.h"
// センサーオブジェクトを作成
// 引数: ADCピン, 電圧比率, 最小距離, 最大距離
DT35_Sensor sensor(A0, 0.33f, 50.0f, 12000.0f);
int main() {
while (true) {
// 距離を読み取り(mm単位)
float distance_mm = sensor.readDistance_mm();
// 距離を読み取り(m単位)
float distance_m = sensor.readDistance_m();
// センサー電圧を読み取り
float voltage = sensor.readVoltage();
// 有効範囲内か確認
if (sensor.isValid()) {
printf("Distance: %.1f mm\n", distance_mm);
}
ThisThread::sleep_for(100ms);
}
}異なる抵抗値を使用する場合は、電圧比率を計算して指定してください。
// 例: R1=8.2kΩ, R2=3.9kΩの場合
// 電圧比率 = 3.9 / (8.2 + 3.9) = 0.322
DT35_Sensor sensor(A0, 0.322f);プログラムを実行すると、以下のような出力が得られます:
=== SICK DT35-B15851 Distance Sensor Reader ===
Measuring range: 50mm to 12000mm
Resolution: 0.1mm
Analog input pin: A0
===============================================
Distance: 150.5 mm (0.151 m) | Voltage: 0.15 V | ADC: 0.015 [OK]
Distance: 245.8 mm (0.246 m) | Voltage: 0.25 V | ADC: 0.025 [OK]
Distance: 1205.3 mm (1.205 m) | Voltage: 1.21 V | ADC: 0.121 [OK]
原因: 電圧分割回路の接続不良、または抵抗値が間違っている
解決策:
- 配線を確認
- 抵抗値を測定
- センサーの電源供給を確認(12-30VDC)
原因: ノイズの影響、またはADC基準電圧の問題
解決策:
- センサー電源にノイズフィルタを追加
- GND接続を確認
- シールドケーブルを使用
原因: 電圧分割回路が正しく動作していない
解決策:
- すぐにセンサーを切断(STM32が破損する可能性)
- 電圧分割回路の抵抗値を再確認
- テスターで分割後の電圧を測定
DT35_Sensor(PinName analogPin,
float voltageRatio = 0.33f,
float minDistance = 50.0f,
float maxDistance = 12000.0f)analogPin: ADCピン番号(例: A0)voltageRatio: 電圧分割比率(デフォルト: 0.33)minDistance: 最小測定距離(mm、デフォルト: 50)maxDistance: 最大測定距離(mm、デフォルト: 12000)
float readDistance_mm(): 距離をmm単位で取得float readDistance_m(): 距離をm単位で取得float readVoltage(): センサー電圧(0-10V)を取得float readRawADC(): 正規化されたADC値(0.0-1.0)を取得bool isValid(): 最後の読み取り値が有効範囲内か確認
このコードは教育・研究目的で自由に使用できます。