# 課程內容 **開燈** ```c= void setup() { pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); } void loop() { digitalWrite(13,HIGH); digitalWrite(12,HIGH); delay(200); digitalWrite(13,LOW); digitalWrite(12,LOW); delay(200); digitalWrite(12,HIGH); digitalWrite(11,HIGH); delay(200); digitalWrite(12,LOW); digitalWrite(11,LOW); delay(200); digitalWrite(11,HIGH); digitalWrite(13,HIGH); delay(200); digitalWrite(11,LOW); digitalWrite(13,LOW); delay(200); } ``` **超音波** ```c= int trigPin = 10; //Trig Pin int echoPin = 9; //Echo Pin long duration, cm, inches; void setup() { Serial.begin (9600); // Serial Port begin pinMode(trigPin, OUTPUT); // 定義輸入及輸出 pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); // 給 Trig 高電位,持續 10微秒 delayMicroseconds(10); digitalWrite(trigPin, LOW); pinMode(echoPin, INPUT); // 讀取 echo 的電位 duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間 cm = (duration/2) / 29.1; // 將時間換算成距離 cm 或 inch inches = (duration/2) / 74; Serial.print("Distance : "); Serial.print(inches); Serial.print("in, "); Serial.print(cm); Serial.print("cm"); Serial.println(); delay(250); } ``` **超音波感測燈** ```c= int trigPin = 10; // 超音波感接 Arduino pin 11 int echoPin = 9; //超音波感測器 Echo 腳接 Arduino pin 12 int speakerpin = 7; //蜂鳴器 + 腳接 Arduino pin 7 long duration, cm ; //宣告計算距離時,需要用到的兩個實數 void setup() { Serial.begin (9600); //設定序列埠監控視窗 (Serial Monitor) 和 Arduino資料傳輸速率為 9600 bps (Bits Per Second) pinMode(trigPin, OUTPUT); //Arduino 對外啟動距離感測器Trig腳,射出超音波 pinMode(echoPin, INPUT); //超音波被障礙物反射後,Arduino讀取感測器Echo腳的時間差 pinMode(speakerpin, OUTPUT); //Arduino對蜂鳴器送出電壓,使其鳴叫 pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); } void loop() { //程式計算出距離值 cm digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); pinMode(echoPin, INPUT); duration = pulseIn(echoPin, HIGH); cm = (duration/2) / 29.1; Serial.print(cm); //印出距離值 cm 在序列埠監控顯示器 單位公分 Serial.println(" cm"); if (cm <= 10) { //距離小於5公分,蜂鳴器一直叫 digitalWrite(13, HIGH); delay (cm*25); digitalWrite(13, LOW); delay (cm*25); } if (cm > 20 && cm <= 50) { //距離介於5到15公分,蜂鳴器斷斷續續叫,每次0.1秒 digitalWrite(12, HIGH); delay (cm*50); digitalWrite(12, LOW); delay (cm*50); } if (cm > 50){ // 距離大於15公分,蜂鳴器斷斷續續叫,每次0.5秒 digitalWrite(11, HIGH); delay (cm*100); digitalWrite(11, LOW); delay (cm*100); } delay(10); } ``` # 專題製作 **避障自走車** ```c= #include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> float turn = 0; float Distance = 0; float Distance_left = 0; float Distance_right = 0; float getDistance(int trig,int echo){ pinMode(trig,OUTPUT); digitalWrite(trig,LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig,LOW); pinMode(echo, INPUT); return pulseIn(echo,HIGH,30000)/58.0; } void go(){ analogWrite(5,0); analogWrite(6,200); analogWrite(9,200); analogWrite(10,0); } void left(){ analogWrite(5,0); analogWrite(6,200); analogWrite(9,0); analogWrite(10,200); } void right(){ analogWrite(5,200); analogWrite(6,0); analogWrite(9,200); analogWrite(10,0); } void a(){ analogWrite(5,0); analogWrite(6,0); analogWrite(9,0); analogWrite(10,0); } void _delay(float seconds) { long endTime = millis() + seconds * 1000; while(millis() < endTime) _loop(); } void setup() { pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); while(1) { Distance = getDistance(3,2); Distance_left = getDistance(13,12); Distance_right = getDistance(11,8); if(Distance > 15){ go(); }else{ if(Distance_left > 15){ left(); }else{ if(Distance_right > 15){ right(); }else{ a(); } } } _loop(); } } void _loop() { } void loop() { _loop(); } ``` ```= #include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> float turn = 0; float Distance = 0; float Distance_left = 0; float Distance_right = 0; float getDistance(int trig,int echo){ pinMode(trig,OUTPUT); digitalWrite(trig,LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig,LOW); pinMode(echo, INPUT); return pulseIn(echo,HIGH,30000)/58.0; } void go(){ analogWrite(5,200); analogWrite(6,0); analogWrite(9,0); analogWrite(10,200); } void left(int a){ analogWrite(5,0); analogWrite(6,a); analogWrite(9,0); analogWrite(10,a); } void right(int a){ analogWrite(5,a); analogWrite(6,0); analogWrite(9,a); analogWrite(10,0); } void a(){ analogWrite(5,0); analogWrite(6,100); analogWrite(9,100); analogWrite(10,0); } void _delay(float seconds) { long endTime = millis() + seconds * 1000; while(millis() < endTime) _loop(); } void setup() { pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); while(1) { Distance = getDistance(3,2); Distance_left = getDistance(13,12); Distance_right = getDistance(11,8); if(Distance > 15){ go(); if(Distance_left>Distance_right){ left(25); }else{right(25); } }else{ if(Distance_left > 15){ left(200); }else{ if(Distance_right > 15){ right(200); }else{ a(); } } } _loop(); } } void _loop() { } void loop() { _loop(); } ``` ```c= #include <AFMotor.h> #include <MsTimer2.h> AF_DCMotor motor1(1); AF_DCMotor motor2(2); AF_DCMotor motor3(3); AF_DCMotor motor4(4); // PID参数 (PID Parameters) double Setpoint = 0.0; // 目标距离(根据传感器单位调整) (Target distance - adjust based on sensor unit) double Kp = 1.5; // 比例增益 (Proportional gain) double Ki = 0.0; // 积分增益 (Integral gain) double Kd = 5; // 微分增益 (Derivative gain) double Input, Output, previousError, integral; //Ultrasonic sensor pins const int frontTrigPin = A4; const int frontEchoPin = A5; const int leftTrigPin = A0; const int leftEchoPin = A1; const int rightTrigPin = A2; const int rightEchoPin = A3; //Other variables double leftDistance, rightDistance, frontDistance; double getDistance(int trigPin, int echoPin) { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); double distance = pulseIn(echoPin, HIGH) / 58.0; // Convert to centimeters //Limit the distance to a maximum of 100 centimeters /*if (distance > 100.0) { distance = 100.0; }*/ return distance; } double forward(){ //Calculate PID control input using distances from left and right ultrasonic sensors Input = leftDistance - rightDistance; //Manual PID control calculation double error = Setpoint - Input; //Error integral += error; //Accumulated error double derivative = error - previousError; //Rate of change of error Output = Kp * error + Ki * integral + Kd * derivative; previousError = error; //Save current error for the next iteration if (Output > 255.0) { Output = 255.0; } //Adjust motor speed based on PID output int leftMotorSpeed = 255 - Output; int rightMotorSpeed = 255 + Output; //Control motors using the AFMotor library motor2.setSpeed(leftMotorSpeed); motor2.run(FORWARD); motor1.setSpeed(rightMotorSpeed); motor1.run(FORWARD); motor3.setSpeed(leftMotorSpeed); motor3.run(FORWARD); motor4.setSpeed(rightMotorSpeed); motor4.run(FORWARD); } void setup() { //Initialize ultrasonic sensor pins pinMode(frontTrigPin, OUTPUT); pinMode(frontEchoPin, INPUT); pinMode(leftTrigPin, OUTPUT); pinMode(leftEchoPin, INPUT); pinMode(rightTrigPin, OUTPUT); pinMode(rightEchoPin, INPUT); //Initialize serial communication Serial.begin(9600); } int k=6; void loop() { //Read left and right ultrasonic sensor distances leftDistance = getDistance(leftTrigPin, leftEchoPin); rightDistance = getDistance(rightTrigPin, rightEchoPin); frontDistance = getDistance(frontTrigPin, frontEchoPin); if(k<=3){k++;if(rightDistance>leftDistance){ motor1.run(BACKWARD); motor1.setSpeed(255); motor4.run(BACKWARD); motor4.setSpeed(255); motor2.run(FORWARD); motor2.setSpeed(255); motor3.run(FORWARD); motor3.setSpeed(255); } else{ motor2.run(BACKWARD); motor2.setSpeed(255); motor3.run(BACKWARD); motor3.setSpeed(255); motor1.run(FORWARD); motor1.setSpeed(255); motor4.run(FORWARD); motor4.setSpeed(255); }}else{ if(frontDistance>20){ forward(); } else if(frontDistance<30){k=0; if(rightDistance>leftDistance){ motor1.run(BACKWARD); motor1.setSpeed(255); motor4.run(BACKWARD); motor4.setSpeed(255); motor2.run(FORWARD); motor2.setSpeed(255); motor3.run(FORWARD); motor3.setSpeed(255); } else{ motor2.run(BACKWARD); motor2.setSpeed(255); motor3.run(BACKWARD); motor3.setSpeed(255); motor1.run(FORWARD); motor1.setSpeed(255); motor4.run(FORWARD); motor4.setSpeed(255); } } //Output debug information Serial.print("前方距离:"); // Left Distance Serial.print(frontDistance); Serial.print("左方距离:"); // Left Distance Serial.print(leftDistance); Serial.print("右方距离:"); // Right Distance Serial.print(rightDistance); Serial.print(" Intput:"); // Input Serial.print(Input); Serial.print(" Output:"); // Output Serial.println(Output); }} ``` ```c= #include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> float turn = 0; float Distance = 0; float Distance_left = 0; float Distance_right = 0; float getDistance(int trig,int echo){ pinMode(trig,OUTPUT); digitalWrite(trig,LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig,LOW); pinMode(echo, INPUT); return pulseIn(echo,HIGH,30000)/58.0; } void go(){ analogWrite(5,200); analogWrite(6,0); analogWrite(9,0); analogWrite(10,200); } void left(int a){ analogWrite(5,0); analogWrite(6,a); analogWrite(9,0); analogWrite(10,a); } void right(int a){ analogWrite(5,a); analogWrite(6,0); analogWrite(9,a); analogWrite(10,0); } void a(){ analogWrite(5,0); analogWrite(6,200); analogWrite(9,200); analogWrite(10,0); } void right1(int k){ while(k>=0){ right(200);k--; } } void left1(int k){ while(k>=0){ left(200);k--; } } void _delay(float seconds) { long endTime = millis() + seconds * 1000; while(millis() < endTime) _loop(); } void setup() { pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); while(1) { Distance = getDistance(3,2); Distance_left = getDistance(13,12); Distance_right = getDistance(11,8); if(Distance > 15){ int k=(Distance_left- Distance_right)*10; if(Distance_left>Distance_right){ analogWrite(5,210); analogWrite(6,k); analogWrite(9,0); analogWrite(10,210+k); }else{analogWrite(5,210-k); analogWrite(6,0); analogWrite(9,-k); analogWrite(10,210); } }else{ if(Distance_left <15 && Distance_right <15){ a(); }else{ if(Distance_right > Distance_left){ right1(5); }else{ left1(7); } } } _loop(); } } void _loop() { } void loop() { _loop(); } ``` **循跡自走車** # 遇到問題與解決方法 1. 腳位不能接1和0,因為接收外部訊息用 # 參考內容