Save 37% off PRO during our Black Friday Sale! »

Software Developers Guide To Prototyping Wearables

Software Developers Guide To Prototyping Wearables

A overview of prototyping wearables as a software developer along with some examples using Android and Metawear

89e0c5e7bfe1c613b1b9287d89963e73?s=128

Lance Gleason

March 10, 2015
Tweet

Transcript

  1. Introductions

  2. Twitter @lgleasain Github lgleasain www.lancegleason.com www.polyglotprogrammincinc.com lgleason@polyglotprogramminginc.com

  3. None
  4. None
  5. None
  6. None
  7. None
  8. None
  9. None
  10. http://www.polyglotprogramminginc.com/purr- programming-2-0/

  11. None
  12. None
  13. Software

  14. Options

  15. None
  16. Pros •Extensible •Common Pinouts

  17. Cons • Impossible to create a at scale prototype •

    Many extensions overkill for wearables
  18. None
  19. Pros • Inexpensive • Available GPS Module • Low Power

    • Aduino Based • Lots of Support
  20. Cons • No easy way to integrate Bluetooth or Wifi

    • Requires a physical connection to get data • Things like an accelerometer require a separate component
  21. None
  22. None
  23. None
  24. None
  25. Features • Bluetooth Support • Robust API for Android and

    IOS • Built in Sensors (temperature, accelerometer etc.) • Built in support for rechargeable batteries
  26. Specs • ! Nordic Semiconductor nRF51822 BLE SoC • !

    2.4 GHz transceiver • ! ARM®Cortex™-M0 32 bit processor • ! 256 kB flash program memory • ! 16 kB RAM • ! 8/9/10 bit ADC
  27. Specs Continued • Accelerometer • Temperature Sensor • Push Button

    Switch • Bright LED • Driver for vibration motor • micro usb chargable • I2C bus, and support for 4 digital/analog and 4 digital pins
  28. None
  29. None
  30. Cons • Really Small • Tough to write custom drivers

    • Proprietary
  31. None
  32. Bluetooth • Same Frequency range as 2.4 Gigahertz Wifi •

    79 Channels VS 13 • Less Throughput
  33. Bluetooth LE • Always off • Less Throughput • Often

    lower transmit power • Designed for low data low power Applications
  34. None
  35. None
  36. IOS • IPad 3rd Generation or better • Iphone 4S

    or greater
  37. Android • Bluetooth 4.0 supported radio • Android 4.3 or

    greater
  38. None
  39. None
  40. None
  41. repositories { ivy { url "http://ivyrep.mbientlab.com" layout "gradle" } }

    compile 'com.mbientlab:metawear:1.5.3' Include the Repo
  42. <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <service android:name="com.mbientlab.metawear.api.MetaWearBleService" /> <!--

    Other application info --> </application> Update The Manifest
  43. package com.example.metawear; import com.mbientlab.metawear.api.MetaWearBleService; import android.app.Activity; import android.content.ServiceConnection; public class

    ExampleActivity extends Activity implements ServiceConnection { private MetaWearBleService mwService= null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //< Bind the MetaWear service when the activity is created getApplicationContext().bindService(new Intent(this, MetaWearBleService.class), this, Context.BIND_AUTO_CREATE); } @Override public void onDestroy() { super.onDestroy(); //< Unbind the service when the activity is destroyed getApplicationContext().unbindService(this); } @Override public void onServiceConnected(ComponentName name, IBinder service) { //< Get a reference to the MetaWear service from the binder mwService= ((MetaWearBleService.LocalBinder) service).getService(); } //< Don't need this callback method but we must implement it @Override public void onServiceDisconnected(ComponentName name) { } }
  44. public class ExampleActivity extends Activity implements ServiceConnection { @Override protected

    void onResume() { super.onResume(); registerReceiver(MetaWearBleService.getMetaWearBroadcastReceiver(), MetaWearBleService.getMetaWearIntentFilter()); } @Override protected void onPause() { super.onPause(); unregisterReceiver(MetaWearBleService.getMetaWearBroadcastReceiver()); } } Nofifications via Activity
  45. private final string MW_MAC_ADDRESS= "EC:2C:09:81:22:AC"; private MetaWearController mwCtrllr; public void

    onServiceConnected(ComponentName name, IBinder service) { mwService= ((MetaWearBleService.LocalBinder) service).getService(); final BluetoothManager btManager= (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); final mwBoard= btManager.getAdapter().getRemoteDevice(MW_MAC_ADDRESS) mwCtrllr= mwService.getMetaWearController(mwBoard); } //< Connect to the board the object is controlling mwCtrllr.connect(); ///< Close the Bluetooth connection mwCtrllr.close(); Instantiate and Connect
  46. private DeviceCallbacks dCallbacks= new DeviceCallbacks() { @Override public void connected()

    { Log.i("ExampleActivity", "A Bluetooth LE connection has been established!"); } @Override public void disconnected() { Log.i("ExampleActivity", "Lost the Bluetooth LE connection!"); } }; ///< Register the callback, log message will appear when connected mwController.addDeviceCallback(dCallbacks); ///< Remove the callback, no feedback for when a ble connection is made mwController.removeDeviceCallback(dCallbacks); Registering Callbacks
  47. import com.mbientlab.metawear.api.characteristic; //< Setup callback for receiving device information mwCtrllr.addDeviceCallback(new

    DeviceCallbacks() { @Override public void receivedGATTCharacteristic(GATTCharacteristic characteristic, byte[] data) { Log.i("ExampleActivity", String.format("%s= %s", characteristic.toString(), new String(data)); } @Override public void receivedRemoteRSSI(int rssi) { log.i("ExampleActivity", String.format("RSSI= %d dBm", rssi)); } }); //< Read characteristics from the device information service //< GATT characteristics are from the DeviceInformation enum mwCtrllr.readDeviceInfo(); //< Read battery level from the battery service //< GATT characteristics are from the Battery enum mwCtrllr.readBatteryLevel(); //< Read RSSI value mwCtrllr.readRemoteRSSI();
  48. mwController.addModuleCallback(new MechanicalSwitch.Callbacks() { @Override public void pressed() { if (saviours

    != null && saviours.getCount() > 0) { Toast.makeText(getActivity(), "button pressed", Toast.LENGTH_SHORT).show(); sendText(true); } else { Toast.makeText(getActivity(), R.string.error_no_contact, Toast.LENGTH_SHORT).show(); } } }) Switch Callback
  49. .addModuleCallback(new Accelerometer.Callbacks() { @Override public void shakeDetected(MovementData moveData) { shakeCounts.getAndIncrement();

    if (!setTimerTask.get()) { resetTask= new TimerTask() { @Override public void run() { shakeCounts.set(0); setTimerTask.getAndSet(false); } }; timer.schedule(resetTask, RESET_DELAY); setTimerTask.getAndSet(true); } if (shakeCounts.get() == MAX_SHAKES) { resetTask.cancel(); setTimerTask.getAndSet(false); shakeCounts.getAndSet(0); if (saviours != null && saviours.getCount() > 0) { sendText(false); } else { Toast.makeText(getActivity(), R.string.error_no_contact, Toast.LENGTH_SHORT).show(); } } } }); Shake Callback
  50. None
  51. None
  52. None
  53. Example Code Available at https://github.com/lgleasain/Metawear-Android-SOS

  54. Twitter @lgleasain Github lgleasain www.lancegleason.com www.polyglotprogrammincinc.com lgleason@polyglotprogramminginc.com