[教學文] 從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,謝謝。

 

相關文章

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *