关于智能蓝牙小车程序控制的问题
我们的小车按照目前程序是输入一个指令,它会一直执行这个指令直到你输入下一个指令,比如按下前进键,小车会一直前进,直到断开电源或者输入另外一个键。求问怎样改程序会使小车当你按这个键的时候执行指令,不按这个键的时候就停止呢??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: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); //左轮静止不动
}
上面就是我的一个比较笨的办法。如果还有哪个大神大腿知道更好的办法,希望能说说,学的不精,同样期待! 上面的方法,如果能找到一个连续输出间隔比较小的发送器,那效果就比较好了。
页:
[1]