14.Servo測試器

[版本一]利用序列埠視窗輸入角度

#include <Servo.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);   // 若LCD 無法啟用,請將0X3F 改為0X27

Servo servo;

int x,y,x1,x2;

void setup(){

Serial.begin(9600);

Serial.setTimeout(10); // 設定為每10毫秒結束一次讀取(數字愈小愈快)

servo.attach(8);

  lcd.init();                     

  lcd.backlight(); 

  lcd.clear();

 lcd.setCursor(0,0);

 lcd.print("Servo in D8");

  lcd.setCursor(0,1);

 lcd.print("Wait command...");

  

}

void loop(){

while(Serial.available()){

  x = Serial.parseInt();

  y = Serial.parseInt();

  if(x2!=x){

    x2 = x ;

  }

}

if(x2!=x1){

 Serial.print(x);

 Serial.print(" , ");

 Serial.println(y);

 lcd.setCursor(0,0);

 lcd.print("Angle = ");

 lcd.print(x);

 lcd.print("   ");

 lcd.setCursor(0,1);

 if(y==0){

 lcd.print("ok");

  lcd.print("              ");

 }

 servo.write(x);

}

 x1 = x2 ;

}

[版本二]利用可變電阻(A0腳位)調整角度(一個servo)

#include <Servo.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);   // 若LCD 無法啟用,請將0X3F 改為0X27

Servo servo;

int x,y,x1,x2,cmd;

void setup(){

Serial.begin(9600);

Serial.setTimeout(10); // 設定為每10毫秒結束一次讀取(數字愈小愈快)

servo.attach(8);

  lcd.init();                     

  lcd.backlight(); 

  lcd.clear();

 lcd.setCursor(0,0);

 lcd.print("Servo in D8");

  lcd.setCursor(0,1);

 lcd.print("Wait command...");

  

}

void loop(){

  x = int(map(analogRead(A0),0,1022,0,181));

  if(x2!=x){

    x2 = x ;

  }

if(x2!=x1){

 Serial.println(x);

 lcd.setCursor(0,0);

 lcd.print("Angle = ");

 lcd.print(x2);

 lcd.print("   ");

 servo.write(x2);

}

 x1 = x2 ;

}

[版本三]利用可變電阻(A0腳位)調整角度(二個servo)

#include <Servo.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);   // 若LCD 無法啟用,請將0X3F 改為0X27

Servo servo1,servo2;

int x,y,x1,x2,cmd,y1,y2;

void setup(){

Serial.begin(9600);

Serial.setTimeout(10); // 設定為每10毫秒結束一次讀取(數字愈小愈快)

servo1.attach(9);

servo2.attach(8);

  lcd.init();                     

  lcd.backlight(); 

  lcd.clear();

 lcd.setCursor(0,0);

 lcd.print("Servo in D8");

  lcd.setCursor(0,1);

 lcd.print("Wait command...");

  

}

void loop(){

  x = int(map(analogRead(A0),0,1022,0,181));

  if(x2!=x){

    x2 = x ;

  }

  if(x2!=x1){

 Serial.println(x);

 lcd.setCursor(0,0);

 lcd.print("Angle = ");

 lcd.print(x2);

 lcd.print("   ");

 servo1.write(x2);

}

 x1 = x2 ;

    y = int(map(analogRead(A1),0,1022,0,181));

  if(y2!=y){

    y2 = y ;

  }

if(y2!=y1){

 Serial.println(y);

 lcd.setCursor(0,1);

 lcd.print("Angle = ");

 lcd.print(y2);

 lcd.print("   ");

 servo2.write(y2);

}

 y1 = y2 ;

}

[版本四]利用序列埠(A0腳位)調整角度(四個servo)

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);   // 若LCD 無法啟用,請將0X3F 改為0X27

#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);

#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)

#define SERVOMAX  540 // this is the 'maximum' pulse length count (out of 4096)

int y,num,angle;

void servoA_write(int d){ 

int x = map(d,0,180,SERVOMIN,SERVOMAX);

  pwm.setPWM(8, 0, x); 

}

void servoB_write(int d){ 

int x = map(d,0,180,SERVOMIN,SERVOMAX);

  pwm.setPWM(9, 0, x); 

}

void servoC_write(int d){ 

int x = map(d,0,180,SERVOMIN,SERVOMAX);

  pwm.setPWM(10, 0, x); 

}

void servoD_write(int d){ 

int x = map(d,0,180,SERVOMIN,SERVOMAX);

  pwm.setPWM(11, 0, x); 

}

void setup(){

Serial.begin(9600);

Serial.setTimeout(10); // 設定為每10毫秒結束一次讀取(數字愈小愈快)

  lcd.init();                     

  lcd.backlight(); 

  lcd.clear();

 lcd.setCursor(0,0);

 lcd.print("Servo in D8");

  lcd.setCursor(0,1);

 lcd.print("Wait command...");

pwm.begin();  

pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

yield();

  

}

void loop(){

if(Serial.available()){

  y = Serial.parseInt();

  }

num = y/1000;

angle=y%1000;

if(num==1){

servoA_write(angle);

}

if(num==2){

servoB_write(angle);

}

if(num==3){

servoC_write(angle);

}

if(num==4){

servoD_write(angle);

}

if(num!=0){

 lcd.setCursor(0,0);

 lcd.print("Angle = ");

 lcd.print(angle);

 lcd.print("   ");

 lcd.setCursor(0,1);

}

 }