在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Windows系统编程 → arduino 舵机控制 串口通信 超声波传感器

arduino 舵机控制 串口通信 超声波传感器

Windows系统编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:2.29KB
  • 下载次数:38
  • 浏览次数:1007
  • 发布时间:2018-11-13
  • 实例类别:Windows系统编程
  • 发 布 人:张君宝
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 串口 UI 声波 通信 d

实例介绍

【实例简介】
【实例截图】

【核心代码】

u8 buf[10]={217,217,00,01,02,03,07,02,231,231};//落下应答
u8 buf1[10]={217,217,00,01,02,03,07,17,231,231};//抬起应答
int C_C[3];
unsigned char C_[26];
int servopin = 8;//设置舵机驱动脚到数字口8
int servopin1 = 9;
int servopin2 = 10;
int myangle;    //定义角度变量
int myangle1;  //定义角度变量
int myangle2;   //定义角度变量
int pulsewidth;//定义脉宽变量
int pulsewidth1;//定义脉宽变量
int pulsewidth2;//定义脉宽变量
unsigned int S; //距离存储
int trig=3;     //发射信号
int echo=2;    //接收信号
int val;
int val1;
int val2;
int j=0;
//要想使得舵机比较连续的旋转,可以改变方波占空比
void servopulse(int servopin,int myangle)/*定义一个控制一号舵机的脉冲函数,用来模拟方式产生PWM值*/
{
  pulsewidth=(myangle*11) 500;//将角度转化为500-2480 的脉宽值
  digitalWrite(servopin,HIGH);//将舵机接口电平置高
  delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
  digitalWrite(servopin,LOW);//将舵机接口电平置低
  delay(20-pulsewidth/1000);//延时周期内剩余时间,20可以改成4
}

void servopulse1(int servopin1,int myangle1)/*定义一个控制2号舵机脉冲函数,用来模拟方式产生PWM值*/
{
  pulsewidth1=(myangle1*11) 500;//将角度转化为500-2480 的脉宽值
  digitalWrite(servopin1,HIGH);//将舵机接口电平置高
  delayMicroseconds(pulsewidth1);//延时脉宽值的微秒数
  digitalWrite(servopin1,LOW);//将舵机接口电平置低
  delay(10);//延时周期内剩余时间
}
  
void servopulse2(int servopin2,int myangle2)/*定义一个控制3号舵机的脉冲函数,用来模拟方式产生PWM值*/
{
  pulsewidth2=(myangle2*11) 500;//将角度转化为500-2480 的脉宽值
  digitalWrite(servopin2,HIGH);//将舵机接口电平置高
  delayMicroseconds(pulsewidth2);//延时脉宽值的微秒数
  digitalWrite(servopin2,LOW);//将舵机接口电平置低
  delay(20-pulsewidth2/1000);//延时周期内剩余时间
}

void setup()
{
  pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
  pinMode(servopin1,OUTPUT);
  pinMode(servopin2,OUTPUT);
  pinMode(trig,OUTPUT); //设置引脚模式
  pinMode(echo,INPUT);
  Serial.begin(9600);//设置波特率为9600

  while(Serial.read()>= 0)
  {}
}
void loop()
{   
  servopulse(servopin,val);
  servopulse(servopin1,val1);
  if (Serial.available() > 0)
  {  
      delay(10); // 等待数据传完  
      int numdata = Serial.available(); 
       for(int i=0;i<numdata;i  )
      {
            C_[i]=Serial.read();
      } 
      //for(int i=0;i<numdata;i  )
      //Serial.println(C_[i]);
     if(C_[0]==217&C_[8]==231)
    {
      if(C_[1]==217&C_[9]==231)
      {
           j = 1;     //变量用于发送应答的开关条件
          for(int i=0;i<3;i  )
            {
               C_C[i]=C_[2 4*i]*256*256*256 C_[3 4*i]*256*256 C_[4 4*i]*256 C_[5 4*i];
            }
            C_[0]==0;   //帧头帧尾必须清零
            C_[1]==0; 
            C_[8]==0;
            C_[9]==0;          
      }
      else
      {
            for(int i=0;i<numdata;i  )
            {
              C_[i]=0;
            }
      }
  }
  /*  else
    {
     for(int i=0;i<numdata;i  )
    {
      C_[i]=0;
    }}*/
   for(int i=0;i<numdata;i  )
    Serial.println(C_[i]);//打印数据
    
    Serial.println(numdata);
    while(Serial.read()>=0)
    {}    //清空串口缓存 
     
}                
  
  if(C_[7]==17)//落下
   {
    
    //Serial.println(C_[7]);
   fun1();
   if(j == 1)
   {
    j = 0;
    Serial.write(buf, 10);    
   }
}
 C_[12] =="";
 //while(Serial.read()>=0){} //清空串口缓存  
  range(); //执行测距函数 
  if(S>23){ 
  fun3();//空函数不写也中
  range(); //执行测距函数 
}  
  if(S<=23&&S>22){ 
  fun4();//控制一号舵机旋转
  range(); //执行测距函数   
}
  if(S<=22)
  { 
  fun3();//空函数不写也中
  range(); //执行测距函数
  }
  if(val1==50)
  { 
    for(int i=0;i<10;i  )
    {
      C_[i]=0;
    }}
      if(val==0&val1==0)
  {
    for(int i=0;i<10;i  )
    {
      C_[i]=0;
    }}
    
  if(C_[7]==1)//抬起
   {
   // Serial.println(C_[7]);
    fun2();
    if(j ==1)
   {
    j = 0;
    Serial.write(buf1, 10);    
   }
 }
  C_[12] =="";
   if(C_[7] ==0 ) //归0
  {
   // Serial.println(comdata);
    fun6();      
    }
  C_[12] =="";
    if(C_[7] ==2 ) //右归位
  {
    //Serial.println(comdata);
    fun7();    
    } 
   C_[12] =="";
    if(C_[7] ==3) //左转
  {
    //Serial.println(comdata);
    fun8();     
    }   
     C_[12] =="";
      if(C_[7] ==4 ) //左归位
  {
    //Serial.println(comdata);
    fun9();   
    } 
    C_[12] =="";
     if(C_[7] ==5 ) //右转
  {
   // Serial.println(comdata);
    fun10();    
    } 
    C_[12] ="";
  //while(Serial.read()>=0){} //清空串口缓存  
 }
 
 
 
 void fun1()
 {
   /*for(val;val<=15;val =1)//val =3可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin,val);//模拟产生PWM
    }}
      for(val;val<=30;val =1)//val =3可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin,val);//模拟产生PWM
    }}*/
           for(val1;val1<=10;val1 =1)//val =5可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin1,val1);//模拟产生PWM
    }}
           for(val1;val1<=30;val1 =3)//val =5可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin1,val1);//模拟产生PWM
    }}
        for(val1;val1<=50;val1 =5)//val =5可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin1,val1);//模拟产生PWM
    }}
           for(val1;val1<=70;val1 =1)//val =5可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin1,val1);//模拟产生PWM
    }}
 }
 
 void fun2()
 {
   /*for(val;val>=0;val-=1)//val-=5可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin,val);//模拟产生PWM
    }}*/
    
        for(val1;val1>=0;val1-=1)
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin1,val1);//模拟产生PWM
    }}
 }

 
void range()
 { //测距函数
  digitalWrite(trig,LOW); //测距
  delayMicroseconds(2); //延时2微秒
  digitalWrite(trig,HIGH);
  delayMicroseconds(20);
  digitalWrite(trig,LOW);
  int distance = pulseIn(echo,HIGH); //读取高电平时间
  distance = distance/58; //按照公式计算
  S = distance; //把值赋给S
  Serial.println(S); //向串口发送S的值,可以在显示器上显示距离
 }
 
 void fun3()
{
  
}
void fun4()
{
        for(val;val<=40;val =1)//val =3可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin,val);//模拟产生PWM
    }}
}
 /*void fun5()
{
 for(int i=0;i<numdata;i  )
    {
      C_[i]=0;
      }
}*/
 void fun6()
{
   for(val2;val2>=0;val2-=2)
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin2,val2);
    }}
  }
    void fun7()
{
  for(val2;val2<=50;val2 =2)//val =5可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i =1) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin2,val2);//模拟产生PWM
    }}   
        for(val2;val2<=75;val2 =1)//val =5可以改变舵机转到指定角度的速度
    {
    for(int i=0;i<=5;i =1) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin2,val2);//模拟产生PWM
    }}
  }
  void fun8()
{
   for(val2;val2<=100;val2 =1)
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin2,val2);
    }}
}
void fun9()
{
   for(val2;val2>=75;val2-=2)
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin2,val2);
    }}
  }
  void fun10()
{
   for(val2;val2>=50;val2-=1)
    {
    for(int i=0;i<=5;i  ) //产生PWM个数,等效延时以保证能转到响应角度
    {
      servopulse(servopin2,val2);
    }}
}

标签: 串口 UI 声波 通信 d

实例下载地址

arduino 舵机控制 串口通信 超声波传感器

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警