STM32+舵机 低成本简易宿舍蓝牙开关灯

本文介绍了如何使用STM32通过蓝牙与SG90舵机通信,通过定时器控制舵机角度并接收手机蓝牙发送的数据。还提到使用Appinventor制作蓝牙APP进行控制,附有详细的源码和连接步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

af46e46b11ec4138a976624c980289d2.jpg

一、简介

        手机通过蓝牙软件向蓝牙串口模块发送数据,STM32通过串口接收蓝牙串口模块的数据,控制舵机旋转角度开关灯。舵机通过PWM驱动,所以就两个外设配置,串口接收数据,定时器驱动舵机旋转。           

二、所需元件

           STM32F103C6T6(5元)+SG90舵机(5元)+蓝牙串口透传模块(10元),杜邦线若干。

三、STM32控制程序

       ①定时器初始化

                使用定时器2通道2输出PWM控制舵机的角度,以下为定时器和GPIO脚的初始化配置。

void GPIO_Config(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);//GPIOA的引脚1为控制引脚
}

void TIM_Config(uint16_t arr,uint16_t pre)//PWM初始化
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSSttruct;
	TIM_TimeBaseInitSSttruct.TIM_Period=arr;
	TIM_TimeBaseInitSSttruct.TIM_Prescaler=pre;
	TIM_TimeBaseInitSSttruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitSSttruct);

	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OC2Init(TIM2, &TIM_OCInitStruct);
	TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
	TIM_Cmd(TIM2, ENABLE);
}
TIM_Config(9999,143);//设置20MS  50HZ

②SG90舵机角度控制

      舵机的控制需要一个20MS的时基脉冲,0.5MS对应-90度,2.5MS对应+90度。2MS对应180度,为了方便设置角度,所以创建一个函数进行设置角度程序如下。

void Anglesetting(short int angle)
{
	angle=(angle*556+50)/100+750;
	TIM_SetCompare2(TIM2, (uint16_t)angle);
}

        计算公式由来:当设置-90度时,占空比为0.5MS,对应比较值为250,设置+90度时对应1250,相差1000,共180度,所以1000/180=5.56次/度,0度对应750,所以值=度数*5.56+750,由于变量为整形,所以分子分母*100。

③串口配置(与手机蓝牙通信)

      配置串口与蓝牙串口透传模块进行通信,手机连接蓝牙发送数据。

配置波特率为9600(可以根据蓝牙模块更改,蓝牙模块默认9600),打开接收中断。

三、蓝牙APP制作

        哔哩哔哩上很多教程,推荐使用App inventor。

视频推荐链接:

 https://www.bilibili.com/video/BV1Cy4y1h7ma/share_source=copy_web&vd_source=655cabdfd899891a83c4c5e45f31310f

四、连接

        舵机的信号线接PA1,STM32的地与舵机的地一定要在一起,5V供电,蓝牙串口模块正常接。

五、程序与APP

源码也有详细注释,蓝牙APP也在里面。

https://gitee.com/fendaya/simple-switching-light.git

 

 

 

 

以下是使用STM32蓝牙模块控制舵机的步骤: 1. 首先,需要连接蓝牙模块和STM32单片机。可以使用UART通信协议进行连接。 2. 接下来,需要编写STM32单片机的程序,以便能够接收蓝牙模块发送的指令,并控制舵机转动。 3. 在程序中,需要使用PWM信号控制舵机的转动角度。可以使用STM32的定时器模块来生成PWM信号。 4. 在接收到蓝牙模块发送的指令后,程序需要解析指令,并根据指令控制舵机转动。 5. 最后,需要将程序烧录到STM32单片机中,并将蓝牙模块连接到手机或电脑上,以便能够通过蓝牙控制舵机。 下面是一个简单的示例代码,用于控制舵机转动: ```c #include "stm32f10x.h" #define PWM_PERIOD 20000 // PWM信号周期为20ms #define PWM_MIN 1000 // PWM信号最小值 #define PWM_MAX 2000 // PWM信号最大值 void TIM3_PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD - 1; TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = PWM_MIN; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_Cmd(TIM3, ENABLE); } void TIM3_PWM_SetDutyCycle(uint16_t dutyCycle) { TIM3->CCR1 = dutyCycle; } int main(void) { TIM3_PWM_Init(); while (1) { // 接收蓝牙模块发送的指令,并解析指令 // 根据指令控制舵机转动 // 这里只是一个简单的示例,每隔1秒钟将舵机转动到最大角度 TIM3_PWM_SetDutyCycle(PWM_MAX); delay_ms(1000); } } void delay_ms(uint16_t ms) { uint16_t i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 1000; j++) { __NOP(); } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值