【教學】從Zero到Hero,給想實做動力小車的你——軟體篇

作者/攝影 動力大腳車製作者、資料、圖影片提供:游允赫

文字整理: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
圖1

 

先讓我們打開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;
圖2

 

現在來到主程式部分,首先是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

圖3 在手機的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;
    }


}
圖4

 

程式完成後,最後一步就是把程式燒錄至LinkIt 7697上。

 

軟體部分簡單介紹至此,若讀者有不了解的地方,

歡迎詢問允赫老師,E-mail:yhyu@cavedu.com,謝謝。

 

相關文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *