Neonode® Touch Sensor Module User's Guide
Neonode® Touch Sensor Module User's Guide
User's Guide
2020-10-09
Legal Notice
Neonode may make changes to specifications and product descriptions at any time, without notice. Do not finalize
a design with this information. Neonode assumes no liability for applications assistance or customer product
design. Customers are responsible for their products and applications using Neonode components. To minimize
the risks associated with customer products and applications, customers should provide adequate design and
operating safeguards.
Neonode components are neither designed nor intended for use in FDA Class III applications, or similar life-critical
medical equipment. Customers acknowledge and agree that they will not use any Neonode components in FDA
Class III applications, or similar life-critical medical equipment, and that Neonode will not be responsible for any
failure to meet the requirements of such applications or equipment.
No part of the materials contained in any Neonode document may be copied, photocopied, reproduced, translated
or reduced to any electronic medium or machine-readable form, in whole or in part, without specific written
permission from Neonode Inc.
NEONODE, the NEONODE logo, and ZFORCE are trademarks of Neonode Inc. registered in the United States and
other countries. All other trademarks are the property of their respective owners.
Copyright © 2018-2020 Neonode Inc. All rights reserved.
Neonode® Touch Sensor Module User's Guide Table of Contents
1 Table of Contents
1 Table of Contents ................................................................................................................... 3
2 Introduction ............................................................................................................................ 6
2.1 Product Overview 6
2.2 Product Variants 6
2.3 Multi-Touch Functionality 11
2.4 Applications 12
2.5 Sensor Module Design and Components 13
2.6 Product Integration 15
3 Getting started with Touch Sensor Module Evaluation.................................................. 16
3.1 Getting Started with Sensor Evaluation - Plug and Play with USB 16
3.2 Getting Started with Sensor Evaluation - Workbench and USB 19
3.3 Getting Started with Sensor Evaluation - I2C and Arduino 25
3.4 Getting Started with Sensor Evaluation - SDK and USB 31
4 Getting Started with Software Integration ...................................................................... 36
4.1 Use the zForce SDK 36
4.2 Use the Touch Sensor Module Interface Library for Arduino 36
4.3 Communicating Using a System and a Programming Language of Your Choice 36
5 Introduction to Contactless Touch Solutions .................................................................. 38
5.1 Introduction 38
5.2 Parallel Plane Solution 38
5.3 Holographic Display Solution 39
5.4 Clean Environment 40
5.5 Software Implementation 41
6 Mechanical Integration ....................................................................................................... 42
6.1 Means of Integration 42
6.2 Touch Applications 44
6.3 Models and Drawings 47
7 Electrical Integration........................................................................................................... 48
7.1 Electrical Block Diagram 48
7.2 Physical Connector 48
Neonode® Touch Sensor Module User's Guide Table of Contents
7.3 Pin-Out 49
7.4 Interface Configuration 50
7.5 Power On and Boot Sequence 54
8 Software Integration ........................................................................................................... 55
8.1 Communication Protocol 55
8.2 Available Function Libraries 55
8.3 Preparing the Sensor for Communication 55
8.4 zForce Communication Protocol 56
8.5 Updating Firmware 95
9 Implementation Examples................................................................................................ 100
9.1 Interface Library for Arduino 100
9.2 USB HID Communication Example 102
9.3 Sub Touch Active Area 106
9.4 I2C Mouse pad and Keyboard 117
9.5 Selective Touch Area 121
9.6 Touch Device Handling 130
10 Specifications ..................................................................................................................... 136
10.1 Specifications Summary 136
10.2 Touch Performance 139
10.3 Power Consumption 141
10.4 Environmental Requirements 142
10.5 Electrical Requirements 143
10.6 Optical Requirements on External Window 143
10.7 Mechanical Data 145
10.8 Test Specifications and Definitions 149
Neonode® Touch Sensor Module User's Guide Table of Contents
https://support.neonode.com 5
Neonode® Touch Sensor Module User's Guide Introduction
2 Introduction
If the variant you are interested in is not available for purchase from your distributor, please contact the
distributor or a Neonode sales representative (refer to www.neonode.com1) for more information.
1 http://www.neonode.com/
https://support.neonode.com 6
Neonode® Touch Sensor Module User's Guide Introduction
90° Type
https://support.neonode.com 7
Neonode® Touch Sensor Module User's Guide Introduction
https://support.neonode.com 8
Neonode® Touch Sensor Module User's Guide Introduction
https://support.neonode.com 9
Neonode® Touch Sensor Module User's Guide Introduction
Basic Principles
The Neonode Touch Sensor Module detect and trace objects by detecting diffusely reflected infrared light. The
sensor module comprises an optical system arranged to combine emitted IR beams and receiver fields of view
within the same apertures. IR light beams are emitted perpendicular to the output window, while receivers field of
view is centered at a certain angle left and right.
Each emitter-receiver combination covers a narrow region on the active area. An object present in the active area
will affect several emitter-receiver channels, and the reported coordinates is the outcome of a center of gravity
calculation on these signals.
https://support.neonode.com 10
Neonode® Touch Sensor Module User's Guide Introduction
2.3.1 Shadows
• An object directly behind another object cannot be illuminated. In the figure above, object A will not be
detected since illumination is blocked by object B.
• The correct receiver must have a clear field of view. Object B is in a region covered only by left looking
receivers. Object B will not be detected because its field of view is blocked by object D.
• Object C may be seen by both left and right looking receivers. Although the right looking field of view is
blocked by object D, object C is detected by the left looking receiver.
• Object D is detected by both left and right looking receivers.
Shadow Trick
Note that in most cases, user experience is not affected by the shadow situations mentioned above. This is because
of a functionality implemented in the sensor module's firmware called "shadow trick", which e.g. generates
a smooth "rotate" feeling despite one touch object being shadowed during the rotate gesture. A previously
detected object that can no longer be detected is still reported as present if:
• The object was last seen close to a location where it could be shadowed by another object.
• The potentially shadowing object is still detected and hasn't moved away from a shadowing location.
The shadow trick make multi-touch gestures such as "rotate" and "pinch-to-zoom" work better.
https://support.neonode.com 11
Neonode® Touch Sensor Module User's Guide Introduction
• In order to recognize two objects close to each other (A and B), a separation must allow at least one emitter-
receiver channel (~10 mm) to pass freely between them. Otherwise, the two objects will be reported as one
large object.
2.4 Applications
The Touch Sensor Module can be integrated for a wide range of applications, such as:
https://support.neonode.com 12
Neonode® Touch Sensor Module User's Guide Introduction
• PCs/Tablets
• TVs/Monitors
• Printers
• Mechanical key replacement
• White goods
• Smart furniture
• Interactive mirrors
• Elevator panels
• eReaders
• Instruments
• Vending Machines
• ATM/POS terminals
• Robotics
• Range finders
• Collision detectors
• ... and much more
https://support.neonode.com 13
Neonode® Touch Sensor Module User's Guide Introduction
Part Description
A Cover
B Adhesive
C Front light pipe – straight shooting or 90 degree shooting depending on sensor module's type
E PCBA
https://support.neonode.com 14
Neonode® Touch Sensor Module User's Guide Introduction
2 https://support.neonode.com/docs/display/AIRTSUsersGuide/zForce+Communication+Protocol
https://support.neonode.com 15
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
3.1 Getting Started with Sensor Evaluation - Plug and Play with USB
Make sure that the USB cable transmits both power and data and not only power.
• (Optional) tape for mounting
https://support.neonode.com 16
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
upwards. Make sure the direction is straight into the connector and the pads have reached the end of
the connector.
c. Make sure the connector pads of the FPC cable are facing downwards, towards interface board. The
sensor module risks damage if the FPC cable is connected in wrong direction.
d. Press down the flip lock.
2. Connect the FPC cable to the sensor module:
a. Place the sensor module so that the module's connector pads are facing downwards (steel surface
upwards).
b. Insert the sensor module into the connector on FPC cable (yellow piece of PCB of the FPC connector
still facing upwards).
c. Make sure the direction of the pads is straight into the connector, and the pads have reached the
end of the connector.
3. Connect a USB cable with a Micro USB type B connector to the interface board.
4. Make sure no object is within the touch active area of the sensor module before connecting power to the
sensor through USB. The sensor calibrates itself when powered on and an object within the touch active
area may interfere with the calibration.
https://support.neonode.com 17
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
a. If the sensor module is of the 0° type: place the module on a table with the steel surface facing
downwards and with the optical surface facing towards you.
b. If the sensor module is of the 90° type: place the module on a table with the steel surface facing
upwards, so the optical surface is facing upwards as well. Make sure no object is within the touch
active area above the sensor module.
i. Alternatively, you can mount the sensor module by using tape in order to fasten the steel
surface to the edge of a table, with the optical surface facing towards you.
https://support.neonode.com 18
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
7. When the sensor module has enumerated, it will act as a touch screen USB HID device.
8. Put an object in the touch active area, touch HID reports will be sent to your computer.
9. To visualize touches, you can for for example use Paint (default Windows application) and draw lines by
moving you finger in the touch active area.
Make sure that the USB cable transmits both power and data and not only power.
https://support.neonode.com 19
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
a. Place the sensor module so that the module's connector pads are facing downwards (steel surface
upwards).
b. Insert the sensor module into the connector on FPC cable (yellow piece of PCB of the FPC connector
still facing upwards).
c. Make sure the direction of the pads is straight into the connector, and the pads have reached the
end of the connector.
https://support.neonode.com 20
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
3. Connect a USB cable with a Micro USB type B connector to the interface board.
4. Make sure no object is within the touch active area of the sensor module before connecting power to the
sensor through USB. The sensor calibrates itself when powered on and an object within the touch active
area may interfere with the calibration.
a. If the sensor module is of the 0° type: place the module on a table with the steel surface facing
downwards and with the optical surface facing towards you.
b. If the sensor module is of the 90° type: place the module on a table with the steel surface facing
upwards, so the optical surface is facing upwards as well. Make sure no object is within the touch
active area above the sensor module.
https://support.neonode.com 21
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
i. Alternatively, you can mount the sensor module by using tape in order to fasten the steel
surface to the edge of a table, with the optical surface facing towards you.
https://support.neonode.com 22
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
In order for the Workbench application to operate, the files in the Workspace folder must be kept
together. Move the entire folder if you want to relocate the workspace file.
https://support.neonode.com 23
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
9. Navigate to the Workspace folder and double-click the .nww file inside the folder.
https://support.neonode.com 24
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
2. If either section in the right panel is collapsed, click to expand it.
3. In the right panel
a. Enable or disable Touch Sizing. With Touch Sizing enabled, the size of a detected object is indicated
by the size of the tracking cursor.
b. Enable or disable Trailing Expiration. With Trailing Expiration enabled, the trail of a detected object
is shown, indicating its movement.
4. Move one or more fingers or other objects in the active area of the sensor module. The registered touches
show on the canvas. Type, ID an x- and y-coordinates of each touch is shown to the right of the canvas.
3 https://support.neonode.com/docs/display/Workbench/Getting+Started+with+Neonode+Workbench.
https://support.neonode.com 25
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
Make sure that the USB cable transmits both power and data and not only power.
• (Optional) tape for mounting
Make sure that the USB cable transmits both power and data and not only power.
• (Optional) tape for mounting
https://support.neonode.com 26
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
upwards. Make sure the direction is straight into the connector and the pads have reached the end of
the connector.
c. Make sure the connector pads of the FPC cable are facing downwards, towards interface board. The
sensor module risks damage if the FPC cable is connected in wrong direction.
d. Press down the flip lock.
2. Connect the FPC cable to the sensor module:
a. Place the sensor module so that the module's connector pads are facing downwards (steel surface
upwards).
b. Insert the sensor module into the connector on FPC cable (yellow piece of PCB of the FPC connector
still facing upwards).
c. Make sure the direction of the pads is straight into the connector, and the pads have reached the
end of the connector.
3. Connect a USB cable with a Micro USB type B connector to the interface board.
4. Make sure no object is within the touch active area of the sensor module before connecting power through
USB. The sensor module calibrates itself when powered on and an object within the touch active area may
interfere with the calibration.
https://support.neonode.com 27
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
a. If the sensor module is of the 0° type: place the module on a table with the steel surface facing
downwards and with the optical surface facing towards you.
b. If the sensor module is of the 90° type: place the module on a table with the steel surface facing
upwards, so the optical surface is facing upwards as well. Make sure no object is within the touch
active area above the sensor module.
i. Alternatively, you can mount the sensor module by using tape in order to fasten the steel
surface to the edge of a table, with the optical surface facing towards you.
https://support.neonode.com 28
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
a. Place the sensor module so that the module's connector pads are facing upwards (black surface
upwards).
https://support.neonode.com 29
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
https://support.neonode.com 30
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
a. A red light next to the micro USB port should turn on to indicate power transfer.
Make sure that the USB cable transmits both power and data and not only power.
• (Optional) tape for mounting.
4 https://support.neonode.com/docs/display/NPB/Get+Started+with+Neonode+Prototyping+Board
5 https://github.com/neonode-inc/zforce-arduino
6 https://support.neonode.com/docs/display/SDKDOC/SDK+System+Requirements
https://support.neonode.com 31
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
a. Place the sensor module so that the module's connector pads are facing downwards (steel surface
upwards).
b. Insert the sensor module into the connector on FPC cable (yellow piece of PCB of the FPC connector
still facing upwards).
c. Make sure the direction of the pads is straight into the connector, and the pads have reached the
end of the connector.
https://support.neonode.com 32
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
3. Connect a USB cable with a Micro USB type B connector to the interface board.
Make sure no object is within the touch active area of the sensor module before connecting power to the
sensor through USB. The sensor calibrates itself when powered on and an object within the touch active
area may interfere with the calibration.
a. If the sensor module is of the 0° type: place the module on a table with the steel surface facing
downwards and with the optical surface facing towards you.
If the sensor module is of the 90° type: place the module on a table with the steel surface facing
upwards, so the optical surface is facing upwards as well. Make sure no object is within the touch
active area above the sensor module.
https://support.neonode.com 33
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
i. Alternatively, you can mount the sensor module by using tape in order to fasten the steel
surface to the edge of a table, with the optical surface facing towards you.
7 https://support.neonode.com/docs/display/SDKDOC/Getting+started+with+SDK+for+Windows
8 https://support.neonode.com/docs/display/SDKDOC/Getting+started+with+SDK+for+Linux
9 https://support.neonode.com/docs/display/SDKDOC
https://support.neonode.com 34
Neonode® Touch Sensor Module User's Guide Getting started with Touch Sensor Module Evaluation
https://support.neonode.com 35
Neonode® Touch Sensor Module User's Guide Getting Started with Software Integration
4.2 Use the Touch Sensor Module Interface Library for Arduino
10 https://support.neonode.com/docs/display/SDKDOC/Example+Program+Pseudocode
11 https://support.neonode.com/docs/display/Downloads/zForce+SDK+Downloads
12 https://support.neonode.com/docs/pages/viewpage.action?pageId=21135404
13 https://support.neonode.com/docs/display/Workbench/Getting+Started+with+Neonode+Workbench
https://support.neonode.com 36
Neonode® Touch Sensor Module User's Guide Getting Started with Software Integration
14 https://helpcenter.neonode.com/hc/en-us/requests/new
https://support.neonode.com 37
Neonode® Touch Sensor Module User's Guide Introduction to Contactless Touch Solutions
5.1 Introduction
Neonode Touch Sensor Modules are perfectly suited to create a contactless touch environment. Contactless
integration allows interaction to an application or interface without having to touch any surface in order to provide
a germ-free alternative. Made to prevent and reduce spread of bacteria and viruses.
When connecting the Touch Sensor Module through USB to a supported system, it will immediately be recognized
as a (HID) touchscreen digitizer through Plug-and-Play15. The sensor module could then be positioned at a
preferred distance parallel to the display. The gap would allow the end user to interact with an application by
simply hovering their finger (or any other object) in front of the display in-air. Examples of this has been
implemented in e.g. kiosks in order to provide a contactless alternative.
Another approach is to let the image display be projected through a special projection plate to create the illusion of
a hologram. The image projection can then be controlled in-air by using the Touch Sensor Module. Examples of this
have been implemented in e.g. elevators around the world.
We separate these two solutions as Parallel Plane Solution and Holographic Display Solution. The sensor module
can also be connected and configured in our get-started tools, such as Workbench16, SDK17, or Arduino
Library18 (I2C) for easier implementation without having to deserialize the ASN.1 encoded message.
15 https://support.neonode.com/docs/display/AIRTSUsersGuide/Getting+Started+with+Sensor+Evaluation+-
+Plug+and+Play+with+USB
16 https://support.neonode.com/docs/display/AIRTSUsersGuide/Getting+Started+with+Sensor+Evaluation+-
+Workbench+and+USB
17 https://support.neonode.com/docs/display/AIRTSUsersGuide/Getting+Started+with+Sensor+Evaluation+-+SDK+and+USB
18 https://support.neonode.com/docs/display/AIRTSUsersGuide/Getting+Started+with+Sensor+Evaluation+-+I2C+and+Arduino
https://support.neonode.com 38
Neonode® Touch Sensor Module User's Guide Introduction to Contactless Touch Solutions
Since the Touch Sensor Module is recognized as a HID touchscreen digitizer by the host system, the Plug-and-Play19
support allows an easy upgrade on existing systems. To upgrade an existing system, the sensor module will simply
work upon plug-and-play if supported. The sensor module can also be implemented or configured using the
evaluation tools (i.e. Workbench, example-SDK, Arduino Library), or a custom solution through USB HID or I2C.
It is possible to apply a new set of configurations temporarily (RAM) with the use of our evaluation tools, or by
simply sending a configuration message to the sensor module. These settings can change how the sensor module
handles touch input data, which makes it possible to mount the sensor alongside any sides of the display
regardless of its orientation.
For further information about software integration, please refer to section software integration.
19 https://support.neonode.com/docs/display/AIRTSUsersGuide/Getting+Started+with+Sensor+Evaluation+-
+Plug+and+Play+with+USB
https://support.neonode.com 39
Neonode® Touch Sensor Module User's Guide Introduction to Contactless Touch Solutions
The Holographic Display Solution enables the in-air image projection of an ordinary LCD to be projected 90 degrees
away from the screen, in-air. Since there is a fixed angular relationship between the display, the projection sheet,
and the final image, the installation geometry of the display and projection sheet determines the orientation of the
final image.
The projection plate reduces the viewing angle of the projected image compared to the original display, which
enables applications with privacy requirements.
5.3.1 Assembly
A projection plate consisting of at least two layers of mirror arrays positioned at 45° relative to the display redirects
light emanating from the display an additional 45° and concentrates it to a position at equal distance from the
plate, creating the floating image.
The Touch Sensor Module can then be positioned underneath the projection plate, where its interactive area (TAA)
is covering the projected image. Please refer to Optical Requirements on External Window20 for optical
requirements.
20 https://support.neonode.com/docs/display/AIRTSUsersGuide/Optical+Requirements+on+External+Window
https://support.neonode.com 40
Neonode® Touch Sensor Module User's Guide Introduction to Contactless Touch Solutions
beneficial for environments that require protective gear, such as gloves. Contactless integration is also an
alternative for environments that cannot risk dirty equipment.
Unlike the standard touchscreen, a contactless holographic display requires less maintenance in regards of
cleaning, as well as a lower risk of spreading bacteria, dirt, and viruses.
21 https://support.neonode.com/docs/display/AIRTSUsersGuide/Getting+started+with+Touch+Sensor+Module+Evaluation
22 https://support.neonode.com/docs/display/AIRTSUsersGuide/Getting+Started+with+Software+Integration
23 https://neonode.com/contactless-touch-interaction-with-images-floating-in-air/
24 https://neonode.com/neonode-enables-contactless-self-check-in-solution-at-singapore-changi-airport/
25 https://neonode.com/neonode-touch-sensor-modules-selected-for-touchless-holographic-elevator-rollout-in-china-by-
easpeed/
26 https://neonode.com/neonode-touch-sensor-modules-selected-for-touchless-holographic-elevator-rollout-in-china-by-
easpeed/
27 https://neonode.com/neonode-touch-sensor-modules-selected-for-touchless-holographic-products-by-yesar/
https://support.neonode.com 41
Neonode® Touch Sensor Module User's Guide Mechanical Integration
6 Mechanical Integration
The Neonode Touch Sensor Module can be used for different purposes, such as detecting touches on a surface or
objects in-air. Assembly requirements differ depending on what purpose the Touch Sensor Module fulfills. In
addition, different industries have different standards and demands to fulfill. In-air detection applications generally
require lower mounting tolerances.
The front optical surface is not allowed to be blocked by the host system.
The short sides of the sensor module should be protected from light of high intensity. If there is a risk for exposure
to strong light, covering the short sides with, for example, black tape might improve performance.
When integrating the Touch Sensor Module into a host system make sure not to interfere with the light path. For
horizontal integration, the opening for the sensor modules light path must be minimum 1.4 mm.
If the host system have large tolerances, opening must be adjusted to always be minimum 1.4 mm.
https://support.neonode.com 42
Neonode® Touch Sensor Module User's Guide Mechanical Integration
To make sure not to interfere with the sensor modules light path, the opening must be minimum 1.6 mm. If the host
system has large tolerances, the opening must always be adjusted to be minimum 1.6 mm. Also note that it is not
allowed to mount, glue or in any other way affect the sensor module's optical surfaces since it will affect the
performance. This applies to both the module's visible optical surface and the back of the mirror surface that bends
the light path 90°.
https://support.neonode.com 43
Neonode® Touch Sensor Module User's Guide Mechanical Integration
The Touch Sensor Module needs to be protected from outer pressure and forces that can bend the module and by
that change the direction of the sensor light. The most common cause of bending is when a sensor module is
mounted on a non-flat surface, so the host system supporting structure needs to be flat. High point load on the
PCBA side of the sensor can also affect touch performance. If any kind of clamp or similar setup is used for
fastening, make sure that the contact surface with the sensor module is as large as possible.
https://support.neonode.com 44
Neonode® Touch Sensor Module User's Guide Mechanical Integration
Translational Tolerances
x-direction ±0.5 mm
y-direction ±0.5 mm
z-direction 0 mm to +0.5 mm
Translational tolerances affects the overlap between the display active area and the touch active area. For
example, if the Touch Sensor Module is translated 0.5 mm in x-direction there will be a systematic touch offset of
0.5 mm for the complete sensor module in x-direction.
A 0 mm translation in z-direction means that the host system active area surface is positioned exactly at the edge of
the light path. A positive translation means that the Touch Sensor Module, and therefore the light path, is
translated up from the host system active area surface. This will not affect the touch accuracy in the sensor module,
but it can affect the perceived touch performance, since it leads to increased hovering. A negative translation in z-
direction should be avoided since parts of the light will be blocked which leads to no or reduced touch
performance.
https://support.neonode.com 45
Neonode® Touch Sensor Module User's Guide Mechanical Integration
Rotational Tolerances
There are two types of rotations that can affect the performance; defined as the angles "a" and "b". Angle "a"
affects the hovering and angle "b" affects the overlap between the intended active area and the sensor module's
Touch Active Area. Both these issues will grow with larger display sizes. The angles are exaggerated in the pictures
to better illustrate the problem. For any uncertainty regarding rotational tolerances for a specific application,
contact Neonode for recommendations.
Angle "a"
The angle "a" is defined as shown in the images below.
The example below illustrates how the problem increases with larger active areas.
Angle "b"
The angle "b" is defined as shown in the image below. How sensitive the Touch Sensor Module is for assembly
rotations is directly linked to the size. At any given angle b, the Touch Active Area will be tilted twice as much at 200
mm compared to at 100 mm.
https://support.neonode.com 46
Neonode® Touch Sensor Module User's Guide Mechanical Integration
28 https://support.neonode.com/docs/display/Downloads
https://support.neonode.com 47
Neonode® Touch Sensor Module User's Guide Electrical Integration
7 Electrical Integration
Electrostatic Sensitive Device!
To prevent equipment damage, use proper grounding techniques.
The contact pads are placed on the backside of the sensor module PCBA.
List of supported FFC connectors:
29 http://www.molex.com/molex/home
30 https://www.components.omron.com/
31 http://www.digikey.com/en/supplier-centers/w/wurth-electronics
https://support.neonode.com 48
Neonode® Touch Sensor Module User's Guide Electrical Integration
7.3 Pin-Out
I2C Data I2C_DATA 4 I/O I2C data line Requires external pull-
up resistor
I2C Clock I2C_CLK 5 Input I2C clock line Requires external pull-
up resistor
Note: All pins use 3.3V voltage level and have 5V tolerance.
32 http://www.almita-connectors.com/
https://support.neonode.com 49
Neonode® Touch Sensor Module User's Guide Electrical Integration
In this case, it is recommended to use two 1kΩ pull-up resistors to tie up I2C_DATA and I2C_CLK pins to VBUS or
3.3V power supply to avoid noise issue on I2C interface, and leave other pins as not connected. PIN 2 ( N_RST )
could be used to reset or enable/disable the sensor module.
USB Characteristics
The USB interface meets the requirements of USB specifictions 2.0:
https://support.neonode.com 50
Neonode® Touch Sensor Module User's Guide Electrical Integration
USB full speed timings: the definitions of data signal rise and fall time are presented in the following table and
figure:
Driver characteristcs
https://support.neonode.com 51
Neonode® Touch Sensor Module User's Guide Electrical Integration
7.4.2 I2C Connection
The Touch Sensor Module provides an I2C interface through its 8-pin connector. The interface runs in fast mode,
which means the speed is 400kbps. With this interface, more advanced configuration could be performed. PIN 1, 3,
4, 5, 8 ( GND, DR, I2C_DATA, I2C_CLK, VBUS ) are used for this connection. It is recommended to use two 1kΩ pull-up
resistors to tie up I2C_DATA and I2C_CLK pins to VBUS or 3.3V power supply to perform proper I2C communication.
If USB connection is not used in parallel, PIN 6, 7 ( USB D-, USB D+ ) could be left unconnected.
After the Touch Sensor Module is powered on, it will act as a slave device on a I2C bus. For further information
about what commands could be send or receive through this interface, please refer to I2C Transport (see page 75).
I2C Characteristics
The I2C interface meets the requirements of the standard I2C communication protocol with the following
restrictions: SDA and SCL are mapped to I/O pins that are not “true” open-drain. When configured as open-drain,
the PMOS connected between the I/O pin and VDD is disabled, but is still present.
The I2C characteristics are described in the following table:
tr(SCL)
tf(SCL)
https://support.neonode.com 52
Neonode® Touch Sensor Module User's Guide Electrical Integration
https://support.neonode.com 53
Neonode® Touch Sensor Module User's Guide Electrical Integration
https://support.neonode.com 54
Neonode® Touch Sensor Module User's Guide Software Integration
8 Software Integration
33 https://support.neonode.com/docs/pages/viewpage.action?pageId=21135404
https://support.neonode.com 55
Neonode® Touch Sensor Module User's Guide Software Integration
4. Wait for the sensor module to signal that there is data to read. This comes as an Input Report 2 or you can
poll Feature Report with id 2 for new data.
5. Read the response data from Feature Report with id 2. The data that is read reflects the current setting in
the sensor module.
The Touch Sensor Module is now ready to communicate. After the procedure, the sensor module is enabled by
default and will start sending ASN.1 serialized touch notifications. To disable the touch notifications, a Disable
request must be sent. Refer to zForce Message Specification (see page 77) for examples of requests, responses and
notifications.
For further details on how to communicate with the Touch Sensor Module over Feature Report 1 and 2 refer to USB
HID Transport (see page 60).
8.3.2 I2C
Use the following procedure to prepare the Touch Sensor MOdule over I2C.
1. Power on the Touch Sensor Module.
2. Wait for sensor module to assert Data Ready pin (DR).
3. Initiate 2 byte I2C read operation. Payload of this read should be EE XX where XX is the amount of bytes to
read in a second I2C read operation.
4. Read XX amount of bytes (number of bytes to read is indicated by second byte of first I2C Read Operation).
Now read a message called BootComplete. The message should be
F0 11 40 02 00 00 63 0B 80 01 YY 81 02 03 YY 82 02 00 YY
where YY is usually "00" but can have another value. This signals that the sensor module is now booted.
5. To enable the Touch Sensor Module to start sending touch notifications, do the following:
a. Send an Enable command:
EE 09 40 02 02 00 65 03 81 01 00
EF 09 40 02 02 00 65 03 81 01 00
The Touch Sensor Module is now ready to communicate. When DR is asserted the sensor module will send a touch
notification or a new BootComplete. A BootComplete indicates that the sensor module has restarted for some
reason; Enable must then be set again. For more details, refer to I2C Transport (see page 75).
https://support.neonode.com 56
Neonode® Touch Sensor Module User's Guide Software Integration
• I2C transport: The sensor module has support for I2C communication with an extra pin for signaling when
data is ready to be read, which allows the host system to be interrupt driven. The sensor module takes the
role of an I2C slave and has the I2C address 0x50. For more information, refer to I2C Transport (see page 75).
For the encoding/decoding, you need to understand the structure of the messages and the protocol that is used to
serialize them:
The structure of the sensor messages is defined in ASN.1 notation. ASN.1 is a standardized way (ISO/IEC 8824) to
describe data regardless of language implementation, hardware system and operation system. For more
information, refer to zForce Message Specification (see page 77).
The zForce communication protocol uses the Distinguished Encoding Rules (DER) to serialize messages. For more
information, refer to Understanding the zForce ASN1 Protocol (see page 89).
Encoding Integers
ASN.1 encoded integers, for example values representing scanning frequency or touch active area size, are
represented by one or more bytes:
• If the integer is between 0 and 127, it is represented by one byte (00 to 7F).
• If the integer is between 128 and 32767, it is represented by two bytes (00 80 to 7F FF).
The length of the message therefore varies depending on parameter values.
EE 09 40 02 02 00 65 03 81 01 00
EF 09 40 02 02 00 65 03 81 01 00
3. The Touch Sensor Module is now Enabled. After this, wait for the sensor module to indicate it has something
to send, which means that the device will send a Touch Notification or a BootComplete. A BootComplete
indicates that the device has restarted for some reason, so rerun the initialization and enable the
sensor module to start receiving touch notifications again.
https://support.neonode.com 57
Neonode® Touch Sensor Module User's Guide Software Integration
1. Disable the sensor module by sending a request with the following command:
EE 08 40 02 02 00 65 02 80 00
EF 08 40 02 02 00 65 02 80 00
Device Configuration
Device configuration is a command that includes different settings for the sensor module, for example the Touch
Active Area. When sending a device configuration message, all of the settings specified are not required to be sent,
however the response from the sensor module will include the full device configuration message.
This is an example message that changes the touch active area using the Device Configuration command:
EE 1A 40 02 02 00 73 14 A2 12 80 02 00 B5 81 01 43 82 02 06 98 83 02 04 34 85 01 FF
Part Description
40 02 02 00 Device address (always the same for Neonode Touch Sensor Modules)
A2 12 ID for Sub Touch Active Area followed by the length of Sub Touch Active
Area payload
81 01 43 ID for yMin followed by payload length and an integer value (0x43 = 67)
https://support.neonode.com 58
Neonode® Touch Sensor Module User's Guide Software Integration
The response from the sensor module to the above message will contain the full device configuration message, also
the parts not set in the request.
Setting the Touch Active Area should be done before enabling the sensor module with the ENABLE request.
EE 09 40 02 02 00 73 03 85 01 80
EE 09 40 02 02 00 73 03 85 01 00
Setting Frequency
To set the finger frequency to 200 Hz and idle frequency to 63 Hz use a request with the following command:
EE 0D 40 02 00 00 68 07 80 02 00 C8 82 01 3F
Neonode Touch Sensor Module does not support Stylus mode, and setting the stylus frequency does not
do anything.
One Touch
A packet that contains one touch will look like:
F0 15 40 02 02 00 A0 0F 42 09 II VV XX XX YY YY GG GG JJ 58 02 TT TT
https://support.neonode.com 59
Neonode® Touch Sensor Module User's Guide Software Integration
Syntax Meaning
II ID of this specific touch object. More than one can be tracked simultaneously.
VV Event:
00 = DOWN (new object). 01 = MOVE (existing object has moved). 02 = UP (existing
object is no longer being tracked).
XX XX X Coordinate of the object. This is in Network Byte Order / Big Endian / Motorola
Endian.
Two Touches
A packet that contains two Touches will look like:
F0 20 40 02 02 00 A0 1A 42 09 II VV XX XX YY YY GG GG JJ 42 09 II VV XX XX YY YY GG
GG JJ 58 02 TT TT
where the first "II" and the following bytes up to and including "JJ" are from the first touch, and the second "II" and
the following bytes up to and including "JJ" are from the second touch.
Three Touches
A packet that contains three Touches will look like:
F0 2B 40 02 02 00 A0 25 42 09 II VV XX XX YY YY GG GG JJ 42 09 II VV XX XX YY YY GG
GG JJ 42 09 II VV XX XX YY YY GG GG JJ 58 02 TT TT
For a more thorough explanation of the serialization protocol, refer to Understanding the zForce ASN.1 Serialization
Protocol (see page 89).
https://support.neonode.com 60
Neonode® Touch Sensor Module User's Guide Software Integration
soon as the sensor module is plugged in. In order to use Raw HID mode, the module's operation mode must be
changed. For more information, refer to Initializing Sensor Modules (see page 55).
USB Permission
Depending on operating system you might need explicit permission for your program to have access to the
HID device.
https://support.neonode.com 61
Neonode® Touch Sensor Module User's Guide Software Integration
uint8_t operationMode[] = { 0x01, 0x17, 0xEE, 0x15, 0x40, 0x02, 0x02, 0x00,
0x67, 0x0F, 0x80, 0x01, 0xFF,
0x81, 0x01, 0x00,
0x82, 0x01, 0x00, 0x83, 0x01,
0x00, 0x84, 0x01, 0x00 }; // The first two bytes are the header. First byte is
feature report, second byte is length of the following data.
uint8_t data[257];
memcpy(data, operationMode, sizeof(operationMode));
int requestType = 0x00 | (0x01 << 5) | 0x01; // USB_HOST_TO_DEVICE | USB_TYPE_CLASS |
USB_RECIPIENT_INTERFACE
int request = 0x09; // SET_CONFIGURATION = 0x09
int value = 0x0301; // 0x03 for feature report, 0x01 for feature report 1
int index = 0x0000;
int length = sizeof(data);
int timeout = 0;
connection.controlTransfer(
requestType,
request,
value,
index, data, length, timeout);
uint8_t data[258];
int requestType = 0x80 | (0x01 << 5) | 0x01; // USB_DEVICE_TO_HOST | USB_TYPE_CLASS |
USB_RECIPIENT_INTERFACE
int request = 0x01; // CLEAR_FEATURE = 0x01
int value = 0x0302; // 0x03 for feature report, 0x02 for feature report 2
int index = 0x0000;
int length = sizeof(data);
int timeout = 0;
connection.controlTransfer(
requestType,
request,
value,
index, data, length, timeout);
The HID Report Descriptor is subject to change. The descriptor below is from firmware version 1.47.
https://support.neonode.com 62
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 63
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 64
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 65
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 66
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 67
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 68
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 69
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 70
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
https://support.neonode.com 71
Neonode® Touch Sensor Module User's Guide Software Integration
Item Data
Input Report 2
0 1 Internal use
1 7 (Not used)
Input Report 3
0 8 Contact count
8 16 Scan Time
24 1 Tip Switch
25 7 Contact identifier
32 16 X
48 16 Y
64 16 Width
80 16 Height
96 1 Tip Switch
97 7 Contact identifier
https://support.neonode.com 72
Neonode® Touch Sensor Module User's Guide Software Integration
104 16 X
120 16 Y
136 16 Width
152 16 Height
176 16 X
192 16 Y
208 16 Width
224 16 Height
248 16 X
264 16 Y
280 16 Width
296 16 Height
320 16 X
336 16 Y
352 16 Width
368 16 Height
392 16 X
https://support.neonode.com 73
Neonode® Touch Sensor Module User's Guide Software Integration
408 16 Y
424 16 Width
440 16 Height
8 2040 Payload
8 2040 Payload
Feature Report 4
0 8 Internal use
0 8 Internal use
https://support.neonode.com 74
Neonode® Touch Sensor Module User's Guide Software Integration
Introduction
Each I2C bus consists of two lines (signals): a clock line (SCL) and a data line (SDA). The devices on the I2C bus are
either masters or slaves. The master is always the device that drives the clock line. The slaves are the devices that
respond to the master. Only the master can initiate a transfer over the I2C bus. Each slave has a unique address.
All bytes in this section are written in hexadecimal form, if not indicated otherwise.
The Touch Sensor Module does not communicate using registers or memory accesses, so the
documentation for the STM32 microcontrollers is not applicable.
Module Address
The slave I2C address of the sensor module is 0x50 (7 bit). The address itself consists of 7 bits but 8 bits are always
sent. The extra bit informs the slave if the master is reading from or writing to it. If the bit is 0 the master is writing
to the slave. If the bit is 1 the master is reading from the slave.
The resulting address bytes are 0xA1 (read) and 0xA0 (write).
Syntax
The I2C Transport Protocol is simple and the syntax is identical in both directions (read or write):
Byte 1 2 3 to n
number
Examples:
1. The payload is 8 bytes long. The transmission reads:
https://support.neonode.com 75
Neonode® Touch Sensor Module User's Guide Software Integration
EE 08 [payload]
EE 19 [payload]
Sending Data
To send data to the Touch Sensor Module, the host initiates a write operation for the sensor module's address and
writes the full payload.
(Do not confuse the I2C FrameStart constant with the type byte that indicates that a serialized message is a
request. The value is EE for both bytes, but the meaning is completely different.)
Example: Sending a request with an ENABLE command to the sensor module:
EE 0B EE 09 40 02 02 00 65 03 81 01 00
DataReady
If the sensor module signals DataReady, it is NOT permitted to initiate an I2C write operation as the sensor
module is waiting for the host to initiate a read operation.
Always wait for the corresponding response from one command before sending another command. Note
that not all commands have a response command. If there is no corresponding response command, the
host is free to issue another command.
Receiving Data
The sensor module triggers the DataReady signal when there is data for the host to receive. To maximize the
performance and minimize the load on the I2C bus, the host is expected to read data in a certain sequence:
1. The sensor module asserts DataReady
2. The host initiates a two bytes I2C read operation for the I2C 7-bit address 0x50.
3. The sensor module fills in the first two bytes, FrameStart and DataSize.
4. The host initiates an I2C read operation for address 0x50 and reads XX bytes (as indicated by DataSize).
5. The sensor module deasserts DataReady.
BootComplete
When the sensor module has finished booting, and hardware such as the I2C module have been configured, the
command BootComplete is put into the send queue. The DataReady signal is triggered and the host needs to read
the data to acknowledge that the module is ready to operate. If the sensor module powers on before the host
system does, the host system needs to check if the DataReady signal is active, in which case it needs to read the
data.
Do not send any commands to the sensor module before BootComplete has been read.
https://support.neonode.com 76
Neonode® Touch Sensor Module User's Guide Software Integration
ASN.1 defines a number of universal types, from which all other types inherit traits. The result is that a set of
encoding rules that covers the universal types can serialize any PDU, as long as the identifier numbers and the
definition categories are available. The identifier numbers and definition categories for the zForce PDU are included
in the PDU definition file.
Request deviceAddress Specifies the virtual device within the sensor module that
receives the request.
34 https://support.neonode.com/docs/display/Downloads/Communication+Protocol+Downloads
https://support.neonode.com 77
Neonode® Touch Sensor Module User's Guide Software Integration
Response deviceAddress Specifies the virtual device within the sensor module that sends
the response.
Notification deviceAddress Specifies the virtual device within the sensor module that sends
the notification.
notificationTimestamp Timestamp.
(optional)
35 https://tools.ietf.org/html/rfc3641#page-6
36 http://www.bellard.org/ffasn1/
https://support.neonode.com 78
Neonode® Touch Sensor Module User's Guide Software Integration
Currently ffasn1dump does not handle identifiers for Integer values. For this reason, they need to be
replaced with numerical values.
Application Interface
The application interface specifies what requests can be made and what responses and notifications they activate.
Messages are specified according to the following templates:
request
request: {
deviceAddress <address>,
<request command>
}
response
response: {
deviceAddress <address>,
<command response>
}
notification
notification: {
deviceAddress <address>,
<notification>
notificationTimestamp <timestamp>
}
Where
• Address is an octet string with 2 octets, device type and index:
'<device type><index>'H. The available device types are:
Device type Device
0 Platform
1 Core
https://support.neonode.com 79
Neonode® Touch Sensor Module User's Guide Software Integration
2 Air
3 Plus
4 Lightning
Example: ‘0000’H for platform (there can be only one platform device per sensor system).
Device Information
The deviceInformation command fetches for example the product id and the FW version. What information that is
available differs depending on the type of device. The following example shows a response from a platform device.
request command
deviceInformation {
}
command response
deviceInformation {
platformInformation {
platformVersionMajor 7,
platformVersionMinor 0,
protocolVersionMajor 1,
protocolVersionMinor 5,
firmwareVersionMajor 1,
firmwareVersionMinor 0,
hardwareIdentifier "Demo board",
hardwareVersion "R2",
asicType nn1002,
numberOfAsics 1,
mcuUniqueIdentifier '340038000E51333439333633'H,
projectReference "DEMO_1.0_REL",
platformReference "734cebd",
buildTime "16:01:14",
buildDate "2016-07-01"
}
}
https://support.neonode.com 80
Neonode® Touch Sensor Module User's Guide Software Integration
Device Count
The deviceCount command enumerates the available virtual devices.
request command
deviceCount {
}
command response
deviceCount {
totalNumberOfDevices 1,
airDevices 1
}
Device type instances are indexed from zero. The response shown here means that the only virtual device available
is Air[0].
Frequency
The frequency command changes the update frequency of all sensor modules globally, that is for all devices on all
platforms.
The following update frequencies can be set, if enabled in the product:
• finger: activated when objects with characteristics matching regular fingers are detected.
• stylus: activated for narrow stylus-like objects. (Not enabled for Neonode Touch Sensor Module.)
• idle: activated when no objects are detected, in order to minimize power usage.
The unit is Hz.
https://support.neonode.com 81
Neonode® Touch Sensor Module User's Guide Software Integration
request command
frequency {
finger 30,
idle 10
}
command response
frequency {
finger 30,
idle 10
}
In this example, the sensor module update frequency will be 30 Hz as long as finger-like objects were recently
detected. When no objects are detected, the frequency will drop to 10 Hz.
Touch Sensor
There are a number of different sensor module products that can co-exist on the same physical device. There are
some product-specific commands, but the ones listed here are general.
The Touch Sensor Module will be used as example, which means that the device address will be the first Air virtual
device
address
'0200'H
Operation Mode
The operationMode command sets what processing to perform on the sensor modules signals, and what
diagnostics that are exposed.
The following example sets the operation mode to normal object detection:
https://support.neonode.com 82
Neonode® Touch Sensor Module User's Guide Software Integration
request command
operationMode {
detection TRUE,
signals FALSE,
ledLevels FALSE,
detectionHid FALSE,
gestures FALSE
}
command response
operationMode {
detection TRUE,
signals FALSE,
ledLevels FALSE,
detectionHid FALSE
}
As can be seen gestures are missing in the response. This is a valid response, since the device is built with a
subset of the protocol, or an older forward-compatible version.
Touch Format
The touchFormat command retrieves the binary format of the detected objects.
request command
touchFormat {
}
command response
touchFormat {
touchDescriptor { id, event, loc-x-byte1, loc-x-byte2, loc-y-byte1, loc-y-byte2,
size-x-byte1, size-y-byte1 }
}
The touchDescriptor is a bit string, where each bit signifies one byte of payload being included in the
touchNotification octet strings. A touchNotification is the concatenation of those bytes. The following table lists all
bits. Bits used in the example are marked green.
https://support.neonode.com 83
Neonode® Touch Sensor Module User's Guide Software Integration
id Touch Identifier
loc-x-byte1 X coordinate
loc-y-byte1 Y coordinate
loc-z-byte1 Z coordinate
size-x-byte1 X size
size-y-byte1 Y size
size-z-byte1 Z size
confidence Confidence Ignore. This value is not reliable for the Touch Sensor Module.
pressure Pressure
Location and size coordinates can be specified with up to 3 bytes. The byte order in decreasing significance - big-
endian. For example:
• 1 byte: location x = loc-x-byte1
https://support.neonode.com 84
Neonode® Touch Sensor Module User's Guide Software Integration
Touch Sensor Module uses Robair, thus the unit is 0.1 mm.
Size is in mm.
Confidence and pressure are fractions of the full values, in percent.
Enable Execution
The enable command activates the Touch Sensor Module, and notifications of detections start to stream.
request command
enable {
enable 0
}
command response
enable {
enable
}
request command
enable {
disable NULL
}
https://support.neonode.com 85
Neonode® Touch Sensor Module User's Guide Software Integration
command response
enable {
disable NULL
}
Touch Notifications
A detected object is reported with a touchNotification. The touchNotification payload is a touchDescriptor bit
string. Every concurrently tracked object is represented by its own touchNotification payload.
notification
notificationMessage touchNotifications: {
'0001013600730A0A64'H
},
The following table shows the value of the example payload interpreted with the touch descriptor.
id Touch Identifier 0
loc-x-byte1 X coordinate 1
loc-y-byte1 Y coordinate 0
Information
The command deviceInformation retrieves some information about the virtual device instance.
https://support.neonode.com 86
Neonode® Touch Sensor Module User's Guide Software Integration
request command
deviceInformation {
}
command response
deviceInformation {
deviceInstanceInformation {
productVersionMajor 1,
productVersionMinor 38,
physicalWidth 1584,
physicalHeight 1341,
numberOfSignalAxes 0
}
}
Part Description
physical Size in unit 0.1 mm. See section Touch Format for the relationship to
location coordinates.
numberOfSignalAxes Only applicable for Core devices. The number of sensor arrays, each
monitoring one dimension/axis of a touch sensor. Generally 2.
Configuration
Some configurations of the Touch Sensor Module can be changed at run-time. The deviceConfiguration request
command and command response are identical, except some configuration items in the request may be omitted in
order to leave them in their current state.
For instance, to set object size restrictions only, omit all other items:
https://support.neonode.com 87
Neonode® Touch Sensor Module User's Guide Software Integration
request command
deviceConfiguration {
sizeRestriction {
maxSizeEnabled TRUE,
maxSize 100,
minSizeEnabled FALSE
}
}
command response
deviceConfiguration {
subTouchActiveArea {
lowBoundX 0,
lowBoundY 0,
highBoundX 1584,
highBoundY 1341,
reverseX FALSE,
reverseY FALSE,
flipXY FALSE,
offsetX 0,
offsetY 0
},
sizeRestriction {
maxSizeEnabled FALSE,
maxSize 0,
minSizeEnabled FALSE,
minSize 0
},
detectionMode default,
numberOfReportedTouches 2,
hidDisplaySize {
x 1584,
y 1341
}
}
https://support.neonode.com 88
Neonode® Touch Sensor Module User's Guide Software Integration
• insensitiveFTIR: Unsupported
• numberOfReportedTouches: Maximum number of reported tracked objects.
• hidDisplaySize: Scaling the coordinate system when using the sensor module in HID Touch Digitizer mode.
Application 0 1 Shared
Private 1 1 Only used to describe the type of the whole message, Request/
Response/Notification
37 https://support.neonode.com/docs/display/Downloads/Communication+Protocol+Downloads
https://support.neonode.com 89
Neonode® Touch Sensor Module User's Guide Software Integration
The encoding for tag numbers up to and including 30 (higher code numbers are encoded differently, but those are
not used in our protocol):
Bit position 8th 7th 6th 5th 4th 3rd 2nd 1st
Spec Binary 1000 0100 0010 0000 0001 0000 0000 0000 0000
ific repres 0000 0000 0000 1000 0100 0010 0001
bit entati
valu on
e
Decim 128 64 32 16 8 4 2 1
al
repres
entati
on
In short this means that the 8th and 7th bits are reserved to specify the class, and the 6th bit is reserved to show if it
is a sequence. Bits 5 to 1 are used to specify the tag number.
This tells us that the deviceConfiguration is a sequence with the class tag Application and 19 as tag number. The
deviceConfiguration type byte looks like this when it is represented as an octet:
Bit position 8th 7th 6th 5th 4th 3rd 2nd 1st
Bit 0 1 1 1 0 0 1 1
https://support.neonode.com 90
Neonode® Touch Sensor Module User's Guide Software Integration
All of the hexadecimal numbers are then added together to get the type byte → 0x40 + 0x20 + 0x10 + 0x02 + 0x01 =
0x73.
Example: The length byte for a value that is 50 bytes long
The decimal value 50 translates to 0x32 in hexadecimal representation and 0011 0010 in binary representation
Bit position 8th 7th 6th 5th 4th 3rd 2nd 1st
Bit 0 0 1 1 0 0 1 0
Description If this bit is set the length of the Valu Valu Valu Valu Valu Valu Value
value is 128 bytes or longer e e e e e e
Example: The length bytes for a value that is 300 bytes long
The length bytes for a value that is 300 bytes long consists of three bytes. The first byte indicates that the following
two bytes ((0x01) 0000 0001 (0x2C) 0010 1100) should be added together. The first byte is described in the following
table:
Bit 1 0 0 0 0 0 1 0
Descripti If this bit is set, the Number Number Numbe Numbe Numbe Numbe Numbe
on length of the value is of of r of r of r of r of r of
128 bytes or longer length length length length length length length
bytes bytes bytes bytes bytes bytes bytes
https://support.neonode.com 91
Neonode® Touch Sensor Module User's Guide Software Integration
int valueLength = 0;
void CalculateValueLength()
{
valueLength = bitString.Length / 8;
if((bitString.Length % 8) != 0)
{
valueLength++;
}
}
*Message Definition*
ProtocolMessage ::= CHOICE {
request [PRIVATE 14] Message,
response [PRIVATE 15] Message,
notification [PRIVATE 16] Notification
}
All three have the class tag private, and they are all sequences which means that the 8th, 7th, and 6th bits are all
set. In binary this evaluates to 1110 0000 which in hexadecimal translates to 0xE0. Now all that needs to be done is
to define which type of message it is, which in this case is either tag number 14, 15, or 16. In order to define a
request, tag number 14 (0x0E) needs to be added to 0xE0, which sums up to 0xEE.
https://support.neonode.com 92
Neonode® Touch Sensor Module User's Guide Software Integration
Device Address
All messages include a Device Address. Most messages go to the Air Device, but some go to the Platform Device. In
the protocol, the DeviceAddress looks like this:
https://support.neonode.com 93
Neonode® Touch Sensor Module User's Guide Software Integration
All settings are optional and therefore does not require all settings to be defined in the message that is sent to the
sensor module.
We want to set the following settings in the sensor module
SubTouchActiveArea:
• LowBoundX: 500
• LowBoundY: 500
• HighBoundX: 2000
• HighBoundY: 2000
This is how to do it (the length bytes are represented by XX, and are added in the last step):
https://support.neonode.com 94
Neonode® Touch Sensor Module User's Guide Software Integration
8.5.1 Prerequisites
Hardware requirements
• CPU: 1 GHz
• RAM: 512 MB
• Disk space: 20 MB
• Internet connection (for the automatic download of necessary Windows drivers)
• The interface board provided with the evaluation kit.
38 https://support.neonode.com/docs/display/Downloads/Firmware+Update+Software
https://support.neonode.com 95
Neonode® Touch Sensor Module User's Guide Software Integration
Software requirements
• .NET Framework 4.5 or higher is required and can be downloaded from Microsoft's official website. Windows
8 and higher has this installed by default.
8.5.2 Procedure
1. Download the wanted firmware here39, and run the application.
The new firmware version is displayed, under Firmware
2. Connect the Touch Sensor Module to the computer via the provided interface board. Refer to Getting started
with Touch Sensor Module Evaluation (see page 16) for details on how to connect the sensor.
39 https://support.neonode.com/docs/display/Downloads/Firmware+Update+Software
https://support.neonode.com 96
Neonode® Touch Sensor Module User's Guide Software Integration
8.5.3 Troubleshooting
If the updating fails or the device does not show up in the application, check the following possible scenarios. If the
problem persists, please contact support.
The sensor module does not appear under Device in the application after it is plugged in
1. Click Help... and follow the instructions.
The progress bar gets stuck at 0% to 5% during the firmware update
1. Click Help... and follow the instructions to set the sensor module in DFU mode.
2. Check "STM device in DFU mode" or "STM32 BOOTLOADER" device under "Universal Serial Bus
controller" or "Other devices" in Windows Device Manager to ensure drivers are working properly. Uninstall
or update the driver if necessary.
https://support.neonode.com 97
Neonode® Touch Sensor Module User's Guide Software Integration
The firmware update fails with the message "Failed to download new firmware" or the progress bar gets
stuck at about 50 to 60%
1. Click Help... and follow the instructions.
The progress bar gets stuck at 100% during firmware update with the message "Waiting for USB
configuration...",
This is because the sensor module failed to leave "boot mode" but the firmware is already updated.
1. Click on Cancel button and re-plug the sensor. The new firmware is updated and the sensor is ready to be
used.
Contents of Release
• Bug fix.
• Modified the relationship between Hid Display Size and Offset.
• Extended range.
Fixed bugs
• Fixed an off by one error in the reported Physical Height.
Contents of Release
• Bug fixes
Fixed bugs
• Fixed a bug where Flip XY did not work as expected, when ReversY and ReverseX was also set to true.
• FIxed a bug for "Sub Area Offset" when using "Flip XY".
https://support.neonode.com 98
Neonode® Touch Sensor Module User's Guide Software Integration
Contents of Release
• Bug fixes
Fixed bugs
A bug was fixed in the gesture feature, that caused poor performance.
Contents of Release
• Added a reflective edge filter
• Bug fixes
• Changed name of the hardware id
New features
A new reflective edge filter has been added and is disabled by default. Instructions on how to enable it is available
here40.
Changed the name of the hardware id to "zForceAIR sensor". Previously called "AirModule".
Enhancements
Fixed bugs
A bug was fixed in the X size of the touching object and the Y size is no longer reported
40 https://support.neonode.com/docs/display/AIRTSUsersGuide/Communication+Protocol+Quick+Start
https://support.neonode.com 99
Neonode® Touch Sensor Module User's Guide Implementation Examples
9 Implementation Examples
The following examples are here to give you an idea of different ways to use the sensor module, and different ways
of integrating the sensor into your system.
9.1.2 Introduction
The library offers an easy way to communicate with the Touch Sensor Module as well as some primitive parsing of
the ASN.1 serialized messages. This makes it easy for the end user to get x and y coordinates from touch
notifications or set different settings such as the correct touch active area. The library does not have support for all
messages available in the ASN.1 protocol, however the I2C read and write functions are public and can be used if
any setting or request not supported by the library needs to be sent/read from the sensor module.
Main Loop
The library is built around using zforce.GetMessage() as the main loop for reading messages from the sensor
module. GetMessage checks if the data ready pin is high and if it is, the function zforce.Read() will be called. The
read function takes a buffer parameter which is used to store the data from the sensor module.
41 https://github.com/neonode-inc/zforce-arduino
42 https://helpcenter.neonode.com/hc/en-us/requests/new
https://support.neonode.com 100
Neonode® Touch Sensor Module User's Guide Implementation Examples
GetMessage
Message* Zforce::GetMessage()
{
Message* msg = nullptr;
if(GetDataReady() == HIGH)
{
if(!Read(buffer))
{
msg = VirtualParse(buffer);
ClearBuffer(buffer);
}
}
return msg;
}
When GetMessage has been called it is up to the end user to destroy the message by calling
zforce.DestroyMessage() and passing the message pointer as a parameter.
https://support.neonode.com 101
Neonode® Touch Sensor Module User's Guide Implementation Examples
// Make sure that there is nothing in the I2C buffer before writing to the sensor
module
Message* msg = zforce.GetMessage();
if(msg != NULL)
{
// Here you can read whatever is in the message or just destroy it.
zforce.DestroyMessage(msg);
}
// Send Touch Active Area request
zforce.TouchActiveArea(50,50,2000,4000);
// Wait for the response to arrive
do
{
msg = zforce.GetMessage();
} while (msg == NULL);
// See what the response contains
if(msg->type == MessageType::TOUCHACTIVEAREATYPE)
{
Serial.print("minX is: ");
Serial.println(((TouchActiveAreaMessage*)msg)->minX);
Serial.print("minY is: ");
Serial.println(((TouchActiveAreaMessage*)msg)->minY);
Serial.print("maxX is: ");
Serial.println(((TouchActiveAreaMessage*)msg)->maxX);
Serial.print("maxY is: ");
Serial.println(((TouchActiveAreaMessage*)msg)->maxY);
}
// Destroy the message
zforce.DestroyMessage(msg);
9.2.2 Introduction
The zForce AIR sensor supports communication over I2C and USB. Both the Neonode Workbench, and the zForce
SDK uses USB hidpipe to communicate with the sensor, but unfortunately not all systems can use the SDK or the
https://support.neonode.com 102
Neonode® Touch Sensor Module User's Guide Implementation Examples
Workbench application. This might be the case if you are planning to connect the sensor to (for example) an
Android device, and need to change some settings, which is also why this example will be in Java using the Android
SDK.
What is HID?
HID stands for Human Interface Device, and is generally a device that takes input from humans and delivers it to a
host system. The zForce AIR sensor has two different modes for the USB connection, which are the HID Digitizer
mode, and the Raw HID mode.
Enumerating
The first thing you have to do in your program, is to make sure that the sensor is talking to your program instead of
communicating with the OS. This is done by enumerating the sensor, and the code can look a bit different
depending on which OS or SDK you are using, but the general idea is still the same, and usually follows the USB
standard.
In Java, using the Android SDK, the code looks like this:
https://support.neonode.com 103
Neonode® Touch Sensor Module User's Guide Implementation Examples
https://support.neonode.com 104
Neonode® Touch Sensor Module User's Guide Implementation Examples
byte[] detectionMode = {
(byte) 0x01,(byte) 0x17,(byte) 0xEE,(byte) 0x15,(byte) 0x40,(byte) 0x02,
(byte) 0x02,
(byte) 0x00,(byte) 0x67,(byte) 0x0F,(byte) 0x80,(byte) 0x01,
(byte) 0xFF,(byte) 0x81,(byte) 0x01,(byte) 0x00,(byte) 0x82,
(byte) 0x01,(byte) 0x00,(byte) 0x83,(byte) 0x01,(byte) 0x00,
(byte) 0x84,(byte) 0x01,(byte) 0x00
};
https://support.neonode.com 105
Neonode® Touch Sensor Module User's Guide Implementation Examples
reportId | 0x0300,
0x0000, data, length, 0);
}
public int GetFeatureReport(int reportId, byte[] data, int length) {
if ((reportId & 0xFF) != reportId)
throw new IllegalArgumentException("reportId may only set the lowest 8
bits");
return zForceAirConnection.controlTransfer(
UsbConstants.USB_DIR_IN | UsbConstants.USB_TYPE_CLASS |
UsbConstants.USB_INTERFACE_SUBCLASS_BOOT,
0x01,
reportId | 0x0300,
0x0000, data, length, 0);
}
9.3.1 Introduction
The Touch Sensor Module can be adjusted by changing the module's device configuration. By configuring these
settings, the size or orientation of the Touch Active Area (TAA) can for instance be modified. Device Configuration is
implemented according to our ASN.1 protocol (see page 56), and most of the parameters can be configured in
Workbench, zForce SDK, or Arduino Library (I2C). The parameters that have been configured using our evaluation
tools or your own application, are stored in the ram memory. Meaning that the new configuration will have to be
applied after each reboot. Please refer to section Device Configuration List to find all avaliable parameters.
Index
• Axis Orientation (see page 106)
• Device Configuration List (see page 107)
• Reverse X and Y (see page 111)
• Flip XY (see page 112)
• Offset X and Y (see page 113)
• Hid Display Size X and Y (see page 114)
• Proportional Mapping (see page 114)
• Selective Touch Area (see page 115)
https://support.neonode.com 106
Neonode® Touch Sensor Module User's Guide Implementation Examples
flips the given coordinates of the reported touches, which allows the sensor to be mounted at any of the 4 sides of
the screen
Almost all displays has a reference point (or origin) positioned at the upper left corner of the screen, where the x-
axis points in the direction to the right, with the y-axis pointing downwards. The origin of the sensor module's
Touch Active Area is positioned on the left hand side, when having the TAA facing downwards, with the black side of
the sensor module facing outwards.
This means that if a sensor module is positioned above a display, with the black side facing outwards, and its TAA
covering the screen - Both coordinates systems would be co-aligned and a reported touch would project on the
display seamlessly. But if we were to flip the sensor module to cover the screen from underneath the display, a
reported touch would appear to be reversed in y-direction since their coordinate systems would no longer be co-
aligned, as illustrated below.
https://support.neonode.com 107
Neonode® Touch Sensor Module User's Guide Implementation Examples
Idle Frequency Frequency (see Hz Scanning frequency when the Touch Sensor
page 139) Module have not registered any touch object.
Finger Frequency Frequency (see Hz Scanning frequency when the Touch Sensor
page 139) Module have registered and tracking a touch
object.
Number Of Reported 1-10 touches Quantity The number of touches that can be reported
Touches simultaneously.
Max Size Enabled True/False Boolean Allows a maximum touch object size.
Max Size Mechanical 10-1·mm Max limitation of a touch object (iif Max Size
Data43 Enabled =True).
Min Size Enabled True/False Boolean Allows a minimum touch object size.
Min Size Mechanical 10-1·mm Min limitation of a touch object (iif Min Size
Data44 Enabled =True).
43 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
44 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
45 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
46 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
47 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
48 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
https://support.neonode.com 108
Neonode® Touch Sensor Module User's Guide Implementation Examples
49 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
50 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
51 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
52 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
53 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
54 https://support.neonode.com/docs/display/AIRTSUsersGuide/Mechanical+Data
https://support.neonode.com 109
Neonode® Touch Sensor Module User's Guide Implementation Examples
Where,
• Low Bound X - Start position of the (Sub)TAA in x-direction, measured from the origin of the TAA.
• High Bound X - End position of the (Sub)TAA in x-direction, measured from the origin of the TAA.
• Low Bound Y - Start position of the (Sub)TAA in y-direction, measured from the origin of the TAA.
• High Bound Y - End position of the (Sub)TAA in y-direction, measured from the origin of the TAA.
When projecting a SubTAA to a display within the host system, the projected SubTAA would then be mapped to the
display's origin, regardless of its position (as shown in the illustration below).
https://support.neonode.com 110
Neonode® Touch Sensor Module User's Guide Implementation Examples
https://support.neonode.com 111
Neonode® Touch Sensor Module User's Guide Implementation Examples
https://support.neonode.com 112
Neonode® Touch Sensor Module User's Guide Implementation Examples
https://support.neonode.com 113
Neonode® Touch Sensor Module User's Guide Implementation Examples
Proportional Mapping
When Hid Display Size is set to the size of the Touch Active Area, the mapping of a reported touch would get
projected proportionally, to fit the size of the display.
For instance, if a display within the host system is larger than the TAA, a reported touch will get projected as the
illustration show below.
https://support.neonode.com 114
Neonode® Touch Sensor Module User's Guide Implementation Examples
55 https://support.neonode.com/docs/display/AIRTSUsersGuide/Selective+Touch+Area
https://support.neonode.com 115
Neonode® Touch Sensor Module User's Guide Implementation Examples
https://support.neonode.com 116
Neonode® Touch Sensor Module User's Guide Implementation Examples
The Touch Sensor Module can be placed as an in-air solution or on any surface, providing plenty of alternatives for
a wide range of users. The sensor module can for instance be configured to work as a personalized control panel, or
mixer board. Due to the customizable layout and controls, It could be used in development, as well as assisting
people who needs a customized workspace.
9.4.1 Description
The zForceKeyboardMouse example showcase how touch input can be converted as mouse or keyboard input. The
example enables SAMD micro based boards (e.g. Neonode Prototyping Board58) to send keystrokes or mouse
navigation to the host system by using the official Arduino libraries <Mouse.h> and <Keyboard.h>, through HID.
The example divides the Touch Active Area into one mouse pad and a keyboard section, containing 5 buttons (A-E).
The mouse section works like a relative mouse pad, where the cursor moves relatively to its previous position. The
Keyboard buttons are programmed to print the letters A-E when a touch is being preformed in each corresponding
section.
We can access the touch data from the sensor module through the zForce Arduino library
56 https://support.neonode.com/docs/display/AIRTSUsersGuide/Touch+Sensor+Module+Interface+Library+for+Arduino
57 https://github.com/neonode-inc/zforce-arduino
58 https://support.neonode.com/docs/display/NPB/User%27s+Guide+-+Neonode+Prototyping+Board
https://support.neonode.com 117
Neonode® Touch Sensor Module User's Guide Implementation Examples
A left-click mouse action is preformed once "tapping" or "clicking" withing the mouse section. The left-click action
is fired when a reported touch has the event data "UP". In practice, this means that the end user would needs to
both "press" and "release" their finger in order to preform a touch. The touch sensitivity can be adjusted by the
global variable holdTime, which acts like a timer for how long a "touch" can take.
In order to use the mouse pad, we use the collected touch information from the sensor module:
https://support.neonode.com 118
Neonode® Touch Sensor Module User's Guide Implementation Examples
switch (event)
{
case 0: // DOWN event
previousTouch.x = x;
previousTouch.y = y;
globalMillis = millis();
Serial.println("Mouse Input - DOWN");
break;
case 1: // MOVE event
if ((millis() - globalMillis) >= holdTime)
{
Mouse.move((x - previousTouch.x), (y - previousTouch.y));
Serial.println("Mouse Input - Moving cursor");
}
previousTouch.x = x;
previousTouch.y = y;
break;
case 2: // UP event
Serial.print("Mouse Input - UP");
if (millis() - globalMillis < holdTime) // mouse "left click", sensitivity
{ // can be tuned by changing "holdTime"
Mouse.click(MOUSE_LEFT);
Serial.print("(Left-Click)");
}
Serial.println("");
break;
default: break;
}
To make a left-click trigger on the DOWN-event instead, please consider the following adjustments:
https://support.neonode.com 119
Neonode® Touch Sensor Module User's Guide Implementation Examples
switch (event)
{
case 0: // DOWN event
previousTouch.x = x;
previousTouch.y = y;
globalMillis = millis();
Mouse.click(MOUSE_LEFT); //Left-click on DOWN-event
break;
case 1: // MOVE event
if ((millis() - globalMillis) >= holdTime)
{
Mouse.move((x - previousTouch.x), (y - previousTouch.y));
}
previousTouch.x = x;
previousTouch.y = y;
break;
case 2: // UP event
break;
default: break;
}
if (y < 250)
Keyboard.print('A'); //Print Key "A"
else if (y < 500)
Keyboard.print('B'); //Print Key "B"
else if (y < 750)
Keyboard.print('C'); //Print Key "C"
else if (y < 1000)
Keyboard.print('D'); //Print Key "D"
else
Keyboard.print('E'); //Print Key "E"
}
https://support.neonode.com 120
Neonode® Touch Sensor Module User's Guide Implementation Examples
9.5.2 Illustrations
9.5.3 Introduction
A Touch Sensor Module can be mounted on four sides of a screen and with the connector to either the right or the
left (PCB or silver side down) but we recommend mounting it with the silver side towards the screen, as the touch
area is then closer to the screen.
This will give a total of eight different configurations.
It is possible to mount a sensor module "on" or "in" the screen. However this will cover/block part of the screen and
is therefore not a part of this example.
1. Top: Sensor module on top of the screen facing down.
2. Bottom: Sensor module on bottom of the screen facing up.
3. Right: Sensor module on right side of the screen facing left.
https://support.neonode.com 121
Neonode® Touch Sensor Module User's Guide Implementation Examples
4. Left: Sensor module on the left side of the screen facing right.
Sub Area Low <Default values from sensor modules original configuration>
Bound X
Sub Area Low <Default values from sensor modules original configuration>
Bound Y
Sub Area High <Default values from sensor modules original configuration>
Bound X
Sub Area High <Default values from sensor modules original configuration>
Bound Y
https://support.neonode.com 122
Neonode® Touch Sensor Module User's Guide Implementation Examples
Sub Area Offset X The offset distance left side of the screen and the (left side of the) sensor module.
If the sensor module sticks out to the left of the screen change "Sub Area High Bound X" .
Subtract the distance the sensor module sticks out from the left edge of the screen and the
SW (Software origin).
Sub Area Low <Default values from sensor modules original configuration>
Bound X
Sub Area Low <Default values from sensor modules original configuration>
Bound Y
Sub Area High <Default values from sensor modules original configuration>
Bound X
Sub Area High <Default values from sensor modules original configuration>
Bound Y
https://support.neonode.com 123
Neonode® Touch Sensor Module User's Guide Implementation Examples
Sub Area Offset X The offset distance left side of the screen and the (left side of the) sensor module.
If the sensor module sticks out to the left of the screen change "Sub Area Low Bound X" .
Add the distance the sensor module sticks out from the left edge of the screen and the SW
(Software origin).
Sub Area Low <Default values from sensor modules original configuration>
Bound X
Sub Area Low <Default values from sensor modules original configuration>
Bound Y
Sub Area High <Default values from sensor modules original configuration>
Bound X
Sub Area High <Default values from sensor modules original configuration>
Bound Y
Sub Area Offset X The offset distance left side of the screen and the (left side of the) sensor module .
If the sensor module sticks out to the left of the screen change "Sub Area High Bound X" .
Subtract the distance the sensor module sticks out from the left edge of the screen and the
SW (Software origin).
https://support.neonode.com 124
Neonode® Touch Sensor Module User's Guide Implementation Examples
Sub Area Offset Y This is the value of "Hid Display Size Y" minus "Sub Area High Bound Y" plus "Sub
Area Low Bound Y"
If the sensor module is below the screen change the "Sub Area Low Bound Y " to the
distance between screen and sensor module. Also update the value of "Sub Area Offset Y"
to correspond to the new offset.
Sub Area Low <Default values from sensor modules original configuration>
Bound X
Sub Area Low <Default values from sensor modules original configuration>
Bound Y
Sub Area High <Default values from sensor modules original configuration>
Bound X
Sub Area High <Default values from sensor modules original configuration>
Bound Y
Sub Area Offset X The offset distance left side of the screen and the (left side of the) sensor module.
If the sensor module sticks out to the left of the screen change "Sub Area Low Bound X" .
Add the distance the sensor module sticks out from the left edge of the screen and the SW
(Software origin).
https://support.neonode.com 125
Neonode® Touch Sensor Module User's Guide Implementation Examples
Sub Area Offset Y This is the value of "Hid Display Size Y" minus "Sub Area High Bound Y" plus "Sub
Area Low Bound Y"
If the sensor module is below the screen change the "Sub Area Low Bound Y " to the
distance between screen and sensor module. Also update the value of "Sub Area Offset Y"
to correspond to the new offset.
Sub Area Low <Default values from sensor modules original configuration>
Bound X
Sub Area Low <Default values from sensor modules original configuration>
Bound Y
Sub Area High <Default values from sensor modules original configuration>
Bound X
Sub Area High <Default values from sensor modules original configuration>
Bound Y
https://support.neonode.com 126
Neonode® Touch Sensor Module User's Guide Implementation Examples
Sub Area Offset Y The offset is the distance from the sensor module to the top of the screen.
Max offset is "Hid Display Size Y" minus "Sub Area High Bound X" plus "Sub Area Low
Bound X".
If the sensor module sticks out to the top of the screen change "Sub Area Low Bound X" .
Add the distance the sensor module sticks out from the left edge of the screen and the SW
(Software origin).
Sub Area Low <Default values from sensor modules original configuration>
Bound X
Sub Area Low <Default values from sensor modules original configuration>
Bound Y
Sub Area High <Default values from sensor modules original configuration>
Bound X
Sub Area High <Default values from sensor modules original configuration>
Bound Y
Sub Area Offset Y The offset is the distance from the sensor module to the top of the screen.
If the sensor module sticks out to the top of the screen change "Sub Area High Bound X" .
Subtract the distance the sensor module sticks out from the left edge of the screen and
the SW (Software origin).
https://support.neonode.com 127
Neonode® Touch Sensor Module User's Guide Implementation Examples
Sub Area Low <Default values from sensor modules original configuration>
Bound X
Sub Area Low <Default values from sensor modules original configuration>
Bound Y
Sub Area High <Default values from sensor modules original configuration>
Bound X
Sub Area High <Default values from sensor modules original configuration>
Bound Y
Sub Area Offset X This is the value of "Hid Display Size X" minus "Sub Area High Bound Y" plus "Sub
Area Low Bound Y".
If you have the sensor module to the right of the screen change the "Sub Area Low Bound
Y" to the distance between screen and sensor module.
Sub Area Offset Y The offset is the distance from the sensor to the top of the screen.
If the sensor module sticks out to the top of the screen change "Sub Area Low Bound X" .
Add the distance the sensor module sticks out from the left edge of the screen and the SW
(Software origin).
https://support.neonode.com 128
Neonode® Touch Sensor Module User's Guide Implementation Examples
Sub Area Low <Default values from sensor modules original configuration>
Bound X
Sub Area Low <Default values from sensor modules original configuration>
Bound Y
Sub Area High <Default values from sensor modules original configuration>
Bound X
Sub Area High <Default values from sensor modules original configuration>
Bound Y
Sub Area Offset X This is the value of "Hid Display Size X" minus "Sub Area High Bound Y" plus "Sub
Area Low Bound Y".
If you have the sensor module to the right of the screen change the "Sub Area Low Bound
Y" to the distance between screen and sensor module.
Sub Area Offset Y The offset is the distance from the sensor module to the top of the screen.
If the sensor module sticks out to the top of the screen change "Sub Area High Bound X" .
Subtract the distance the sensor module sticks out from the left edge of the screen and the
SW (Software origin).
https://support.neonode.com 129
Neonode® Touch Sensor Module User's Guide Implementation Examples
9.6.1 Introduction
When the Touch Sensor Module sends touch notification, it contains event data that describes the state of the
current tracked touch (DOWN, MOVE, UP). When connecting the Touch Sensor Module over USB HID, It is recognized
as a Touch Screen Digitizer by the Operating System, where a "touch" is recognized on the UP event. In practice,
this means that the end user would have to both "press" and "release" their finger (or touch object) before a touch
can be preformed. Similar to a tapping motion.
For in-air contactless touch solutions, the application gets a stronger tactile response when the application to
trigger on the DOWN event instead of the UP event. This way, a touch will be recognized as soon as a the object is
entering the Touch Active Area. In this article, we will show how this can be achieved by binding buttons to the
DOWN event of a tracked touch, using a WPF example application. For I2C communications, a demonstration of this
can be found in I2C Mouse pad and Keyboard (see page 117).
How to bind the touch event to trigger a button command might differ depending on your framework. It is
usually with the same principle as this WPF application shows, but using different formatting.
A "touch" has 4 significant events called, TouchEnter, TouchDown, TouchLeave, and TouchUp that is used to
describe a TOUCH event. The wanted touch events (i.e. TouchDown) could then be handled in the application to
trigger a button, for example.
Touch Enter Fired when an object enters the area. Can be either from the side, or a new object registering.
Touch Down Fired when a new object enters the area. Note: Only fired on new events.
If a new object enters straight into this area (or bound button), both TouchEnter and
TouchDown are fired.
Touch Leave Fired when an object leaves the area. Both when it is no longer tracked at all, and when it
leaves the boundaries of the button.
Touch Up Fired when a object leaves the area and is no longer tracked at all
To get a better understanding of the different touch events, please consider the following example.
https://support.neonode.com 130
Neonode® Touch Sensor Module User's Guide Implementation Examples
Example
Imagine 4 buttons that are positioned in a 2x2 pattern called UpperLeft, UpperRight, LowerLeft, LowerRight. Each
button can be configured to be fired on one on multiple touch events.
System Requirements
• Windows 8, or higher
• Visual Studio 2019
• .Net Core
Download the Example WPF Application, here.
https://support.neonode.com 131
Neonode® Touch Sensor Module User's Guide Implementation Examples
Introduction
The WPF Touch Device Handling Application both reads and separates TOUCH- from MOUSE events. The
application contains of 6 buttons that triggers from different touch- or mouse events. A text is printed in the lower
left corner to indicate when a button has been fired, and by what event. The application can be used to test out the
effects of the different touch events. The application code is available for reference, which is created in the
framework WPF.
To use a Command to handle touches, one must add the NuGet package "Microsoft.Xaml.Behaviors.Wpf", which
has been done in this project already.
Left Mouse Button Triggers from MOUSE event, from pressing down left mouse button.
Down
Left Mouse Button Triggers from MOUSE event, from releasing left mouse button.
Up
Touch Enter Triggers from TOUCH event, from entering the event area. Can be either from the side,
or a new object registering.
Touch Down Triggers from TOUCH event, when a new touch object enters the event area.
Note: Only fired on new events. If a new object enters straight into this area (button in
this case), both TouchEnter and TouchDown are triggered.
Touch Leave Triggers from TOUCH event, when a touch object leaves the event area. Both when it is
no longer tracked at all, and when it leaves the boundaries of the button.
Touch Up Triggers from TOUCH event, when a touch object leaves the area and is no longer
tracked at all.
https://support.neonode.com 132
Neonode® Touch Sensor Module User's Guide Implementation Examples
a. When you run the program, the application will start, and 6 buttons will appear.
Binding Description
The input events are bound in the following two files, and those are.
• MainWindow.xaml - Make sure to bind the button commands correctly here.
• MainViewModel.cs - All code that manage button presses is here.
The trigger event TouchEnterButtonCommand for example, is bound using the following method.
MainViewModel.xaml
//Bind TouchEnterButtonCommand
this.TouchEnterButtonCommand = new Command ((parameter) => { this.SelectedButtonLabel
= "Touch Enter."; }, () => true);
https://support.neonode.com 133
Neonode® Touch Sensor Module User's Guide Implementation Examples
Mouse events can both be from a mouse device, or promoted from a touch device. If the application reacts
open the "fake" mouse events, there might be a small delay, which is why only the first input event should
be read. The first event in this case would always be a touch event.
The application distinguish touch events from the translated touch events (mouse events) by checking if the events
were originally sent from a touch screen digitizer.
The following code is an example from WPF example application, which concludes if the application should read
event- or touch data.
https://support.neonode.com 134
Neonode® Touch Sensor Module User's Guide Implementation Examples
switch ( parameter )
{
case TouchEventArgs eventArgs:
// This is a Touch Event.
this.SelectedButtonLabel = "Touch Down in Touch Down Area.";
break;
case MouseEventArgs eventArgs:
// this is a Mouse Event. What we don't know is if it is
promoted from a Touch Event or from a "real mouse".
if ( eventArgs.StylusDevice == null )
{
// This is from a mouse, i.e. not promoted from a Touch
Event. We ignore it if it was promoted, or we get
// two clicks.
this.SelectedButtonLabel = "Left Mouse Button Down in
Touch Down Area.";
}
break;
}
https://support.neonode.com 135
Neonode® Touch Sensor Module User's Guide Specifications
10 Specifications
10.1 Specifications Summary
Item Specification
Touch Active Area Up to 345.6 x 327.7 mm. For details, refer to information on product
variants in Introduction (see page 6).
Scanning frequency Configurable up to 900 Hz, depending on product variant. For details,
refer to Touch Performance (see page 139).
Touch accuracy
The specified values are valid for the used test setup. For more information, refer to Performance Test Methods (see
page 149). The touch accuracy is measured inside the TAA, using a silicone based cylindrical test rod with a diameter
of 16 mm.
https://support.neonode.com 136
Neonode® Touch Sensor Module User's Guide Specifications
Touch Accuracy for Normal Range Sensor Modules of the 90° and 0° Types
NNAMC115XPC01 1.5 4
Typical Value: The accuracy on average, within the TAA.
μ ± 2σ: 95% of reported touch positions deviate less than this value. (2σ standard deviation).
Product number: "X" indicates if the sensor module is of type 0º ("0") or 90º ("1").
The accuracy specification (normal range, 0° and 90°) is valid for units produced from 15th January 2020. Please
contact our support team for specification regarding earlier produced sensor modules, or general questions about
the accuracy specification.
https://support.neonode.com 137
Neonode® Touch Sensor Module User's Guide Specifications
Touch Accuracy for Extended Range Sensor Modules of the 90° and 0° Types
Technical Specification
Item Sensor module Variant Specification
NNAMC3460PC01, 104 mW
NNAMC3461PC01
NNAMC3460PC01, 135 mW
NNAMC3461PC01,
Extended Range
NNAMC3460PC01, 47 mW
NNAMC3461PC01
https://support.neonode.com 138
Neonode® Touch Sensor Module User's Guide Specifications
NNAMC3460PC01, 61 mW
NNAMC3461PC01,
Extended Range
Specification
Measured touch coordinate error in X and Y axis is less or equal than the specified value for about 95% of the cases.
Touch coordinate error data is calculated by subtracting the actual position and measured position in X and Y axis.
Definition
The touch accuracy of the Touch Sensor Module can be described statistically with the normal distribution and a
standard deviation of 2 sigma. This means that the touch position reported by the sensor module will deviate less
than the specified value in 95% of the cases.
Specification
• Initial touch: ~50 ms, at 33 Hz scanning frequency (default frequency in idle mode).
https://support.neonode.com 139
Neonode® Touch Sensor Module User's Guide Specifications
Definition
Initial Touch
The specified response time for the initial touch starts from the instant an object is presented in the sensor
module's touch active area and stops when the module starts to send the first touch notification for this object. The
specified response time consists of two numbers reflecting the best case and the worst case, with the average
response time right in the middle.
The response time (t) can be calculated for different idle mode frequencies (f) can be calculated by the formulas
below:
Best case: t = 16 ms
Worst case: t = 1/f + 16 ms
Average: t = (1/f + 32 ms) / 2
In touch applications, an object will be detected slightly before it reaches the touch surface, making the perceived
response time shorter.
Continuous Tracking
After the first touch notification, the sensor module will continuously track and send touch notifications to update
the object position. The response time is therefore defined as the time between subsequent touch notifications.
The response time (t) can be calculated for different active mode frequencies (f) can be calculated by the formula
below:
t = 1/f
https://support.neonode.com 140
Neonode® Touch Sensor Module User's Guide Specifications
The maximum scanning frequency for product variants NNAMC3460PC01 and NNAMC3461PC01 with Extended
Range is 175 Hz.
10.3.1 Specification
The graph below shows the power consumption for various sensor module's lengths, in active and idle mode. In
active mode, the scanning frequency is set to 100 Hz, and one object is presented in active area. In idle mode the
scanning frequency is set to 33 Hz, with a clean active area. With higher scanning frequency or more detected
objects, the power consumption might slightly higher than the values in the graph. The sensor module will only be
in active mode when a touch object is being detected or tracked.
https://support.neonode.com 141
Neonode® Touch Sensor Module User's Guide Specifications
.
From firmware version 1.49 and higher, the sensor module types NNAMC3460PC01 and NNAMC3461PC01 are
provided with Extended Range, and their power consumption increases 30% in both USB active mode and USB idle
mode. The power consumption for module types shorter than 237 mm is not affected by Extended Range.
10.3.2 Definition
The power consumption is calculated from the current consumption when supplying the sensor module with 5 V.
The current consumption is, in turn, defined as the average current that goes through a sensor module. This is
measured from the +5V power pin and reflects how much electric energy that is consumed by the whole sensor
module. In real time, the current is not a stable value. Since the Touch Sensor Module has a low power
consumption design, the processor and some peripheral circuits will switch to sleep mode during the time between
two scan periods, to save power. Therefore, the current is frequently changing during run time.
According to the different working modes of the Touch Sensor Module, the current consumption value also changes
between Active mode and Idle mode.
https://support.neonode.com 142
Neonode® Touch Sensor Module User's Guide Specifications
https://support.neonode.com 143
Neonode® Touch Sensor Module User's Guide Specifications
• In x-direction, a maximum angle of 15° between window normal and sensor module's optical axis is
recommended, for all parts of the window within the sensor module's TAA.
, which corresponds to a minimum radius of 12 mm for the surface closest to the sensor module.
https://support.neonode.com 144
Neonode® Touch Sensor Module User's Guide Specifications
Top View
Dimensions C and D vary between the Touch Sensor Module types (0° and 90°) and therefore also the Touch Active
Area (TAA) sizes (A and B). For Touch Sensor Module types with A ≥ 237.6 mm, dimension B also depends on the
installed firmware version.
0° 90° A B C D
https://support.neonode.com 145
Neonode® Touch Sensor Module User's Guide Specifications
0° 90° A B C D
https://support.neonode.com 146
Neonode® Touch Sensor Module User's Guide Specifications
NNAMC238 NNAMC238 237 208. 243 3.5 v1.38 237 223 243. 3.5 Available on
0PC01 1PC01 .6 5 .1 .6 .4 1 request
NNAMC245 NNAMC245 244 208. 248 2 v1.38 244 223 248. 2 Available on
0PC01 1PC01 .8 5 .8 .8 .4 8 request
NNAMC252 NNAMC252 252 208. 257 3.5 v1.38 252 238 257. 3.5 Available on
0PC01 1PC01 5 .5 .3 5 request
NNAMC259 NNAMC259 259 208. 263 2 v1.38 259 238 263. 2 Available on
0PC01 1PC01 .2 5 .2 .2 .3 2 request
NNAMC266 NNAMC266 266 208. 271 3.5 v1.38 266 253 271. 3.5 Available on
0PC01 1PC01 .4 5 .9 .4 .2 9 request
NNAMC274 NNAMC274 273 208. 277 2 v1.38 273 253 277. 2 Available on
0PC01 1PC01 .6 5 .6 .6 .2 6 request
NNAMC281 NNAMC281 280 208. 286 3.5 v1.38 280 268 286. 3.5 Available on
0PC01 1PC01 .8 5 .3 .8 .1 3 request
NNAMC288 NNAMC288 288 208. 292 2 v1.38 288 268 292 2 Available on
0PC01 1PC01 5 .1 request
NNAMC295 NNAMC295 295 208. 300 3.5 v1.38 295 283 300. 3.5 Available on
0PC01 1PC01 .2 5 .7 .2 .0 7 request
NNAMC302 NNAMC302 302 208. 306 2 v1.38 302 283 306. 2 Available on
0PC01 1PC01 .4 5 .4 .4 .0 4 request
NNAMC310 NNAMC310 309 208. 315 3.5 v1.38 309 297 315. 3.5 Available on
0PC01 1PC01 .6 5 .1 .6 .9 1 request
NNAMC317 NNAMC317 316 208. 320 2 v1.38 316 297 320. 2 Available on
0PC01 1PC01 .8 5 .8 .8 .9 8 request
NNAMC324 NNAMC324 324 208. 329 3.5 v1.38 324 312 329. 3.5 Available on
0PC01 1PC01 5 .5 .8 5 request
NNAMC331 NNAMC331 331 208. 335 2 v1.38 331 312 335. 2 Available on
0PC01 1PC01 .2 5 .2 .2 .8 2 request
https://support.neonode.com 147
Neonode® Touch Sensor Module User's Guide Specifications
NNAMC338 NNAMC338 338 208. 343 3.5 v1.38 338 327 343. 3.5 Available on
0PC01 1PC01 .4 5 .9 .4 .7 9 request
NNAMC346 NNAMC346 345 208. 349 2 v1.38 345 327 349. 2 v1.49
0PC01 1PC01 .6 5 .6 .6 .7 6 Extended
Range
Side View
These measurements are identical for all sensor module's lenghts but vary some between the 0° and 90 ° types. The
position of origin is marked with "zero software".
0° Type
https://support.neonode.com 148
Neonode® Touch Sensor Module User's Guide Specifications
90 ° Type
0.75
1.6 0.05
0.12
16.05
0.30
0.19
3.46 0.13
10.7.2 Packaging
Please refer to Packaging Blueprints in Downloads59for further information.
59 https://support.neonode.com/docs/display/Downloads/Packaging+Blueprints
60 https://helpcenter.neonode.com/hc/en-us/requests/new
https://support.neonode.com 149
Neonode® Touch Sensor Module User's Guide Specifications
61 https://support.neonode.com/docs/display/Downloads/PDF+Documents
https://support.neonode.com 150
Neonode® Touch Sensor Module User's Guide Specifications
ESD EN55024 3
(61000-4-2)
Direct contact discharge: 2,4,8 kV
Indirect contact discharge: 2,4,8 kV
Air discharge: 4,8,16 kV
https://support.neonode.com 151