极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10310|回复: 3

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

[复制链接]
发表于 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)
  {
&#160;&#160;&#160;&#160;if(t<0) t=0;
&#160;&#160;&#160;&#160;comtemp=Serial.read();
&#160;&#160;&#160;&#160;switch(comtemp)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;case '1':t=t-3;break;
&#160;&#160;&#160;&#160;&#160;&#160;case '3':t=t+3;break;
&#160;&#160;&#160;&#160;&#160;&#160;case '4':t-=50;break;
&#160;&#160;&#160;&#160;&#160;&#160;case '6':t+=50;break;
&#160;&#160;&#160;&#160;&#160;&#160;case '2':
&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;forward(&#160;);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;delay(t);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;}&#160;
&#160;&#160;}
&#160;&#160;else _stop();

}

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


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

使用道具 举报

发表于 2015-7-24 16:29:37 | 显示全部楼层
上面就是我的一个比较笨的办法。如果还有哪个大神大腿知道更好的办法,希望能说说,学的不精,同样期待!
回复 支持 反对

使用道具 举报

发表于 2015-7-24 17:04:34 | 显示全部楼层
上面的方法,如果能找到一个连续输出间隔比较小的发送器,那效果就比较好了。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-5 00:08 , Processed in 0.040553 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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