兩軸橡皮筋砲台

橡皮筋槍.pptx

#include<Servo.h>

#include<Wire.h>

#include<LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3f,16,2);

Servo servo1,servo2,servo3;

////////////////////////////////////////////////////////////////////////////////////////////////////

int angle_lunch=180; //設定觸發時servo的角度

int angle_ready=120; //設定預備時servo的角度

/////////////////////////////////////////////////////////////////////////////////////////////////////

int rl0=90 , ud0=90 ;

int rl1,ud1,x,y;

long x_avg,x_set;

long y_avg,y_set;

unsigned long t1,t2;

void lcd_disp(){

t2=millis();

if(t2>t1+50){

lcd.clear();

lcd.setCursor(0,0);

lcd.print(rl1);

lcd.print("(");

if(x>=0){

lcd.print("+");

}

lcd.print(x);

lcd.print(")");

lcd.setCursor(8,0);

lcd.print(ud1);

lcd.print("(");

if(y>=0){

lcd.print("+");

}

lcd.print(y);

lcd.print(")");

t1=t2;

}

}

void setup(){

Serial.begin(9600);

servo1.attach(8);

servo2.attach(9);

servo3.attach(10);

pinMode(16, INPUT_PULLUP);

lcd.init();

lcd.backlight();

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Servo in D8");

lcd.setCursor(0,1);

lcd.print("Don't move control");

delay(1000);

for(int i=0 ; i<50 ; i++){ //這一段程式碼是對香菇頭的讀數做歸零調整,取平均

x_set += analogRead(A0);

y_set += analogRead(A1);

}

x_set=x_set/50;

y_set=y_set/50;

t1=millis();

}

void loop() {

for(int i=0 ; i<50 ; i++){ //這一段程式碼是對香菇頭的讀數變化取平均,作濾波,可以濾掉不穩定的變動值

x_avg += analogRead(A0);

y_avg += analogRead(A1);

}

x_avg=x_avg/50;

y_avg=y_avg/50;

x =(x_set-x_avg)/100;

y =(y_set-y_avg)/100;

rl1=rl0+x;

if(rl1>180)

{

rl1=180;

}

if(rl1<0)

{

rl1=0;

}

servo1.write(180-rl1);

rl0=rl1;

ud1=ud0+y;

if(ud1>180)

{

ud1=180;

}

if(ud1<0)

{

ud1=0;

}

servo2.write(180-ud1);

ud0=ud1;

if(digitalRead(16)==0)

{

servo3.write(angle_lunch);

lcd.setCursor(0,1);

lcd.print("Lunch!!");

delay(200);

servo3.write(angle_ready);

lcd.setCursor(0,1);

lcd.print("ready...");

delay(300);

}

else

{

servo3.write(angle_ready);

lcd.setCursor(0,1);

lcd.print("ready...");

}

lcd_disp();

delay(5);

}