[Windows Phone 8 | Arduino]_當WP8遇上Arduino-藍芽小車製作

別的男人是一生要擁有哈雷機車,
資訊宅宅是一生要自己做出自己的遙控車!

讓我們看下去,如何用Windows Phone實作出一台藍芽遙控車吧

WP_20131122_20_28_36_Pro

最近都在寫軟體,想說偶爾搞搞電子電路平衡一下也不錯

 

想到前幾個禮拜看到DEMO大大的SLIDE,後面提到一張Windows Phone+Arduino的slide

 

突然想到我去年在Android平台有簡單寫出藍芽小車的程式

而且網友詢問的還真不少…

▼Android版本參照:http://thkaw.pixnet.net/blog/post/85537018

P1000148

 

其實那時候就想寫WP版的,但礙於WP7似乎無法有比較自由限度的藍芽控制權限而作罷

而現在WP8有找到NOKIA方面簡單的連線文章:

http://developer.nokia.com/Community/Wiki/Windows_Phone_8_communicating_with_Arduino_using_Bluetooth

 

裏頭的範例簡單用藍芽做連線,在做相對應簡單的燈號控制

 

而我就基於這篇文章用到的連線CLASS,

並且在上頭移植之前Android版本的部分程式碼以及Arduino方面的程式來做成Windows Phone版的遙控車。

 

 

 

Wp8_arduino_seq_diagram

本次程式因為是基於Marcos Fabio Pereira這位開發者寫的架構來做衍伸

 

所以我轉貼在上面連結文內的圖片,主要就是很正規的訊息傳遞架構,連結後回報,傳送指令後再回報接收狀況(如上圖所示)

 

其實Windows Phone版本的程式相較Android來說我覺得簡單好用許多(或許是我也對wp dev熟悉吧...)

 

 

我簡單提一下我改寫WINDOWS PHONE程式的主要邏輯區塊:

1. async void connectionManager_MessageReceived(string message)

 

這個副程式主要是ConnectionManager物件要接收來自Arduino的回覆訊息,對應Arduino的Code是void sendMessage(char* message)

但我改寫之後,wp的MessageReceived副程式是不會有任何接收判斷的動作,因為我不需要知道這個指令究竟目前的執行狀態為何

 

2. private async void AppToDevice()

我加入了disconnect的操作邏輯,但這部分請不要頻繁亂點,因為會導致系統IO反應不過來CRASH...(就...交給各位修好他這個不完美的地方吧XD)

 

3.對應按鈕動作,這就沒啥了不起的了~

 

 

▼至於前端XAML整個是改很多,也加入了GRID等LAYOUT方式,確保在不同裝置下畫面是一致不變形或跑框的~

wp_ss_20131122_0003

 


比較主要要細講的是Arduino的部分,

如果你是插馬達版,I/O接腳要注意一下有沒有跟我現在Arduino的程式邏輯衝突到

CODE中的

 

const int TX_BT = 6;
const int RX_BT = 7;

代表藍芽模組的TX插到DIGITAL PORT第6PIN

RX插到DIGITAL PORT地7PIN

 

因為這次是用SoftwareSerial的方式去與藍芽模組溝通,跟以往直接插到板子上面的TX RX不太一樣,

你也可以依照你的需求去調整成別的DIGITAL PORT,只要不要與馬達板的訊號接腳衝突到即可

 

void processCommand(char* command)副程式裡面就是要來處理來自WINDOWS PHONE訊號指令的相對應程式邏輯判斷

其實在WINDOWS PHONE跟ARDUINO接收跟傳送都是透過字串的形式來往,所以你可以用字串的方式去判斷或解析指令的內容

再去對應相關的動作,這部分你可以依照自己的需求再去自訂化

 

   1: //Process the incoming command from Windows Phone.
   2: void processCommand(char* command) {
   3:   Serial.print("RecvCommand:");
   4:   Serial.println(command);
   5:   String sCmd = command;
   6:   if(strcmp(command,"Forward") == 0) {
   7:     ForwardDrive();
   8:     sendMessage("Forward");
   9:   } 
  10:   else if(strcmp(command,"Back") == 0) {
  11:     BackDrive();
  12:     sendMessage("Back");
  13:   } 
  14:   else if(strcmp(command,"Left") == 0) {
  15:     LeftDrive();
  16:     sendMessage("Left");
  17:   } 
  18:   else if(strcmp(command,"Right") == 0) {
  19:     RightDrive();
  20:     sendMessage("Right");
  21:   } 
  22:   else if(strcmp(command,"Stop") == 0) {
  23:     StopDrive();
  24:     sendMessage("Stop");
  25:   } 
  26:   else if(sCmd.indexOf("PowerVal") >= 0) {
  27:  
  28:     int spliterPosition;
  29:  
  30:     spliterPosition = sCmd.indexOf(';');
  31:     Power_Val = sCmd.substring(spliterPosition+1, sCmd.length()).toInt();
  32:     Serial.print("Power_Val:");
  33:     Serial.println(Power_Val);
  34:     sendMessage(command);    
  35:   }
  36: }

 

那最下方的馬達部分,MOTODRIVE(char motor,int speed,int dir)

使用方法也很簡單,首先第一個傳值是看你要左馬達還右馬達,接著接速度,再來接方向

這部分可能要自行調整,因為有可能你的板子方向是跟我相反的,再自行調整int dir的傳值

 

Power_Val是掌握全部馬達的速度~~~

   1:  
   2: void ForwardDrive()
   3: {
   4:   MOTODRIVE('R',(Power_Val),1);
   5:   MOTODRIVE('L',(Power_Val),1);
   6: }
   7:  
   8: void BackDrive()
   9: {
  10:   MOTODRIVE('R',(Power_Val),0);
  11:   MOTODRIVE('L',(Power_Val),0);
  12: }
  13:  
  14: void LeftDrive()//新版左轉
  15: {
  16:   MOTODRIVE('R',0,0);
  17:   MOTODRIVE('L',0,0);
  18:   delay(50);
  19:   MOTODRIVE('L',(Power_Val),1);
  20: }
  21:  
  22: void RightDrive()//新版右轉
  23: {
  24:   MOTODRIVE('R',0,0);
  25:   MOTODRIVE('L',0,0);
  26:   delay(50);
  27:   MOTODRIVE('R',(Power_Val),1);
  28: }

 

另外我拔除了原本SAMPLE CODE有的週期回報,如果你要在ARDUINO上面加個溫溼度感測啦,人體感測啦等等的模組

你可以取消在Loop()末端算時間呼叫的註解

並且把想要週期性執行的Code塞到sendPeriodicMessages()

 


 

硬體接線部分每個人的馬達板可能不太一樣,所以變化就比較大了,

這次主要還是用跟去年做ANDROID版本一樣的模組L298N

那馬達部分都是直流馬達,所以沒有什麼正負極之分

A或B隨便你接,反正動作怪怪的再去ARDUINO的CODE做修正

▼(再偷一張之前的圖騙吃騙喝XD)

P1000161

 

 

以下是這次的demo影片,基本上跟android完全一樣~只是車台換了一個

還有因為鋰電池模組不在身邊的關係,只好接USB供電!

 

 

Code我放在Github上頭了:https://github.com/thkaw/NTL_WP8_BT_CAR

arduino的程式也放在裏頭的Arduino資料夾中~請自行燒錄到板子上頭

 

 

也希望未來微軟可以再繼續開放更多底層的東西給大家玩玩…

 

大多數的CODE我都有寫上註解,若有不懂的地方在與我討論吧!

以上~~

 

祝大家玩得愉快 :)

 

Technorati 的標籤: ,