极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12304|回复: 2

比较复杂的代码,硬件不能按预想的运动

[复制链接]
发表于 2015-9-10 16:03:38 | 显示全部楼层 |阅读模式
     我想自制个小东西,包括舵机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;
   }
}


   但是编译是正确的,可结果没有按照预想的动作运动

希望大哥大姐些帮我看看,问题出在哪儿,谢谢了!
回复

使用道具 举报

发表于 2015-9-10 17:10:18 | 显示全部楼层
if(val_1<204,val_2>204);是啥?应该写
if(val_1<204 && val_2>204){
}
吧后面不要有分号

另外判断按钮是否按下用digitalRead不是更简单?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-11 13:51:14 | 显示全部楼层
第一次自己写代码嘛,有些还不是很熟,谢谢,我在改改!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 07:02 , Processed in 0.039622 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表