作者/攝影 |
動力大腳車製作者、資料、圖影片提供:游允赫文字整理:CAVEDU 宗諭 |
文章分類 | 教學文 |
時間 | |
成本 | |
難度 | |
材料表 |
接著上一篇「從Zero到Hero,給想實做動力小車的你——硬體篇」,這次我們將繼續介紹,完成動力大腳車硬體設施後,軟體層面該如何部署。
首先介紹所需要的配備:
-
開發板:LinkIt 7697 + RobotShield
-
顏色感測器:TCS3200
設定方式:
Frequency Scaling 20% (S0-H,S1-L)
Photodiode Type Clean (S2-H,S3-L)
-
手機遙控app:LinkIt Remote
-
程式編輯器:Arduino IDE
先讓我們打開Arduino IDE,然後寫好將顯示在LinkIt Remote上的各項物件,等之後LinkIt Remot與7697透過藍牙連接時,LinkIt Remote將自動抓取這些物件。如下:
//設定爬坡按鈕
LRemoteButton buttonClimb;
//設定折返按鈕
LRemoteButton buttonGoAndBack;
//設定計時器
LRemoteSlider Timer;
//設定顏色極限值
LRemoteSlider Limit;
//上方標籤
LRemoteLabel BigFoot;
//設定狀態欄
LRemoteLabel LabelS;
//設定顏色感應器偵測值欄
LRemoteLabel LabelLight;
接下來,讓我們為著之後的主程式宣告一些變數,如下:
//馬達分別接於13、17
int M1A = 17;
int M1B = 13;
//宣告變數T(時間-0.1秒為單位)
int T;
//宣告變數F(顏色感應器讀數)
int F;
//宣告變數S(車輛狀態)
int S = 0;
//宣告變數L(顏色極限值)
int L;
//宣告變數button=6(7697內建USR按鈕)
int button = 6;
現在來到主程式部分,首先是setup函式,如下:
void setup() {
Serial.begin(9600);
Serial.println(“Start configuring remote”);
pinMode (13, OUTPUT);
pinMode (17, OUTPUT);
pinMode ( 2, INPUT);
pinMode ( 4, INPUT);
pinMode ( 6, OUTPUT);
digitalWrite (13, 1);
digitalWrite (17, 1);
//這部分是LinkIt Remote介面上各項物件的進一步設定
//藍牙名稱,介面分割
LRemote.setName (“BigFoot”);
LRemote.setOrientation (RC_PORTRAIT);
LRemote.setGrid (3, 5);
//上方標籤
BigFoot.setText (“!大腳車!”);
BigFoot.setPos (0,0);
BigFoot.setSize (3,1);
BigFoot.setColor (RC_GREY);
LRemote.addControl (BigFoot);
//爬坡按鈕
buttonClimb.setText (“爬坡!”);
buttonClimb.setPos (0, 2);
buttonClimb.setSize (1, 1);
buttonClimb.setColor (RC_BLUE);
LRemote.addControl (buttonClimb);
//折返按鈕
buttonGoAndBack.setText (“折返!”);
buttonGoAndBack.setPos (2, 2);
buttonGoAndBack.setSize (1, 1);
buttonGoAndBack.setColor (RC_BLUE);
LRemote.addControl (buttonGoAndBack);
//時間設定滑桿
Timer.setText (“Timer=( 10 ~ 150 )”);
Timer.setPos (0,1);
Timer.setSize (3,1);
Timer.setColor (RC_ORANGE);
Timer.setValueRange (10,150,10);
LRemote.addControl (Timer);
//光感極限值設定滑桿
Limit.setText (“LIMIT”);
Limit.setPos (0,3);
Limit.setSize (3,1);
Limit.setColor (RC_GREEN);
Limit.setValueRange (100,360,225);
LRemote.addControl (Limit);
//光感值顯示標籤
LabelLight.setText (String(F));
LabelLight.setPos (0, 4);
LabelLight.setSize (2, 1);
LabelLight.setColor (RC_PINK);
LRemote.addControl (LabelLight);
//狀態顯示標籤
LabelS.setText (String(S));
LabelS.setPos (2, 4);
LabelS.setSize (1, 1);
LabelS.setColor (RC_GREY);
LRemote.addControl (LabelS);
LRemote.begin();
Serial.println(“begin() returned”);
}
關於LinkIt Remote如何設定,讀者們可以進一步參考這篇文章:使用LinkIt Remote
再來是loop函式的部分,如下:
void loop() {
if(!LRemote.connected()) {
Serial.println(“waiting for connection”);
delay(1000);
} else {
delay(15);
}
LRemote.process();
//獲取極限值設定
L = Limit.getValue();
//獲取時間值設定
T = Timer.getValue();
//獲取顏色感測器讀取值,感測器訊號接於4號腳位上
F = pulseIn(4,LOW);
//顯示讀取值於光感值標籤
LabelLight.updateText(String(F));
//當爬坡按鈕按下,狀態值設定為5,狀態欄顯示為”已選爬坡”
switch (buttonClimb.getValue()){
case 1:
S = 5;
LabelS.updateText(“已選爬坡”);
break;
case 0:
break;
}
//當爬坡按鈕按下,狀態值設定為1,狀態欄顯示為”已選折返”
switch (buttonGoAndBack.getValue()){
case 1:
S = 1;
LabelS.updateText(“已選折返”);
break;
case 0:
break;
}
//若狀態值為1(已選折返)且7697 USR按鈕被按下
//狀態列顯示為”下坡”,馬達反轉,持續秒數依滑感設定
//持續時間設定值過後,狀態值切換至2
if (digitalRead(button) == 1 && S ==1 ){
LabelS.updateText(“下坡”);
digitalWrite(M1A,0);
digitalWrite(M1B,1);
delay(T*100);
S = 2;
}
//若狀態為2且顏色感應器偵測值小於極限值(判定為尚未過黑線)
//馬達持續反轉,狀態欄顯示為”偵測中”
else if(S == 2 && F < L){
digitalWrite(M1A,0);
digitalWrite(M1B,1);
LabelS.updateText(“偵測中”);
}
//若狀態為2且顏色感應器偵測值大於極限值(判定為過黑線)
//狀態值切換至3,狀態欄顯示為”已偵測”
else if(S == 2 && F > L){
S = 3;
LabelS.updateText(“已偵測”);
}
//若狀態為3,則狀態欄顯示為”上坡”,馬達正轉
//持續時間為設定值+2秒(上坡所需時間較長),時間到達後狀態值切換至4
else if(S==3){
LabelS.updateText(“上坡”);
digitalWrite(M1A, 1);
digitalWrite(M1B, 0);
delay(T*100+2000);
S = 4;
}
//若狀態為4且顏色感應器偵測值小於極限值(判定為尚未過黑線)
//馬達持續正轉,狀態欄顯示為”偵測中”
else if(S == 4 && F < L){
digitalWrite(M1A,1);
digitalWrite(M1B,0);
LabelS.updateText(“偵測中”);
}
//若狀態為4且顏色感應器偵測值大於極限值(判定為過黑線)
//狀態欄顯示為”已偵測”,馬達持續正轉一秒
//一秒後狀態值切換至0,狀態欄顯示為”停止”
else if(S == 4 && F > L){
LabelS.updateText(“已偵測”);
digitalWrite(M1A,1);
digitalWrite(M1B,0);
delay(1000);
digitalWrite(M1A,1);
digitalWrite(M1B,1);
S = 0;
LabelS.updateText(“停止”);
}
//若狀態值為5(已選爬坡)且7697 USR按鈕被按下
//狀態值切換至3
else if(S ==5 && digitalRead(button) == 1){
S = 3;
}
}
程式完成後,最後一步就是把程式燒錄至LinkIt 7697上。
軟體部分簡單介紹至此,若讀者有不了解的地方,歡迎詢問允赫老師,E-mail:yhyu@cavedu.com,謝謝。