小組成員:
411114208 葉姿琳 411114209 張庭慈
作品介紹:
依據我們所學到的東西來製作一個實做的作品,我們根據上學期所做的作品進行進一步的進化與改良,我們閱讀其他人做的循跡車專題,循機車主要是利用紅外線感測器對地面的探測來決定行走的軌跡,可以應用在生活中很多地方,像是日常用品的搬運等,可以依據自己的需要來制定所需的軌跡,讓這款移動車可以依據自己的想法變化,在上學期的作品中他可以移動但會卡卡的,所以我們這學期希望改良他的移動,讓他更順暢另外我們也加裝蜂鳴器和LED燈在行動時會發出聲音,左轉跟右轉時會發出不同的光。
經過我們的嘗試發現這不是一個簡單的的事情,光是程式我們就進行多方的改良還有感測器的位置想盡量的增加靈敏度,雖然最後的結果不如預期的好,他還是沒辦法完全準確的依我們的道路行走,但比之前的走得更加順暢,也能依左右轉進行亮燈與蜂鳴器的執行。
程式碼:
void setup() {
// 把控制腳位定義輸出模式
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// 將感測器引腳定義為輸入模式
pinMode(SENSOR_LEFT, INPUT);
pinMode(SENSOR_RIGHT, INPUT);
// 將LED和蜂鳴器腳位為輸出模式
pinMode(LED_LEFT, OUTPUT);
pinMode(LED_RIGHT, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// 把所有設備初始成LOW狀態
digitalWrite(LED_LEFT, LOW);
digitalWrite(LED_RIGHT, LOW);
digitalWrite(BUZZER_PIN, LOW);
Serial.begin(9600); // 初始化
}
void loop() {
// 讀取感測器資料跟抗抖
int leftSensor = readSensorWithDebounce(SENSOR_LEFT);
int rightSensor = readSensorWithDebounce(SENSOR_RIGHT);
// 輸出感測器狀態
Serial.print("Left Sensor: ");
Serial.print(leftSensor);
Serial.print(" | Right Sensor: ");
Serial.println(rightSensor);
// 根據感測器狀態控制小车
if (leftSensor == SENSOR_ACTIVE && rightSensor == SENSOR_ACTIVE) {
Forward(); // 前進
updateIndicators(HIGH, HIGH, HIGH);
} else if (leftSensor == SENSOR_INACTIVE && rightSensor == SENSOR_ACTIVE) {
Left(); // 左轉
updateIndicators(HIGH, LOW, HIGH);
} else if (leftSensor == SENSOR_ACTIVE && rightSensor == SENSOR_INACTIVE) {
Right(); // 右轉
updateIndicators(LOW, HIGH, LOW);
} else {
Stop(); // 停止
updateIndicators(LOW, LOW, LOW);
}
delay(LOOP_DELAY);
}
// 讀取感測器狀態並抗抖
int readSensorWithDebounce(int pin) {
int state1 = digitalRead(pin);
delay(DEBOUNCE_DELAY);
int state2 = digitalRead(pin);
if (state1 == state2) {
return state1;
}
return SENSOR_INACTIVE;
}
// 更新LED和蜂鳴器狀態
void updateIndicators(int ledLeftState, int ledRightState, int buzzerState) {
digitalWrite(LED_LEFT, ledLeftState);
digitalWrite(LED_RIGHT, ledRightState);
digitalWrite(BUZZER_PIN, buzzerState);
}
// 前進
void Forward() {
digitalWrite(IN1, HIGH); // 左馬達正轉
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); // 右馬達正轉
digitalWrite(IN4, LOW);
}
// 停止
void Stop() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
// 左轉
void Left() {
digitalWrite(IN1, LOW); // 停止左邊馬達
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); // 右馬達正转
digitalWrite(IN4, LOW);
}
// 右轉
void Right() {
digitalWrite(IN1, HIGH); // 左馬達正转
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); // 停止右馬達
digitalWrite(IN4, LOW);
}
腳位:
// 定義控制腳位
#define IN1 10
#define IN2 11
#define IN3 6
#define IN4 5
// 定義感測器腳位
#define SENSOR_LEFT 7
#define SENSOR_RIGHT 8
// 定義LED和蜂鸣器腳位
#define LED_LEFT 9
#define LED_RIGHT 12
#define BUZZER_PIN 13
// 定義常數
#define SENSOR_ACTIVE LOW // 如果感測器測到黑線時输出LOW
#define SENSOR_INACTIVE HIGH
#define DEBOUNCE_DELAY 10 // 感測器抗抖動延遲
#define LOOP_DELAY 20 // 主循環延遲
心得:
411114208葉姿琳:
在這次的專題中,我們為循跡車加入了 LED 和蜂鳴器,進一步提升了提示功能。雖然循跡車的移動效果最終未達到預期的順暢,但透過實作的過程,我對 Arduino 的相關知識有了更深入的了解。在解決問題的過程中,也培養了邏輯思考能力。儘管遇到不少挑戰,我們仍然一步步克服困難,成功完成了成品。雖然結果未完全符合理想,但看到循跡車能夠運行時,仍然感到滿足與成就感。
411114209張庭慈:
透過這次的實作除了增加循跡車的轉彎靈敏度外也增加了發光的能力,我們發現他的靈敏度會受到線的均勻程度跟感測器的位置影響,使他走的路線不一定能按照我們的需求,在製作的過程雖然不容易會很想放棄,但看到他真實開始移動的時候就會很有成就感,雖然最後的結果沒有預期的這麼好,但可以讓他至少比以前更加的順就很有成就感了,在過程中也學到如何與夥伴互助跟解問題能力,也對寫程式碼有了更進一步的認識。