DavidGong 发表于 2015-7-24 12:40:16

关于智能蓝牙小车程序控制的问题

我们的小车按照目前程序是输入一个指令,它会一直执行这个指令直到你输入下一个指令,比如按下前进键,小车会一直前进,直到断开电源或者输入另外一个键。求问怎样改程序会使小车当你按这个键的时候执行指令,不按这个键的时候就停止呢??

int INA = 3;//A,B for left motor
int INB = 4;
int INC = 5;//C,D for right motor
int IND = 6;

int ENA = 10;
int ENB = 11;
int ON=13;

void setup()
{
pinMode(INA,OUTPUT);
pinMode(INB,OUTPUT);
pinMode(INC,OUTPUT);
pinMode(IND,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
pinMode(ON,OUTPUT):
Serial.begin(9600);
}

void loop()
{
while(Serial.available())
   {
   char c=Serial.read();
      if(c=='f')
      {
          digitalWrite(INA,LOW); //left forward
          digitalWrite(INB,HIGH);
          analogWrite(ENA,120);

         digitalWrite(INC,LOW); //right forward
         digitalWrite(IND,HIGH);
         analogWrite(ENB,120);
      }
      else if(c=='b')
      {
          digitalWrite(INA,HIGH); //left backwark
          digitalWrite(INB,LOW);
          analogWrite(ENA,120);

         digitalWrite(INC,HIGH); //right backwark
         digitalWrite(IND,LOW);
         analogWrite(ENB,120);
      }
       else if(c=='r')
      {
          digitalWrite(INA,LOW); //left forward
          digitalWrite(INB,HIGH);
         analogWrite(ENA,110);
         digitalWrite(INC,LOW);
         digitalWrite(IND,HIGH);
         analogWrite(ENB,60);
      }
      else if(c=='l')
      {
          digitalWrite(INA,LOW); //left backward
          digitalWrite(INB,HIGH);
          analogWrite(ENA,60);
          digitalWrite(INC,LOW); //right forward
          digitalWrite(IND,HIGH);
          analogWrite(ENB,110);
      }
         else if(c=='s')
      {
          digitalWrite(INA,LOW); //left stop
          digitalWrite(INB,LOW);
          analogWrite(ENA,0);

         digitalWrite(INC,LOW); //right stop
         digitalWrite(IND,LOW);
         analogWrite(ENB,0);
      }
      else if(c=='n')
      {
          digitalWrite(ON,HIGH):
      }
   }
}

血阳 发表于 2015-7-24 16:23:12

本帖最后由 血阳 于 2015-7-24 16:49 编辑

我这里有一个方法,比较笨,但是能在一定程度上满足你的需求;
你要解决的问题有两个:
1、如何让信号持续输出,因为你长按,那么就需要信号持续输出,接收端才知道你一直长按着,这个一些软件就有这方面的功能,可以解决。
2、要解决发送端信号持续输出时候,两个信号之间的间隔时间。这样你编写程序时候才好判断。
我这里写了个小小的测试程序,实验了一下,能满足你的需求,不过有一个缺点:
缺点:在你停止按键后,还会有1s左右的延迟才能停下来。
原因你话,你看看代码就知道了:
注:你这里可以通过1、3来微调延迟时间,通过4,6来粗调延迟时间。延迟时间目的,是契合上面所说的第2点,让你这次轮子转动的时间持续到下次接收到信号,这样就能保持持续转动。

#define IN1 8 
#define IN2 9

void forward( );
void _stop();


void setup()
{
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  Serial.begin(9600);
}

char comtemp;
int t=0;


void loop()
{
  if(Serial.available()>0)
  {
    if(t<0) t=0;
    comtemp=Serial.read();
    switch(comtemp)
    {
      case '1':t=t-3;break;
      case '3':t=t+3;break;
      case '4':t-=50;break;
      case '6':t+=50;break;
      case '2':
      {
        forward( );
        delay(t);
        break;
      }
    } 
  }
  else _stop();

}

/**************************************************
forward子函数——前进子函数
函数功能:控制履带车前进
**************************************************/
void forward( )
{
          digitalWrite(IN1,HIGH);      
          digitalWrite(IN2,LOW);         //左轮前进
}


/**************************************************
stop子函数—停止子函数
函数功能:控制履带车停止
入口参数:无
**************************************************/
void _stop()
{
          digitalWrite(IN1,LOW);      
          digitalWrite(IN2,LOW);         //左轮静止不动
}


血阳 发表于 2015-7-24 16:29:37

上面就是我的一个比较笨的办法。如果还有哪个大神大腿知道更好的办法,希望能说说,学的不精,同样期待!

血阳 发表于 2015-7-24 17:04:34

上面的方法,如果能找到一个连续输出间隔比较小的发送器,那效果就比较好了。
页: [1]
查看完整版本: 关于智能蓝牙小车程序控制的问题