首页 » 智能 » 单片机实例分享经由进程手势控制的体感音响_暗记_距离

单片机实例分享经由进程手势控制的体感音响_暗记_距离

神尊大人 2024-12-11 08:46:26 0

扫一扫用手机浏览

文章目录 [+]

你一定想知道它是怎么事情的,事理实在很大略,便是利用传感器来丈量手与机器的间隔,根据不同的间隔来掌握音响,全体系统的构成如图2.1所示。
当然这是一维探测,如果有两个传感器水平放置,通过打算两个传感器与手的间隔差就可以进行二维掌握。

图2.1 体感音响的系统构成

单片机实例分享经由进程手势控制的体感音响_暗记_距离 智能

材料准备

1. 测距传感器

目前市情上比较盛行的测距方法有3种:无线电测距(也便是常说的雷达)、激光测距和超声波测距。
无线电测距在这里显然弗成,我们的测距探头哀求达到毫米级的精度,而且永劫光的电磁辐射会对身体造成侵害。
至于激光测距,探头常日造价不菲,其余过强的激光束可能侵害到眼睛。
因此,最得当的要数超声波测距了。
超声波只是发射出听不见的声音,精度可以担保,还存在盲区小的优点,不会发生手晃动一下,传感器就失落去目标的征象。

为了简化硬件设计,最好购买现成的模块,实物如图2.2所示。

图2.2 超声波测距模块

2. 中心掌握器

过去,51内核的单片机牢牢地霸占着微掌握器市场,直到现在也是初学者入门嵌入式系统的绝佳选择。
然而任何事物都有一个生命周期,51内核的“先天不敷”越来越明显。
CISC的繁芜架构使芯片门数增加,从而导致功耗高,时钟频率难以提高。
RAM、ROM容量普遍偏小,使其很难运行嵌入式实时操作系统,导致研发周期加长。
从目前的形势来看,以ARM公司Coretex-M3为内核的STM32系列微掌握器最得当不过了。
以STM32F103RBT6芯片为例,仅十余元的价格,就带来很多令人愉快的配置:最高72MHz的时钟频率,带有USB2.0、I2C、USART、SPI、IIS、CAN等接口,拥有128KB的片内Flash、20KB的RAM,拥有49个I/O口(GPIO)、8个定时器,20mA的灌电流直接驱动LED……最紧张的是,可以运行μC/OS-II等盛行的嵌入式操作系统。
其资料也相称完好,在网上可以找到很多开拓板,有的不但附赠很多源代码,乃至还供应视频教程、配套书本等。
因此,不管你是老手还是新手,都是很值得一学的。

为了节约电路板面积、提高性能,目前大部分芯片都采取了贴片封装。
这或许会给手工焊接的质量提出更高的哀求,不过购买最小系统模块也是不错的选择,虽然轻微贵点,但是硬件性能能得到担保,使我们不用总是做一些重复性的劳动,而是把精力集中在软件的编写上。
已经包含最小系统的RBT6模块如图2.3所示。

图2.3 包含最小系统的RBT6 模块

3. 放大器与数字音量电位器

同样,为了简化硬件,放大器仍用现成的模块,如图2.4所示。
现在的音频放大器模块种类很多,详细规格就要看你自己的喜好了。
我选用的是一款功放芯片为TEA2025B的3W双声道模块,其增益可通过微调电阻调节,+5~+12V供电,用来做电脑的桌面音箱已经足够了。

至于音量调节电路,就须要自己动手制作了。
我选用FM62429作为音量调节模块的核心,完成后的实物如图2.5所示。
其制作过程我会在后面详细先容。

图2.4 基于 TEA2025B的放大器模块

图2.5 低廉甜头的音量调节电路

4. 其他

其余还须要LED多少、万用板2片、一些常用的接插件、线材以及焊接工具等,详细就不多说啦,相信DIY爱好者一定早有准备。

软件:前后台还是操作系统 ?

在我学习μC/OS-II嵌入式实时操作系统时,看到过一句话,大致是这样的:当你学会利用操作系统,就再也不想回到前后台的开拓办法。
这不禁让我想起当初学汇编和C措辞时,一开始总是在想,学会了汇编是不是还有必要学C措辞,但当我学会了C措辞,就再也不想转回汇编措辞开拓程序。
利用操作系统到底有多少优点,我不想多说,这须要自己去实践。
我想说的是,有很多知识,我们并没故意识到是须要的,直到我们学会了并且运用了。

常用的嵌入式操作系统有很多,比如大名鼎鼎的VxWorks、当前手机利用最多的Android,以及通过美国航空管理局认证,已经运用在“好奇”号火星车的实时内核μC/OS-II等。
在这里我利用μC/OS-II,紧张考虑到它源代码开放、构造大略、在海内比较盛行,而且有大量的学习资源及代码。

图2.6 嵌入式软件系统的基本模型

嵌入式软件系统的基本模型如图2.6所示。
当然,并不是所有软件系统都完备遵照这一模型。
然而对付大多数嵌入式设备来说,采取这种层次构造来开拓全体系统的软件,具有很强的可操作性和可掩护性。

软件事理

1. μC/OS-II 基于任务(task)的软件设计方法

大略单片机系统如图2.7所示,这种软件设计方法将所有代码放在一起,代码层次观点不清晰,且功能大略,因此仅适用于小型系统。

μC/OS-II操作系统下基于任务的软件设计方法则不同。
基于操作系统的软件开拓抛开了对硬件资源的管理,而将硬件资源的管理交给操作系统,这使得代码的层次关系很清晰。
同时,对某个任务的相应韶光可以由操作系统掌握,从而提高程序的实行效率。

图2.7 大略单片机系统

2. 掌握方法

在讲代码之前,我们要先明白让程序干些什么。
实在我们要实现的功能很大略——开机、音量增、音量减,但是要知道,探测器探测的间隔不一定总是得手的间隔,它本身并不具备人手识别的功能,只是探测离它最近的物体的间隔。
大概你在走路的时候会无意间触发其掌握程序,涌现不想要的结果。
因此我们就要有一个“距离开关”,只有达到特定的间隔才能被打开,从而使掌握有效。

在本程序中,我采取下限间隔法和LED渐亮指示法。
先设定一个下限间隔,比如5cm。
当探测的间隔大于或即是5cm时,不进行任何动作;当探测的间隔小于5cm时,第一个LED由灭逐渐变亮,此过程大约持续2s,如果在这2s内,探测的间隔一贯小于5cm,那么就打开电源或音量掌握开关(流程图见图2.8)。

图2.8 流程图

之以是这样,是由于如果音响放在桌面上,它离桌面边缘常日会有一定的间隔,身体自然会大于这个间隔,这样便避免了测错目标。
加上2s的渐亮延时是由于手可能会在不经意间进入其临界间隔,由于声音传播的速率太快,如果不加延时,便会产生误动作。
这就像我们设计键盘扫描程序一样。

图2.8所示的流程只是一个思路,实际的代码是分在不同的任务中,在后面我会详细讲解。
其余,音量掌握是这样的:有5个LED用来显示由近及远5个不同的间隔。
超声波测距模块的有效间隔为30cm,这样我们可以把间隔分成6份,每份5cm,每靠近5cm,点亮一个灯。
如果间隔大于30cm,则认为音量设定完毕。

实际操作时是这样的:如果希望音量衰减为10dB,而当手移动至第二个灯亮时即为音量衰减到10dB,这时可以将手水平移动到探测间隔之外的盲区,会关闭音量掌握开关,而一贯保留10dB音量,LED灯也会全部熄灭。

3. 体感音响的软件部分

全体软件由10个文件夹、29个C源代码文件组成,如图2.9所示。
不过不用害怕,有很多都是操作系统代码,没必要理解每一行程序,只须要知道主要函数的用法即可。
真正须要自己写的代码,实在只有iCode文件夹中7个与硬件干系的C措辞驱动程序以及APP文件夹中名为app. c的运用程序。
其他的代码很少须要修正乃至不用修正。

图2.9 全体软件由10个文件夹、29个C源代码文件组成

主要部分在app.c文件中,此文件有启动操作系统的main函数,各个任务的建立及运行函数,如图2.10所示。
在我们自己编写的所有代码中,有5个文件是操作芯片的外部设备的:VoiceVolume.c掌握数字音量电位器,Capture.c掌握雷达模块,Led.c掌握间隔指示LED,pwm.c利用脉宽调制掌握LED亮度、启动电源及音量掌握开关。
其余还有sys.c和timer.c,这两个文件紧张是对芯片内部的配置,比如配置中断向量表、定时器等。
在实际调用这些代码时,常日会建立与.c文件同名的.h文件。
.h文件包含函数的声明、全局变量的声明。
在调用的时候,也是用#include命令包含.h文件的。

图2.10 app.c 文件部分代码阐明

μC/OS-II是基于任务的,每个任务都有唯一的优先级。
优先级不但代表了这个任务优先运行的程度,还是任务的标识。
在μC/OS-II中,优先级的数值越小,其优先程度越大。

一个任务的形式常日如下:

static void任务名 (void p_arg){

p_arg= p_arg;//避免警告

while(1){

用户代码…… }

OSTimeDlyHMSM(0,0,0,10);

}

每个任务都必须有一个去世循环,在循环的末端会有一个延时函数。
当一个任务进入延时函数后,此任务便由运行态转为挂起,从而让优先级次低于它的任务实行。
虽然从微不雅观角度看,这些程序仍旧是顺序实行的,但由于每一任务的用户代码实行得非常快,因此看起来像是同时运行。

p_arg为任务函数的参数,如果不该用,编译器会发出警告。
由于我们用不到它,又为避免丢脸的(但不影响程序正常运行)警告以是会加上“p_arg= p_arg;”。

任务实行时,有时须要进行任务间通信。
μC/OS-II支持旗子暗记量、邮箱和行列步队。
在这里,我们要将AppRader任务打算的间隔值传给LED指示任务AppLedIndicate、亮度调节任务AppPWM以及音量掌握任务AppVoiceControl,利用邮箱来通报。
我们用OSMboxPend函数壅塞式读取数据,也便是说,只要没有收到数据,此函数所在的任务就一贯处于挂起状态。

4. 主要代码详解

为了更好地解释程序的事情事理,请看如下代码。

首先是函数及变量的声明:

#define Task_ControlVoice_PRIO 8

#define VoiceTASK_STK_SIZE 512

OS_STK VoiceStk[VoiceTASK_STK_SIZE];

static void AppVoiceControl(void p_arg);

#define Task_Rader_PRIO 5

#define RaderTASK_STK_SIZE 512

OS_STK RaderStk[RaderTASK_STK_SIZE];

static void AppRader(void p_arg);

///////LED indicate

#define Task_LedIndicate_PRIO

#define LedIndicate_STK_SIZE 512

①OS_STK LedIndicateStk[LedIndicate_STK_SIZE];

static void AppLedIndicate(void p_arg);

/////// PWM Control LED

#define Task_PWM_PRIO 7 //6

#define PWM_STK_SIZE 512

OS_STK PWM_IndicateStk[PWM_STK_SIZE];

static void AppPWM(void p_arg);

/////////Power control

//#define Task_PowerControl_PRIO 9

//#define PowerControl_STK_SIZE 256

//OS_STK PowerControlStk[PWM_STK_SIZE];

//static void AppPowerControl(void p_arg);

②OS_EVENT pmailDistance;

③typedef enum {PowerOff=0,PowerOn=1,VoiceOff=0,VoiceOn=1}eStatues;

int gviPowerStatue=0;//gvi means:global volatile int

int gviVoiceStatue=0;

①为了进行任务调度,每个任务都须要一定的堆栈空间。
我们用OS_STK,它实际上便是一个构造体。
在这里我们将堆栈空间设为512字节。

②在利用邮箱之前,我们先要进行变量的声明。

③共用体eStatues用来指示电源和音量的开关,1表示开,0表示关。

然后进入main函数,初始化芯片、操作系统,启动内核等。

int main(void)

CPU_IntDis();//禁止CPU中断

OSInit();//UCOS初始化

①BSP_Init();//硬件平台初始化

②OSTaskCreate((void () (void )) App_TaskStart, // 建立主任务

(void ) 0, (OS_STK ) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],

(INT8U) APP_TASK_START_PRIO);

OSTimeSet(0);

OSStart(); //启动内核

return (0); }

①对芯片正常运行进行初始化,比如将内核时钟调节至72MHz,设置GPIO端口、中断优先级、波特率,以及开启1号串口。

②在这里我们建立了一个主任务 App_TaskStart。
实在我们可以将所有的任务都放在 main函数中建立,但是为了看起来简洁,我们将其他任务放在App_TaskStart中建立。

此后是其他任务的建立:

static void App_TaskStart(void p_arg)

{ (void) p_arg;

①OS_CPU_SysTickInit();//初始化ucos时钟节拍

#if (OS_TASK_STAT_EN > 0) //使能ucos的统计任务

OSStatInit(); //----统计任务初始化函数

#endif

App_TaskCreate();//建立其他的任务

②while (1) //1秒一次循环

{ OSTimeDlyHMSM(0, 0,1, 0); }

}

static void App_TaskCreate(void)

{ ///////////创建任务

OSTaskCreate(AppVoiceControl,NULL,//数字音量电位器调节音量任务

(OS_STK)&VoiceStk[VoiceTASK_STK_SIZE-1],Task_ControlVoice_PRIO);

OSTaskCreate(AppRader,NULL, //超声波测距模块任务

(OS_STK)&RaderStk[RaderTASK_STK_SIZE-1],Task_Rader_PRIO);

OSTaskCreate(AppLedIndicate,NULL,//LED指示灯任务

(OS_STK)&LedIndicateStk[LedIndicate_STK_SIZE-1],Task_LedIndicate_PRIO);

OSTaskCreate(AppPWM,NULL, //PWM掌握LED亮度任务

(OS_STK)&PWM_IndicateStk[PWM_STK_SIZE-1],Task_PWM_PRIO);

pmailDistance=OSMboxCreate(NULL); //////////////// 创建邮箱

}

①如果操作系统要正常进行任务调度等事情,就必须供应一个稳定的时钟滴答。
以前我们常常用芯片的Timer,现在我们有了更方便的定时器——SysTick Timer。
此 Timer 直接建在Coretex-M3内部,与内核共用一条时钟旗子暗记,是专门为加入操作系统而生的。

②实际上App_TaskStart任务只需运行一次,不能不断地创建任务,因此才加入一条循环程序,并且每秒运行一次。

至于任务间如何通信、各任务如何事情,由于代码量比较大,就不列出来了,其事情流程参照图2.8可以理解。

硬件事理与制作过程

1. 音量掌握模块

我们以FM62429作为音量掌握模块的核心器件,其事理图如图2.11所示。

要掌握 FM62429,我们须要两根线:数据线(DATA)和时钟线(CLOCK)。
其时序如图2.12所示。
数据位有10位,如图2.13所示,个中D0和D1位为声道选择位。
当D1为0时,双通道同时修正。
当D1为1时,若D0为0,只修正通道1;若D0为1,只修正通道2。
D2~D10为音量掌握位,由于音量衰减与数据值递增无关,因此只能查阅其数据手册来得到数据与音量的关系。

图2.11 FM62429 事理图

图2.12 FM62429的时序

末了先容一下制作时须要把稳的地方。
从事理图可见,并没有几个元器件,因此制作难度并不大,但是要特殊把稳滋扰。
由于在音量掌握级上只要有很小的滋扰,经由放大器的放大后,就会发出很大的噪声。
首先要过滤来自电源的滋扰,在这里我用了大容量电解电容和小瓷片电容并联的办法。
其余还要把稳线路的布局,如图2.14所示。
除了要看起来都雅、有序外,还要把稳仿照旗子暗记线要只管即便短。
末了,由于我们采取模块化的设计,模块之间的仿照旗子暗记连线最好不要用普通的杜邦线,而是利用3芯屏蔽导线。

图2.13 FM62429的数据位

图2.14 线路的布局

2. 超声波传感器

我利用的是深圳捷深公司设计的HR40超声波模块(见图2.2)。
它共有4根引脚:VCC为5V电源,GND为地线,TRIG为触发掌握旗子暗记输入,ECHO为回响旗子暗记输出。

其基本事情事理如下:用TRIG触发测距,保持最少10μs的高电平旗子暗记。
模块自动发送8个40kHz的方波,检测是否有旗子暗记返回。
若有旗子暗记返回,则通过I/O口ECHO输出一个高电平,高电平持续的韶光便是超声波从发射到返回的韶光。
间隔=(高电平时间×声速)/2。

由于我们测的间隔比较近,在实际编程中,以毫米为单位。
又由于芯片定时计数器的捕获时钟设为1ms,这样,只要将测到的韶光值乘以0.17即可。

3. 其他

功率放大模块可以低廉甜头,也可以购买现成的,不过最好买单电源供电的,这样电平匹配会大略点。
最小系统板选用雁凌YL-8。
各个模块的硬件连接方法如图2.15所示。

图2.15 各个模块的硬件连接方法

4. 组装

外壳可以购买现成的机壳,我用的是一尺寸为20cm(长)×15.5cm(宽)×6.5cm(高)的白色塑料外壳,如图2.16所示。
当然,如果用金属外壳,屏蔽效果会更好。
如果你没有买到得当的外壳,也可以用大一点的塑料餐盒或者纸质包装盒。

我们先要用一个大一点的万用板来连接各个模块,完成后就可以安装在机壳内了。
由于外壳底部有很多螺丝孔,因此很随意马虎固定在外壳上。
在外壳背面,再用电钻钻一个孔,用来连接电源线及数据线。

最麻烦的要数固定测距模块和LED了。
准备一套AB胶用来固定。
由于这种外壳的前后面板可以从槽内抽出,钻孔又方便了一些。
抽出前面板后,丈量好超声波发射和吸收元件间的间隔,然后打孔。
我在这里碰着一个小麻烦——最大的钻头直径为10mm,而元件的直径为20mm,因此只能用刀片来扩孔。
当两个超声波探头恰好能通过孔露在表面时,就大功告成啦,如图2.17所示。
然后钻LED的孔,一共有5个,由于有得当的钻头,以是这一步是很轻松的,只是要把稳顺序不要接错(LED从右往左依次为LED1到LED5),个中LED1兼作电源开关和音量开关的开启指示灯。
这统统事情完成后,我们就可以舒畅地坐在椅子上“远程”掌握我们的音响啦!

图2.16 准备一个外壳来容纳部件

图2.17 在前面板上固定好测距模块和LED

二维手势掌握体感音响大升级

前面向大家先容了一维办法的体感音响,它的升级版不但可以感应得手间隔传感器的远近,还能探测出水平偏移(即手在音箱的左侧、右侧还是中间位置)。
现在让我先容一下它吧!

在先容它的事理之前,我先讲一下如何利用它。

开启/关闭电源:电路板旁边各有一个超声波传感器(见图2.18),准确地说,是两个吸收模块。
让你的手心对着电路板,然后从左到右移动,把稳手到电路板的间隔不要超过30mm,这时你会看到最底下那一排(5个)LED也从左向右随着你手的移动而依次亮了起来。
当LED全部都亮了之后,手再从右向左移动,这时LED又随着手势从右向左依次熄灭。
当LED全都熄灭大约1s后,你会听到轻微的“哒”的一声,这是继电器接通,电磁铁触点打仗时的声音,也表明电源开启了。
当你想关闭电源时,很大略,重复一次上面的动作就行啦!

图2.18 顶板

音量掌握:掌握音量要有一个条件,那便是电源须要处于开启状态。
电源开启后,手从右向左,再从左向右(这和开启/关闭电源时的动作相反),会见告微掌握器启动音量掌握程序。
现在手不要急着离开,正对着右侧的传感器,你会创造当你的手前后移动时,右侧的一排LED也根据间隔的不同而点亮不同的数目。
如果正在播放音乐,你会听到其音量随着间隔的变远而减小。
当调到适宜的音量,连续让手水平向右移,到一定的间隔后,右侧LED溘然全部熄灭,音量就会“定格”在那里。

经由我的先容,你一定迫不及待地想知道其事情事理,并亲手制作一台了吧?不要焦急,我会详细讲解的,不只是事情事理,还会包含在实验过程中可能碰着的问题。
这些都是本人的亲自经历,独家秘笈哦。

升级版硬件

升级版体感音响的材料基本和初版的一样,只是多了两个吸收传感器模块(见图2.19)。
如果不想全部自己设计硬件,在网上买现成的模块也是一个很好的选择。
实在我比较推举这种方案,由于我们的重点在于软件,而硬件方面在技能上是很成熟的,没必要做一些重复性的事情。
当然,如果是为了学习硬件方面的知识,那便是另一回事啦。

图2.19 升级版体感音响的构成

虽然材料没有多用很多,但是全体系统的布局比较于初版有了很大的变革。
一是为了适应二维掌握的分外性,二来也大大提高了抗滋扰能力,并降落了功率放大器的噪声。
详细设计如下:首先,我利用了两片比较大(大概是10cm×15cm)的万用板,顶板用来安装指示灯电路和超声波发射、吸收模块,底板则包含了全体系统的核心电路,包括数字音量掌握电路、电源掌握电路、功率放大模块以及微掌握器模块(见图2.20)。
顶板与底板的连接是这样的,发射模块及吸收模块利用自带的排线连接,而考虑到LED指示电路须要的连线比较多,就直接用长一点的单排针来连接了(见图2.21)。

图2.20 底板

图2.21 LED 指示电路用长一点的单排针来连接

其余,还须要提醒两点:一是在线路排布上,由于涉及的元器件比较多,连线难免会搭在一起(见图2.22),一定要把稳绝缘。
我就碰着过下面这样的问题:在组装电源掌握电路时,考虑到电路很大略,只有一个三极管、一个电阻、一个继电器,因此就直接用元器件引脚多出来的部分来连接,但我当时没有把稳到,在焊接时引脚会很热,结果恰好熔化了阁下的赤色塑料绝缘导线,从而造成了三极管基极和VDD之间短路。
这个短路确实很“坑爹”,由于引脚导线很细,而且其温度又不至于使塑料绝缘体冒烟,结果两秒钟可以办理的问题,我花了好几个小时才办理。
看来搞硬件的个个都要粗中有细才行。

图2.22 连线难免会搭在一起,一定要把稳绝缘

二是关于数字地与仿照地,如果处理不好,很随意马虎导致数字电路事情不稳定,仿照电路涌现很大噪声。
这在初版时没有考虑严密,当扬声器接到放大器的输出端时总能听到很讨厌的噪声。
为了避免以上情形,首先要用电感隔离数字地和仿照地。
其余大家都比较喜好用电脑的USB供电,但最好外接电源,由于打算机的音频插孔的地线也是来自打算机,这会造成数字和仿照电平不一致,带来很大滋扰。

升级版软件

下面结合图2.23来先容一下基本事理。
首先,发射器发射一束声波,经由一定的韶光,超声波就会反弹回左、右吸收器,这时我们便可打算脱手与传感器的间隔,根据其旗子暗记强弱以及左、右吸收器吸收到间隔的差值打算出水平偏移。

图2.23 基本事理

虽说事理讲起来很大略,但现实总是会和空想有一定差距,如果没有奥妙的办法,是很难实现的。
下面我就还原一下“现场”,把碰着的问题与办理方法详细地讲一讲。

1. 最初的设想——间隔打算法

最主要的要算是算法设计与选择了。
我一开始利用的是三角形事理,算法繁芜,打算量很大。
我当时是这样想的:在图2.23中把两吸收器间的间隔算作三角形的底边,把目标物体算作是顶角,左/右侧吸收器测出三角形的左/右边。
由于3边长度都知道了,根据海伦公式便可知其面积s:

,个中p=(a+b+c)/2。
a、b、c为各边边长。
由h=2s/c(底边长)可知高。
从图2.24中可以看到,全体大三角形被高分成了左、右两个小直角三角形。
以左侧小三角形为例,由勾股定理可知

,末了用底边长a4的1/2减去a3即得脱手到两吸收器中线的偏移a5。

图2.24 间隔打算法事理图

在设计之初,我为想出这种方法愉快得不得了,可是真正运用到实践中时,麻烦就来了。
首先便是芯片的打算能力的问题。
从海伦公式中可看出,不但要打算出二次方根,还要连续做3次乘法运算,数值轻微大一点,就溢出了。
我一开始测试时,结果总是零,查了良久,末了才创造是由于数值太大,程序“罢工”了。
事实上,纵然降落精度,末了得到的结果也是相称不稳定的,由于手本身是一个不规则物体,而且还在不断运动。

2. 旗子暗记强度检测法

我研究了将近一个星期,还是没搞定,眼看操持就要泡汤了,末了终于想到了另一个方法——既然间隔打算法弗成,那就用旗子暗记强度检测法。
这个方法非常靠近蝙蝠的定位事理,由于蝙蝠的大脑没有那么快的处理速率,不可能打算出物体的间隔。
这个方法的事理非常大略:首先,发射器发射出一束超声波,请把稳,这束超声波在同一水平面内,越靠近中轴线的位置,旗子暗记强度越大。
碰着手后反射的声波也同样如此(见图2.25)。
如果手向左侧水平移动,左侧吸收器接到的旗子暗记强度就会更强。
根据两传感器的强度差即可知道偏移量。

图2.25 旗子暗记强度检测法事理图

以上方法虽然在软件上很随意马虎实现,但在硬件上比较难实现,由于市情上大多数超声波吸收模块都因此电平高低来触发处理器的Timer,并不能指示旗子暗记强度。
难道我们真的要重新设计吸收器吗?有没有替代方案呢?答案是肯定的。
有很多吸收模块都可以通过数字旗子暗记掌握放大电路的增益,我们虽然不能直接得到旗子暗记强度,但可以间接测得。

同样请看图2.24,当左、右两吸收器的增益很大时都能收到旗子暗记,只管右侧的吸收器间隔目标物更远一点,但还不至于使旗子暗记衰减到收不到的程度。
现在我们同步降落两个吸收器的增益,直到左侧传感器恰好能够触发处理器的Timer,由于两吸收模块的放大倍数本身就小,而且右侧旗子暗记强度又比左侧弱很多,显然右侧吸收器不会触发处理器的Timer。
如果手水平移动到中间,两传感器则会同时有或无旗子暗记;而移动到右边,情形就和左边相反了。
这样,通过旗子暗记的有无,我们就间接地知道了手的水平位置。
事实上,我们还可以根据此事理起到“无关物体过滤”功能。
如果波是从身体反射过来的,那么旗子暗记强度会大于同间隔时从手反射过来的声波。
“原来用800倍的放大倍数就没反射旗子暗记,现在同样间隔用500倍的放大倍数仍旧还没有,一定是无关物体,”我们可以让处理器这样“想”。

3. 两种方法的结合

在实际的代码中,我将旗子暗记的有无,即偏移值分为5类情形,并对应地接上了5个LED来显示(图2.18中最下边那一排便是)。

LED1亮:手处于最左边,左吸收器能收到,但右吸收器收不到。

LED2亮:手处于最右边,左吸收器收不到,但右吸收器能收到。

LED3亮:手处于中间位置,两吸收器均能收到,且间隔基本相等。

LED4亮:手处于中间偏左位置,两吸收器均能收到,但左边收到旗子暗记的韶光更短。

LED5亮:手处于中间偏右位置,两吸收器均能收到,但右边收到旗子暗记的韶光更短。

事实上还有一个隐含状态——旁边两边都没有收到旗子暗记,这样就没法探测手势啦,不过它可以帮助我们关闭音量掌握程序。

这样看来,我们既利用了间隔打算法,又利用了旗子暗记强度检测法——鱼和熊掌并不总是不可兼得的哦。

4. 音量掌握算法的设计

在完成了水平位置的探测后,我们就可以通过手势来开关音响的电源了。
不过这还不足,由于我们常常须要调节音量。
我是这样设计音量掌握算法的:以手到传感器的间隔变革来掌握音量,当间隔变近时,音量变小,反过来则变大。

在这之前还有一个步骤,由于我们在开/关机时不能担保手的移动绝对水平,或者说探测的垂直间隔值始终不变,这会导致音量也随着变了,这并不是我们想要的。
因此我们要有一个音量掌握“开关”,当然它不必是真正的开关,而是一组程序。
其功能类似于手机的锁定键,如果手机放在口袋里,很随意马虎按下不可预知的键,加上锁定功能,就不会对误按做出反应。
不过在这里我们不用按键,只须要用手挥一挥就可以。
从左到右的手势是用来开机的,那么用于解锁的手势就从右向左吧!

当我们选好了想要的音量后,手总不能一贯留在那儿吧?手一动音量值就又变了,因此还要吧“音量掌握开关”关掉。
实在很大略,不用再设计手势了,在掌握音量时设定一个条件就可以了:当左侧传感器收不到旗子暗记,而右侧传感器能收到旗子暗记,也便是说,手在最右边时,间隔值才有效。
当我们要关闭音量程序时,接着把手往右移,直到右边的传感器也吸收不到旗子暗记,就认为关闭此段程序了。
之后只要我们不做出解锁的手势,再怎么张牙舞爪,音响也没任何反应。

以上内容我实在因此自然措辞的办法来讲解打算机措辞,由于现在的高等措辞是很靠近自然措辞的。
在实际编程中,我也是先将想法、把稳点等写在条记本上,至于画流程图、先写出伪代码之类方法,倒是基本没用过。
不过流程图对付理解整体思路确实很有帮助,末了我还是画了一个给大家参考(见图2.26)。

图2.26 程序流程图

相关文章

IT佣兵工会,数字化时代的自由职业者联盟

随着互联网的普及和全球化的推进,IT行业正经历着前所未有的变革。在这个变革的大背景下,IT佣兵工会应运而生,成为数字化时代自由职业...

智能 2024-12-28 阅读0 评论0

IT全国大赛,创新科技人才的摇篮

随着信息技术的飞速发展,我国IT行业迎来了前所未有的机遇。在这个背景下,IT全国大赛应运而生,成为了我国IT领域最具影响力的赛事之...

智能 2024-12-28 阅读0 评论0

IT创客协会,培育未来创新人才的摇篮

随着科技的飞速发展,创新已成为推动社会进步的重要动力。在这个变革的时代,培养具备创新精神和实践能力的人才显得尤为重要。在我国,IT...

智能 2024-12-28 阅读0 评论0