2015年9月19日 星期六

ROSA 系統開發 5 ─ mBot 自走車驅動

https://4rdp.blogspot.com/2015/09/rosa-5-mbot.html?m=0

ROSA 的基本系統底層已經可以精準計時運作,現在再加入 mBot 自走車驅動,並配合前文紅外線遙控,就可以前進後退左右轉。

// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)


// normal pin control
void D_OUT(byte p, byte v){
pinMode(p, OUTPUT);
digitalWrite(p, v);
}
void D_PWM(byte p, byte v){
pinMode(p, OUTPUT);
analogWrite(p, v);
}
byte D_IN(byte p){
pinMode(p, INPUT);
return digitalRead(p);
}
unsigned int A_IN(byte p){
pinMode(p, INPUT);
return analogRead(p);
}


// pin 4,5,6,7
enum {
  MOVE_STOP,
  MOVE_FORWARD,
  MOVE_LEFT,
  MOVE_RIGHT,
  MOVE_BACK
};
void MOTOR(byte dir, byte speed) {
  #if TARGET == mBot
    #define M1 6
    #define M2 5
    #define M1D 4
    #define M2D 7
  #elif TARGET == motoduino
    #define M1 5
    #define M2 6
    #define M1D 10
    #define M2D 11
  #else
    #define M1 6
    #define M2 5
    #define M1D 4
    #define M2D 7
  #endif
  switch (dir) {
    case MOVE_FORWARD:
      D_OUT(M1D, HIGH);
      D_OUT(M2D, LOW);
      D_PWM(M1, speed);
      D_PWM(M2, speed);
      break;
    case MOVE_BACK:
      D_OUT(M1D, LOW);
      D_OUT(M2D, HIGH);
      D_PWM(M1, speed);
      D_PWM(M2, speed);
      break;
    case MOVE_RIGHT:
      D_OUT(M1D, LOW);
      D_OUT(M2D, LOW);
      D_PWM(M1, speed);
      D_PWM(M2, 0);
      break;
    case MOVE_LEFT:
      D_OUT(M1D, HIGH);
      D_OUT(M2D, HIGH);
      D_PWM(M1, 0);
      D_PWM(M2, speed);
      break;
    default:
      D_PWM(M1, 0);
      D_PWM(M2, 0);
  }
}

採取 #if TARGET 定義式,可以方便替換不同硬體不同馬達位置,另外,或許有人會問,為什麼不把 pinMode 放在 setup() 函式中,這做法有好有壞,放在 setup() 只要執行一次宣告,之後就不必浪費時間於每次執行又在宣告一次,壞處為程式容易被限定某隻腳為某功能而不能變更,有時修改程式可能忘記配合更改,ROSA 為了獲取最大彈性,採取使用時再宣告,改程式時也比較不容易忘記。

加入 normal pin control 程式,是為了減小程式碼佔用空間。

這裡的網路教學文是一段一段解說,如果你要完整功能,需要把前文找出來拼起來,其實使用開源碼就需習慣這樣學習,不會有完整的 solution,每個人因應自己的需要,把別人的程式碼拼湊出自己要的東西。

沒有留言:

張貼留言