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);
}
}