お問い合わせ リンク 開発者プロフィール マニュアル_プログラム
順序とタイミングで誤検知を防ぐ2点式非接触スイッチ
動作検出に特化した複眼型モーションセンサー
攻めたセンシング・システムの試作と実験
新規、変更
- 新:公開フォルダ(マニュアル_プログラム)にArduino Nano R4用のプログラムを追加しました(25/12/10)
- 新:protopediaにUFOパンチゲームの記事をYouTubeにUFOパンチゲーム2の動画を投稿しました(25/10/28)
- 新:TikTokとYouTubeショートにUFOパンチ・ゲームの動画を投稿しました(25/10/21)
- 新:hackaday prize 2023 ファイナリストに選ばれました(23/8/18)
概要
- ソフトウェア版
- 赤外線LEDの電流は10マイクロ秒間、1.5Aの電流
- サイクルは8センサー1.2ミリ秒、検出距離 約20センチ
- 線や面に展開して上空の手の動きをソフトで検出、応用範囲が広い
- 色はソフトで変えられる。通常は距離を表す
- ハードウェア版
- 距離に応じた電圧出力(簡易距離センサー)
- 誤検知しない便利な2点式非接触スイッチ
- スイッチングフォトリフレクタ(SPR)で特許出願済み

リンク(投稿、動画、技術解説)








開発スポンサー募集中! 技術の詳細公開中、ダウンロードも
他のセンサーとの比較(景色は目、動作検出は複眼)
| センサー | AIカメラ | LIDAR | 双方向ハンドセンサー |
| 測定原理 | ・画像をAI(ソフトウェア)で分析 | ・赤外線レーザー光を放射し飛行時間を測定 | ・普通の赤外線を放射し反射光の強さをADコンバータとソフトウェアで検出 |
| 配置と測定角度 | ・一点から放射状に測定 | ・一点から放射状に測定 | ・線や平面に展開する複眼型、真上を検出し解像度が高い |
| 測定速度 | 遅い(ピント合わせと計算時間) | 遅い(飛行時間、測定点が多い) | 速い(8センサー1.2ミリ秒、電圧測定だけ) |
| 短所 | ・映像が残り、プライバシーが見られる恐れ ・視野角が狭く死角がある ・仕様に依存するので応用は限定的 | ・死角がある、 ・仕様に依存するので応用は限定的 ・目を傷つける場合がある | ・距離測定の誤差が大きい(反射光と距離は比例しない) ・検出距離が短い(約20センチ) ・認知されていない |
| 長所 | ・1m以上の長距離でも測定可能 ・性能が保証されている ・検出パターンの自由度が大きい | ・1m以上の長距離でも測定可能 ・距離測定の精度が高い ・暗いところでも測定できる | ・非接触の機械入力に特化したセンサー ・暗いところでも測定できる ・制約が無く応用範囲が広い |


リンク
センサー基板発売中
販売サイト 製品は黒色(緑の基板は色以外製品と同じ試作品)
技術詳細
ハードウェア
センサー基板



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

距離読み取りの手順
- マイコンはADコンバータをSPIインターフェイスで読みます。
- このSPIのSSをトリガーに10uSec(マイクロ秒)のパルスをワンショットマルチバイブレータで発生します。
- 10uSecのパルスでMOSFETのゲートをオンします。
- 赤外線LEDに10uSecの時間、約1.5Aの電流を流しオーバードライブします。(電流制限抵抗なし)
- ADコンバータはフォトトランジスタの出力を電圧変換した値を読みます。
- マイコンはADコンバータの値から距離近似値を検出します。
回路図と部品表(回路図はユーザーマニュアルが見やすいです)



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

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

スイッチングフォトリフレクタ
赤外線LEDを10uSだけオンして強く発光させADコンバータで反射光を読み取ります。これが技術の核心です。
スイッチングフォトリフレクタは私が2019年に発明した技術でまだ認知されていません。
スイッチングフォトリフレクタ記事
私は昔、半導体の故障解析の仕事をしていました。MOSFETやLSIの電流リークなどの故障箇所を見つけSEM(走査型電子顕微鏡)で写真を撮ります。半導体の故障原因は結晶のわずかな歪やゴミなどで、そこから電流リークなどが起こることが多いです。歪のない綺麗な半導体は壊れ難いです。
一方で最近は半導体プロセスの微細化で世界が競争しています。赤外線LEDはLSIチップと違って微細化の対象ではないかもしれませんが平均的な精度が上がり歪の無い半導体が製造可能になっています。これらの要因で昔に比べ半導体(赤外線LED)が壊れ難くなったのがその背景です。
ソフトウェア
ADコンバータ読み込み手順
- OE_CLED:LOW // カラーLEDオフ
- A,B,C セット // センサーチャンネル選択
- SEL_SEN: HIGH // SPIはセンサー制御
- OE_ILED:LOW // 赤外線LEDオフ
- SS :LOW
- SPIでADコンバータ読み取り3バイト 値X
- SS :HIGH
- OE_ILED:HIGH // 赤外線LEDスタンバイ
- SS :LOW // 赤外線LEDオン
- SPIでADコンバータ読み取り3バイト 値Y
- SS :HIGH
- 近似距離値 = 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プログラム