简单介绍
超声波自拍神器就是一个用来自拍的东西,下面是一个网页上的广告:
http://it007.com/thread-1699349-1-1.html
简单说就是,如果有一个自拍杆,然后想要自拍的时候,按下开关,然后发出一个超声波,手机接收到了之后就会拍照了——此外,我们还需要下载一个手机APP,叫做Airshooting。
参考资料
我是在某位大神的博客上看到有这么个东西的。
地址如下:
http://www.cirmall.com/circuit/1484/(ST大赛三等奖作品)超声波自拍神器#/details?2
方案介绍
首先手机先到网上下载一个APP(Airshooting),然后打开APP,利用STM32 NUCLEO-F072RB开发板的定时器产生一定频率PWM信号,用来控制蜂鸣器发出声音,当手机接收到蜂鸣器发出的声音后,会执行拍张操作,如果你的手机有前摄像头,还可以控制手机执行切换摄像头操作。
(1)拍照的PWM频率为:先发送250ms的频率为15870Hz的PWM信号(占空比没什么要求,50%左右即可);后发送250ms的频率为15617Hz的PWM信号。这个频率精确度越高,控制的距离就越远。
(2)切换的PWM频率为:先发送250ms的频率为16526Hz的PWM信号(占空比没什么要求,50%左右即可);后发送250ms的频率为15620Hz的PWM信号。
实物图
我也是拿面包板搭建的电路,用的是正点原子的STM32F4开发板。
因为我用的是开发板,所以很多代码都是现成的,自己需要改的部分很少。用的是TIM14_CH1通过PF9端口输出PWM信号。蜂鸣器串联了一个1K电阻,然后一端连着PF9引脚,另一端接地。电路非常简单。
主要的代码片段
PWM的频率和占空比公式
频率:
//Fpwm = 时钟频率 / ((arr+1)*(psc+1))(单位:Hz)
占空比:
//duty circle = TIMxx->CCR1 / arr(单位:%)
int main(void)
{
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //延时初始化
KEY_Init(); //按键初始化
while(1)
{
u8 flag=0;
flag=KEY_Scan(0);
if(flag==2)
{
/******拍照信号******/
TIM14_PWM_Init(63-1,84-1);
delay_ms(250);
//先发送250ms的频率为15870Hz的PWM信号(占空比没什么要求,50%左右即可);
TIM14_PWM_Init(64-1,84-1);
delay_ms(250);
//后发送250ms的频率为15617Hz的PWM信号。
RCC->APB1ENR|=0<<8; //TIM14时钟关闭
flag=0; //标志清零
//delay_ms(5000);
}
if(flag==3)
{
/******切换镜头信号******/
TIM14_PWM_Init(60-1,84-1);
delay_ms(250);
//先发送250ms的频率为16526Hz的PWM信号;
TIM14_PWM_Init(64-1,84-1);
delay_ms(250);
//后发送250ms的频率为15620Hz的PWM信号。
RCC->APB1ENR|=0<<8; //TIM14时钟关闭
flag=0; //标志清零
//delay_ms(5000);
}
}
}
//TIM14 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<8; //TIM14时钟使能
RCC->AHB1ENR|=1<<5; //使能PORTF时钟
GPIO_Set(GPIOF,PIN9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
GPIO_AF_Set(GPIOF,9,9); //PF9,AF9
TIM14->ARR=arr; //设定计数器自动重装值
TIM14->PSC=psc; //预分频器不分频
TIM14->CCMR1|=6<<4; //CH1 PWM1模式
TIM14->CCMR1|=1<<3; //CH1 预装载使能
TIM14->CCER|=1<<0; //OC1 输出使能
TIM14->CCER|=1<<1; //OC1 低电平有效
TIM14->CR1|=1<<7; //ARPE使能
TIM14->CR1|=1<<0; //使能定时器14
TIM14->CCR1=arr*0.5; //占空比= TIM14->CCR1 / arr(单位:%)
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下
//4,KEY_UP按下 即WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY_UP!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}
遇到的问题
大神博客中说的切换前后摄像头的哪一部分有问题,我没法实现,频率不对——也有可能是我的硬件部分有问题。但是拍照那一部分是可以实现的。