STM32
直播中

张玉兰

7年用户 1335经验值
私信 关注
[问答]

请问一下蓝牙模块是如何去控制舵机的

蓝牙模块是什么?蓝牙模块可分为哪几种类型?
蓝牙模块是如何去控制舵机的?

回帖(1)

罗丹

2021-10-14 11:59:59
  一。模块介绍
  蓝牙模块
  蓝牙模块,是一种集成蓝牙功能的PCBA板,用于短距离无线通讯,按功能分为蓝牙数据模块和蓝牙语音模块。蓝牙模块是指集成蓝牙功能的芯片基本电路集合,用于无线网络通讯,大致可分为三大类型:数据传输模块远程控制模块等。
  RXD: 接收端
  TXD: 发送端
  实物图及参数
  
  舵机
  原理
  舵机的控制一般需要一个20MS左右的时基脉冲,该脉冲的高电平部分一般为0.5MS-2.5MS范围内的角度控制脉冲部分,总间隔为2Ms。以180度角度伺服为例,那么对应的控制关系是这样的:
  0.5MS--------o度;
  1.0MS-------45度;
  1.5MS-------90度;
  2.0MS-------135度;
  2.5MS-------180度;
  占空比控制舵机角度:
  
  实物图及参数
  
  二。开发工具
  编程软件:KEIL5
  串口软件:XCOM V2.0
  烧录软件:stc-isp-15xx-v6.86C
  手机APP:SPP蓝牙串口(安卓手机)
  三。程序代码
  部分代码如下,完整代码在下面会提供百度网盘下载。
  对应视频讲解说明在B站有分享。
  在main.c文件中
  /*
  B站:Tuyue沐尘
  本程序采用stc8a8k64s4a12为主控
  舵机接线-----信号线接P37
  蓝牙模块 TX---接单片机P30
  RX---接单片机P31
  */
  #include “all.h”
  int main()
  {
  sart_Init(9600);
  Timer0Init();
  printf(“这是一个串口程序rn”);
  while(1)
  {
  steering_control();
  switch(rdata) //串口控制,写需要的效果
  {
  case ‘1’:P00=0;break; //舵机控制
  case ‘2’:P00=1;break;
  case ‘3’:P01=0;break; //灯控制
  case ‘4’:P01=1;break;
  }
  if(usart_flag)
  {
  usart_flag=0;
  usart_send_str(buffer); //字符串回显
  if((strcmp((char*)buffer,“led_on”))==0)
  {
  memset(buffer,0,sizeof(buffer)); //c语言数组清零
  P01=0;
  }
  }
  }
  }
  在usart.c文件中
  #include “usart.h”
  #define sysclk 24000000
  bit busy;
  int r_ret=0;
  int usart_flag=0;
  char buffer[32];
  char rdata;
  void usart_Init(int BRT)
  {
  SCON = 0x50;
  //关闭定时器0,模式选择16位自动重载
  TMOD = 0x00;
  //定时器1,1分频,选择定时器1为波特率发生器
  AUXR = 0x40;
  //波特率
  TL1 = (65536-sysclk/BRT/4);
  TH1 = (65536-sysclk/BRT/4)》》8;
  //禁止T1中断
  ET1 = 0;
  //开启定时器1
  TR1 = 1;
  //开启串口1中断
  ES = 1;
  //使能总中断
  EA = 1;
  busy = 0;
  }
  void usart_send(char dat) //字符
  {
  while(busy);
  busy = 1;
  SBUF = dat;
  }
  void usart_send_str(char *p) //字符串
  {
  while(*p)
  {
  usart_send(*p++);
  }
  }
  char putchar(char c) //printf
  {
  usart_send(c);
  return c;
  }
  void usart_Isr() interrupt 4
  {
  if(TI==1)
  {
  TI=0;
  busy=0;
  }
  if(RI==1)
  {
  RI=0;
  rdata=SBUF;
  // usart_send(rdata); //回显
  if(rdata!=‘r’ && rdata!=‘n’) //看是否换行or回车,再进行存放数组
  {
  buffer[r_ret++]=rdata; //buffer[0]=rdata;
  }
  if(rdata==‘n’)
  {
  buffer[r_ret]=0;
  usart_flag=1;
  r_ret=0;
  }
  }
  }
  四。串口调试和手机APP控制
  电脑端
  
  手机端
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分