別的男人是一生要擁有哈雷機車,
資訊宅宅是一生要自己做出自己的遙控車!
讓我們看下去,如何用Windows Phone實作出一台藍芽遙控車吧
最近都在寫軟體,想說偶爾搞搞電子電路平衡一下也不錯
想到前幾個禮拜看到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我都有寫上註解,若有不懂的地方在與我討論吧!
以上~~
祝大家玩得愉快 :)