#driver #touch #embedded-hal-driver

no-std AT42QT2120

Platform agnostic Rust driver for the AT42QT2120

3 releases

Uses old Rust 2015

0.1.2 Apr 20, 2020
0.1.1 Nov 24, 2019
0.1.0 Nov 24, 2019

#815 in Embedded development

Download history 1/week @ 2024-09-21 6/week @ 2024-10-12 1/week @ 2024-10-19 2/week @ 2024-11-02

62 downloads per month

LGPL-3.0

16KB
152 lines

AT42QT2120 Rust driver

Platform agnostic Rust driver for the AT42QT2120

The AT42QT2120

The AT42QT2120 is a touch driver with 12 channels, of which 3 can be used as a slider or a wheel. It has an I2C interface. Datasheet: http://ww1.microchip.com/downloads/en/devicedoc/doc9634.pdf

Status

Basic support works and is tested on hardware:

  • Support reading keys
  • Support reading raw key values
  • Support reading slider
  • Configurable slider/wheel
  • Configurable key threshold
  • Enable/disable keys
  • Configurable detection integrator

Most advanced configuration is not supported:

  • Configurable drift compensation
  • Configurable touch recal delay
  • Low power mode
  • Using Change pin as input
  • Configurable key oversampling

I am new to Rust, so the code quality is probably not great.

License

Licensed under GNU Lesser General Public License v3.0. All contributions intentionally submitted shall be licensed under the same license.


lib.rs:

A platform agnostic driver for the AT42QT2120 touch sensor IC in Rust. It is based on the embedded-hal traits

The device

The AT42QT2120 is a 12 channel QTouch touch sensor that also supports a touch sliders

Usage

Import this crate and an embedded_hal implementation, for example, on an stm32f103 device:

extern crate stm32f1xx_hal as hal;
extern crate AT42QT2120;

The AT42QT2120 only has one address option, so to instantiate a device:

let i2c2 = BlockingI2c::i2c2(..);
let mut touch_sensor = At42qt2120::new(i2c2);

The AT42QT2120, on reset, has all 12 channels setup as touch input with sane settings. If only touch buttons are needed, no extra setup is needed.

To enable a slider:

let use_wheel = false;
let enable_slider = true;
touch_sensor.setup_slider(use_wheel, enable_slider); 

If a key needs to be disabled, or the threshold changed:

let key_to_setup = 3;
let key_threshold = 20;  //must be 1 or more!
let enable_key = true;
setup_key(key_to_setup, key_threshold, enable_key);

Reading keys and the slider:

if touch_sensor.keys_pressed()? {
  let keys_pressed = touch_sensor.read_keys()?;
}

if touch_sensor.slider_pressed()? {
  let keys_pressed = touch_sensor.read_slider()?;
}

individual keys can also be read using:

let key_to_read = 3;
touch_sensor.read_key(key_to_read)?;

supported features

Basic features are supported: setting up and reading the slider/wheel setting up and reading keys. Calibration.

Not supported is: setting power mode, changing drift compensation and other advanced settings Grouping keys Setting oversampling on keys

This driver is tested on an stm32f103 and made by someone who is new to rust, ymmv :)

Dependencies

~71KB