Non-contact touch panel

Clean machine operation with non-contact touch panel.
This sensor is a science fiction prototyping designed by imagining the future.

Public Chat
Similar projects worth following
Even if covid-19 converges, the next infectious disease will come. Don't you think modern machine input is filthy? Is it possible to operate ticket vending machines without contact?

I want to control with cleaner and more intuitive movements
I want a sensor that can be easily used by children and people with physical disabilities

"Interactive Hand Sensor" is a motion sensor that I invented.
It can detect distance, speed and direction.
It covers a distance of about 7.9 inch (20 cm) at a high speed of 1.2 milliseconds.
( The distance is about 1 inch for non-contact touch panel )

I'm a little worried about reliability because I'm using recent semiconductors that have become more durable, but it's a technology that stabilizes as time goes by. I think that it is used in everyday life in 2030.


"Interactive Hand Sensor" can be detected with a resolution of 0.4~0.8 inch (1~2 cm).Can be applied to non-contact switches, non-contact touch panels, motion detection, etc.

8 sensors from 0 to 7 channels can be sensed in the shortest 1.2 milliseconds

How it works

The principle is "Switching Photo Reflector".
The photo transistor converts the reflected light into current, and the resistor converts it into voltage.
When reading the voltage with the AD converter, the infrared LED is lit at the SCLK timing of SPI Interface. It is driven for 10 microseconds without a current limiting resistor and emits strong light at a current of about 1.5A.

Distance accuracy is poor. The intensity of the reflected light is not proportional to the distance. I'm throwing away accuracy of distance and taking speed

The 12-bit AD converter number contains a lot of noise, so it's processed by a micro controller.
V = (A - B) - C
V: distance approximation
A: Reflected light from turning on the infrared LED
B: Reflected light with infrared LED turned off
C: Ambient brightness measured at startup

Circuit diagram

Parts list


Logic analyzer

The process rules for semiconductors are getting smaller every year, and the accuracy is improving, making it more difficult to break.
Recent semiconductors have a gray zone of about 100 microseconds. In the gray zone range, even if the current exceeds the absolute maximum rating, it will not be damaged.

The sensor has been tested continuously for more than 2 years and 2 months with no problems.
It is on salein Japan. 

Non-contact touch panel

The sensor's infrared rays can pass through the transparent OLED panel to detect fingertips.
A non-contact touch panel made with this
I think it will help prevent infectious diseases when used at airports and ports around the world.

Only available at 1.51 inches with a smaller transparent OLED display.
Since only 6 sensors can be used, it is easily affected by momentary optical noise and is prone to false detection. So the software has a special way.

In the loop, the number of times the hand has entered the sky above the display is counted and the direction with the largest number of times is acquired. This gives about 95% correct detection.

If a non-contact touch panel is commercialized, the sensor can be deployed in a wider range, so the direction should be taken accurately.

Software is Python on Raspberry pi 4, using the luma.core library


User Manual of the sensor

Adobe Portable Document Format - 4.74 MB - 08/15/2023 at 12:01


Arduino example of the sensor, C++

Zip Archive - 4.68 MB - 08/15/2023 at 11:59


Non-contact touch panel program, Raspberry pi 4, Python

Zip Archive - 4.80 MB - 08/15/2023 at 11:56


  • 1 × Interactive Hand Sensor
  • 1 × Raspberry pi 4
  • 1 × SparkFun Transparent Graphical OLED Breakout

  • Video2

    Takahiro08/19/2023 at 06:48 0 comments

    Draw letters with cube type

    This is an experiment to detect characters in a cube shape.
    I want to make it possible for anyone to use advanced machines with intuitive machine operation.

    motion detection

    Video that detects hand movement direction, speed, and position
    It is characterized by speed exceeding AI camera

    dynamic exhibition

    It would be interesting to be able to display models and pictures that move without contact.
    It is expected to be realized by 2030.

    sensing basket

    A basket that lights up to let you know when something is inside. Effective for preventing forgotten items, etc., and can be used in shops, etc.

    Rock paper scissors detection

    If this is used as a cipher, it will be difficult to decipher.

    N/8 switch

    It is a non-contact switch that can input numerical values without erroneous detection.

    False detection prevention contactless switch

    It is a type that operates with two fingers that I was thinking about first.

  • Development history of Interactive Hand Sensor

    Takahiro08/15/2023 at 07:21 0 comments


    This dynamic art I made in 2019 is what inspired me to come up with the sensor idea.

    The LEDs are likened to small creatures, and when a pencil is brought close to them, they gather. Scatters when moved.

    New Interface

    This is an early work I took in 2019.
    The mode selection method, which selects from 6 glowing dots, is inspired by the Japanese animation Kemurikusa. It is interesting that the cube type can create new interfaces such as selection methods as well as control.

    Improved sensor cover

    In the first prototype, such as the paper airplane video above, aluminum foil was wrapped. Now I cut the PVC cap and use it. One of the reasons why photo reflectors have not evolved is that it takes time and effort to cover the sensor, but this has now been resolved.

    The second from the left is a prototype with two infrared LEDs. I stopped using this because it didn't work.

    Non-contact switch

    I have several ideas for non-contact switches, but I think the following insertion type is the easiest and does not cause false positives.

    Intrusion detection

    You can also do this by arranging sensors under the floor.

    Antenna device

    The last is the antenna device that I am going to experiment from now on. The sensing content is transmitted to the fingertips with a vibration motor. It is convenient because it can detect a wider range faster than a cane. I also hope that this sensor will be useful for visually impaired people.

View all 2 project logs

  • 1
    Electrical specifications of the sensor

    Power-supply voltage5VAssuming USB power supply
    controller voltage5V, 3.3VSignal output 3.3V
    consumption current180mA (scan time 1.2mS)Typical value for single board
    power consumption1WTypical value for single board
    Scan time board alone1.2mS or more, 1 channel 150uS or more
    Scan time parallel continuation800uS or more, 1 channel 100uS or more※

    ※In order not to reduce the detection distance, it is desirable to use 150uS or more per channel.

  • 2
    Hardware of the sensor

    Main board

    Main board pinout (JP1)

    pin numberPIN nameexplanation
    1+5VVcc 5V
    3ASensor channel 0bit
    4BSensor channel 1bit
    5CSensor channel 2bit
    6SSSPI Slave-Select (active-Low) Substrate selection when connecting in parallel
    7MOSISPI Input
    8MISOSPI Output (3.3V/5V switching JP2)
    9SCLKSPI Clock
    10SEL_SENSPI selection High: Sensor (AD converter), Low: CLED
    11OE_ILEDILED Output Enable ※ILED: Infrared LED 
    ILED enable/disable * Infrared radiation is automatically performed in synchronization with the AD converter.
    12FIX_CLEDCLED Shift Register Latch ※CLED: color LED
    Reflect the value of the shift register to the output
    13OE_CLEDCLED Output Enable
    CLED output ON/OFF
    14PWM_CLEDAdjust the brightness of the CLED with PWM (Pulse Wide Modulation) control Short to 13pin or 5V when not using PWM


    • SEL_SEN pin for SPI switching of sensor (AD converter) and CLED.
    • Set the ILED channel with ABC.
    • After CLED transfers data to the shift register, it is reflected in the output with a FIX_CLED pulse.
    • CLED ON can adjust the brightness with AND output of 13pin and 14pin and PWM of 14pin.

    Sensor sensitivity adjustment method

    ILEDandPhTrYou can adjust the sensitivity of the sensor by moving the black cover up and down, but
    please be careful as it may deviate from the optimum sensitivity.

    ※ILED: Infrared LED,  PhTr: Phototransistor

    Main board circuit diagram

    Sensor board circuit diagram

  • 3
    Software and interface of the sensor

    SPI interface setting (AD converter/shift register)

    • SPI-MODE:0
    • CLOCK:2MHz ※
    • One cycle (time interval between accesses to the same ILED) is 1.2mS or more

    AD converter reading procedure

    1. OE_CLED:LOW
    2. A,B,C      :Sensor channel setting
    3. SEL_SEN: HIGH Select sensor, do not select CLED

    4. OE_ILED:LOW ILED OFF  ※ ILED: Infrared LED
    5. SS          :LOW
    6. SPI-read AD read value:vOff
    7. SS           :HIGH

    9. SS           :LOW
    10. SPI-read AD read value:from
    11. SS           :HIGH
    12. Temporary sensor value:fromOn - fromOff Save in an array

    ※ The value obtained by subtracting the ambient brightness measured at startup from the temporary sensor value is the sensor value.

                                                               Logic analyzer sensor reading diagram

    Read code of AD converter (Arduino C++)

    8 sensor readings

    void Sensor::setAd(bool bInit) {// bInit:add val to adAryInit[]
        for (int col = 0; col < COL_LEN; col++) {// COL_LEN:8
            setCol(col, bInit);    // *** sensing ***
        if (!bInit)                // *** set CLED ***
            cled.set(val);        // sensor-data, indicator

    Reading of a single sensor

    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 ofOn =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);
            adAry[col] = noMinus(vOn - vOff - (vOff >> 2) + (vOn >> 4)- adAryInit[col]);
        val[col] = ad2val(adAry[col]);    // adAryInit[col]: Ambient brightness measured at startup
    unsigned int Sensor::getAdc(int col) {
        digitalWrite(SS, LOW);
        SPI.transfer(6 | (col >> 2));
        unsigned char r1 = SPI.transfer(col << 6);
        unsigned char r2 = SPI.transfer(0);
        digitalWrite(SS, HIGH);
        return ((r1 & 0x0f) << 8) + r2;

View all 4 instructions

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates