概要
「非接触タッチパネル」の記事がアメリカの電子工作コンテスト hackaday prize 2023のファイナリストに選ばれました。記事の概要と、今まで非公開だった核心部も含め全て公開します。
hackaday prize 2023 : Non-contact touch panel https://hackaday.io/project/192360-non-contact-touch-panel
動画
動画はhackaday prize 2023の動画をelchika用に編集しました。
センサー基板
原理
フォトリフレクタ
スイッチングフォトリフレクタ
原理はフォトリフレクタの赤外線LEDを10uSだけオンするスイッチングフォトリフレクタです。赤外線LEDは電流制限抵抗が無く、絶対最大定格を超える1.5Aの電流が流れ強い赤外線を放射します。
2年4ヶ月を超える連続動作試験でも壊れたり劣化せず今も動作中です。
スイッチングフォトリフレクタが実現できた背景
私は昔半導体の故障解析の仕事をしていました。MOSFETやLSIの電流リークなどの故障箇所を見つけSEM(走査型電子顕微鏡)で写真を撮ります。半導体の故障原因は結晶のわずかな歪やゴミなどで、そこから電流リークなどが起こることが多いです。歪のない綺麗な半導体は壊れ難いと言えます。
一方で最近は半導体プロセスの微細化で世界が競争するほどです。赤外線LEDはLSIチップと違って微細化の対象ではないかもしれませんが平均的な精度が上がり歪の無い半導体が製造可能になっています。
これらの要因で昔に比べ赤外線LEDが壊れ難くなったのがその背景です。
ブロック図
赤外線LEDのスイッチはADコンバータを読むSPIのSSをトリガーにします。
ADコンバータはOE_ILEDをオンにすると赤外線LEDの反射光、オフのとき周囲の光を読みます。
SPIはSEL_SENピンで選択したセンサー又はカラーLEDのどちらか一つを制御します。
回路図と部品表
ソフトウェア(センサーの基本動作)
SPIセッティング
- SPI-MODE:0
- CLOCK:2MHz
- 1サイクル 1.2mS以上
ADコンバータ読み込み手順
- OE_CLED:LOW // カラーLEDオフ
- A,B,C セット // センサーチャンネル選択
- SEL_SEN: HIGH // SPIはセンサー制御
- OE_ILED:LOW // 赤外線LEDオフ
- SS :LOW
- SPIでADコンバータ読み取り3バイト 値A
- SS :HIGH
- OE_ILED:HIGH // 赤外線LEDスタンバイ
- SS :LOW // 赤外線LEDオン
- SPIでADコンバータ読み取り3バイト 値B
- SS :HIGH
- 近似距離値 = B - A - C
※Cは起動直後に測定した校正値(周囲の明るさ)
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); // sensor-data, indicator
}
センサー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を発光させて物体からの反射光を読みます。この差から起動直後に測定した周囲の明るさ校正値を引いた値が距離近似値です。
距離近似値=(B - A) - C
A: 赤外線LEDオフのAD値、B: 赤外線LEDオンのAD値、C: 校正値(起動直後に測定した周囲の明るさ)
SPIと赤外線LED、ADコンバータ波形
SPIのSSをトリガーに赤外線LEDをオン(青)します。黄色はSPIのクロック(SCLK)です。
ADコンバータはSPIのSCLK(黄色)の中央付近でアナログ値を読んでいます。コントローラーによりSPIのSSのタイミングが大きくズレるとADコンバータの値が下がる事があります。Raspberry Pi, Arduino Uno, Arduino Nano Every, Nucleo F303k8では問題なく動作します。
非接触タッチパネル動作の概要
センサーの赤外線は透明OLEDディスプレイを裏から透過して約2センチの距離で指先を検出します。非接触でスワイプや選択などタッチパネルを操作できるので感染症拡大の防止に役立つと思います。
透明OLEDディスプレイは1.51インチの小さいものしか手に入りません。センサーが6個だけなので周囲の光ノイズを受けて誤検知しやすいです。そのためソフトウェアはどの方向から手が来るかしか見ていません。大きい透明OLEDが使えると商品の間隔が広くなるので誤検知が減って実用的なものができると思います。
透明OLEDと非接触センシング
コントローラー(ラズベリーパイ)のグラフ描画が少し遅れますがセンサーは高速でセンシングしています。空中では約20センチの距離を検出しますが透明OLEDディスプレイを通過すると減衰して4、5センチしか検出できません。
赤外線は透明アクリル板を通過してもほとんど減衰しませんが、透明OLEDは透明な有機ELや配線などを含む複雑な構造なので光が拡散し減衰すると考えられます。
透明OLEDディスプレイ
SparkFun透明OLEDブレイクアウトを使っています。
https://www.sparkfun.com/products/retired/15173
制御はSPIです。センサーは SPI0、透明OLEDはSPI3を使います。
言語はPython3, MITのluma.core ライブラリを使っています。
https://github.com/rm-hull/luma.core
プログラムやユーザーマニュアルは下記google driveからダウンロードできます。
https://drive.google.com/drive/folders/16AX9YFIODV_R7OsrGI2nDDG8XKKObReu
- Arduino_Nano_Every3.zip
双方向ハンドセンサー(書込済Arduino Nano Everyバンドル版)用スケッチ
https://www.switch-science.com/products/9152 - Non-contact_touch_panel.zip
非接触タッチパネルプログラム(ハードウェアは発売していません、プログラムは参考用として下さい) - ユーザーマニュアル1_20.pdf (最新版ユーザーマニュアル)
詳細写真と配線図
3年間未公開、技術の核心
図は同じ条件で手を近づけ、遠ざけた時のフォトトランジスタによる特性の違いを表します。センサーに採用したLTR-209は弱い信号を補足できますが早く飽和する特性があります。この特性がそのまま双方向ハンドセンサーの特性になっています。20センチを検出するのもこの特性のおかげです。
これが今まで秘密にしてきた技術の核心です。フォトトランジスタを高感度で直線性の良いものに変えるとセンサーの性能を上げられます。
終わりに
電子工作ブームやelchikaの目指すところはイノベーションとか最先端の追求ではありません。双方向ハンドセンサーや非接触タッチパネルはイノベーションを狙った技術ですがこちらに投稿させてもらいます。ご質問などはwebsiteのお問い合わせからお願いします。
若者に希望を持ってもらい日本の電機産業復活を目指します。
website https://interactive-hand-sensor.com/root/
マイコン付きセンサー発売中 https://www.switch-science.com/products/9152
投稿者の人気記事
-
3duilab
さんが
2023/10/17
に
編集
をしました。
(メッセージ: 初版)
-
3duilab
さんが
2023/10/17
に
編集
をしました。
-
3duilab
さんが
2023/10/17
に
編集
をしました。
(メッセージ: 「センサーが実現できた背景」追加)
-
3duilab
さんが
2023/10/17
に
編集
をしました。
-
3duilab
さんが
2023/10/22
に
編集
をしました。
ログインしてコメントを投稿する