|
|
我想自制个小东西,包括舵机3.9.10 ,按钮1,2,3 ,LED灯8。
运动是这样的:
当1,2,3按钮没有被按下时舵机3就做往返运动,LED灯8 不亮。
当1被按下,动作1。
当2被按下,1没有被按下,动作2
当2被按下,1被按下,动作1
当3被按下,1,2没有按下,动作3
当3被按下,1按下,2没按下,动作1
当3被按下,1没有按下,2按下。动作2
当1,2,3都被按下,动作2
动作1 :LED灯8亮,舵机10到0度,舵机9到180度。
动作2 :LED灯8亮,舵机10到90度,舵机9到180度。
动作3 :LED灯8亮,舵机10到180度,舵机9到180度。
代码是这样的:#include <Servo.h> //引入lib
int ledpin=8;//定义数字8接口(声音接口)
Servo myservo1; // 创建一个伺服电机对象9(张嘴动作)
Servo myservo2; // 创建一个伺服电机对象10(摆头动作)
int myangle;//定义角度变量
int pulsewidth;//定义脉宽变量
int val;//定义变量val
Servo sv5; // 建立Servo物件,控制伺服馬達
const int sv5Pin = 3; // sv5 接 Pin 3
const int every555 = 15;//控制速度,数值越大舵机越慢
unsigned long last555 = 0;
int dir5 = 1;
int dir9 = -1;
int pos555 = 90;
int pos999 = 90;
void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
myservo1.attach(9); // 9号引脚输出电机控制信号
myservo2.attach(10); // 10号引脚输出电机控制信号
sv5.attach(sv5Pin); // pin3, 故意名稱叫 sv5
Serial.begin(9600);
sv5.write(pos555);
Serial.println("Test 2 Serbo");
}
void loop()
{
int val_1, val_2, val_3;
val_1=analogRead(1);//读取模拟7的电压值
val_2=analogRead(2);//读取模拟6的电压值
val_3=analogRead(3);//读取模拟5的电压值
if(val_1<204,val_2<204,val_3<204);
{
delay(10);
if(val_1<204,val_2<204,val_3<204);
{
check555( );
delay(568);
}
}
if(val_1>204); //按钮1被按下
{
delay(10);//由于有抖动,所以延时100ms再一次判断
if(val_1>204);
{
weizhi1(); //执行动作1
}
}
if(val_1<204,val_2>204);//按钮2被按下,1没有被按下
{
delay(10);//由于有抖动,所以延时100ms再一次判断
if(val_1<204,val_2>204);
{
weizhi2();//执行动作2
}
}
if(val_1>204,val_2>204);//按钮2被按下,1被按下,
{
delay(10);//由于有抖动,所以延时100ms再一次判断
if(val_1>204,val_2>204);
{
weizhi1();//执行动作1
}
}
if(val_1<204,val_2<204,val_3>204);//按钮3被按下,1,2没有被按下
{
delay(10);//由于有抖动,所以延时100ms再一次判断
if(val_1<204,val_2<204,val_3>204);
{
weizhi3();
}
}
if(val_1>204,val_2<204,val_3>204);//按钮3被按下,1被按下,2没按下
{
delay(10);//由于有抖动,所以延时100ms再一次判断
if(val_1>204,val_2<204,val_3>204);
{
weizhi1();
}
}
if(val_1<204,val_2<204,val_3>204);//按钮3被按下,1,2没有被按下
{
delay(10);//由于有抖动,所以延时100ms再一次判断
if(val_1<204,val_2<204,val_3>204);
{
weizhi3();
}
}
if(val_1>204,val_2>204,val_3>204);//按钮1,2,3被按下
{
delay(10);//由于有抖动,所以延时100ms再一次判断
if(val_1>204,val_2>204,val_3>204);
{
weizhi2();
}
}
}
void weizhi1() //位置1子程序
{
myservo1.write(180);
delay(100);
myservo2.write(0);
delay(10);
digitalWrite(ledpin,HIGH);//设置引脚8号为高电平
delay(400);
digitalWrite(ledpin,LOW);
delay(100);
myservo1.write(0);
delay(10);
}
void weizhi2() //位置2子程序
{
myservo1.write(180);
delay(10);
myservo2.write(90);
delay(10);
digitalWrite(ledpin,HIGH);//设置引脚8号为高电平
delay(400);
digitalWrite(ledpin,LOW);
delay(100);
myservo1.write(0);
delay(10);
}
void weizhi3() //位置3子程序
{
myservo1.write(180);
delay(10);
myservo2.write(180);
delay(10);
digitalWrite(ledpin,HIGH);//设置引脚8号为高电平
delay(400);
digitalWrite(ledpin,LOW);
delay(100);
myservo1.write(0);
delay(10);
}
void check555( ) //子程序3舵机来回运动
{
if(millis( ) - last555 < every555) return;
last555 = millis( );
pos555 += dir5;
sv5.write(pos555);
if(dir5 == 1){
if(pos555 >179) dir5 = -1;
}else{
if(pos555 < 1) dir5 = 1;
}
pos999 += dir9;
if(dir9 == 1){
if(pos999 >179) dir9 = -1;
}else{
if(pos999 < 1) dir9 = 1;
}
}
但是编译是正确的,可结果没有按照预想的动作运动
希望大哥大姐些帮我看看,问题出在哪儿,谢谢了! |
|