双方向ハンドセンサー(書込済Arduino Nano Everyバンドル版)説明ページ
双方向ハンドセンサー(書込済Arduino Nano Everyバンドル版)販売サイト

ご購入のお客様へ センサーのみ販売 スポンサー募集中 リンク 技術・ソフト 開発者

原理 解説(投稿)

YouTubeと投稿


開発スポンサー募集中! 技術の詳細公開中、ダウンロードも

 新規、変更

他のセンサーとの比較

センサーAIカメラLIDAR双方向ハンドセンサー
測定原理画像をAI(ソフトウェア)で分析赤外線レーザー光を放射し飛行時間を測定普通の赤外線を放射し反射光の強さを測定
配置と測定角度一点から放射状に測定一点から放射状に測定線状、平面状にセンサーを展開しピンポイントで上空を測定
測定速度遅い遅い速い
短所奥行き方向の精度が悪い
映像が残り、プライバシーが見られる恐れ
死角がある
応用の自由度が低い
死角がある、
応用の自由度が低い
目を傷つける場合がある
距離が測定できない
検出距離が短い(約20センチ)
認知されていない
長所1m以上の長距離でも測定可能
性能が保証されている
情報が多く使いやすい
1m以上の長距離でも測定可能
距離測定の精度が高い
情報が多く使いやすい
暗いところでも測定できる
マイコンで制御でき応用の自由度が高い
死角がなく、3次元的に空間の変化を捉える
暗いところでも測定できる

リンク

センサー基板発売中

販売サイト 製品は黒色(緑の基板は色以外製品と同じ試作品)

技術詳細

ハードウェア

センサー基板

※赤外線LEDとフォトトランジスタに黒いカバーをつけています。これが無いと横からの光を検出して正しく検出できません。最初は銀紙を巻いていましたが現在は塩ビ端末保護キャップ 端子カバーを切って使っています。

ブロック図

距離読み取りの手順

  1. マイコンはADコンバータをSPIインターフェイスで読みます。
  2. このSPIのSSをトリガーに10uSec(マイクロ秒)のパルスをワンショットマルチバイブレータで発生します。
  3. 10uSecのパルスでMOSFETのゲートをオンします。
  4. 赤外線LEDに10uSecの時間、約1.5Aの電流を流しオーバードライブします。(電流制限抵抗なし)
  5. ADコンバータはフォトトランジスタの出力を電圧変換した値を読みます。
  6. マイコンはADコンバータの値から距離近似値を検出します。

回路図と部品表

フォトトランジスタの特性

フォトトランジスタの特性でセンサーの性能が決まります。センサーに採用したLTR-209は感度が高く飽和しやすい性質があります。フォトトランジスタを高感度で直線的な特性の物にするとセンサーの性能が上がります。

フォトリフレクタ

スイッチングフォトリフレクタ

赤外線LEDを10uSだけオンして強く発光させADコンバータで反射光を読み取ります。これが技術の核心です。
スイッチングフォトリフレクタは私が2019年に発明した技術でまだ認知されていません。
スイッチングフォトリフレクタ記事

私は昔、半導体の故障解析の仕事をしていました。MOSFETやLSIの電流リークなどの故障箇所を見つけSEM(走査型電子顕微鏡)で写真を撮ります。半導体の故障原因は結晶のわずかな歪やゴミなどで、そこから電流リークなどが起こることが多いです。歪のない綺麗な半導体は壊れ難いです。
一方で最近は半導体プロセスの微細化で世界が競争しています。赤外線LEDはLSIチップと違って微細化の対象ではないかもしれませんが平均的な精度が上がり歪の無い半導体が製造可能になっています。これらの要因で昔に比べ半導体(赤外線LED)が壊れ難くなったのがその背景です。

ソフトウェア

ADコンバータ読み込み手順

  1. OE_CLED:LOW   // カラーLEDオフ
  2. A,B,C セット     // センサーチャンネル選択
  3. SEL_SEN: HIGH   // SPIはセンサー制御
  4. OE_ILED:LOW   // 赤外線LEDオフ
  5. SS :LOW
  6. SPIでADコンバータ読み取り3バイト 値X
  7. SS :HIGH
  8. OE_ILED:HIGH  // 赤外線LEDスタンバイ
  9. SS :LOW     // 赤外線LEDオン
  10. SPIでADコンバータ読み取り3バイト 値Y
  11. SS :HIGH
  12. 近似距離値 = Y – X – Z ※Zは起動直後に測定した校正値(周囲の明るさ)

ADコンバータ読み込みプログラム

センサー8個を読む
void Sensor::setAd(bool bInit) {            // bInit:add val to adAryInit[]
	for (int col = 0; col < COL_LEN; col++) {
		setCol(col, bInit);         // sensing
	}
	if (!bInit)                         // set CLED
		cled.set(val);		    // set sensor-data
}
センサー1個を読む
void Sensor::setCol(int col, bool bInit) {
	int ledSta = digitalRead(OE_CLED);
	digitalWrite(OE_CLED, LOW);
	out3bit(abc, col);
	digitalWrite(SEL_SEN, HIGH);
	digitalWrite(OE_ILED, LOW);     // ILED-OFF
	int vOff = getAdc(col);			// *** read ADC ***
	digitalWrite(OE_ILED, HIGH);    // ILED-ON
	int vOn = getAdc(col);      	// *** read ADC ***
	digitalWrite(SEL_SEN, LOW);
	digitalWrite(OE_ILED, LOW);     // ILED-OFF
	digitalWrite(OE_CLED, ledSta);
	if (bInit)
		adAryInit[col] += vOn - vOff - (vOff >> 2) + (vOn >> 4);
	else
		adAry[col] = noMinus(vOn - vOff - (vOff >> 2) + (vOn >> 4) - adAryInit[col]);
	val[col] = ad2val(adAry[col]);
}
※(vOff >> 2) + (vOn >> 4)は強い光に対する補正値です。

ロジック

ADコンバータは赤外線の強さを2回読みます。1回目は赤外線LEDをオフにして周囲の明るさだけ、2回目は赤外線LEDを発光させて物体からの反射光を読みます。この差から起動直後に測定した周囲の明るさ校正値を引いた値が距離近似値です。
距離近似値=(Y – X) – Z
X: 赤外線LEDオフのAD値、Y: 赤外線LEDオンのAD値、Z: 校正値(起動直後に測定した周囲の明るさ)

SPIと赤外線LED、ADコンバータ波形

SPIクロックと赤外線LEDゲートドライブ波形

SPIのSSをトリガーに10uSec赤外線LEDをオンします(青)

SPIクロックとADコンバータ波形

ADコンバータ(青)はSPIのクロック(黄)の中央付近でアナログ値を読んでいます。コントローラーによりSPIのSSのタイミングが大きくズレるとADコンバータの値が下がる事があります。Raspberry Pi, Arduino Uno, Arduino Nano Every, Nucleo F303k8では問題なく動作します。

ダウンロード(google ドライブ)
  • Arduino_Nano_Every_3a.zip : Arduino Nano Everyの基本プログラム(最初の動画)
  • ユーザーマニュアル1_20.pdf : ユーザーマニュアル(回路図付き)
  • Manual_Program1.zip    : ユーザーマニュアルとArduino, Rsspberry Pi, mbedプログラム
MENU
PAGE TOP