Okosvezérlés

Ennek a leírásnak a végén képesek leszünk egy Syma típusó drónt telefonnal és okosórával reptetni. Az itt bemutatottak Windows 10 alatt készültek, de logikus változtatásokkal Linux és Mac alatt is működnek.

Telepítés

Először telepítsük a legfrissebb Java 8 JDK verziót és adjuk hozzá a megfelelő elérési utat a Path Environment Variables-hez.

Ellenőrizzük a consoleban a “java –version” paranccsal, hogy sikerült-e a Java telepítése. Ha kiírja a telepített verziót, akkor sikerrel jártunk.

Most telepítsük az Android Studiot. Ha a telepítés befejeződött, nyissuk meg az SDK Managert és telepítsük a megfelelő Build Tools és SDK platformot. Jelenleg Build Tools 23, Android API 23 és Android Wear 23.

Ha ezzel megvagyunk, hozzunk létre egy új projektet. Válasszuk ki a telefon és okosóra modulokat:

Kezelőfelület

Ahhoz, hogy a drone-t telefonnal, illetve órával irányíthassuk, szükségünk lesz egy kezelőfelületre, ahol gombokat és debug információkat jeleníthetünk meg.

A drón haladását az eszközök Gyroscope-jával fogjuk irányítani, tehát amerre döntjük, arra fog a drone repülni.

A fel és leszálláshoz, illetve a kényszerlászálláshoz fogunk készíteni egy-egy gombot.

Ehhez nyissuk meg a main.xml file-t a resources-ban és adjunk hozzá 3 <Button/> tag-et. Az idjük legyen btn_up, btn_down és btn_emergency.

Majd hasonló módon hozzunk létre 3 szövegmezőt <TextView/> a szenzoradatok megjelenítéséhez.

Telefon -drone kommunikáció

Mivel a drónon gyárilag csak RC vezérlés van, ezért szükségünk lesz egy RC-Bluetooth hídra vagyis külső elektronikára, ami fogadja a vezérlő Bluetooth jelünket és továbbítja a drón által értelmezett rádiójellel.

Ehhez egy már korábban megismert Arduino Uno mikrokontrollert fogunk használni, de más hasonló is kivállóan működik. A mi drónunkhoz egy NRF24L01 rádió modult kell használnni. Ezeket az alábbi kapcsolási rajz szerint kell bekötni:

UniConTX

Az arduinora fel kell tölteni ezt a kódot, ami kezeli a Bluetooth kommunikációt: https://github.com/PingguSoft/UniConTX

A híd működésének helyességéről könnyen meggyőződhetünk ennek az alkalmazásnak segítségével:

https://play.google.com/store/apps/details?id=com.pinggusoft.btcon
UniConTX_SW_EN.png

Óra-Telefon kommunikáció

Most, hogy a telefonról tudjuk irányítani a drónt már csak az okosóra és a telefon közötti kommunikációt kell biztosítanunk.

Az Android Wear a következő kommunikációs modellt alkalmazza:

Google Play Services-en keresztül kommunikál az órával, ahol mindig van egy lefoglalt tárhely, amit periodikusan szinkronizál az eszközök között. Mi ide fogjuk küldeni a szenzor adatainkat.

Mi sok adatot küldünk és nem szeretnénk késleltetést, viszont nem kritikus, ha egy-egy csomag kimarad.
Ezért a MessageApi-t fogjuk használni.

Mobil oldal:

Regisztáljuk az appunkat a Google Play Services-ben és adjuk hozzá a class-t listenerként, hogy meghívódjon az onMessageReceive
függvény meghívódjon, amikor adat érkezik az óráról:

mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addApi(Wearable.API)
    .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
        @Override
        public void onConnected(Bundle bundle) {
             Wearable.MessageApi.addListener(mGoogleApiClient, SpheroWearTiltActivity.this);
        }
        @Override
        public void onConnectionSuspended(int i) {
        }
    })
    .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
        @Override
        public void onConnectionFailed(ConnectionResult connectionResult) {}
    })
    .build();

Ebben a függvényben be kell olvasni a fogadott üzenetet és kiküldeni a bluetooth hídra az adatokat:

@Override
public void onMessageReceived(MessageEvent messageEvent) {
 if (messageEvent.getPath().equals(ORIENTATION_MESSAGE_PATH)) {
 messageEvent.getData() // adat kiolvasása
 }
}

Okosóra oldal:

A következőket írjuk a wear modulba.

Hasonlóan a mobil oldalhoz, itt is inicializálnunk kell a Google APIt, amihez implementálni kell a GoogleApiClient.ConnectionCallbacks és GoogleApiClient.OnConnectionFailedListener interface-eket.


mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
         @Override
         public void onConnected(Bundle connectionHint) {
             Log.d(TAG, "onConnected: " + connectionHint);
              // Now you can use the Data Layer API
             }

         @Override
         public void onConnectionSuspended(int cause) {
              Log.d(TAG, "onConnectionSuspended: " + cause);
         }
     })
      .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
          @Override
          public void onConnectionFailed(ConnectionResult result) {
             Log.d(TAG, "onConnectionFailed: " + result);
          }
     })
      // Request access only to the Wearable API
      .addApi(Wearable.API)//ifAvailable for comp
      .build();

A szenzoradatokra regisztálás után így tudunk üzenetet küldeni:

Wearable.MessageApi.sendMessage(mGoogleApiClient, transcriptionNodeId,
    ORIENTATION_MESSAGE_PATH, data).setResultCallback(
    new ResultCallback<MessageApi.SendMessageResult>() {
        @Override
        public void onResult(MessageApi.SendMessageResult sendMessageResult) {
            if (!sendMessageResult.getStatus().isSuccess()) {
                Log.w(TAG, "Failed to send message");
            }
        }
    }
);