Tag Archives: IOT

Lets Write Code for MyO Armband – Android

Myo Armband is kind of a Wearable technology which senses the electrical signals produced when the muscles move. It got EMG Sensor, Gyroscopes and Accelerometer(Check here for Exact Spec 11137159_10204486542423879_2960066497525238836_n

So today we will see how to write code to get data and do stuff accordingly from the MyO Armband from the electrical signals that it can sense.

When the MyO Band is launched first, there was no instructions on how to setup the environment for the Android Studio. So there is a sample for Eclipse in Git Hub you guys can try it
gitHub-download-button

But today we are going to create and run an app that responds to all your gestures in Android Studio

Ok then will jump into the Tutorial

Step 1
First of all you have to Download the MyO SDK from the site and Extract the zip file and place it somewhere so that later you can add the path of it. You may have to register yourself before you can download it.
(You can download the SDK here)

Step 2
Create a new Project in the Android Studio, at the time of this tutorial my Compile SDK Version is API 23 Android 6.0 (Marshmallows), Build Tool version is 23.0.2, Minimum target SDK is 18. Ill be using a Galaxy s3 for testing. When it comes to Android Marshmallows you have to handle the new permission system. I’ll be explaining it in another Blog.

Step 3
Go to the build.gradle(Module:app) and add these code snippet to the dependencies

repositories {
    maven {
        url 'C:\\Users\\adh\\Desktop\\myo-android-sdk-0.10.0\\myo-android-sdk-0.10.0\\myorepository'
    }
}
compile 'com.thalmic:myosdk:0.10.+@aar'

Be careful when adding the maven url, it has to be the path to the MyO SDK, which you have downloaded earlier. And the path should go upto the level of the folder “myorepository”. In my case it was in the Desktop.

The compile line will get the library from the path provided above and sync it. The reason is unlike many other libraries the MYO is not hosted anywhere to automatically Android Studio to find it. So this is kind of a work around to build a MYO app in Android Studio.

Step 4
Next thing is in the SDK you have downloaded go to the
Eclipse –> MyoSdk–>libs and copy all the folders in it.
Capture
Be careful not to copy the “myosdk.jar”

Then go to the file location of your Android Studio Project
In the app–>src–>main create a folder called “jniLibs” and paste the folders you have copied earlier from the MYO SDK folder

Now your Project structure will look like this
Capture2

Step 5
Ok now we have done the important stuffs and the workaround to some errors we may have faced(Actually I faced those errors and found out these workarounds, all happened due to no support for the Android studio from the MYO guys )

So we go to our main activity and first we have to create a instance of Hub and initiate it. Hub is the main guy who will be listening to the signals from the Band.

So we create and initialize it in the onCreate() method

Hub hub = Hub.getInstance();
if (!hub.init(this)) {
    Log.e(TAG, "Could not initialize the Hub.");
    finish();
    return;
}

Step 6
Now we have initialized the Hub, now we have to find available MyO bands and connect to it. For that we start an activity called ScanActivity, which comes with the MyO SDK.

Intent intent = new Intent(context, ScanActivity.class);
context.startActivity(intent);

All the hard work is done by the library, you will just have to select the device shown by this activity to connect your app with

Step 7
Ok now we come to a place where we have to set something called lock policy, as this is a Gadget which will be always moving here and there we have to enable one of the 2 policies available(You can create your own policy and apply them but for now we will see the 2 default ones)
One is LockingPolicy.NONE –  this one will remove any lock policies that are available, for this example I am using this for easy to understand
and the other one is  LockingPolicy.STANDARD – This policy is a general one that is used by most of the developers, which lock the device when it detects that it is not being used, so that when you want to use it again, you have to do the unlock gesture to unlock it.

So we have to apply a Locking Policy to out app too
So the next code snippet to add will be

Hub.getInstance().setLockingPolicy(Hub.LockingPolicy.NONE);

Remember all the code I am adding are in the onCreate() mthod. And I am only showing the snippets here. In the Full Code sample you will find them nicely organized in to methods.

Step 8
The last code snippet in the onCreate is not important, but I thought its important to mention it. The MYO guys are actually getting some usage data through their API, but we can manually stop it by adding this code line

if (Hub.getInstance().isSendingUsageData()) {
    Hub.getInstance().setSendUsageData(false);
}

I am checking if the usage data is being sent and if it returns true I am stoping it by passing the parameter ‘false’ to the method setSendUsageData()

Step 9
Now we have to create a method to create a listener and to respond based on the signals that we receive and Add it to the Hub

private void createAndAddListner() {

    mListener = new AbstractDeviceListener() {
        @Override
        public void onConnect(Myo myo, long timestamp) {
            Toast.makeText(context, "Myo Connected!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onDisconnect(Myo myo, long timestamp) {
            Toast.makeText(context, "Myo Disconnected!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPose(Myo myo, long timestamp, Pose pose) {
            switch (pose) {
                case REST:
                    Toast.makeText(context, "REST", Toast.LENGTH_SHORT).show();
                    break;
                case FIST:
                    Toast.makeText(context, "FIST", Toast.LENGTH_SHORT).show();
                    break;
                case WAVE_IN:
                    Toast.makeText(context, "WAVE_IN", Toast.LENGTH_SHORT).show();
                    break;
                case WAVE_OUT:
                    Toast.makeText(context, "WAVE_OUT", Toast.LENGTH_SHORT).show();
                    break;
                case FINGERS_SPREAD:
                    Toast.makeText(context, "FINGERS_SPREAD", Toast.LENGTH_SHORT).show();
                    break;
                case DOUBLE_TAP:
                    Toast.makeText(context, "DOUBLE_TAP", Toast.LENGTH_SHORT).show();
                    break;
                case UNKNOWN:
                    Toast.makeText(context, "UNKNOWN", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    Hub.getInstance().addListener(mListener);
}

Here the mListner is an instance of DeviceListener Class. And you can see 3 override methods it has, onConnect, onDisconnect and the onPose

If the device is connected properly onPose is the one that gets triggered when you try to do gestures  using the MyO Arm band. I have added different Toast Messages for each of the Actions. If the action does not match any of the predefined 6 Actions it will be fall under the Action “Unknown”

Step 10
So now that we have created the function to create the mListner and attach it to the Hub now we have to call it in the onResume()

protected void onResume() {
    super.onResume();
    createAndAddListner();
}

and must not forget to detach the listener when we go out of the app so on oPause function we remove the listener

protected void onPause() {
    super.onPause();
    Hub.getInstance().removeListener(mListener);
}

So that’s it folks now you can write your own code to do stuff for each of the MYO Arm Band’s gestures detected.

Have Fun Folks
😀

For clear and clean code of this project visit the GitHub
gitHub-download-button

Exploring Flic Button

What is a Flic?
Flic is a wireless hardware button. Works using Bluetooth, paired with your phone. It is not rechargeable but the battery is replaceable. Can be stuck on wall or pinned in dresses, for easy access depends on your need. It can broadcast 3 functions to your phone for 3 actions, Single Click, Double Click and Press and Hold.

IMG_20160212_093850

It already has an app called flic, which got some basic day to day usable functions already defined. It is more than enough for your daily usage. But it got an API which we can use to invoke our own app or services that is running in the phone. This will enable us to develop a mobile solution which can be triggered using this button or create a service which can gather resources using the available sensors in the phone and send it to server. So we can consider this under Concept of IOT.

Ok so we will try to write something so we invoke our own functionality using the Flic Button.

Step 1
First of all this API does not work alone it needs you to install their android app and connect your Flic buttons using it. Before you start to concentrate on the API. You can download the app here

Step 2
Now you have to visit GitHub and download the Flic Library project. You can simply download it as a zip file and unzip it.  you can visit the site here

Step 3
Open the Android studio and create a new project that supports Minimum API level 19(Android 4.4), then go to File –> New –> Import Module and select the ‘fliclib-android’ from the git hub library project you have downloaded. Now you have added the library to the project structure.

Step 4
Now you have to add reference to the added library by going to  File -> Project -> Structure -> app (in the left sidebar) -> Dependencies tab -> The + button in the rightmost section -> Module dependency -> fliclib  and selecting ‘OK’

Step 5

on your main activity on the onCreate you have to set up the app credentials

FlicManager.setAppCredentials("[appId]", "[appSecret]", "[appName]");

You can get the credentials by registering your app at the Flic here

Step 6
Now after setting the App Credentials you have to grab a button from the main flic button app using this code snippet

try {
    FlicManager.getInstance(this, new FlicManagerInitializedCallback() {
        @Override
        public void onInitialized(FlicManager manager) {
            manager.initiateGrabButton(MainActivity.this);
        }
    });
} catch (FlicAppNotInstalledException err) {
    Toast.makeText(this, "Flic App is not installed", Toast.LENGTH_SHORT).show();
}

So when you have selected the button on the onActivityResult call back you will get the results, and if the grab is success, you can registerBroadcast for specific functions, based on that the Broadcast receiver we are gona write in a moment, will trigger events. In this case we are subscribing the Broadcast Receiver for UP_OR_DOWN operation and REMOVED events only

@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    FlicManager.getInstance(this, new FlicManagerInitializedCallback() {
        @Override
        public void onInitialized(FlicManager manager) {
            FlicButton button = manager.completeGrabButton(requestCode, resultCode, data);
            if (button != null) {
                button.registerListenForBroadcast(FlicBroadcastReceiverFlags.UP_OR_DOWN | FlicBroadcastReceiverFlags.REMOVED);
                Toast.makeText(MainActivity.this, "Grabbed a button", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Did not grab any button", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

So now we have configured the setting up we, have to write a BroadCastReceiver to get the calls from the button and trigger events

Step 7

Create a class called ‘BroadCastReceiverFlic’ that extends ‘FlicBroadcastReceiver’, which comes from the API project we added.
In that class in the Override method ‘onRequestAppCredentials’ you have to again setup the flic credential that you did at the main activity onCreate function.

Then as we have already registered for the UP_OR_DOWN and REMOVED broadcasts we can override these functions

@Override
public void onButtonRemoved(Context context, FlicButton button) {
    // Button was removed
}

and

@Override
public void onButtonUpOrDown(Context context, FlicButton button, boolean wasQueued, int timeDiff, boolean isUp, boolean isDown) {
    super.onButtonUpOrDown(context, button, wasQueued, timeDiff, isUp, isDown);
    if (isUp) {
        Log.d("IS UP", "True");
    } else {
        Log.d("IS DOWN", "True");
    }
}

In the final method you can trigger events based on if the button is up or down(In my case I am Logging different messages). If you have subscribed for the Broadcast service “CLICK_OR_DOUBLE_CLICK_OR_HOLD” you could override the function ‘onButtonSingleOrDoubleClickOrHold()’

Any way for the sample code I’ll do the coding for ‘”CLICK_OR_DOUBLE_CLICK_OR_HOLD”‘ broadcast

So thats it folks you guys can get the full code here
gitHub-download-button

Will Write our Own App to Trigger Mi Band

10371404_10206191040355262_3352352559338119016_n
Xiaomi Mi Band is the world’s cheapest and branded fitness tracker. So why don’t we do some experiments so that we can make the Mi Band do what we say for a change?

I’ll be doing this code session for Android using Android Studio, hope others can understand the basics

Step 1
Firs of all we start a new empty project. And add 4 buttons. This is to test 4 basic functions of the Mi Band. Then initialize the buttons and ready the the setOnclick listners.

Step 2
Add Bluetooth Permissions in the Manifestfile, else you wont be able to connect to the band 😀

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /

Step 3
Add the Xiaomi Mi Band dependencyto the gradle and sync it

compile 'com.zhaoxiaodan.miband:miband-sdk:1.1.2'

Step 4

In the oncreate you have to create and initialize an instance of the MiBand Class

private MiBand miband;
miband = new MiBand(this);

Step 5

I have not done the pairing part in the code, but I assume the Mi band of yours is already paired to the device. If you have paired more than one device you can populate all the paired devices and allow the user to select one. But for the demonstration purpose I have only paired with my Mi Band so it is the one and only device returns to me

Object[] devices = BluetoothAdapter.getDefaultAdapter().getBondedDevices().toArray();
final BluetoothDevice device = (BluetoothDevice) devices[0];

So I am getting my paired device from the available devices, as I only got my Mi band paired I get the 0th device. hope you people got that part 😀

Step 6
No you have to connect to the paired device

miband.connect(device, new ActionCallback() {
    @Override
    public void onSuccess(Object data) {
        pd.dismiss();
        Log.d(TAG, "Success !!!");
        miband.setDisconnectedListener(new NotifyListener() {
            @Override
            public void onNotify(byte[] data) {
                Log.d(TAG, "Disconnected!!!");
            }
        });
    }
    @Override
    public void onFail(int errorCode, String msg) {
        pd.dismiss();
        Log.d(TAG, "connect fail, code:" + errorCode + ",mgs:" + msg);
    }
});

Step 7

So if you have successfully connected to the device. You can start invoking functions of the MiBand in the button clicks
For example : You can make it Vibrate using this code snippet

miband.startVibration(VibrationMode.VIBRATION_WITH_LED);

You can check out some more commands in the sample code available in Git HubgitHub-download-button