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

WP_20131122_20_28_36_Pro

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

 

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

 

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

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

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

 

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

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

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

 

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

 

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

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

 

 

 

本次程式因為是基於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方式,確保在不同裝置下畫面是一致不變形或跑框的~

 


比較主要要細講的是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)

 

 

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

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

 

 

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

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

 

 

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

 

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

以上~~

 

祝大家玩得愉快 🙂

 

Technorati 的標籤: ,

Leave a comment 取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

Exit mobile version