- UID
- 373967
- 帖子
- 8850
- 主題
- 2609
- 精華
- 0
- 積分
- 999
- 楓幣
- 1
- 威望
- 976
- 存款
- 34705
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 50
- 在線時間
- 454 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-18
|
所需零件:
Arduino UNO開發板
5V直流電源
16x2液晶顯示屏
蜂鳴器
L293D馬達驅動模組
直流電機
紅色、藍色、綠色LED
電位器
電阻器
杜邦線
連接腳位:
Arduino UNO的5V引腳連接到L293D馬達驅動模組的5V腳。
Arduino UNO的GND引腳連接到L293D馬達驅動模組的GND腳。
Arduino UNO的9號引腳連接到L293D馬達驅動模組的ENA腳。
Arduino UNO的10號引腳連接到L293D馬達驅動模組的IN1腳。
Arduino UNO的11號引腳連接到L293D馬達驅動模組的IN2腳。
Arduino UNO的A0引腳連接到電位器。
Arduino UNO的2號引腳連接到蜂鳴器。
Arduino UNO的3號引腳連接到紅色LED。
Arduino UNO的4號引腳連接到藍色LED。
Arduino UNO的5號引腳連接到綠色LED。
程式碼:
arduino
#include <LiquidCrystal.h>
#define KP 2
#define KI 5
#define KD 1
#define setpoint 500
#define motorPin1 10
#define motorPin2 11
#define enaPin 9
#define buzzerPin 2
#define redPin 3
#define bluePin 4
#define greenPin 5
int sensorPin = A0;
float error = 0;
float previous_error = 0;
float integral = 0;
float derivative = 0
float output = 0;
LiquidCrystal lcd(7, 6, 13, 12, 8, 9);
void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(enaPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(greenPin, OUTPUT);
analogWrite(enaPin, 255);
lcd.begin(16, 2);
lcd.print("PID Controller");
delay(1000);
}
void loop() {
int sensorValue = analogRead(sensorPin);
error = setpoint - sensorValue;
integral = integral + error;
derivative = error - previous_error;
output = (KP * error) + (KI * integral) + (KD * derivative);
previous_error = error;
if(output > 0) {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
}
else {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
}
analogWrite(enaPin, abs(output));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Setpoint: ");
lcd.print(setpoint);
lcd.setCursor(0, 1);
lcd.print("Sensor: ");
lcd.print(sensorValue);
if(error < 0) {
digitalWrite(redPin, HIGH);
digitalWrite(bluePin, LOW);
}
else {
digitalWrite(redPin, LOW);
digitalWrite(bluePin, HIGH);
}
if(abs(error) < 10) {
digitalWrite(greenPin, HIGH);
tone(buzzerPin, 1000, 500);
}
else {
digitalWrite(greenPin, LOW);
noTone(buzzerPin);
}
delay(50);
}
以上程式碼的作用如下:
1. 宣告所需使用的變數和常數。
2. 設定Arduino UNO的輸出引腳和L293D馬達驅動模組的控制引腳。
3. 初始化LCD顯示屏。
4. 在`loop()`函數中,讀取感測器的數值,計算誤差、積分和微分,根據PID控制器的計算結果調整電機的輸出。
5. 更新LCD顯示屏的內容。
6. 根據誤差的正負和大小,控制紅色、藍色和綠色LED的亮滅。
7. 根據誤差的大小,控制蜂鳴器的鳴叫。
您可以根據您的需求調整PID控制器的參數,例如`KP`、`KI`和`KD`的值,以獲得更好的控制效果。 |
|