蓝牙控制单片机控制舵机_51单片机蓝牙控制舵机 - CSDN
  • 要求:1,9V电池为控制器供电,4节1.5V电池为舵机供电; 2,PC要求XP32位系统;第一步:PC安装BlueSoleil,打开控制器,此时蓝牙模块的红灯快速闪烁 搜索并配对:0000,配对成功后,蓝牙模块不会出现连接成功的...

    要求:1,9V电池为控制器供电,4节1.5V电池为舵机供电;
    2,PC要求XP32位系统;

    第一步:PC安装BlueSoleil,打开控制器,此时蓝牙模块的红灯快速闪烁
    搜索并配对:0000
    搜索并配对:0000,配对成功后,蓝牙模块不会出现连接成功的表现。
    这里写图片描述

    第二步:搜索服务,建立串口连接
    搜索服务
    建立串口连接1
    建立串口连接2
    此时蓝牙模块亮绿灯,并且红灯慢速闪烁,表明已经建立串口连接
    成功连接

    第三步:打开舵机控制器上位机软件,选择端口,串口只能使用115200波特率
    这里写图片描述
    连接后既可以通过蓝牙控制舵机

    展开全文
  • 蓝牙舵机篇 引语 本系列博客将分为三篇来讲解,第一篇讲解如何通过HC-05蓝牙模块控制舵机,第二篇会介绍HC-SR04超声波模块的测距程序,第三篇会将两者组装在一起。最终目的:通过手机连接蓝牙单片机发送信号,...

    蓝牙舵机篇  

    引语  本系列博客将分为三篇来讲解,第一篇讲解如何通过HC-05蓝牙模块控制舵机,第二篇会介绍HC-SR04超声波模块的测距程序,第三篇会将两者组装在一起。


    最终目的:通过手机连接蓝牙向单片机发送信号,单片机收到信号后向舵机发送pwm信号,让舵机达到相应的角度。

    实现效果需要达到的目标:

    1.会使用HC-05蓝牙模块,了解51单片机的串口通信。

    2.会用51单片机输出pwm波控制舵机,并校正舵机的误差。

    材料:51单片机最小系统、HC-05蓝牙模块、舵机、杜邦线、数据传输线。

    51单片机最小系统:如图:


    HC-05


    如上图所示为蓝牙模块与51单片机的连接方式

    那么如何让手机控制单片机呢?

    这里我们需要下载一个app,如图


    我们可以在聊天栏中,向单片机发送信息,手机将信息分解为ASCII码发给单片机。单片机接受到的也是ASCII码,因此在下面的程序中的case语句中是以16进制来分情况的。

    舵机:我们这里所使用的是SG-90舵机 如图


    将舵机的橙线连接到P1.2接口

                  红线连接到VCC口

                  棕色连接到GND

    想要控制舵机,那么我们就需要一个周期T = 20ms,高电平的时间(t)等于0.5ms-2.5ms之间的这样一个信号。 
    以下是高电平持续的时间(t)与舵机的关系。


    t = 0.5ms——————-舵机会转动 0 ° 
    t = 1.0ms——————-舵机会转动 45° 
    t = 1.5ms——————-舵机会转动 90° 
    t = 2.0ms——————-舵机会转动 135° 

    t = 2.5ms——————-舵机会转动180° 

    但是在实际的应用中,我发现每一个舵机都存在误差,也就是说输出对应空占比的pwm信号,舵机不会精确地转动到相应的度数。因此我将在下面的程序中加以校正。

    以下是代码

    #include <AT89x51.H>//注意这里的头文件为 <AT89x51.H>
    
    #define SEH_PWM P1_2//舵机PWM口定义
    
    unsigned char SEH_count=5;
    unsigned char count=0;
    
    
    unsigned char T0RH = 0xff;  //T0重载值的高字节
    unsigned char T0RL = 0xa3;  //T0重载值的低字节
    unsigned char RxdByte = 0;  //串口接收到的字节
    
    void ConfigTimer0();
    void ConfigUART(unsigned int baud);
    
    void PWM(unsigned char x)
    {
    	SEH_count=x;
    }
    
    void main()
    {
        EA = 1;       //使能总中断
    ;
        ConfigTimer0();   //配置T0定时1ms
        ConfigUART(9600);  //配置波特率为9600
        
        while (1)
        {  
    					switch(RxdByte)
    				{
    					case 0x31:{
    											PWM(5);//手机向单片机发送‘0’,舵机转到0度    
    										};break;
    					case 0x32:{
    										PWM(10);//手机向单片机发送‘1’,舵机转到45度  
    										};break;
    					case 0x33:{
    										PWM(15);//手机向单片机发送‘2’,舵机转到90度  
    										};break;
    					case 0x34:{
    										PWM(20);//手机向单片机发送‘3’,舵机转到135度  
    										};break;
    					case 0x35:{
    										PWM(25);//手机向单片机发送‘4’,舵机转到180度  
    										};break;
    					case 0x36:{
    										;//														
    										};break;
    					case 0x37:{
    									   ;//																
    										};break;
    					case 0x38:;break;
    				}
        }
    }
    /* 配置并启动T0,ms-T0定时时间 */
    void ConfigTimer0()
    {
      
    
    
        TMOD &= 0xF0;   //清零T0的控制位
        TMOD |= 0x01;   //配置T0为模式1
        TH0 = T0RH;     //加载T0重载值
        TL0 = T0RL;
        ET0 = 1;        //使能T0中断
        TR0 = 1;        //启动T0
    }
    /* 串口配置函数,baud-通信波特率 */
    void ConfigUART(unsigned int baud)
    {
        SCON  = 0x50;  //配置串口为模式1
        TMOD &= 0x0F;  //清零T1的控制位
        TMOD |= 0x20;  //配置T1为模式2
        TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值
        TL1 = TH1;     //初值等于重载值
        ET1 = 0;       //禁止T1中断
        ES  = 1;       //使能串口中断
        TR1 = 1;       //启动T1
    }
    
    /* T0中断服务函数,完成LED扫描 */
    void InterruptTimer0() interrupt 1
    {
        TH0 = T0RH;  //重新加载重载值
        TL0 = T0RL;
    	  if(count <= SEH_count) 
        {
         
            SEH_PWM = 1;
        }
        else
        {
            SEH_PWM = 0;
        }
    
        
        count++;
        if (count >= 200) 
        {
            count = 0;
    			
        }
    	
    }
    /* UART中断服务函数 */
    void InterruptUART() interrupt 4
    {
        if (RI)  //接收到字节
        {
            RI = 0;  //手动清零接收中断标志位
            RxdByte = SBUF;  //接收到的数据保存到接收字节变量中
            SBUF = RxdByte;  //接收到的数据又直接发回,叫作-"echo",
                             //用以提示用户输入的信息是否已正确接收
        }
        if (TI)  //字节发送完毕
        {
            TI = 0;  //手动清零发送中断标志位
        }
    }

    展开全文
  • 通过按键控制舵机的左转和右转,舵机工作周期为20ms.本程序非常简单易懂,希望可以帮到有需要的人。
  • 为什么要写这篇博客、因为我在调我的51单片机wifi小车的双舵机摄像头的时候。从一开始对PWM很陌生到完全理解PWM调节并调好了两个舵机加起来花费了整整一天的时间。也看了很多的资料。这里综合一下,希望能帮助到像我...

    为什么要写这篇博客、因为我在调我的51单片机wifi小车的双舵机摄像头的时候。从一开始对PWM很陌生到完全理解PWM调节并调好了两个舵机加起来花费了整整一天的时间。也看了很多的资料。这里综合一下,希望能帮助到像我一样需要使用PWM调舵机的人。


    我用的舵机是———-盛辉SG90舵机(标准版)

    这里写图片描述
    对就是上面这个东东

    下面来简单的看一下它的工作原理:
    三根线:
    橙色—————————–信号线
    红色—————————–VCC
    棕色—————————–GND

    首先、在这个舵机的内部有一个基准电压。如果我们想要控制这个舵机的转动。那么我们就要通过一定信号线给它一个一定周期的直流偏置电压。
    最终舵机内部会根据直流偏置电压与内部基准电压进行比较,获得电压差输出。最后电压差的正负输出到电机驱动芯片决定电机的正反转。

    经过这样一个简单的叙述我们大概知道了该怎么控制舵机的正反转。

    下面我们了解一下该给它什么样周期的直流偏置电压呢?
    下看一下占空比的概念(图示):
    这里写图片描述

    如上图:占空比 = t / T;
    想要控制舵机,那么我们就需要一个周期T = 20ms。高电平小t等于0.5ms-2.5ms之间的这样一个方波。
    为什么是这个参数呢?

    因为 t (高电平在一个周期内持续时间)
    t = 0.5ms——————-舵机会转动 0 °
    t = 1.0ms——————-舵机会转动 45°
    t = 1.5ms——————-舵机会转动 90°
    t = 2.0ms——————-舵机会转动 135°
    t = 2.5ms——————-舵机会转动180°
    不要问我为什么,哈哈哈,因为这和舵机内部的基准电压有关,我们只要知道它到底如何用就可以了,里面的电路实现可以不用深究!


    通过上面的一下基础概念性的知识我们已经大概了解了舵机的工作原理。接下来让我们来看一下如果用C51单片机PWM来调节控制它


    对于T = 20ms 。我们可以定时器0(方式1)来计数。每次0.1ms。如果计数达到200则说明一个周期到了,计数清0
    补充:
    11.0592MHz晶振——0.1ms TH0 = 0xff,TL0 = 0xa3
    12.0000MHz晶振——0.1ms TH0 = 0xff,TL0 = 0x9c

    对于t = 0.5ms—–2.5ms我们可以采用全局变量。让全局变量等于5—25之间,因为我的舵机的一个计数周期是0.1ms,这样全局变量的5—25正好就是0.5ms—2.5ms

    有了这个对应关系,那么程序变的简单起来
    一起来看

    /* 因为我是使用Android APP通过串口给单片机发送指令来控制两个舵机的转动
       所以下列程序的参数在这里做个解释:
       SEV_count  上文中提到的全局变量,它的改变能够改变占空比,也就是高电平持续时间,相信你们看了代码就会明白,SEV_COUNT控制电机左右转。
       SEH_count  控制电机上下转
       count定时器计数值
       串口发送‘f’代表舵机向上转
       串口发送'g'代表舵机向下转
       串口发送‘h’代表舵机向左转
       串口发送‘i’代表舵机向右转
       sbit SEV_PWM = P0^0;  //上下舵机信号位
       sbit SEH_PWM = P0^1;  //左右舵机信号位
     */
    unsigned char count = 0;
    unsigned char SEV_conut = 15;
    unsigned char SEH_count = 15;
    /* 串口初始化、定时器T0、T1初始化 */
    void Com_Init()
    {
        IP = 0x08;
        PCON &= 0x7F;
        TMOD &= 0x00;
        TMOD |= 0x21; //定时器0设置为16为定时器方式1,定时器1配置波特率为自动重载方式2
        SCON= 0x50;   //串口工作在方式1,8位异步通信
        TH1 = 0xfd;   //定时器1设置为在11.0592下波特率为9600
        TL1 = 0xfd;
        ES = 1;       //打开串口中断
        ET1 = 0;      //关闭定时器1中断
        TR1 = 1;      //打开定时器1
    
        TH0 = 0xff;   //配置定时器0初值,溢出时间为0.1ms
        TL0 = 0xa4;
    
        ET0 = 1;      //打开定时器0中断
        TR0 = 1;      //开启定时器0
    }
    /* 定时器0中断服务程序 */
    void Time0_Int() interrupt 1
    {
        TR0 = 0;      //关闭定时器0
        TH0 = 0xff;   //重装初值0.1ms
        TL0 = 0xa4;
        //舵机1
        if(count <= SEH_count) //控制占空比左右
        {
            //如果count的计数小于(5-25)也就是0.5ms-2.5ms则这段小t周期持续高电平。产生方波
            SEH_PWM = 1;
        }
        else
        {
            SEH_PWM = 0;
        }
        //舵机2
        if(count <= SEV_count) //控制占空比上下
        {
            SEV_PWM = 1;
        }
        else
        {
            SEV_PWM = 0;
        }
        count++;
        if (count >= 200) //T = 20ms则定时器计数变量清0
        {
            count = 0;
        }
        TR0 = 1; //开启定时器0
    }
    
    void main()
    {
        Com_Init();
        while(1)
        {
            ;
        }
    }
    /* 串口中断函数 */
    void uart_ser() interrupt 4
    {
        if (RI == 0)
        {
            return;
        }
        ES = 0;
        RI = 0;
        command = SBUF; //将接收到的数据传给command
        switch(command)
        {
             case 'f': //舵机向上转
            {
                SEV_count++;
                if(SEV_count >= 25)
                {
                    SEV_count = 25;
                }
                count = 0; //占空比参数t改变,让定时器重新计数
                break;
            }   
            case 'g':
            {
                SEV_count--;
                if(SEV_count <= 5)
                {
                    SEV_count = 5;
                }
                count = 0;
                break;
            }   
            case 'h':
            {
                SEH_count++;
                if(SEH_count >= 25)
                {
                    SEH_count = 25; //保持角度180度。 
                }
                count = 0;
                break;
            }   
            case 'i':
            {
                SEH_count--;
                if(SEH_count <= 5) //保持角度0度
                {
                    SEH_count = 5;
                }
                count = 0;
                break;
            }
            case 'k':  //舵机复位
            {
                SEH_count = 15;
                SEV_count = 15;
                count = 0;
                break;
            }
            default:
            {
                break;
            }
        }
        ES = 1; //打开串口
    }

    以上就是一个双舵机的PWM控制,其实原理很简单。只要明白了原理实现起来很快的。

    嘿嘿、深夜写博客也就是我了,碎觉!!!!

    展开全文
  • stm32新手看过来 分享一个基于stm32的蓝牙控制舵机自动关灯程序 用的是stm32f103c8t6最小系统板,实现功能是蓝牙控制舵机转动,之后stm32和蓝牙模块进入休眠省电模式 这里采用了软件发送AT指令使得蓝牙模块进入...

    stm32新手看过来 分享一个基于stm32的蓝牙控制小舵机自动关灯程序

    用的是stm32f103c8t6最小系统板,实现功能是蓝牙控制舵机转动,之后stm32和蓝牙模块进入休眠省电模式
    这里采用了软件发送AT指令使得蓝牙模块进入休眠,需要注意的是不同厂家生产的蓝牙模块的AT指令不一样。

    这个程序很适合stm32新手练手编写,简单实用,能复习到stm32两大重要功能:脉宽调制和串口通信,另外对熟悉stm32f1系列单片机也有很大帮助

    当然最重要的是实用,自己做一个关灯装置,在舍友的惊叹声中实现“魔法关灯”吧哈哈。

    这个程序已经是成熟的版本了,我是通过两节南孚给蓝牙模块供电,四节南孚给stm32供电,已经使用了半个月了(之前没有加入蓝牙休眠的时候一晚上就没电了)

    其中主函数如下

    #include "pwm.h"
    #include "system.h"
    #include "SysTick.h"
    #include "usart.h"
    
    int main()
    {
            SysTick_Init(72);
            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
            TIM2_CH1_PWM_Init(199,7199); 
            USART1_Init(9600);
            TIM_SetCompare3(TIM2,185);
            
            while(1)
            {
            sleep();
    
            servo_control();
            }
    }
    

    void servo_control (void)
    {

    if(r==0x35)
    {
    	if(flag==1)
    	{
    		TIM_SetCompare3(TIM2,170);
    		delay_ms(1000);
    		TIM_SetCompare3(TIM2,185);
    		delay_ms(100);
    		flag=0;
    	PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFE);
    	}
    }
    

    }

    软件发送蓝牙AT指令,根据蓝牙模块厂家不一,AT指令会不同
    delay_ms(1);很重要,实践检验:如果少了这个那么只能发送出第一个字符;

    void sleep(void)
    {
    	 if (sleep_flag==0)
    	 {
    		  delay_ms(1000);
    	    USART_SendData(USART1,0x41);
    		  delay_ms(1);
    		 
    		  USART_SendData(USART1,0x54);
    		  delay_ms(1);
    		 
    		  USART_SendData(USART1,0x2b);
    		  delay_ms(1);
    		 
    		  USART_SendData(USART1,0x4d);
    		  delay_ms(1);
    		 
    		  USART_SendData(USART1,0x4f);
    		  delay_ms(1);
    		 
    		  USART_SendData(USART1,0x44);
    		  delay_ms(1);
    		 
    		  USART_SendData(USART1,0x45);
    		  delay_ms(1);
    		 
    		  USART_SendData(USART1,0x3d);
    		  delay_ms(1);
    			
    			USART_SendData(USART1,0x31);
    		  delay_ms(1);
    		  sleep_flag=1;
    	 }
    
    }
    

    其他就是一些GPIO的设置以及pwm的配置这些了,篇幅原因在此不多叙述,有问题的可以在下方留言

    展开全文
  • //舵机控制脉冲信号输出口 sbit led = P2^3 ; //信号灯输出口 sbit wen=P3^1; //传感器或按键输入口 sbit dianji = P0^1; //电机控制信号输出口 unsigned char angle; unsigned char count; void de...
  • 51单片机8路高精度舵机下位机及C#上位机程序
  • 通过控制PWM实现对6路舵机控制
  • 最终目的:将51开发板与超声波模块相连,超声波模块的echo引脚将电信号返回给单片机,通过程序判断距离,然后将距离显示在数码管上。实现效果需要达到的目标:1.了解SR-04超声波模块的工作原理,并会编写相应程序。2...
  • 做校赛时候用的程序,蓝牙控制四驱小车的行走,以及控制机械臂抓取不同角度的东西,
  • 引语:本篇将介绍如何用51单片机蓝牙舵机控制超声波模块测距,并将距离在开发板的数码管上显示你通过学习上两篇的文章,应该可以实现这些功能了,那么下面我们要做的就是将他们组装起来。...
  • 源代码我已经上传到了CSDN资源里面。 难点:1.模拟串口,这个代码在STC烧写器里面就有。 2.利用定时器产生方波。 3.程序逻辑
  • 电脑与单片机通信原理 我们用到的串口调试助手,就是通过电脑上面的虚拟串口和单片机的...我们把电脑上的串口配置好了之后,我们就可以用电脑上的串口调试助手来控制单片机了,(当然是你代码没问题的情况下)。可以通
  • 在机器人中使用伺服电机进行...我们已经介绍过如何使用Arduino开发板控制伺服电机,这次我们使用无线蓝牙模块HC-06控制伺服电机。 所需的材料 ● Arduino UNO开发板 ● HC-05或HC-06蓝牙模块 ● 伺服电机 ●...
  • STM32串口控制舵机

    2019-06-30 12:11:53
    首先我们要解决 硬件问题: 舵机工作电压是多少? 一般供电范围是4.8V-6.0V电压,我这种舵机3V、5V不影响...有人可以直接连接,没有出现什么问题,但是有人可能会出现单片机复位的情况,可能是舵机瞬间驱动电流...
  • 要学习HC-06蓝牙模块与51单片机互相通信以控制舵机首先了解51内部RXD与TXD的关系(如下图): 通过此图可以清晰了解51与TXD/RXD数据传输方式,都是通过TXD/RXD传输至51内部SBUF,通过SBUF中的数据,执行控制舵机动作...
  • 利用atmega16单片机制作智能锁,具有矩阵键盘扫描、P波控制舵机蓝牙串口控制舵机
  • 这里使用到的是BT04蓝牙模块,作为从机使用 蓝牙配置的代码可以直接搬运,需要自己配置的是对从机收到的数据进行分析并且作出相应动作实现。
  • **51单片机智能小车(舵机云台超声波避障+循迹+蓝牙+红外跟随+遥控+TFT液晶显示屏) 本人由于使用的液晶显示屏,程序大于8K,所以更换为STC12C5A60S2芯片,与51芯片兼容。 功能比较多: 1舵机云台超声波避障 2....
  • 由于对wifi模块的控制需要,在网上找了许多资料,发现wifi模块通过单片机进行通讯的代码不多,也有一些存在着错误,于是便自己写了一个wifi控制舵机和灯的程序,记录下来 stm32通过wifi模块实现手机远程控制灯与...
1 2 3 4 5 ... 12
收藏数 239
精华内容 95
关键字:

蓝牙控制单片机控制舵机