Skip to content

KeioRoboticsAssociation/DT35

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SICK DT35-B15851 Distance Sensor Reader

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]

トラブルシューティング

問題: 距離が常に0または12000mmと表示される

原因: 電圧分割回路の接続不良、または抵抗値が間違っている

解決策:

  1. 配線を確認
  2. 抵抗値を測定
  3. センサーの電源供給を確認(12-30VDC)

問題: 値が不安定

原因: ノイズの影響、またはADC基準電圧の問題

解決策:

  1. センサー電源にノイズフィルタを追加
  2. GND接続を確認
  3. シールドケーブルを使用

問題: ADC値が3.3Vを超える

原因: 電圧分割回路が正しく動作していない

解決策:

  1. すぐにセンサーを切断(STM32が破損する可能性)
  2. 電圧分割回路の抵抗値を再確認
  3. テスターで分割後の電圧を測定

API リファレンス

DT35_Sensor クラス

コンストラクタ

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(): 最後の読み取り値が有効範囲内か確認

ライセンス

このコードは教育・研究目的で自由に使用できます。

参考リンク

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages