2017年9月22日 星期五

【ArkLab飛行學院】遙控器開源程式碼--應用分享


        還記得8/26是什麼大日子嗎? 沒錯,arklab飛行學院正式公開了遙控器的開源程式碼!各位資深的飛客及黑客們,是不是已經開始想要大改特改了呢! 究竟有了新的遙控器我們可以怎麼玩呢? 今天分享幾種簡單的應用,想試試的玩家們不妨跟著我們一起來玩看看吧!

注意:有一點比較特別的是奶油蒼蠅2.0、3.0以及飛龍在天,雖然都可以使用新的遙控器操控,但是在飛龍在天上增加了許多不同功能的配件,所以建議沒有購買擴充元件的玩家可以先從飛龍在天的設定上玩起。



1.piano

                一般的鋼琴或者是或者是在手機平板上的虛擬電子琴並不少見,但是在開放遙 控器的原始碼之後,不知道有沒有想過如果飛龍在天可以像鋼琴一樣彈奏是一 件多酷的事情。在原始媽中基本的藍芽連線都已經完整的設置好了,剩下我們 需要做的就是來整合一下,手機遙控器上以及飛龍在天表現的部分,小編在這 裡先提個概要,詳細到底要如何做請容許小編在這裡賣個關子~





        要完成 DF 鋼琴的關鍵就在於蜂鳴器身上,蜂鳴器是透過電磁鐵的原理引動內部 的振動薄片來產生聲音,只要設定好 arduino 上的高低電位的啟動週期,以 Do 為例,將代表蜂鳴器的 D4 高低電位各輸出 1953 微秒,就可以發出 Do 的音調 喔~





2. LED controller

        不知道各位有沒有注意過飛龍在天在藍芽開關旁邊有兩個頭燈呢,其實他就連接在arknano的D2 pin 腳上喔,在我們客製化自己的遙控器的同時,怎麼可以不讓它們亮一下呢?想想在夜晚黯淡無光的時候跟親朋好友一起玩飛龍在天,這時候掏出你的自製遙控器把機頭燈打開,絕對是蝦趴又酷炫,立馬成為全場焦點啦!

        我們在設置好arduino上面的LED開關之後,就可以在android的程式裡面加上這段程式碼,讓操作者按下按鈕的同時打開LED頭燈





private void turnOnLed()

{

    if (btSocket!=null)

    {

        try

        {

            btSocket.getOutputStream().write("1".getBytes());

        }

        catch (IOException e)

        {

            msg("Error");

        }

    }

}


        當然開了燈自然就少不了關燈的步驟,關閉LED燈的方法也跟上面大同小異,只需要把輸出的1改為0就可以關燈了喔~




private void turnOffLed()

{

    if (btSocket!=null)

    {

        try

        {

            btSocket.getOutputStream().write("0".getBytes());

        }

        catch (IOException e)

        {

            msg("Error");

        }

    }

}





上圖為模擬LED Controller功能介面



3.Messenger

        你有想像過有一天能跟自己心愛的無人機進行互動嗎? 又或者是透過無人機跟 他人建立一道溝通的橋樑呢? Messenger 顧名思義就是『送信人』的意思,如果 在軍事上那就是一位『通訊兵』的角色,Messenger 就是透過我們自己設計的 遙控器送信給飛龍在天,就可以用打字的方式來要控我們的無人機做一些簡單 的操作,這次小編以訊息傳送 01 的方式開關機頭燈示意,各位高玩們想要用訊 息控制它們的升降也是完全沒問題~

  






4. Motor

        自製遙控器 APP 怎麼能少了最基本也最重要的馬達控制,在電路上從左前方的 槳開始順時針依序對應到的腳位是 3695,只要在對應的腳位上給予響應 的 PWM 訊號,就可以簡易的操控馬達了。在實際飛行前,也可以先用遙控器 測試馬達是不是可以正常運轉,就不用將馬達線拔除來測試囉~

首先將 arduino 部分設定完成

const byte MOTOR_PIN = 9; String inputString = "";
int strength; void setup() {
Serial.begin(115200); pinMode(MOTOR_PIN, OUTPUT);
digitalWrite(MOTOR_PIN, LOW); strength = 0;
Serial.println("set up done!");
}
void loop() { while(Serial.available() > 0){
int intChar = Serial.read(); if(isDigit(intChar)){
inputString += (char) intChar;
}
if(intChar == '\n'){
strength = inputString.toInt(); Serial.println(strength); inputString = "";
}
}
analogWrite(MOTOR_PIN, strength);

}


        再來完成 android 執行的部分,以操作上比較直覺的 Bar 來操作馬達 PWM 輸出 (如果要用別種方式也可以)

bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { value.setText(seekBar.getProgress() + "/" + seekBar.getMax()); mConnectedThread.write(String.valueOf(seekBar.getProgress()  + "\n"));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) { mConnectedThread.write(String.valueOf(seekBar.getProgress())  + "\n");
}
});
value.setText(bar.getProgress() + "/" + bar.getMax()); new ConnectBT().execute();
mHandler = new Handler(){
public void handleMessage(android.os.Message msg){ if(msg.what == MESSAGE_READ){
String readMessage = null; try {
readMessage = new String((byte[]) msg.obj, "UTF-8");
} catch (UnsupportedEncodingException e) { e.printStackTrace();
}
}
}
};


  



        以上就是四種比較直接的應用方式,試想有一天你控制無人機不再需要冷冰冰 的搖桿,而是只需要在手機平板上打幾個字或是對著手機說句話就能輕鬆的操 控它,這分分鐘閃瞎旁人雙眼的操作,想著想著心裡那叫一個美~ 或許,那個有一天並沒有想像中那麼遙遠,在 arklab 遙控器開源那個起,一切都只有想不到就沒有做不到的! 各位飛客如果有想到什麼新鮮的創意也歡迎在下方留言分享,或是把你們最後的 創意成果拍成影片分享給我們,讓我們一起激盪出更多靈感,並讓更多人成為飛客的一員。


2 則留言: