DIY Arduino追光器
1.Arduino UNO
2.舵機 x2
3.光敏電阻 x4
4.電阻 x4
IMG_20191220_191026.jpg (116.89 KB, 下載次數: 76)
下載附件
2019-12-20 19:44 上傳
IMG_20191220_191042.jpg (117.84 KB, 下載次數: 78)
下載附件
2019-12-20 19:44 上傳
代碼:
//追光系統
#include <Servo.h> //載入Servo庫
#define InA A0 //定義讀取a光敏電阻的模擬口
#define InB A1 //定義讀取b光敏電阻的模擬口
#define InC A2 //定義讀取c光敏電阻的模擬口
#define InD A3 //定義讀取d光敏電阻的模擬口
int valA,valB; //用于存儲兩個光敏電阻的數值
int valC,valD; //用于存儲兩個光敏電阻的數值
int angle1 = 90; //設置初始角度
int range1 = 100; //設置范圍
int angle2 = 45; //設置初始角度
int range2 = 100; //設置范圍
Servo myServo1;
Servo myServo2;
void setup() {
myServo1.attach(2); //定義舵機接口
myServo1.write(angle1); //初始化舵機角度為90度
myServo2.attach(3); //定義舵機接口
myServo2.write(angle2); //初始化舵機角度為90度
Serial.begin(9600); //設置串口波特率
}
void loop() {
valA = analogRead(InA); //讀取A光敏電阻數據
valB = analogRead(InB); //讀取B光敏電阻數據
valC = analogRead(InC); //讀取C光敏電阻數據
valD = analogRead(InD); //讀取D光敏電阻數據
//正極接光敏,越光數值越大 A大于B,A比B光 A-B為正數 舵機向A方向轉
if(valA-valB > range1){
angle1 = angle1 + 20; //角度+1
angle1 = constrain(angle1,0,180); //約束輸出
myServo1.write(angle1); //執行角度
}
//A小于B,B比A光 A-B為負數 舵機向B方向轉
else if(valA - valB < -range1){
angle1 = angle1 - 20;
angle1 = constrain(angle1,0,180);
myServo1.write(angle1);
}
//C大于B,C比D光C-D為正數 舵機向C方向轉
if(valC-valD > range2){
angle2 = angle2 + 20; //角度+1
angle2 = constrain(angle2,0,180); //約束輸出
myServo2.write(angle2); //執行角度
}
//C小于D,D比A光C-D為負數 舵機向D方向轉
else if(valC - valD < -range2){
angle2 = angle2 - 20;
angle2 = constrain(angle2,0,180);
myServo2.write(angle2);
}
//串口輸出數據,便于觀察工作原理
Serial.print("A=");
Serial.print(valA);
Serial.print("||B=");
Serial.println(valB);
Serial.print("Angle1=");
Serial.println(angle1);
Serial.print("C=");
Serial.print(valC);
Serial.print("||D=");
Serial.println(valD);
Serial.print("Angle2=");
Serial.println(angle2);
delay(500); //延時
}
視頻:
|