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:
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
Ó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"); } } } );