Hacker News new | ask | show | jobs
by robertely 2213 days ago
Given how ubiquitous the capacitive touch senors have become I'm surprised no one has put together an open source option. I've gone down something of a rabbit hole searching and haven't found any prior work.

The closest I have seen is the Snowpad[1] but it's been discontinued by the maker and they pulled down the source as well.

I'd try duplicating it but it used the Microchip MTCH6301 and it's been marked `Not recommended for use in new designs.` I'm hunting for an easy to use alternative if anyone knows one. I may still take a stab at the MTCH6301 just because of how easy it looks to use.

[1][https://www.kitronyx.com/snowpad.html]

2 comments

What does "Open Source" mean in this context? Isn't the goal "just" to have an understandable interface?

Also: Can you recommend some reading material as an introduction to using a capacitive digitizer? I am planning to use one in an upcoming project (either one from a tablet glass replacement or a stand alone one) and really have no idea what to look out for yet in terms of communication with my Linux board (bonus: Something about DIYing one because I need a special format, but I guess that's especially hard because it's supposed to go on to a screen).

Having a tidy interface is certainly a primary goal but there are others.

- Control over the size/shape of the sensor pad.

- Control over communication (i2c/spi/usb)

- Ability to explore gesture behaviors and expose simplified interfaces to the OS.

- Control over click feel/behaviors by customizing snap switch style, mount, and locations.

- Control over the touch surface finish. (Did you know you can laser cut glass screen protectors? Why are none of these touch pads glass outside of macbooks?)

- Open documentation on all of the above.

As for reading material I can't recommend anything as a summery (see my last bullet). Manufacture design guidelines are probably where you should start.

Case in point: MTCH6301: https://www.microchip.com/wwwproducts/en/MTCH6301 Microchip Sensor design guide: http://ww1.microchip.com/downloads/en/DeviceDoc/FAQs%20-%20S...

It's not just the sensor. I'd warn people trying to DIY from scratch to make sure you really think of the full gestalt of a touch / gesture experience which spans:

- Mechanics (a good surface, sensing)

- Robustly designed state machines to track states even before your finger lands.

- Math (to deal with finger acceleration, stabilization)

- Feedback! Mechanical clicking, piezo, weight actuation, etc. I cringe when I see projects lacking feedback.

As a teaser here's my messy breakdown of the macbook trackpad states, based on things done back around 2008/2009 (http://blog.sendapatch.se/2009/november/multitouch-on-unibod...):

    enum RawTouchStateOneValues {
        TOUCH_STARTED_STATE = 1,       // initial touch started state - i.e. first frame of a touch. warning on this state: StateTwoValues seem invalid here
        TOUCH_HOVERING_STATE = 2,      // multi-frame: typically occurs when a touch is about to land. 
        TOUCH_LANDED_ON_PAD_STATE = 3, // usually single-frame, but can occur multiple times if a touch hovers and returns (from state 6,2,1) - you can also go here from state 6, which means a hanging touch can 'return'
        TOUCH_ON_PAD_STATE = 4,        // typical duration of a touch - moving around on pad
        TOUCH_LEAVING_PAD_STATE = 5,   // usually single-frame - 
        TOUCH_LEFT_NOW_HOVERING_STATE = 6, // multi-frame: occurs when a touch occurred but then left pad (state 5), and is now hovering
        TOUCH_ENDED_STATE = 7          // single-frame: touch finally ends
    };

    enum RawTouchStateTwoValues {
        TOUCH_DETECTED_ALTSTATE = 0, //state only seems to occur on initial touch (stateOne's TOUCH_STARTED_STATE), which I filter out 
        TOUCH_RESTING = 1,
        TOUCH_NON_RESTING = 2,
        TOUCH_NON_RESTING_AGAIN = 3,
        TOUCH_THIRD_TOUCH = 4,
        TOUCH_EDGE_REGION = 5, //only observed on magic trackpad - seems to occur when starting at the edge.
        TOUCH_SIXTH_TOUCH = 6,
        TOUCH_GROWING_FROM_EDGE = 7, //both cases 12 and 7 seem be used for palm-rejection scenarios
        TOUCH_EIGHTH_TOUCH = 8,
        TOUCH_NINTH_TOUCH = 9,
        TOUCH_TENTH_TOUCH = 10,
        TOUCH_ELEVENTH_TOUCH = 11,
        TOUCH_COMING_FROM_EDGE = 12 //both cases 12 and 7 seem be used for palm-rejection scenarios
        
        //other states observed but unknown - 4 (seems to consistently occur when I have three fingers down. 
        //                                         likely occurs in certain pad regions)
        // 
    };