IoT Mashup #002: Armband Gesture Controllers

Fluid, natural gesture controls were a pipe dream of interface design long before Tom Cruise donned those three-fingered gloves in Minority Report. They’ve even started to become a reality thanks to camera-based systems like the Xbox Kinect and Leap Motion.

But what if you didn’t need cameras, which tend to tie you to one location, to watch the motions of your hands and arms and interpret your gestures? What if your arm could, in effect, watch itself and help you engage with your surroundings?

Today we’ll look at two companies that do just that -- with smart, wireless armbands.

Myo, from Thalmic Labs, is worn high on the forearm, just below the elbow. Eight electromyography sensors on the inside of the armband detect activity in the bundle of muscles running up the arm. If you wrap your other hand around that spot and make different shapes with your hand -- a fist, a flat palm, a finger gun, etc. -- you’ll get a pretty good sense of how it works.

IoT Mashup #002: Armband Gesture Controllers 1 image
MYO Drone arm and motion control

Different combinations of hand shape and arm movement can be combined to provide fine-tuned controls for just about any application. If the company’s demonstration video is to be believed, Myo is equally suited to flipping slides in a presentation, flying a remote-controlled quadcopter, or playing your favorite video game. But it can only connect (via Bluetooth) to one device at a time, so the controls don’t get mixed up.

Myo works with Mac, Windows, iOS and Android, and Thalmic is already offering developers early access to the SDK. Battery life is an obvious concern, and the company says it’s aiming for multi-day use by the time they start shipping preorders in mid-2014.

IoT Mashup #002: Armband Gesture Controllers 2 image
Nymi security band with fingerprint access

Nymi, from Bionym, is more of a passive control system. The key is the unique electrical signal produced by the user’s heartbeat. When you strap Nymi to your wrist and touch the sensor on the outside of the band, the device takes a brief electrocardiogram to verify your identity. Until you take it off, Nymi becomes a Bluetooth Low Energy beacon that can provide secure access to nearby devices.

The company says the technology works even if you’ve had a little too much coffee, or just bounded up a flight of stairs. That’s partly because Nymi only measures your heartbeat once, to authenticate the wearer -- it’s not a medical device or a fitness tracker, so it’s not listening to your heart all day long. (Check out Bionym’s white paper for more details.)

But as long as you wear it, Nymi can securely verify your identity to anything with a Bluetooth connection. Use it to automatically unlock phones, tablets, and computers; to open secure doors or enter your car; or to pay for that morning coffee. It’s a biometric sensor you can take with you anywhere.

IoT Mashup #002: Armband Gesture Controllers 3 image
Nymi opening Tesla trunk with a simple up gesture

Privacy is a big concern with any biometric data, so it’s good to know that Bionym has built Nymi according to the principles of Privacy By Design. Everything is opt-in, and the wristband itself doesn’t store any of your passwords or PINs. All that sensitive data is stored locally on your devices, which simply listen for Nymi’s all-clear signal via the Nymi app.

Nymi also has an accelerometer and recognizes basic gestures, like a turn of the wrist, though fine-grained gesture control is not this device’s strong suit. But we’ll see what happens as developers start experimenting with the SDK. Preorders will ship in mid-2014.

Related: IoT Mashup: #001: Bluetooth Brains, Connected Body Award Winners


[gravityform id="38" title="false" description="false" ajax="true" tabindex="49"]
<div class='gf_browser_unknown gform_wrapper' id='gform_wrapper_38' ><div id='gf_38' class='gform_anchor' tabindex='-1'></div><form method='post' enctype='multipart/form-data' target='gform_ajax_frame_38' id='gform_38' action='/iot-mashup-002-armband-controllers/#gf_38'> <div class='gform_body'><ul id='gform_fields_38' class='gform_fields top_label form_sublabel_below description_below'><li id='field_38_2' class='gfield field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label gfield_label_before_complex' >Your Name</label><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name no_last_name no_suffix gf_name_has_1 ginput_container_name' id='input_38_2'> <span id='input_38_2_3_container' class='name_first' > <input type='text' name='input_2.3' id='input_38_2_3' value='' aria-label='First name' tabindex='50' aria-invalid="false" /> <label for='input_38_2_3' >First</label> </span> </div></li><li id='field_38_3' class='gfield field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_38_3' >Can you share a high level overview of what you are looking for?</label><div class='ginput_container ginput_container_textarea'><textarea name='input_3' id='input_38_3' class='textarea medium' tabindex='54' aria-invalid="false" rows='10' cols='50'></textarea></div></li><li id='field_38_4' class='gfield field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_38_4' >What is your email address?</label><div class='ginput_container ginput_container_text'><input name='input_4' id='input_38_4' type='text' value='' class='medium' tabindex='55' aria-invalid="false" /></div></li> </ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_38' class='gform_button button' value='Submit' tabindex='56' onclick='if(window["gf_submitting_38"]){return false;} window["gf_submitting_38"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_38"]){return false;} window["gf_submitting_38"]=true; jQuery("#gform_38").trigger("submit",[true]); }' /> <input type='hidden' name='gform_ajax' value='form_id=38&amp;title=&amp;description=&amp;tabindex=49' /> <input type='hidden' class='gform_hidden' name='is_submit_38' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='38' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_38' value='WyJbXSIsIjI0MzNjYTY3YTUxNWM5ZTM5NmFkOWNiZWJiMjkyMDYyIl0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_38' id='gform_target_page_number_38' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_38' id='gform_source_page_number_38' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_38' id='gform_ajax_frame_38'>This iframe contains the logic required to handle Ajax powered Gravity Forms.</iframe> <script type='text/javascript'>jQuery(document).ready(function($){gformInitSpinner( 38, '' );jQuery('#gform_ajax_frame_38').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_38');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_38').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_38').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_38').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_38').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_38').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_38').val();gformInitSpinner( 38, '' );jQuery(document).trigger('gform_page_loaded', [38, current_page]);window['gf_submitting_38'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_38').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_38').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [38]);window['gf_submitting_38'] = false;}, 50);}else{jQuery('#gform_38').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [38, current_page]);} );} );</script><script type='text/javascript'> jQuery(document).bind('gform_post_render', function(event, formId, currentPage){if(formId == 38) {} } );jQuery(document).bind('gform_post_conditional_logic', function(event, formId, fields, isInit){} );</script><script type='text/javascript'> jQuery(document).ready(function(){jQuery(document).trigger('gform_post_render', [38, 1]) } ); </script>