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 遙控器開源那個起,一切都只有想不到就沒有做不到的! 各位飛客如果有想到什麼新鮮的創意也歡迎在下方留言分享,或是把你們最後的 創意成果拍成影片分享給我們,讓我們一起激盪出更多靈感,並讓更多人成為飛客的一員。


2017年9月17日 星期日

『職人教學』飛龍在天 Sensor (聲音、servo、紅外線、雷射) 介紹 part2




              
        在上篇文章中我們介紹了包含超音波、光強度、溫室度等三種擴充感測元件,但咱們的飛龍在天可不只有這三種元件可以擴充,另外還有聲音感測、伺服馬達還有背後的紅外線及雷射,就讓小編繼續來為各位飛客一一介紹!


<聲音感測>



         聲音感測器就類似一個電子式的耳朵,使用高靈敏度的電容式麥克風收音,產生不同的電壓訊號,一般用來檢測周遭的聲音強度。


       而輸出有兩種,第一種是可以隨著麥克風的電壓訊號實時輸出類比數字大小的類比輸出,另一種是當電壓高於某個閥值時切換高低電位的數位訊號輸出,當偵測到有音源輸出低電位開啟led燈提示,沒有感測到音源則輸出高電位關閉電源。




Arduino程式碼:

#define led  A0
#define voice  A1
int v=0;
void setup(){
 Serial.begin(115200);
 pinMode(led,OUTPUT);
 pinMode(voice,INPUT);
}
void loop(){
digitalWrite(led,);
  v=analogRead(voice);
  Serial.println(v);
  if(v>=250){
  digitalWrite(led,LOW);
  delay(2000);
  }
}




Servo

              Servo中文叫做伺服馬達,做為一個常常使用於模型飛機的馬達所以也常被稱作RC伺服機(RC servo),伺服馬達裡是由直流馬達、齒輪箱、轉軸以及控制電路組成的模組,我們可以通過arduino輸入PWM訊號到Servo中來操控轉軸的角度。


                我們可以看到伺服馬達拉出棕紅橘三條杜邦線分別是代表接地(-)、電源(+)以及橘色的訊號線,在飛龍在天底部預留出伺服馬達的位置上,按照順序連接到GND1SA2(左翼)orA3(右翼)腳位上即可使用。

Arduino程式碼:

#include <Servo.h>

Servo myservo; 

int pos = 0;  

void setup()
{
  myservo.attach(A2);
}

void loop()
{
  for(pos = 0; pos <= 180; pos += 1)
  {                                 
    myservo.write(pos);            
    delay(15);                    
  }
  for(pos = 180; pos>=0; pos-=1)     
  {                               
    myservo.write(pos);              
    delay(15);                      
  }
}



<紅外線感測>


                 紅外線模組具有一對紅外線發射與接收管,發射管發射出一定頻率的紅外線,當檢測方向遇到障礙物(反射面)時,紅外線反射回來被接收管接收,經過比較器電路處理之後,綠色指示燈會亮起,同時信號輸出接口輸出數字信號(一個低電平信號)。紅外線模組對於環境光線適應能力很強,不需要擔心會因為環境光的強弱受到干涉,並且可使用螺絲起子旋轉藍色電位器旋節檢測距離,有效距離範圍230cm順時針旋轉感色距離加長反之則會縮短,實際測量距離與紅外線接觸到物體的大小、形狀有關係,測量黑色和較小物體時感測距離會比較近,而白色以及較大的物體可以感測的距離則會加長。


Arduino程式碼:
const int buttonPin = A2;   
const int ledPin =  2;    
int buttonState =0;   

void setup() {

  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(ledPin, HIGH);
  Serial.begin(115200);
}

void loop() {

  buttonState = digitalRead(buttonPin);
  Serial.print(buttonState);
  if (buttonState == HIGH) {
  digitalWrite(ledPin,HIGH);
  Serial.print("0");
  }
  else {
    digitalWrite(ledPin, LOW);  
    Serial.print("1");
  }
  Serial.print("\n");
  delay(100);
}




<雷射發射器>

               
                最後我們要來介紹的就是無人機感測擴充包裡的最後一件,紅光雷射激光模組,在學校教學或是簡報的時候常常會需要用到雷射筆來標示PPT或是簡報內容的人,對於雷射一定不會很陌生,沒錯!只要把這個紅外線模組擴充到飛龍在天上面,就可以讓它也擁有發射機光的能力囉~


Arduino程式碼:

void setup()
{
pinMode(A2,OUTPUT);    
}
void loop()
{
digitalWrite(A2,HIGH);     
delay(1000);                     
digitalWrite(A2,LOW);   
delay(1000);                    
}


       看完這麼多擴充元件的介紹,是不是也想要讓你的飛龍在天升級一下呢?如果對我們的產品有興趣的話,歡迎到Arklab的露天賣場參觀購買~~ 






2017年9月11日 星期一

『職人教學』飛龍在天 Sensor (超音波、光強度、溫溼度) 介紹 part1



                各位在購買完飛龍在天1.0之後有沒有發現,他除了正面能插上飛行底板外,背後還留有許多接孔呢?


                今天就來告訴大家飛龍在天1.0除了能飛在空中之外,還有什麼新鮮的玩法~




<超音波避障>

                超音波感測器是由超音波發射器、接收器和控制電路所組成。當它被觸發的時候,會發射一連串 40 kHz的聲波並且從離它最近的物體接收回音。人類的耳朵只能接收20~20K赫茲的頻率,所以在發射超音波的時候我們是聽不到的。

                超音波感測的原理是利用超音波發射器(Transmitter)發射音波之後,碰到物體返回使接收器(Receiver)收到回音之間的時間差來計算與物體之間的距離。聲音的速度約為340M/s
1000000/340*100=29.4

              由上面的計算我們可以知道聲音傳播1公分所需要的時間為29.4 毫秒
所以我們在真正計算距離時使用公式distance = (duty/2)/29.4來得到我們需要感測的距離。


arduino程式碼:

int trig = A0;
int echo = A1;
int ini_time =1000;
long current_time =0;
float duty,distance;

void setup(){

 Serial.begin(115200);
 pinMode(trig,OUTPUT);
 pinMode(echo,INPUT);

}

void loop(){

  digitalWrite(trig,HIGH);
  delayMicroseconds(ini_time);
  digitalWrite(trig,LOW);
  duty = pulseIn(echo,HIGH);
  distance = (duty/2)/29.4;
  delay(ini_time);
  Serial.print("data:");
  current_time = millis();
  Serial.print("NO. ");
  Serial.print (current_time/1000);
  Serial.print(", d = ");
  Serial.print(distance);
  Serial.println(" cm");

}

實際結果:



<光強度感測>


               光強度感測主要是通過光敏電阻來感測光源的刺激,當有光線照射時,電阻內原本處於穩定狀態的電子受到激發,成為自由電子。所以光線越強,產生的自由電子也就越多,電阻就會越小。

暗電阻:當電阻在完全沒有光線照射的狀態下(室溫),稱這時的電阻值為暗電阻(當電阻值穩定不變時,例如1kM歐姆),與暗電阻相對應的電流為暗電流
亮電阻:當電阻在充足光線照射的狀態下(室溫),稱這時的電阻值為亮電阻(當電阻值穩定不變時,例如1歐姆),與亮電阻相對應的電流為亮電流。

光電流 = 亮電流 - 暗電流

                當光敏電阻感受到強光時電阻下降,我們設計當電阻讀取的值小於500時將LED關閉,反之當讀取的值大於500代表沒有光源,將LED燈打開。


Arduino程式碼:

#define lightsensor  A1
#define led  A0
float light;

void setup() {
  Serial.begin(115200);
  pinMode(lightsensor, INPUT); //data pin for ambientlight sensor
  pinMode(led, OUTPUT);
}

void loop() {
  light = analogRead(lightsensor); 
  if (light < 500) {
    digitalWrite(led, LOW);
  }
  if(light>500) {
  digitalWrite(led,HIGH);
  }
 
  Serial.println(light);
delay(100);
}


<溫溼度感測>


         DHT-11 是一個結合濕度計和測溫元件的複合式感測器,並與一個高性能8位元單晶片相連接,將所量測到的溫、濕度資料拆解成為數位訊號,再由 data pin腳將資料送出。使用上很簡單,但是抓取資料時必須要特別注意時間的掌控,而且每筆資料的抓取時間間隔要1~2秒鐘,不能做太快速的取樣。

其規格如下:
1、濕度測量範圍:20~90%RH
2、濕度測量精度:±5%RH
3、溫度測量範圍:0~50℃
4、溫度測量精度:±2℃
5
、電源供應範圍: 3~5V
6
、頻率不可超過:0.5Hz (2秒一次)


              在編輯arduino 程式碼之前我們需要從Github先下載DHTlibrary,在下載完之後就可以來編寫DHT11的程式碼了喔~


Arduno程式碼:

#include "DHT.h"
#define DHTPIN A0  
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);
char o='127';
void setup() {
  Serial.begin(115200);
  Serial.println("DHT11 test!");
  dht.begin();
}
void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT !");
    return;
  }
  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" C \t");
  Serial.print(f);
  Serial.print(" F \t\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" C \t");
  Serial.print(hif);
  Serial.println(" F");
}


實際測試:


       這次介紹的都是最基礎的應用,希望起到Arklab拋磚引玉的效果,吸引更過人加入創客的行列。真正的實用科技不在於技術的高深複雜,而是在於誰更符合生活、更有創意,這才是我們的創客精神。下篇文章會繼續介紹剩下的感測器,如果對我們的產品有興趣的話,歡迎到Arklab的露天賣場參觀購買~~