ROSA 的基本系統底層已經可以精準計時運作,現在再加入 mBot 自走車驅動,並配合前文紅外線遙控,就可以前進後退左右轉。
// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)
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 程式,是為了減小程式碼佔用空間。
加入 normal pin control 程式,是為了減小程式碼佔用空間。
這裡的網路教學文是一段一段解說,如果你要完整功能,需要把前文找出來拼起來,其實使用開源碼就需習慣這樣學習,不會有完整的 solution,每個人因應自己的需要,把別人的程式碼拼湊出自己要的東西。
沒有留言:
張貼留言