无人机字幕day04

day04

01-四轴飞行器-飞控端-通讯任务-数据处理思路

01-四轴飞行器-飞控端-通讯任务-数据处理思路好了,各位同学啊,那我们先梳理一下,就是咱一会儿要完成的工作啊,呃来我们进到这个飞控项目这一端啊,在这儿打开了一经。好,我们目前这个飞控端呢通讯任务里边其实只写了一个是不是接收数据的逻辑啊,对吧?当然并不是简单的接收,我们接收,同时我们做了什么操作,我们是不是做了校验呀,对吧?包括两部分,一个是针头的校验,还有一个是校验盒的校验,没错吧。哎,这是我们目前已经完成的任务,但是光照这儿肯定去做啊,我们后边还有很多多儿需要去做的。比如说举一个例子的同学,大家还记不记得,就我们前边给咱们的这个飞控制这边的定义了两个状态,一个是遥控的连接状态,还有一个是飞行器的飞行状态。没错啊,并且呢我们还有两个,是不是或者说一个吧,还有一个灯控任务,是不是跟这两个状态是密切相关的呀,对吧?我们专门给这俩状态设计了一个这样的一个显示的逻辑,对吧?有一个指示灯啊,有一个指示灯啊。好了,那目前这俩状态是不是还只有谁用了,是不是只有灯控任务用了呀,对吧?哎,那我什么时候去设置遥控状态,什么时候去设置飞机的状态?这个必须得怎么着?同学是不是得通讯任务去做呀,对吧?咱就举一个例子啊,我们以这个遥控它的连接状态和未连接为例啊,大家想想我我怎么就算是连接上了呀,是不是通讯任务?我确认我收到了数据了,那是不是就是连接上了,对不对?OK好,那我没收到数据,那是不是就没连接呀,对吧?所以说这个遥控状态的设置是由谁来呃去做的呢?或者说遥控状态的处理是由谁来做的呢?是不是应该是由咱们通讯任务来做呀,对吧?我每来一个数据,那我都要去怎么着呢?去呃呃设置一下咱们这个遥控状态啊,或者说我每来一轮循环吧,因为咱这个是不循循,不断断去集入数据啊,对吧?
如果我循环循环循环,一直循环一直收不到数据,那我就认为这个遥控现在是失联的一个状态,对吧?ok好,那我每收到只要收到数据,那我就认为这是已经连接上的一个状态,这样一来是不是才能够唉,就是利用起来咱们这个状态啊,对吧?呃,这一点要注意。好,除了它之外呢,还有下边这个飞机的状态,呃,大家应该还能想起来吧。我之前给这个飞机一共定了四个状态啊,分别是空闲呃,normal还有fixtime,还有fault对吧?这几个状态分别代表什么含义?我们再来回顾一下啊,呃空闲状态呢,指的是咱那个是不是遥控油门解锁之前的状态啊,对吧?大家之前测试的时候也都知道有这回事儿啊,得解锁其实为了安全嘛,对吧?解锁之前处于空闲,不管这个遥控有没有连接下滑?同学只要你解锁之前的状态,那我这儿是不是都是挨do啊,对吧?哎,空闲,因为你你推那个油门啥的,它也不走嘛,对吧?这就是空闲啊。好了,那什么时候进入这个第二一个所谓的normal状态呢?遥控解锁之后就进入工作状态了,因为你开始工作了嘛,对吧?这个时候你推油门它是不是就该该飞了呀,对吧?哎,这一点要注意。好,然后再有呢就是定高什么时候定高呢?
按照我们目前的逻辑,是不是只要遥控端摁一下右上角那个按键短按一下是不是就是定高啊,对吧?往这边发个数据,那这个时候咱们就得进入定高状态了。哎,好了,那再往下进行故障状态,什么时候故障的,比如说遥控失联了,对吧?一会儿这个咱们能模拟出来啊,比如说我那个飞机,我现在正在连接的一个状态正在飞着呢。完了之后呢,我把这个呃我把飞机,我把遥控直接关机了,咱们能能能模拟拟这个现象,对吧?这样一来是不是肯定会失联,对吧?失联之后,我要进入故障状态。唉,好了,那大家想想你吧,就是这个飞机状态设设置,对,不是也得由通讯任务来完成。这时候大家想想是不是这么回事,肯定是啊,因为你这里边的状态切换,其实都跟遥控发过来的数据是不是密切相关呀,对吧?咱就举个最简单的例子定完成对吧?您是那发个定高信号,我才能切到定高状态,包括解锁也是一样的解锁其实是根据遥控那边发过来的什么信号去解锁的呀?你看咱咱解锁那个逻辑,咱之前应该都解过锁,怎么解的,是不是油门我先推到最高待一会儿,然后再拉到最低待一会儿,是不是才会进入到解锁状态啊,对吧?所以你进入解锁状态,或者进入这个所谓的正常工作模式。好,这是根据什么?根据你遥控发轮的油门数据去进行判断的。总之啊就是飞机状态的切换,也是需要由哎通讯任务来完成的。它需要根据收到的数据来进行这个飞机状态的判断。然后进行设置设置完之后呢,我灯控任务这边是不是自然而然就会显示对应的这个灯的一个状态啊,对吧?哎,就是这么个逻辑。好,所以咱接下来要做的就是这些事儿。哎,当然还有一个事儿忘了说了关机,我们关机命令是不是现在还没还没实现它的逻辑啊,对吧?哎,好,收到关机命令之后,我要干什么?这个事儿是不是也得落实啊?同学哎,好了,各位。那至此呢就给大家把这块的内容介绍完毕了,这就是我接下来来做的一一核核心的务务。好,这是处接收到的这个数据。唉,好了,同学这块做完了之后,大再说,我们就可以做啥的呀,是不是就可以去做这个非控的任务了呀,对吧?你想啊呃遥控发出来的数据,我处理完了,对吧?我设置好了,遥控状态了,我设计好了飞机状态了。那当然了,这个解析数据的这个事儿,咱是不是已经做完了呀,对吧?就是我已经把这个什么呃油门啊,俯仰恒滚偏航,这些东西已经给它设置到权局变量上了。那到时候飞控是不是就可以从这里边读?读完之后呢,去根据你比如说根据油门去设置我这个电极的状态是不是大概应该能这么做了呀,对吧?哎,好了啊,这个具体坐会儿咱们再慢慢来吧。呃,这个非控任务是最核心的,也是最复杂的一个任务啊。行了呃,先把这个任务咱们梳理完,梳理完之后,咱就开始实现啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

02-四轴飞行器-飞控端-通讯任务-无线通讯不稳定问题说明

02-四轴飞行器-飞控端-通讯任务-无线通讯不稳定问题说明哎,好了,各位同学,那接下来呢咱们就正式开始去做一下咱这个呃呃就是非控项目的这个通讯任务的数据处理的逻辑啊。好了,开始呃,先找一下咱之前的项目啊,找到pronect。那这块呢我们应该打开,谁,是不是应该打开这个flight呀,对吧?给打开啊,打开之后呢,我把这个项目打开,大家稍等一下。好,我把无关的内容先全部关闭啊。好,关闭之后呢,接下来咱就开始了啊。呃,开始之前呢,我们老规矩还是先测试一下,就是看看咱这个数据,目前它呃能不能顺利的接收到,看看目前还正不正常啊,一会儿有问题,咱们还得调整。呃,为啥呢?因为如果你这个就是数据二点四g的无线通讯,你这块儿还不能保证呢?那你后边你处理数据的逻辑是不是肯定是实现不了的呀,对吧?所以大家在做这部分之前,一定要确保自己的二点四g无线通讯,这个是没有问题的啊,来这边拿过来,然后呢我给它捎录进去啊,嗯大家稍等一下,稍等一下啊。呃这边呢我们随便打开一个文件啊SRC慢点儿c愿意。嗯嗯,好,我们刷录行。那现在这个呃飞机的这个数据已经捎进去了啊,然后呢我再把这个遥控的也重新捎一下。因为呃因为昨天备课嘛,烧过其他的程序啊,就是大家得稍等一下。嗯,自己人呃来这边编译重新放入啊,我这遥控又出问题了,我还得重启一下,大家那个遥控没有这个问题是吧?我看同学说行OK那我这边呢两两两侧就都已经那个OK了啊。呃,完事之后呢,接下来咱们去做一下这个实际的这个测试,看看能不能正确的收到咱这个数据啊,呃目前这什么意意?哎,目前我我这边是不是在福瑞RQStask里边,就咱那个通讯任务那块是不是会打印咱们收到的这些数据啊,对吧?会打印啊,那所以接下来我们打开这个窗口助手,完了之后看能不能收到啊。呃,好,我给大家把这个摄像头打开嗯嗯嗯,行摄像头已经打开了啊,打开摄像头了。完事完事往往往这边放一放,大家时刻看着他啊,然后我一会儿把遥控也放过来。呃,注意观察同学。目前我这个遥控,还有这个无人机,其实目前都是一个开机的一个状态,对吧?但是目前你会发现我我刚才烧进之后,是不是它收不到数据啊,对吧啊?OK好,那确实经过实际的测试发现,确实就是你第一次烧进去之后呢,它其实偶尔也能立即收到数据啊。OK但是这个呢就是呃不敢确定,不敢确定啊。所以说这个时候咱们怎么保证他收到数据呢?这个烧完之后,如果收不到,你把这个就是无人机这边呢?这个插头呢重新给它拔插一下OK你会发现他现在是不是就能收到数据了呀,对吧?OK但是呢就是你有时候你重新插拔一下之后,你会发现它也是不到数据,就是这个事儿,你看是不是也是会卡在这个位置啊,对吧?这个其实那天那天晚上其实也给大家分析了一下,这个其实是怎么一回事儿呢?就是考虑到啊,就是咱们这个怎么机这边它是怎么怎么一回事,我再给大家明确一下啊,就是是之呃我就不带大家去看那个原理图了。如果去看的话呢,你会发现咱是咱的供电系统是这样的一个逻辑,就是这是咱的电池,对吧?呃,OK比如说这咱电池,我写一个bbattery啊。好了,那完了之后呢,这个电池直接连到了谁呢?是不是连到了咱们那个IP五三零五t那个电源芯片呀,对吧?OK好,那完了之后呢,呃,咱的那个就是这个插头插头是不是也会提供这个?USB供电啊,对吧?好,这个插头的供电啊,注意它只会给到谁同学,它只会给到是不是这个电源芯片呀?它只会给到电源芯片的充电输入啊。OK好了,那完了之后,这个电池是不是相当于是连接的?这个相当于是充电的一个输出啊,对吧?啊,OK好,它它是这么一个逻辑,这是咱的一个USB啊OK好,那完了之后,我们整个这个板子除了电机啊,电机是不是直接连接电池?我们前面讲过,对吧?那其他的这个设备呢,其实都是通过谁通过这个IP五三零五t输出的这个呃这个这个电源去进行工作的啊,当然不是说直接用IP五三零五t输出的电源。那它它它它这输出的是五伏,对不对?那我们这些芯片其实都是三点三伏的一个工作状态啊,所以说这边还接了一个什么呢?
一个线性稳压器是不是接了一个LDO啊,对吧?好,完了之后,这个东西再去连接我们的这个MCO包括其他的一些东西。哎,它是这么一个逻辑啊啊OK包括什么SL四零呃,咱们那个无线通讯通讯的芯片,其实都是都是这么来的。大家能理解这个事儿吧。哎,好了,那所以说呃当我们像就是咱这个呃MCU去烧数据的时候,它是怎么一回事呢?
就是我我我这块也是也是猜测啊,就是说呃当我们去烧录程序的时候,大家都知道这个MCU它是不是肯定是会重启的呀呀?没错,同学OK好,它重启同学。那你想一想它会不会影响到就是咱们这个IP五三零五t这个芯片的工作,它不会它一直都有电,对吧?因为什么?因为它是不是连接着电池的呀?它连着电池的啊OK好,那所以它一直工作,那是不是它这个输出呃,就是它往LCU这边是不是也是一直有输出的呀,对吧?有输出的,你像我们这个SI二四呃呃r幺就是咱们这个无线通信的芯片,它是不是它论上也会正常的这个工作作呀,是是这样的啊。
OK好了,那完了之后呢呃它呃工作着,然后保持着之前的状态。我们这个MCU呢它怎么着呢?重启启所所呃,并且咱们应该还记得吧,就是这个SI二四二幺,它有一个有一个CE引角带,还记得吧,是不是有一个使棱眼角啊,矢灯眼角它是不是高电瓶,是有效的,低电平是无效的呀,对吧?OK就有可能是说哎,我们这个FCU它重启了之后,就是这个它是不是那个CE眼角就会被垃圾或者怎么着啊,对吧?总之这块会导致这个SI二四零幺它不能正常的工作啊,所以说你每次烧录进去之后,你就发现它就收不到这个遥控的数据了。哎,但是你给它呃插拔一下之后呢,有时候它就能够是不是收到数据了呀,对吧?OK好,那这个插拔一下,有时候能收到数据,这个其实也不是特别的稳定,有时候还是可能收不到,对不对啊,那之前给大家测了,怎么着就能确保它能收到数据了呢?
就是我们把这个电池给它拔了,电池拔了,也就是这块儿是不是给它断开呀,对吧?好,完了之后呢,我USB进行插拔,那这样保证它是能够收到数据的。OK好,那这这这个是怎么一回事呢?呃,可能是因为什么呢?就是如果我们带着电池去插拔这个USB的话,我觉得这个IP零三零五t它可能就是它输出的这个电源啊,它输出的电电源可能会有一个可能会有一个波动。
就是我想的是啊,就是因为它是工作在充电宝上的嘛,大家想想啊,充电宝那边它的使用逻辑应该是啥呢?就是你给这个呃,就是我个子么?同同学就是这咱咱个充电宝,对不对?这边你给充充电这边呢,他往外这个呃这个输出输,也就是它的充电和放电,是不是同时工同时插着呀,对吧?好,完了之后它内部是不是有电池啊,对吧?哎,大家想想,如果说我这边插上USB了,那它还会就是让这个电池作为咱们这个电源的输出嘛,可能就不会了。他可能直接是不是利用这个USB供电,是不是就是作为输出了呀,对吧?哎,它它可能是这么一个逻逻辑啊,也就是说这边你插拔这个UIB的时候带着电池的话,那它实际上内部可能会做一个电源切换,就会导致我们这儿的输出会有一个波动。呃,这个波动呢就是也可能会导致我们这个呃就是SL四二幺,就是它的一个工作的不稳定。呃,也就是说有时候你插拔就是它它就会出现这个问题啊啊,最终最终发现了怎么着就一定能够好使了。就是我们把这个谁,我们把这个电池给断了,电池断了之后呢,那你每次重新这个插拔USB。
大家想想那它一定是怎么着的,它一定是会让这个IP五三零五t断电的对吧?然后整个是不是系统就全部重启了呀,对吧?那全部重启之后,那实际上你会发现它是能够正常工作啊,这个就没啥问题啊OK好,所以说大家呢你要是在测试的话,如果不行,就按照我说的,你把这个把它拔了,把它拔了。拔了之后呢呃,把把把把这个电池拔了。拔了之后,如果收不到,你就把这个东西再重新插拔一下这个保证证,能够够能够能够收到的啊,就是这个大家稍微的注意一下这个事就行了啊。好,那理论上啊,同学那将来我们在实际去就是真正的处在工作状态的时候啊,咱不可能是不是通过USB供电啊,对吧?我们肯定是直接是不是使用这个电池供电使用它供电的话是不是理论上就不会出现这个所谓的就是一个电源的一个切换呀,对吧?啊,所以这个应该是能够正常工作的啊,这一点大家注意一下就行了。哎,好了,各位啊,那这实际上呢就是咱们这儿的一个呃处理逻辑啊,就是大家注意就行了啊,行,我再把这个视频停。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

03-四轴飞行器-飞控端-通讯任务-处理遥控连接状态

03-四轴飞行器-飞控端-通讯任务-处理遥控连接状态哎,好了,各位同学呃,接下来咱们继续往下进行,下面咱们要做的工作应该是什么呢?
是不是就是按照我们的分析去做这个相应的处理了呀,对吧?哎,好,咱这样同学呃,我们先去处理一下什么呢?
呃,你看就是这是我们目前这个写写的这个这个这个这个呃通讯任务的一个逻辑,对不对?那接下来还先去处理啥呢?比如说我们先去处理一下这个遥控的连接状态吧。呃,为什么先处理它呢?呃,因为呃处理了连接状态之后,我们就能够清楚的根据,是不是我这个板子上的LED来判断出我当前这个遥控有没有连接上?就是说白了,我这个数据有没有正确的发过去啊,对吧?完事之后,我们再去处理理机机,令令再设设置一机这个个状态。那这样一来,到时候比如举例子啊,你会发现你发现你的关机命令一直不好用,或者你发现我设置那个飞行状态也一直不起不起作用,对吧?这个事儿就是你是不是就能根据你那个灯看出来,你这个遥控到底有没有连上数据有没有发过去啊,对吧?呃,就是方便咱们定位一下,说白了就是啊来来我们现在呢先去实现一下,就是遥控的连接状态的设置啊,呃来先明确一下,就是咱这个遥控的连接状态,咱们怎么定义啊?就是其实大家也可以想一想啊,怎么就算连接上了,是不是只要我成功的收到了一个数据包,那就是连接上了呀,对吧?嗯,哎,那怎么就算是断开了呢?是只要我有一个没收到,那我就是断开的吗?这样有点太太苛刻了,为什么我给大家解释一下这个同学。呃,首先同学咱这个commontask,它是不是在一直循环不断的去执行啊,对吧?好,那我们那边就是谁呢?就是咱那个发送端遥控端啊,其实也是在一直不断的往这边发数据的。咱们其实并不能保证啊,就是我commontask里边每轮循环,也就是你每次去调这个他都能收到遥控那边的数据,你不能保证这一点,为什么?
因为是不是这个发送和接收,他俩可能并不是同步的呀。同学就是他可能是不是说这个发一个之后,我这边立即就收到这个发一个,这个就收到他俩不是同步的,能理解这个事儿吧。同学他可能是什么样的呢?呃,可能是我这次循环的时候OK那边还没发过来呢,对吧?
等呃,然后呢,等你这个等你下次循环的时候,对吧?这边可能就发过来了,我是不是才能收到,对吧?吧的可能并不是同步的,也就是说我这个方法他应该是偶尔可能会返返回个个么?是不是可可能返返回一个fse的呀,对吧?这一点大家要注意一下这个事儿啊OK那所以说呢同学咱们不能这么简单的判断,不能说哎,我这个等于处,我不能说我收到数据了,那我就立即把那个遥控状态设为连接,然后呃只要一收不到,那我就设为呃状态连接了。呃,这个条件太苛刻了啊,所以咱这怎么设,我们这样规定啊?同学就是如果说我这儿收到了,其实收到了,那肯定是连接上了,你能收到是不是肯定是连接上了?同学,所以说我们的逻辑是只要收到了,那我就把遥控的这个连接状态设为已连接好,那什么时候设为未连接呢?哎,OK好,如果连续比如说两百毫秒或者是连续三百毫秒,五百毫秒。我没收到数据。这个时候我才认为它是失联了,能能理解我这个意思吧。同学哎,ok好,这是我们的判断逻辑啊。好,所以接下来呢咱们就按照这个思路去写一下啊。呃为了让这个代码的结构清晰一点啊,我就把这个都删掉了啊。同学啊,完了之后呢,咱们怎么着?完了之后呢,我们就把这个东西咱们单独的声明一个方法吧。来我们在哪儿?我们还是在是不是APPcommon这个呃这个communication这个文件里边啊,对吧?这是通讯相关的嘛,我们在这里边声明一个方法在这儿去处理这个相应的逻辑啊。好,那现在咱们就开始写呗,呃,具体怎么处理,各位同学怎么着啊,具体怎么着?
那我写一下啊,应该是word,咱写个名字啊,所以APP后边我叫做COMM后边咱叫啥呢?叫做就叫HANDLE这个给我提示的呃,还挺准status啊。好,那这个叫什么呢?叫做handleremotestatus。大家知道我这个remotesttes指的是谁吧,指的是不是就是我们前面定义好的这个全局变量啊,对吧?就是handle它嘛,对吧?就是处理它啊。OK好,那接下来呢我们往下进行。大家想想啊,你说我这里边呢应该接收什么样的参数?就是说我们一会儿调用它的时候呃,要给它传什么样的参数。这个大家想想啊,大家想想,咱先说这个方法的逻辑是什么吧?我是不是应该根据我当前有没有收到数据来判断我的连接状态完事之后呢,去改谁去改这个全局变量的值啊?应该是这么一个思路,对不对?所以大家想想,你说咱们在这个位置去调刚才那个方法的时候得给它传进谁去。首先别的不说前面那个全局变量的指针是不是得传进去?嗯,你不转我怎么设置啊,对吧?哎,好,这是一个啊,那还需不需要其他的参数了,需要对吧?那根据我刚才的呃呃这个说明啊,就是我们判断这个连没连接上,是不是完全取决于你这儿有没有刷到数据啊,对吧,是不是应该把这个返回值给它关进来,能理解这个事吧。同学OK好,所以接下来呢我们就把这俩参数呢给它定义上啊。首先我们第一个common呃,COM对吧?statusOK好,那这个叫做EREECIVEEDisreceived就是是否收到数据了,能理解这个事儿吧。哎,好,那接下来呢还有第个一个对吧,是不?刚才咱们提到的那个remotestatus啊,对吧?这个咱们要啥,咱要有一个指针,是不是就可以了?同学哎,好了啊,那这就是我们这目前声明出来的两个方这个方法的两个参数啊。好,这样我们先给它啊定义在这个定义。好,然后呢我们去调一下它啊,这个调的话是不是就在我们刚刚的这个位置,在这儿去调就行了呀,对吧?在那写一下啊,写下注释我们这分几步。首先第一步这是在干啥?是不是在接收数据啊,对吧?来,我们写一下啊,接收数据呃,收啊数据。哎,好了,这个完事儿完事之后,接下来我们再往下走啊,这边我们来个啥呢?这边来一个是不是就是处理那个遥控的连接状态啊?对吧啊遥控哎,连接状态,哎,好,那处理连接状态是不是就得调我们刚刚自己声明的这个方法了呀,对吧?好,按照分析,我应该给它传俩参数。一个是啥?一个就是它这这个咱改个名字,我叫做RECEIVEDisreceive的,对不对?就是是否收到数据嘛,对吧?嗯,OK大家还记得咱这个receive的逻辑吧,是不是收到了我就会返回OK对吧?
否则是不是返回errr对吧?哎,好了,那所以接下来呢我们就往下进行啊。好,我应该直接把它给它放进去啊,完了之后呢,再把谁再把上边的那个remote是不是status的指针给它传进去,方便它进行设置啊,对吧?
哎,好,就是这么个思路啊OK那现在我们点进来去实现这个方法来吧。
同学开始嗯来我们先规定一下它的功能啊,同学嗯,好,这是干啥处理遥控的这个连接状态,对不对?ok好,那我们刚才呃这个这个这个这个参数呃,行,他给提示了,那就是按他提示来啊。
好,这是接收状态,就是说白了是否接收到数据对吧?第二个是遥控状态的一个指针啊。好,那先说一下,就是咱这块儿判断的具体逻辑啊,逻辑是什么?
是不是只要收到数据,ok那就应该是怎么着呢?那我们就认为他怎么着了,是不就就认为认为是不是连接上了呀,对吧?哎,认为这个连接成功呃,成功?哎,好,那怎么就算它连接失败了,同学是不是呃,咱们得持续一段时间。举个例子啊,比如说我就认为是两百毫秒OK那未收到数据就是一直两百毫秒内一直都未收到数据啊,那我们就认为它是是不是断开连接了呀,对吧?这是我们的思路啊OK好,那接下来呢咱们就按照这个思路去写一下啊,同学当然两百毫秒还是还是一秒还是五百毫秒?这个咱自己说了算啊。好,那接着往下走,同学,看看这块儿怎么写,呃,是不是说白了,主要是根据它进行判断吧。同学OK好,那行,我就开始了啊,只要收到数据就认为是连接成功。所以说我这儿应该怎么写,是不是if一下ifisreceive,ve对不ifisreceived,它应该怎么着呢?如果它等等于OK,那就证明是不是我目前已经收到这个数据来对吧?至少目前这一轮循环是不是收到数据了,对不对?好,那收到了,我就怎么着,我就认为它连接上了,这个时候我就应该怎么着呢?是不是将remotestatus给它设置为连接状态呀,对吧?注意这块儿咱们是不是得引引用一下呀,对吧?这是一个指针啊。好了,那接下来往下进行同学,那否则呢否则怎么办?其实这个好实现,对吧?否则是不是也就是没收到啊,对吧?本轮循环没收到,那没收到,我就需要立即将其置为这个就是未连接吗?就是unconnectt的吗?咱能这么写的同学,哎,不能我刚才说了,是不是偶尔确实会有一轮循环,是收不到数据的呀?对吧?这是正常常现象,因为两两边不同步,对不对?OK所以说你直接这么写的话,就有点太激进了啊,就不太好。那所以咱不能这么写,那怎么写呢?哎,怎么写?按照我刚才说的,你得连续两百毫秒都没收到数据,我才认为你断开,所以这儿应该怎么办,就得又得计时了吧,同学是不是又得计时了,对吧?ok好,那怎么计这个时呢,怎么记这个十了?哎,好,首先咱们什么时候开始计时这个事儿,咱得想明白,同学大家说应该从什么时候开始计时啊,也是嗯第一次没收到数据就开始计时,对不对?但是但是我这怎么知道我进到这个IOS我是是一一次收收到,还是第二次没收到,因为这个方法是不是也会被循环不断的调用啊,对吧?哎,其实从哪开始记比较合适的,第一次未收到,或者说你直接让他从哪儿呢?从最后一次收到去开始计时,是不是也是不是应该是一样的道理啊?同学第一次未收到和最后一次收到是不是相差的,应该就是差一轮循环啊,对吧?这个是不是无伤大雅,对不对?ok好,那你要想让他从最后一次未收,呃,最后一次收到开始计时,那怎么做就行,能只需要怎么着,只需要在这儿,你每次收到,我就记下当前的时间,每次收到,我就记下当前的时间,能能理解这个事吧。同学这样一来实现起来我更容易一些啊,所以你看我这是怎么写的。同学啊,首先呢我在这边我先去定一个啥,我定义一个时间。
哎,注意观察,你看我定一个时间啊,定一个什么时间呢?注意呃,我这就来一个uyou,比如说三十二t吧,那OK三十二t好,那完了之后呢,我就叫做呃lastRECEIVEreceivetick。也就是说这是不是我上次收到的时间啊,同学OK好,或者说最近一次收到的时间,比如说我先让它等于零啊。好,那完了之后呢,我每次收到数据,我都要去把收到数据的时间给它记上来OK这边拿一个XX当然这个这个咱们用了,我我这要用是不是gettick那个函数啊,对吧?所以说我应该怎么着呢?我应该include的一个freeRTUS点h。然后呢我们再include一个啥,应该是task点h对吧?OK好拿过来。好,完完了之后呢,我在里边写啥,是不是就是直接xtask后边跟成一个getfreetakecount就可以啊,对吧?
哎,拿过来。好,那你注意观察,你看我是不是每次收到数据,我就会把收到数据的时间,是不是记到这边来呀?对吧?好OK接下来呢就进进入到else了。那你说else里我只只需要判断啥就行了,你只需要判断和你当前时间和你上次收到的这个时间相比,是不是差了两百毫秒了。如果是,那我们就认为它断开了,否则是不是就认为它没断开呀,对吧?
就是这么一个思路,哎,好,这个事儿就解决了。哎,就这么一个思路其实挺简单的啊。好,所以这边咱怎怎么写呢?去具体判断,哎,ifx先获取当前时间,对吧?taskget呃,taccount完之后呢,需要让它怎么着减去,是不是lastreceiveTK啊,对吧?如果大于两百毫秒。好,那这个时候呢,我就认为它断开了。好,认为它断开,其实只需要将什么将是不是remotestatus给它设置,为什么就行了?设置为是不是按connectt的就行了呀?哎,好,那这个咱们注意一下啊,这个拿过来哎,行了。哎,大家看一看这个逻辑能不能看明白呃,应该能吧。其实说白了就是这么一回事啊。首先这个方法它是一直循环不断的被调用这个事儿,咱们应该知道,对吧?好,那每调用一次,如果我目前是连接的状态,也就是这个easyreceive啊,它是OK的那我是不是相当于会实时的去更新这个最后一次收到数据的时间,对不对?OK好,那假如说某次它收不到了,确实是断开了。断开之后呢,那下次再来这个循环,是不是就进这里边来,对吧?但是你刚进来的时候,你发现这个条件它满足吗?同学不满足足满足,他是不是不会去改这个状态啊,同吧?好,那一直得等等两百毫秒之后,这个条件才会满足满足了之后,它是不是才去改这个状态,就是这么一个思路。
哎,好了,同学那呃等后边我这个遥控再连接上,你再连接上之后,这儿依次上是不就就等于receikk了,对吧?只要一等于OK,我立即是不是就将它设置为已连接的状态了,对吧?这是咱们这样的一个呃整体思路了。
好了,那这个思路就完事了,接下来呢就给大家演示一下咱们这个实际的效果,看看它怎么样啊,这个方法咱们调用了吧。好,已经调用了啊,确保它调用了啊。好,接下来我们编译,然后呢给它稍录就行。咱们看一下这个实际的效果怎么样啊,同学稍等。然后呢我们稍录好引刷进去了。那接下来来们们开开个摄摄像头,咱们去看一下,呃,注意观察同学,大家还记得吧?就是咱们那个连接状态是用哪两个灯去控制这个显示的显示来着,是不是机头那两个呀,对吧?这是天线机头,应该是应该是这俩灯,对吧?那按照我们之前定义的这个逻辑,应该是连接上了之后,这俩灯应该是常亮的,连接不上,应该是这个熄灭的一个状态,对不对?OK好,那显然目前是连接上了吗?同学没有没有没有这个咱们插拔一下啊,来我们插拔OK好,那目前还是没亮,对吧?没亮,说明它还是没有收到。OK注意观察工程,你看现在是不是确保它收到了呀,对吧?
收到了前面那俩是不是已经亮了,对不对?然后呢,我们再根据刚才咱们这个判断逻辑啊,我现在怎么着,就连就就会失联呢?我是不是把这个遥控给它关了,你看那块儿是不是就已经熄灭了同学,然后呢,我再给它打开,哎,只要一打开,那边是不是收到之后,它就它就连上了,它连上了之后就亮了呀,对吧?能能看明白这个事儿吧。同学OK好,那我再给它哎,关了,哎,那再打开再关了,再打开,再关开再打开。哎,我没关了啊,关掉,打开好,整个工作起来是不是看起来是挺正常的呀,对不对?OK好了,那接下来呢我们再继续往下进行,咱们再测试一个呃呃一一种一种使用的这个场景了,怎么着呢?注意啊,现在咱们就脱离谁了啊,就脱离咱们这个就是USB供端了,供电了,我们直接使用谁,是不是直接使用咱们当前的这个就是电池供电啊,对吧?啊,注意这个电池得插着啊。好,那接下来呢咱们模拟个这样样场景,我现在呢先开遥控按理说啊,我开了遥控之后,只要咱们这个就是飞机这边上电了,那它应该就是是不是处在一个连接上的一个状态啊,对不对?那我按一下,你会发现这个它还是是不是连接不上,我再给他开开,它,是不是还是连接不上啊?同学OK哎,这个好像跟我之前的描述是不是有点不太不太太不不太统一了呀,对吧?我前面说咱之所以有时候连不上,是是因为啥?是因为是不是我们这个USB供电和这个就是电池供电,它它它内部可能有一个切换的逻辑,导致这个工作不稳定,是不是它它连接不上,对吧?但是我目前我是不是目前是单纯的谁供电,我是单纯的,是不是电池供电呀,对吧?那电池单纯单纯电池供电,按理说你这边一开机所有东西全部重启,相当于应该是能连接上的呀。对吧?但是为什么那个灯它不亮呢?同学这个是为什么呢?这是咋回事儿呢?这个是不是有点奇怪?同学OK好,那再给大家看一个现象啊,我我我现在把这个线拔了,拔了之后,我我我现在还是就是要求它单一供电啊,你拔了之后,目前是不是就是咱直接让谁,是不是直接让USB给它供电呀,对吧?好,看看这种情况下,就是我们给它通电的时候,它能不能就是连接上啊,注意观察欧尼。嗯,你看你用它供电的时候,它是不是只要是你一上电,它就能连接上,只要是你一上电,它是不是就能连接上了,同学对不对?但是你用摇你用电池供电的时候,你发现就是你联系上之后,他他可能还是他他还是不能正常工作,对不对?嗯,现在是正常的,对不对?因为我遥控一直开着,所以这边按理说你这边只要一开机,那我就应该是连接状态,只要一开机,那我就应该是连接状态。你看现在是这个是正常的状态吧,但是电池不正常,这个是怎么一回事呢?这个我昨天其实也挺纳闷的,就是这个小问题我也找了挺久。
最后我发现啊是怎么一回事呢?其实它之所以就是有时候工作不了啊,它还是一回事呢,还是因为那个无线通信的那个芯片,它没有正常的工作,没有正常的工作。
呃,后来我怎么做就解决了这个问题呢?大家还记不记得就是我们这个无线通讯的芯片,它这是不是有一个初始化的函数,对吧?好,前面就给大家讲过这个芯片啊,它怎么着呢?就是它刚上电之后,它是不是需要等一会儿之后才会进入到它那个状态。机里边。大家还记得那张图吗?呃,咱们去看一眼吧,来咱们看一眼啊,我们找到这个呃无人机这块儿啊,找到资料,找到二点四g通讯,这个咱们看一眼应该是v一点三,对吧?咱们点开稍稍微等一下啊。好,这是不是咱那个状态机对吧?你会发现就是你上电之后是不是得等一会儿呃,它这说的是延时一百毫秒,对不对?并且还得保证什么?是不是就是你给它的电压是不是得大于一点九伏?在这种情况下,然后再延时一百毫秒,它是不是才会进入到这个后续的这个工作的一个状态呀,对吧?是这样的,我就我感觉应该是什么呢?应该就是我们使用电池供电的时候和使用USB供电的时候,就是它俩的什么呢?就是可能这个它俩的供电的能力是不一样的对吧?你使用UCB供电,我可能供电的要怎么着呢?可可能要怎么着?可能要稍微就快一点,对不对?OK它它它能够正常的一个就是快速的达到这个一点九伏啊。完了之后呢呃就是我们这个s二三呃二四二幺能够在我们这个任务启动之前,就呃就是初始化。好。呃,那你换成电池之后可能就不行了啊,是这样的啊,所以说这边最终最终我怎么去解决这个问题的啊,其实也没啥太好的办法,我就硬加延时啊,我就硬加延时,我在哪儿加的延时呢?同学在这个位置比共啥flight,这是不是咱那个其实其实之前啊,这段逻辑其实就为了等啥同学,咱们加这个所谓的自讲逻辑,一直让它在这循环,其实就是为了等什么?同学其是不是就是为了等他进入到这个正常的这个工作模式啊,对吧?因为咱们前面讲过啊,就是关断模式,下边来看一下沙车道模式。呃,是不是虽然这个收发呃模块是关闭的,但是谁是可以正常工作的呀?SPI对寄存器的读写是能够正常工作的对吧?所以之前咱们加这段逻辑,就是为了怎么着呢?检测它那个SPI有没有正常工作?如果能够正常工作了,是不是就我们就可以认为它已经顺利的进到这个就是关断模式了呀,对吧?但是我发现这个东西它好像也不太靠谱,又是啥意思呢?有可能就就说啊便说我这个SPI对读寄存器的读写能够正常工作了。
但是它这个芯片还是没有正常的初始化,就是这段逻辑呢没有起到它该有的这个效果哈。所以我最终最终怎么着呢?我直接在这硬加了一个延时啊。好,这研了怎么延的呢?比如说这边来一个vtaskdelay啊,注意我我现在是不是已经把它放到了咱们这个任务的任务里边来啊,对吧?啊,OK所以你可以用为vtask的delay啊。好,那所以这边呢我直接硬给它加了一个一百毫秒的延时,多。等一会儿这样一来就是不管你你用电池还是用那个USB供端呃,供电它都可以正常的工作了。就是说你得保证你在去设置这个接收模式之前啊,同学你得让这个电压稳定了,你得让它正确的进入到这个它的那个状态机里,那后边才能正常的工作,否则的话它是没法正常工作的,只要加上这个之后就正常。
接下来咱们可以测试一下啊。同学那现在呢我要把这个拿过来,就是这个芯片,它坑还是挺多的。首先它那个中断引脚,当时就不太好用。完了之后这块也是有点那个有点小问题啊,所以这边咱们再给它往里走,然后给它稍录一下。好,大家看这次啊,来我们打开这个这边,呃,刚才咱们是不是用电池的时候,它是不好用的呀,对吧?OK好,你看我这次我把它拔了啊,呃拔了之后,目前我遥控是不是还是一直开着的同学,对不对?然后注意观察,这是咱那俩指示灯,对吧?目前是连接的是亮的啊,然后我给它关了呃,呃,不对,不是观察,不是观察换谁呃,呃,对对,就是观察就是观察。好,你关了之后,它是不是肯定是正常,就是就是全灭了呀,对吧?现在我我用电池供电啊,电池供电,然后我开机好,大家稍等哎,你看是不是亮了,对不对?它可能慢一点,因为我那边是不是硬加了延时了呀,对吧?OK好,然后再给它关掉,然后再开好,大家说等你看是不是也能够正常的连接上啊,对吧?好,我再给它关掉,再开好,是不是也能够正常的工作了呀,对不对?所以说就是这个芯片呢,它确实有点有点坑人啊,也就是所以说咱那个就是也没啥太好的办法。呃,通过这个自检的逻辑发现也不能保证,就是说它一定能够等到它这个能够成功。所以这边咱就呃稍微用一点,这个就是问一点办法吧,咱就直接硬延时。实际上你这块要加的这个延时啊,你这个自检大家说还还还有必要做吗?同学其实也没啥太大必要了,对不对?就是你给他去了,他可能也能正常工作。咱其实也可以测测一下啊,就是之前加这个字典目的就是为了干啥,不就是为了等嘛,对吧?
就是等他这个工作正常嘛。但你果发现你这个字典的逻辑等等半天好像也不太好使啊,来我们稍微等一下啊,来拿过来之后呢,我们给他稍录一下同学啊,嗯好烧录进去。
然后呢我们还是看一下这个摄像头啊,来。那现在我们还是切换到这个就是电池供电啊,来这边咱们关了,然后再开看它能不能呃亮哎,你看是不是也亮了呀,再开哎,也也没问题,对吧?其实就是就是其实说白了就是还是得等他那个就是呃工作稳定了,其实还是跟跟什么呢?
跟人家这个状态机是有挺大关系的对吧?你得保证电压达到它的要求,完了之后还得往上是不是这么长时间之后,它才能正常工作呀,对吧?就是这么一个思路这块呢大家要注意一下就行了啊呃行了吧呃,就是其实芯片可能问题也不太大,就是我们的这个供电供电模块,其实整的就是有点不太稳定,其实是这么一回事啊呃行了。那整体来讲呢,就是咱们最终最终就是怎么保证它能够正常的这个稳定的工作啊,这边咱就还是给它加,就是加加上这个延迟就行了。为了确保它这个问题啊,咱们咱们稳妥一下,同学稍微长一点,我给他延个一百五,这个也没啥问题吧。因为这个它不不是说循环执行,是不是只执行一次啊?就是在初始化的时候执行一次,所以说咱们多等一会儿是不是也没啥问题,对吧?这个大家注意一下就行了啊。ok好,这个自检成功不成功,这个事儿呢你就甭管它了,就让他这么着吧,就这么着吧啊OK好了,那需要给大家说明的一点,就是你这块儿你这么处理完了之后,遥控那边呢咱是不是最好也这么处理一下啊,同学对吧?
我们找到遥控这边的这个项目啊,咱也找到那个二点四g芯片的那个初始化啊,在这个位置,咱在这是不是最好也加一个延时的同学来吧。哎,我们这边呢也是给它改成。呃,其实这边之前用的是耗delay,因为之前咱没在task里边进行初始化嘛,对吧?这回我们切到task里边了,那咱是不是用taskdelay是比较好的呀,对不对?
OK咱们taskdelay好了,这边咱给contcontrol己拿过来,哎,我们这直接给它硬延时一个什么呢?
一百五就是等这个芯片对工作正常,哎,咱们硬延时硬延时啊。OK好了,这个咱就OK了啊,同学行了。那这个完了之后呢,遥控我也重新给它上录一下啊,来,这是遥控啊。那其他同学啊,那这块完了之后,咱这样啊,我们最终最终再测试一下,就是咱们当前的这个就是连接的一个效果啊,呃咱们怎么怎么算,就是没问题了呢?就是我把这个所有的电全呃,所有的这个就是呃飞机和遥控都采用电池供电啊,我把这个线头已经拔掉了,那已经拔掉了,拔掉之后,接下来咱怎么保证,就是它一定是正常工作的啊。呃,咱们就测呗,对吧?我对这个遥控器进行开关啊,完了之后看那个指示灯能不能正常的响应啊OK好,注意观察关掉那灯是不是已经灭了呀,对吧?哎,这个正常,然后我再开开亮了,再关,再开再关,再开。好,那它是不是那个一直都能够正常的连接核断开呀,对吧?这就没问题。好,那同同理反过来,我这个无人机这边呢也是一样的,我每次关掉哎,再打开。因为在你遥控器这边是常开的状态,你这个飞机是不是只要打开,就应该是连接上的一个状态呀,对吧?OK好,连接上了啊,关掉再打开嗯,ok关掉再打开,关掉再打开,就是因为家里延时可能慢一点啊。但是能连上就行来再打开好,是不是也能连上,对吧?ok好,如果大家能做到这一步,那就证明咱们目前的这个遥控跟无人机之间的连接是没有问题了呃,大家能能能能能跟上吧。哎,好,就是这么一回事儿啊哦行,那这个完事之后我停一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

04-四轴飞行器-飞控端-通讯任务-处理关机信号

04-四轴飞行器-飞控端-通讯任务-处理关机信号您嗯,好,各位,那接下来呢我们进入下一个环节,下边咱们要做的就是处理那个飞行状态啊呃living那个关机信号,处理关机信号,哎,我们来一个处理关机信号。ok呃,那问一下大家,你说这个处理关机信号,咱们应该是放在放在前边,还是放在后边比较好。其实放在前面比较好啊,你想啊同学就是关机,这个事应该是是挺挺重要,挺着急的,对不对?紧急情况下我关机,哎,或者说咱们换一个角度也行,就是你你你都关机了,对吧?你你你后边你你还处理这个连接状态什么的,还有意义吗?同学是不没有意义了,对吧?所以我们先处理关机信号啊,那我为什么刚才先写这部分代码呢?是因为呃,你要不不处理它,你你不知道你现在有没有收到数据嘛?对吧?所以这边呢我把那个代码放在前边啊,来这边拿放在这儿处理关系号一会大。大家呢也先先这这个事搞定,然后再去写这部分代码。要不然的话,你可能你发现那个关不了机,关不了机,其实不是因为你这个关机的信号有问题是因为你根本就没收到数据,对吧吧?
所以大家先写这个啊行关机效号,这个怎么处理啊,怎么处理,关键信号是不是只要收到了那个remotedate里边的那个什么powerdown?等于一是不是就是我们现在要关机了呀,对不对?就这么个思路嘛,很简单啊,所以这块儿应该怎么写,咱们先做一个异步判断啊,这我先判断啥呢?再说我先判断isreceived,是不是等于OK就是本轮循环,你都没收到数据。你你你还去解析这个remotedate里边有没有那个powerdown,大家你觉得有意义吗?同学是不是没有意义啊,对吧?你得保证本轮循环,我收到数据了,我再去判断,我这个到底也有没有怎么着呢?收到关机信号,对吧?来里边再进行判断判断啥?哎,remotedate怎么着点儿点,谁是不是powerdown啊,对吧?如果等等于一好,这个时候我就要干啥了,是不是就要关机了呀,对吧?哎,ok好,那怎么关机同学加油环节怎么关机,怎么关机关机?大家还记得吧,是不是我们需要模拟一下这个相当于什么呀?模拟一下,这个就是两次短,按咱那个按键吧,就是你你你正常你这个关机不就是呃,按两次嘛,对吧?
那我们要模拟一下,就是按两次的这个行为啊。好,所以接下来咱这样,我们先去实现一个这个就是关机的API完了之后在在这儿咱们再调用啊。
好,那关机这个事儿应该是处于哪一个驱动的呀,是不是属于这个power这个驱动的对吧?IP五三零t啊属于它。那所以在这边呢,我们再重新声明,一个方法,word后边来一个INT呃,咱们就叫slop就可以啊。好了,那问一下大家,那他的这个就是关机的这个按键的一个说明是啥呢?是在一秒内连续短按两次吧,大家还记不记得,就是在他手册上里边写的很清楚啊,是一秒内连续短按两次。那这个时候我认为它是关机嘛,对不对?好,所以应该怎么着呢?这是不是短按一次,对吧?
那我是不是短按了一次之后,我再再延个迟,然后呢,完事之后再短按一次,是不是就行了呀?大家说是应该是这个思路吧,是这个思路吧。所以现在咱们去咱们去写一下,所以这样为了方便一点,咱们这样吧,我把这部分代码都给它提出来,咱们封装一个方法,来一个静态方法,对吧?这stac咱调啥呢?叫做IP呃五三零五TIP五三零五,后边来一个t对不对?
后边我叫啥呢?我就叫做shortSHORTshort里面呢price对吧?PRESS是不是就是短按呀,对吧?OK好拿过来,哎,放在放放到这里边来就行了啊,好了,那如果说你现在是要激活,那是不是就是短按一次就完事儿了,对吧?让它直接调一下个个法法。好,如果你现在是要关机,那是不是咱就得短,按两次先调一次,对不对?然后呢,我中间延个十,延个十之后,是不是再调一次就行了呀?对吧?因为这个方法是需要在呃pass里边执行了,所以我们用passdelay啊。好,这边延多少呢?咱们稍微长一点五百就行呃,你只要保证啥呢?就是你你短按的这两次是在什么?是在一秒内,是不是就行啊,一秒内连续短按两次嘛,对吧?所以我们稍微长一点,这个应该没问题吧,这个一百也就是这儿一百,这儿一百,也就是七百,这个呃,两百两百加上五百,是不是一共才七百啊,对吧?那这个是没有问题的啊。好了,那在一秒之内就行,这就是咱们这个短按的一个呃这个关机的一个逻辑啊。好,完了之后,我们需要给它怎么着,是不是声明一个这个定义啊,对吧?哎,来哎,好了,那完了之后呢,我们再回到咱的这个task这边来。哎,好,那现在就可以去进行关机了,怎么写这个关机的逻辑是不是直接直接调就行啊,对吧?直接调INTIP五三零五t是不是stop就可以以了?这行不行?行啊,可以可以啊,可以可以。但是但是这么写的话呢,就是可能有同学会觉得有一点点恶心啊,怎么恶心呢?你要你要记住一个这样的事儿,同学这个任务是不是咱们接收数据的任务?
我严正常来讲,我应该严格保证啥呢?是不是保证咱们这个接收数据逻辑,每是不是这么长时间就得执行一次啊,对吧?但是如果啊你真的收到了关键信号了,他去执行这个方法了,还能保证这一点吗?同学保证不了了,为啥呢?因为你进来之后里边就怎么着了,它是不会相当于前后加一起,是不是会延迟七百毫秒,是不是才会就是退出这这这一行代码啊,对不对?OK那是不是就不会就不能保证我们这个循环每这么长时间是不是执行一次了呀,对吧?
是这样的,但是又有又有什么影响呢?我都要关机了,你这边你你你你你你保证证了他每每每毫秒秒以一次,又有什么关系呢?是不是也没关系啊,我都要关机了,对吧?你就等就等呗,能理解这事吗?同学所以也行啊,也不是不行。ok好,那所以接下来咱们这样,我现在我编译,然后咱们测试一下啊。呃这会儿有一个问题啊,他说INT这个是啊,我们我们是不是没写那个啥呀?那块儿没写返回值是不是?OK没写返回值啊,写一个word,哎,OK好,写上嗯,来往下走。呃,行了,那现在就编译通过了啊,编译通过之后,我们给它捎录到这个就是无人机里哎,烧进去了。好,下来我们测试一下,就是咱的这个呃就是呃关机的逻辑能不能实现啊?大家一定要注意关机的时候呢,测关机的时候呢,这个东西是不是得拔了呀,对吧?因为它插这USB,那那个芯片它是不会去进行关机的啊,它是一直都会这个正常工作的。因为你给它充个电了嘛,你充电宝也是一样的,你充电它那个灯是不是一直亮着呀,对吧?一个道理啊。好了,那接下来呢咱们就开始测试一下这个关机啊,我目前呃因为是刚拔,所以这边呢咱们重新启动一下啊。
好,那现在目前是不是已经联系上了呀?我遥控那边都已经联系上了啊,我这边给它呃重新开呃,没问题吧,正常的连接状态啊。当我摁一下左边这个按键,这是关机,对吧?好,摁一下,看它能不能关,哎,是不是已经关了同学。嗯,好,那我们再给它开了啊,多测试两下,好,开了之后已经连接上了,对吧?一定要确保它那俩灯已经亮了啊,得连接上之后,你再你再按示它有用啊。对吧?走你好,是不是也关了呀,对吧?这个没啥问题啊啊,ok好,这么写行啊。好,但是这块呢其实咱们还有一个稍微好一点写法啊,稍微好的怎怎么着呢?其实本质上啊就是说白了,就是你只要收到这个东西,你得让这个方法调用才行,对吧?
但是我呢我不在这儿调了,那咱们去哪儿调呢?各位同学大家要大家要知道知道啥呢?就是你想想啊呃咱是不是有一个任务,有一个电源任务是专门用来负责,就是激活这个电源芯片,或者是关闭这个电源芯片片呀呀。所以理论上这个操作应该让谁来完成呢?是不是应该让这个电源任务来完成啊,对吧?因为让他做,我们之前还加了一个标记土度关机嘛,对吧?好,现在呢我们就真的让他做,就是哪个任务,他负责什么,让他一直负责就行了啊。好,大家想想这块怎么让他去调这个方法呢?你想啊收数据是谁收,是这个task收,但是最终执行关键的操作,谁执行,是不是他执行啊?并且这俩任务之间同学他们是有一个什么关系的,是有一个同步关系的吧。我得保证这个task收到这个数据之后,再让上边那个powertask去执行,是不是那个方法呀?嗯,对不对?所以这块会涉及到一个任务之间的什么问题,同学是不是同步问题啊,对吧?哎,怎么去实现任务之间的同步?大家还记得不是不是用信号量啊,用二值信号量是不是能解决这个问题,对不对?呃,或者说我们后边啊,最后最后咱们儿童OS最后课程是不是学了一个任务呃,就是直接任务通知啊,直接任务通知是不是更清亮更高效,它也能实现信号量的这个工作功能啊,对吧?所以咱这儿呢直接使用一个最简单的是不是直接任务通知就行了,对不对?好,那接下来呢咱们就实现一下这个逻辑啊。好,那说白了啊,你要是呃咱们就以信号量的这个角度去思考这个问题啊。那这个位置是不应该是释放一个信号量,那上边它是不应该是一直等一个信号量啊,大家能理解这个事儿吧,应该是这么个思路啊。
所以接下来呢咱们先去写上边吧,咱看看上边怎么写,就这块这块不能能让他这么做了啊,那应该怎么做呢?我就直接先给它去掉了啊,是不是应该等信号量对吧?等信号量啊。OK好等信号量的话,当然我们不用真的信号量,我们用是不是直接任务通知模拟信号量啊,对吧?所以这块儿应该调哪个方法,应该是调用task后边跟着一个啥notify,对不对?notifynotify是什么来着?是通知,那我们这儿是应该是党通知,对吧?党党知是不是应该是有一个take呀,对吧?但是这个好像返回值应该不是它返回值应该是UL吧。我记得ULtasknotify,后边是不是跟上一个take?哎,对,哎,是它啊。好,那大家还记不记得这个API的用法忘了全忘了是吧?我全忘了,咱们稍微回顾一下吧,全忘了啊,这个忘的有点快啊,咱概呃找到RTS,然后找到笔记啊,找到咱们这个脑图直接任务通知,当时咱们还做过是不是具体的案例啊,来往下翻往下翻,这个是不是直接任务通知?对吧?咱直奔主题看API啊API当时呢给大家介绍了两组。API一组是什么呢?好tasknotifygave以及ULtasktasknotify,是不是take呀,对吧?它俩是不是专门用来模拟信号量的,你看它的名字就能看出来呀,gavetake是不是信号量它的一个具体操作呀,对吧?而另外两个呃这一组它们是用来干啥的,是不是用来发我们自定义的这个通知和接收自定义的通知了呀,对吧?
啊OK好了,那本质的区别是什么呢?就是这个发的通知是有通知值的。而这个发的通知呢,是不需要我们人为指定通知值的。但实际上它内部它是不是它也有通知值啊,对吧?哎,OK这一点大家注意啊。好了,那所以咱这用哪组就行啊,咱这用这组是不是就行?因为我们现在要用的是信号量的功能啊,对吧?用这组就行啊。OK好,所以说这边take啊。好,接下来往下进行。那我这边take的话,同学,那刚才也看到了这个方法是需要我们传入两个参数了,对吧?
哎,这俩参数视察,大家还记得不还能想起来不来吧。看官网吧,来找到这个take卡,我们点一下这个链接就行,忘了咱就稍微回顾一下。呃,大家坚持一下,这会儿讲完咱们休息一会儿来往下走。呃,咱们找taketake,是不是?也就是这个俩参rol,对吧?一个是clearcounttexistst,一个是你等多长时间take我要等信号量等信号量是不是会进入阻塞状态呀?对吧?好,等多久你就退出呢?哎,这块儿你可以指定一个最大的时长。这个好说,关键是它大家还记不记得它的作用。就是当我等到信号量的时候,我退出这个方法,我是否要干啥,是不是清除这个count呀,对吧?哎,true,就是清除false,就是不清除是吗?是不是是不是咱们看一眼啊,这个其实还是有点东西的,咱们稍微回顾一下吧,来走走走是不是应该是这个方法呀,对吧?OK是这样的啊,呃,当我们收到任务通知之后,哎,OK那如果你将它这个clearonexist的设为false。你如果设置为false,也就是不清除,对吧?不清除那呃RTS这个任务务知值它会怎么着着呢?它是不是会递减呀?那这时候我们目前相当于模拟的就是一个什么样的信号量,是不是计数型信号量啊,对不对?OK好,那如果你给它设成处,设成处,它就不是递减了,它是直接怎么着?是不是直接把那个计数通知值给怎么着给清零啊,对吧?清零这个时候他模拟的就是啥了,就是二值信号量了,大家还能想起来吧。哎,OK啊好了,那所以大家想想啊,咱现在要模拟的应该是二值的,还是这个计数了呀?就是二值的二值的,所以我们这是不是传个PD处就行,对吧?传个PD处就行啊OK其实呃你你就传的也行,为什么呢?因为咱这儿关机这个信号是不是你给他发一次直接就关机了,你下值代开要重头开始了呀,对吧?所以他也不会说呃,这个计数值也不会增长到二三四五六,它其实最多也是到一大家能理解我这个意思吧。哎,所以说呢这个你传啥都行啊,但是也严谨来讲,还是应该传处啊。好了,那进来就是往下走,下边是不是还得指定一个最大等待多长时间呀,对吧?按照咱之前的习惯,我这是不是直接就这么写了呀,就是最大了。但是你像这儿用最大合不合适的同学合不合适。那我们现在的逻辑肯定是啥呢?我就一直等等,谁说白了,是不是在等那个关机信号啊,对吧?pook好,那我等不到,我就一直阻塞,你一直阻塞,你要这么写,一直阻塞,会不会有啥问题?有问题,你一直阻塞,我是不是正常情况下,我这个任务还得还还有另一个职责的吧,是不是得定期的去激活这个电源芯片呀,你一直阻塞等那我怎么去激活这个电源芯片呢,是不是就不行了?同学,所以这样应该怎么着?咱不能让他一直等你最多就让他等多长时间,最多就让他等多长时间东西。你你想想啊,就是怎么怎么样把关机的逻辑和定期激活的这个逻辑给它完美的融合在一起,最多就让他等多长时间,注意注意他等是在等谁,是不是在等那个关机信号啊,最多咱就让他等之前我们给这个任务划分的这个执行周期是多少?是十呃,一秒呃,十秒钟,对不对?哎,我这是十秒呃,是十秒啊呃OK一千是一秒吗?十没问题吧,同学ok好,那接着往下走,我最多就让他等多长时间,就等十秒钟。好,十秒钟,你等到关机信号了。好,那你就关机等不到,你就得退出阻塞状态,你就得干啥去了。同学你就得去唤醒咱们这个芯片了吧。同学哎OK应该是这么一个思路,所以最多就让他等这么长时间啊。好,那接下来呢咱们就可以去对它是不是进行一个接收了呀,对吧?它是有返回值的啊,同学,所以咱这儿呢应该怎么着,应该是if它怎么着呢?注意它的返回位置是不是只有两种情况,要么true要么false啊,对吧?
好,再问一下,大家以目前拿这个逻辑来讲,它什么时候返回处,是不是在规定的时间内收到通知的返回数啊,对不对?那什么时候返回false规定的就是超时了,超时了都没收到这个关机信号,是不是返回false,对吧?所以我们这儿就应该根据它返回值进行判断了啊,如果它等等于PDA应该是true,对吧?好,那就证明我在规定的十秒内收到了关机信号了,收到关机信号我直接干啥?我是不是直接关机,直接是不是stop就可以没问题吧?OK好,否则否则就说明这个方法它返回这是false嘛,false是因为啥是false,是不是只有它超时了才返返回false,对吧?所以这个时候咱就应该干啥,是不是就得让他去唤醒了呀,对吧?那原来那个延时什么的,是不是就不用加了?哎,好了,哎,你看是不是这样写,就完美的,将咱这个唤醒的和关机的逻辑给它整合在一起了呀。哎,好了,那这样写是比较比较好的啊。好了,那接下来往下走,同学这个完了之后,接下来咱们再去写这个这边,这边这边这边是不是收到这个关机信号之后,我就得给那边发通知的同学,对吧?发通知我这儿应该调的一个方法,应该是xtask叫做notifygive啊,应该是下面这个没问题吧。同学啊OK好,那这边简单你想给谁通知,是不是就把那个任务的句柄传进来就行了呀,对不对?好,那这样一来是不就完事儿了。哎,好了啊,那这样一来我这个通讯就负责通讯的逻辑,你你那个电源负责电源的逻辑,哎,这样一来就行了。
哎,好了,那接下来呢我们再重新稍录一下,再测试一下这个关机功能,看看它稳定不稳定啊,来我们往下走。好,大家稍等啊。所以好呃来我们看一下这个实际的这个效果呃,来我还是得把这个拔了啊,拔了之后,目前可以看到那那块灯是不是已经点亮了呀?同学那点亮了之后呢,这边注意观察,我现在给它我我我连着拿关机。哎,完了,这个也是能实现这个同样的效果的啊,稍等打开,哎,没连上是吧?我呃连上了,但但是哎但是是不是不太不太稳定啊,同学是是看到了吧,同学他他他那边灯只要一亮,是不是一定是连上了,但是他很快他是不是要灭了,对吧?这个说明什么?说明目前我们这个是不是无线通信还是不够稳定的呀,对吧?如果大家遇到这个情况啊,没啥好办法,关机重启一下,这个它就稳定了。这个咱这个芯片确实是存在一些问题的啊。嗯现在是不是稳定了,就是信号可能不太好,可能受到干扰,什么都都有可能啊。好,那这个我再给它呃,关了再开这个是不是现在连接稳定了呀,对吧?哎,好了,那完了之后,接下来我们再测这个关机啊,然后等你啊是不是也关了呀,对吧?哎,OK好,这个没啥问题啊。好,完事之后呃,说明我们这个关机任务关机逻辑就算是处理完了啊。呃,这个完了之后呢,再给大家稍微的呃说个事儿啊,什么事儿呢?大家还记不记得,就是之前我们在写那个遥控任务的时候,就是就是是不是因为我们那个通讯任务,它占用的时间太长,导致咱们那个电源任务是不是有时候他执行不了啊吧。我当时怎怎么去处理这个问题的,是不是把电源任务的优先级给它升起来了呀,对吧?呃,但是我们非控这边是不是没审啊,非控这边是不是也有可能会扔。因为比如说这个任务或者是这个任务,他们执行的时间过长,导致咱这个电源任务是不是没时间执行啊,也有可能出现这样的一个情况。所以这边咱们最好怎么着呢?把这个电源任务的优先级,咱也怎么着也给它提高,也提高到四,也提高到四啊OK这样一来是不是就能够确保咱们这个电源任务,它一定是能够分到一杯羹的呀,对吧?哎,这一点大家注意一下就行了啊。ok好,咱也给它提高一下。行,那目前也就是说我们的通信任务非控任务以及谁以及灯以及这个电源任务,目前是不都是最高优先级啊,对吧?只有这个灯控任务,它的优先级是比较低的。哎,这一点大家注意就行了啊。ok行,那这样一来咱这个关机的任务也就算是啊完成了啊,行,把这个视频停一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

05-四轴飞行器-飞控端-通讯任务-处理飞行状态-状态机说明

05-四轴飞行器-飞控端-通讯任务-处理飞行状态-状态机说明嗯,好了,各位同学,那接下来呢咱就来看一看,就是通讯任务里边的最后一项任务啊,就是根据收到的数据来判断,或者是识别我们飞行状态。呃,当当前处在哪个状态啊,然后呃处理一下,就是这几个状态之间的切换逻辑啊,来吧,同学分析分析这块儿怎么去做呀?咱这样同学,我们先把就是这几个状态,它们之间的转换逻辑给它考虑,搞搞清楚。对吧什么意思呢?就是我们嗯就就好比谁啊,就好比咱之前看到的,比如说我们这个芯片,咱那个电源芯片是不是有一个这样的一个状态的转换逻辑啊,我们也跟他一样,先把这样的一个状态之间的转换逻辑先梳理清楚,然后再去写代码。哎,好了,那现在咱们分析分析吧,同学,你说这几个状态之间,那他们之间的切换逻辑会是什么样的呀?初始状态肯定是idl,对吧?上电就处在idle状态,这个应该没没没什么悬念。对各位同学哎,好了,完事儿之后呢,什么时候进入到normal状态呢?我得遇到或者是我得识别到解锁信号,是不是才能进入到normal状态?
没错吧,同学ok好了,那normal状态在normal状态里边,我要干什么?我得时刻去判断,我现在有没有收到定高信号,你收到定高信号是不是立即进入定高状态,对不对?同时你还得实时判断你这个遥控目前有没有断联,如果遥控断联了,应该怎么着?是不是进入故障状态,大家能理解这个事儿吧。哎,好,那当你处在这个定高状态的时候,你应该判断什么呢?你也应该判断有没有收到那个定高信号等于一。因为我们那个定高是一的话,是不是可能是取消正呃,可能是进入定高,也可能是取消定高啊,对吧?所以如果收的呃fixhead等于一了OK好,你还得回到normal,那同时你也要判断,现在遥控有没有失联,对吧?失联之后是不是也要进入故障啊,对吧,是不是这个切换逻辑有点复杂呀,对吧?所以这边呢我提前给大家准备了一张图啊。好,这张图呢就能够给咱们呈现出这几个状态之间的转换逻辑了OK那实际上这个东西就是我们之前常说的那个是不是状态机呀,对吧?就是我一个事物呢有多种状态,然后这些状态之间呢能够在某些特定的条件下进行转换。所以我们称这个东西呢称为一个所谓的状态机,呃,就是statestatusmachine嘛,对吧?啊,OK好,那所以接下来呢咱们就来看照着这张图,再来梳理一遍。我刚给大家分析的那几个状态啊,首先默认的状态应该是处在空闲状态没问题吧。同学啊OK好,那在空闲状态下,大家想想你只需要判断什么就行了。目前处在空闲状态,你只需要判断有没有收到解锁信号就行,对吧?收到了,那你就进入普通的工作状态,没收到呢,啥也不用干,啥也不用干,是不是就还是处在当前的空闲状态呀,对吧?就这个意思啊,ok好了,那进入到解锁状态之后,你想呃就是不是解锁啊啊,当然也也叫解锁,就是工作状态嘛,对吧?工作状态解锁以后呗,对吧?好,进入普通工作状态,也就是那个normal之后,大家想想,你说你现在应该判断什么,只需要判断两点就行了。一个你有没有收到接定高的信号,对吧?如果收到了,你就进入到定高没问题吧。同学如果没收到呢,没收到,你还得判断一下,遥控有没有失联,对吧?失联了,你就得进入是不是故障啊,对吧?好,如果既没有收到定高信号,遥控也没失联,你说我们应该怎么着,啥也不干,是不是继续保持当前的普通工作状态就行了,对不对?ok好,那继续往下进行。如果你现在进到定高了,那同学如果你现在进到定高状态了呢,那那那定高中是不是也是判断两点呀,对吧?第一点,你要判断你有没有收到取消定高的圈,也就是那个facecad有没有说到等于一对吧?说到一是不是就取消定高了呀,对吧?好,这个时候呢收到了,你就再回到回取消定高吗?取消定高之后,是不是理论上我们应该回到那个正常的,就是可高度可以改变的那个状态,也就是普通的工作状态呀,对吧?OK好,应该进入普通状态,能理解这个事吧。同学哎,好,继续往下进行。哎,在定高状态下,是不是也应该实时检测,我有没有失联,对吧?失联了,是不是也要进入故障状态呀?没错吧。好,那现在假如举例子啊,我们遥控失联了,遥控失联了,飞机这边是不是理论上他那个还是能够正常工作的呀,对吧?你你就不不是所谓的正常呃,不是正常么?就是你那个电源什么的,是不都都还正常了,对吧?OK好,所以说你你飞机这边应该怎么着呢?你应该让它处理这个故障,举个例子怎么处理故障呢?比如最简单的啊,你是不是不应该再让这个飞机继续飞了,你应该让它落地,对不对?你要让它降落怎么降落呢?比如说我可以让它这个电机的速度缓慢的,这个是不是下降啊,对吧?你一下降到零可能也不太好,一下降到零它会怎么着呢?直接降下来了,对吧?你让它慢慢降对吧?慢慢降到零。哎,OK好,就是随便整一个处理的逻辑啊OK慢慢降到零,好,让它降落好降落完了之后呢,同学也就是故障处理完了之后,你应该让它处在什么状态上面,是不是应该让它回到空闲状态呀,能能理解这个事儿吧。同学哎,好了,那你看这就是我们这几个状态之间的一个完整的转换流程。呃,首先这个转换的流程,大家现在应该已经清楚了吧。哎,好了,这个清楚了之后,咱接下来要做的事儿呢,就是通过代码来实现这样的一个状态机,通过代码来实现一个这样的状态机。
好,就是这种状态机编程怎么去编?大家之前在做小项目的时候,有没有做过,就是状态机的这个编程啊,没做过,对吧?然后呢,现在给大家说一下,就是这个状态机怎么去做这个编程很简单,其实首你就你就记住这样的两个原则就行了。遇到状态机,首先先定义一个变量用来表示当前所处状态。那我们是不是这个变量已经有了呀?咱之前是不是就在那个全局里边定义了一个flightstatus啊,对吧?已经有那个变量了啊,好,先定义一个全局变量。好,这个事儿咱们先搞清楚,第二一个很简单,第二一个就是啥呢?就是你只需要管什么呢?管什么就行,就是是根据你当前所处的状态去执行,你在该状态下需要做的判断就行了,别的都不用。管啥意思呢?比如举个例子,我如果说我当前这个飞机状态啊,我处在空闲状态,你只需要考虑什么就行,只需要考虑我有没有收到解锁信号收到了,那我就将什么将这个状态是不是设置为普通就行了呀,对吧?OK好,那完了之后呢,你还得去给他提供一个在普通状态下,你的逻辑是什么?普通状态下,我只需要考虑什么就行了,有没有收到定高信号,我遥控有没有失联,是不是只需要考虑这些就行了呀,对吧?收到定高,把这个变量给它设置,为什么就行了?设置为定高,对不对?OK好,那如果说哎我失联了,那我就把它怎么着啊,我就把它设置为故障。哎。OK好,然后呢,你再去写我在故障状态下,我应该考虑什么?能这个事儿吧。就是你只需要明确出来,你在每一个状态下的判断逻辑就行了。哎,好了,那完事之后呢,该切换切换就行了,基本上就是这么一个思路啊。好,那接下来呢咱就按照这样的一个思路去实际的去写一下这样的一个状态机的编程整体其实比较简单啊,那我先把视频停一下同学。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

06-四轴飞行器-飞控端-通讯任务-处理飞行状态-状态机编程

06-四轴飞行器-飞控端-通讯任务-处理飞行状态-状态机编程来吧,各位同学,接下来我们开始去编写这块逻辑啊。呃,首先我们还是老规矩啊,就是将来肯定是在哪儿,是在是不是这一步去,就是这个做完了之后咱们去做呀,对吧?好,所以这边呢我们来一个四呃,咱叫啥呢?叫做呃处理飞控状态,不叫飞控,咱们叫飞行状态吧,飞行状态。好,这个todo这个去了啊,咱们就基本上处理完了呃,肯定是在这调调一个方法,对吧?好,那这个方法呢逻辑比较复杂,所以我们还是单独给它提出去啊,咱们声明一个方法来往下走,这边咱叫啥名字呢?
咱叫做wordAPP后边跟着一个COMM咱就叫做啥呃,这个这个删掉啊,它这个不对删掉啊,呃这个都给它去掉。这个咱自己分析啊,咱叫做handle,是不是flightdata同学,对吧?呃,HADLEhandle后边跟上一个flight。FRYGHT这个没问题吧。同学哎,好了,那接下来呢咱们来分析分析啊,就是我这一块这个方法需不需要接触什么样的参数,是不是跟它类似啊?同学,首先第一个,你这个是要干啥,最终最终是要设呃设置谁设置们前边是不是定义的,这个全局变量,是不是要要要对它进行设置啊,对吧?所以这个指针是不是一定要给它,对不对?OK好,除此之外,我们还需要什么?需要什么?咱们自己分析啊,你觉得再去我在我们去做这这些状态之间的这个转换的一个判断的时候,咱们需要用到什么数据啊?举个例子,定高,那是不是得收到定高数据才行,所以说我们需要用到谁,所以说我们是不是需要用到遥控数据嗯,对吧?是不是得收得用到遥控发过来的这个数据啊,对吧?对吧?你没数据,我怎么知道有没有收到定光信号呢?能理解这个事儿吧,同学同理解锁解锁,其实咱们的的谁谁油门门以是不是也需要用到发过来的数据啊,对吧?哎,总之就就我们再去做这个状态态,判断断的候候是需要用到遥控发过来的数据的这是一个哎,好,还需要什么遥控的连接状态是不是也需要对吧?因为我要是遥控失联了,失联了之后,我是不是就得进入到这个故障状态了呀,对吧?所以是不是也需要用到遥控的连接状态呀,对不对?ok所以总之啊我们这儿需要的数据应该有什么呢?应该是有这样的几个,咱们一个定义啊?首先第一个就是遥控的连接状态啊,那遥控的连接状态是不是我们前面定义了一个全局变量啊,对吧?唉,在哪呢?在这个在这个位置,说白了,就是咱得把谁是不是得把这个给它传进去啊,对吧?
哎,得把这个传进去,还得把谁传进去呢?还得把是不是这个remotedate给它传进去啊,对对不对?再有就是把我们最终要设置那个飞行状态的指针,是不是给它传进去,应该是这么几个参数来吧。所以接下来呢,咱们就按照这个思路去设置一下啊。OK好,你要是不想设置这么多的参数,其实也有招,你怎么着呢?同学,你以确认一下,引用一下那个全局变量是不是也行都可以啊。那这边咱们就是传单吧,传单吧,来传单吧,来我们去找到刚才的那个方法跑哪去了?c在这里啊,哎我们把这几个参数传进来。首先第一个就是咱们刚才提到了,就是目前的遥控的连接状态,是不是得传进来,对吧?这个连接状态的参数叫做COM,后边跟成一个啥,是不是status啊,对吧?哎,不是不是com应该是remote吧?remotestatus,这个咱得要啊。好,那咱就叫做remoteSTATUS这个是给个指针,还是说直接让它把这个值传进来,其实都行吧啊OK因为因为那个啥首先啊,我们是不是只需要读这个数,不需要写它吧,不需要写的话,你是不是给指针给值都行,对不对?OK好,那又因为这仅仅是一个枚举变量,所以你你之前你你要读的话,给指针是为了啥?是为了节省这个内存啊,对吧?呃,OK好,那你现在既然本身就是一个值而已,所以说你给指针给那个呃这个指针或者给具体的值都行,都无所谓啊,所以这个咱们怎么着都行啊。好,我一会儿为了用的方便,我就直接传值吧。啊,好,接着往下走。第二一个第二一个咱们要传的是不是应该是个遥控的数据啊,对吧?好,来一个remote,是不是struct后边跟成一个remotedate,这个注意啊,它是个什么东西,它是个结构体,所以这个咱们最好给啥最好给指针了啊,remotedate啊,这个没问题啊。好,那后边也得提示出来了,是不我们还需要一个flag啊,对吧?这个必须得是指针,因为你将来是不是要往里边写东西啊,对吧?哎,好,那这样一来咱这三个参数就定义好了啊啊好,完了之后,接下来往下进行下边,咱们就开开始就要开始进行这个所谓的状态机编程了。
哎,这个怎么去做呀?我前面讲过啊,你在写这个状态机的逻辑的时候呢,你只需要明确出来,你处在每一个状态下的时候,你要执行的判断逻辑就行了。比如我当前处在空闲状态下,我要怎么怎么着,我处在普通状态下,我要怎么怎么着,我处在普高状态下,我要怎么怎么着,是不是这个是写明白就行了呀,对吧?好,所以这块儿大家想想,我们应该怎么着,是不是得来个statif或者是来一个switch上,对吧?判断先判断一下,你当前处在什么状态,处在什么状态下,你就执行什么状态下逻辑是不是就行了?对吧?OK好,那现在咱们写一下啊,最方便的方法肯定是来一个啥,是不是switch啊,对吧?来,我们来switch,当我switch判断的肯定不是他啊,咱判断的应该是谁?应该是咱当前处在哪个状态下,对不对?哎,ok好,所以应该是switch后边跟谁flightswitch什么,但是注意这是一个什么,这是一个这是一个指针啊,指针的话,我们是不是得解引用一下同学这个没问题吧。哎,好了哎,我判断我当前所处的状态。好,那如果我现在处在idle状态下,好,那我就应该怎么怎么着,咱们一会儿再写啊。好,那接着往下走。那如果我现在处在,比如说那个idle了之后,是不是那个normal啊,对吧?好,那我处在这个normal,也就是普通的工作状态下,我应该怎么着啊?OK好,那往下走BREAK啊。好,那继续往下进行,那下边是不是把那几个状态都声明出来就行了呀,对吧?CASE如果我现在处在定高状态下,我应该怎么着?那如果我现在处在fault故障状态下,我又应该怎么着,是不是应该是这样的一个编程的模式啊,同学。哎,好,现在咱要做的工作就是去判断了。在这个状态下,我要做的是识别解锁信号识别到之后,那我应该干啥?是不是进入到normal状态,对不对?哎,好,你只要进入到normal状态之后,你想这个方法是不是一直循环不断的执行同学。那下次来他是不是就会去执行normal状态下的执判断逻辑了呀,对吧?哎,就是这么一个思路啊?好,现在咱们就开始呗,一个一个来,那就先看normal呗。按照我刚才的分析,在no空闲状态下,我要判断的就是啥解锁信号,就看你现在有没有解锁,你解锁了,你就进普通,你没解锁,你就进,你就保持当前的空闲状态,是不是应该是这么一个思路啊。好,那接下来咱们就开始呗,怎么去识别这个解锁信号,它不像定高定高,其实挺简单的定高,是不是我只要刷到一个一,那就那就那就那就那就完事了呀,对吧?但是这个可能就有点麻烦了。同学啊识别解锁。先说咱们的解锁逻辑是油门先推到最高,保持一秒钟,然后再推到最低保持一秒钟,然后就可以解锁了。嗯,也就是我们整个解锁的时间最最至少要两两秒钟吧,对吧?哎,好,那他就可以解锁了。那所以这块儿具体咋写呀?这个逻辑来我们还是老规矩,咱先把这个方法的调用先给它写上啊,将来在哪儿调,将来是不是在这个位置调了,来往下翻,应该是在这个位置调对吧?也就是说我每收到一个数据,或者说每来一轮循环,我是不是都会去调一下这个方法呀,对吧?应该是这样的一个思路啊。好,那我现在把谁放进去,先传它啊,先传它。第一个就是咱那个remote是不是status啊,对吧?这个得用。然后呢,就是咱那个指针了啊,一个是这边调不了,调不了,应该是啥?因为我没有OK,它创建声明吧,来,咱们创建一个声明啊,创建声明好,回到这边来。呃,完完了后,该传传的是不是是传传个个针针呀,对吧?第一个是remomoteata,第二一个是fllightstatus,这个没问题吧,各位同学哎,好了啊。行,将来是在这儿调的啊,是每轮循环都要调一下这个方法,所以应该怎么写呀?这个有点麻烦的,这个有点麻烦了。那这样吧,为了让咱这个函数的逻辑清晰一点,我们单独的把识别那个解锁信号的逻辑给它提出去。咱们生为一个函数啊OK好了,那完了之后呢,我这样我先把这个函数简单的定义一下啊,咱们先简单定一下,一会儿最后再实现这个逻辑啊。好,那解锁成功与否,是不是会有一个返回值啊,对不对?OK所以这边呢我来一个comeandstatus。好,这个我就叫做APP,它这儿也写了,叫做checkremotestatus,这也不对啊,这个瞎瞎写,我们给它去掉,我叫做check什么呢?咱是不是要识别解锁信号啊,对吧?哎,所以说我就叫做checkunlock解锁嘛,对吧?呃,UNLOCKcheckunlock啊。好了,完了之后它需要什么样的参数?我们现在也不考虑虑,总之就是知道啊,它是用来检查解锁信号了。完了之后呢,它会给咱们一个返回值。如果解锁成功了,那是不是返回OK呃,否则的话是不是返回error啊,对吧?应该是这么一个思路啊?好,所以接下来呢我们这里边应该怎么写这个i豆像的逻辑呢?
那是不是每次注意这个方法是会循环不断的调用,对吧?循环不断的调用,那每次调用我是不是都要去检查一下,就是我这个有没有收到解锁信号啊,对吧?所以这块应该怎么解呢?就直接是不是调上面这个方法就行了,对吧?
每次来了之后,我都要调这个方法,呃,但其实也不是每次来的都要掉啊。如果我当前的遥控是未连接的状态,你说我有必要去判断我有没有解锁的同学没必要,你遥控都没连上,它可能解锁吗?同学是不是不可能啊,对吧?所以没必要去做那些无谓的判断啊,所以这边咱们先先做啥呢?我先判断一下,就是目前的遥控的连接状态啊。如果说哎如果说哎,你切不过去了。好,如果说我目前的remotestatus,它等等于什么呢?等等于connected,也就是说我是连接的状态,我再去,是不是检查了一个解锁信号,这才是有意义的呀,对吧?否则你检查没用啊,对吧?哎,OK好,所以这个时候你就调谁,你就调它就行了。检查解锁信号,具体怎么检查,咱们一会儿再写啊。好,那完了之后往前走,这会咱应该写个啥呢?是不是得接受一下返回值啊,对吧?controlc拿过来。好,那完了之后,我这儿写一下,应该该啥?咱咱就叫islolocNLCK。好,等于谁等于它没问题吧。哎,好,那如果说如果说啥isunlock,等等于啥,等于comeOK说明我现在怎么着的同学解锁成功了,解锁成功了之后咱就要干啥了,是不是就要切换状态了呀?
同学切换状态怎么写?直接点flightFRIGHTstatus等于谁就行了,是不是等于normal就可以了呀,对吧?
否则是不是啥也不干啥也不干,是不是状态就处在idle状态了呀,嗯对吧?就是这个思路啊。好了,那假如说啊现在我某一次在idle状态下识别到了解锁信号,我是不是就进入到了normal了呀,对吧?好,那你要知道这个方法是不是一直循环不断的调用,那它下次再调进来之后,还执行idle的这个逻辑吗?不执行了,人家是不是就执行这个normal的逻辑了呀,对吧?这就是状态机编程,我只需要给它说清楚,你在每一个状态下,我的判断逻辑就行了。什么时候切到别的状态能理解这个事儿吧,哎,就完事了啊啊,那现在咱们就开始呗,现在我们进到normal状态了,那你在normal状态下应该做哪些判断呢?咱们也是考虑清楚同学啊,在这儿呢,这张图normal状态也就简单了,我就考虑两件事儿,一个遥控有没有失联,你失联了,是不是直接进故障啊,对吧?
没失联的话,那你就看你有没有收到定高,收到定高是不是进定高,应该就是这么个思路,对吧?同学好,所以现在咱就写呗,这个好写这个咱直接就能搞定了。OK首先应该怎么着?先判断遥控,目前是不是连接状态,对吧?ifremotestatusOK我等等于connected,对吧?这个时候你再去判断有没有收到定高信号二维码。好,那一会儿再写else,咱们先写elseelse,直接怎么着,直接怎么着?你看else就说明我的remotestare,现在是失联的一个状态,对吧?你失联状态,你还扯什么,直接是不是进到这个故障就可以了,对吧?你再直接进故障啊,应该是FAOLT。好,大家说应该是这个思路吧。哎,好,现在往下走,如果现在是连接状态,连上了,遥控是连接状态啊。好,那咱就得干啥了,就得检查,有没有收到定高信号了,对吧?好,怎么检查?那就看你收到的这个remotedate里那个is那个facehead,是不是等于一就完事儿了,对吧?哎,所以你接下来就直接判断ifremotedate,然后点儿后边来一个啥faxhat,它等等于什么?一等等于一就证明我收到了一个定高信号,那现在我们是不是就可以从normal状态进入到定高状态了?对吧?所以应该是怎么着直接flightstatus,它应该等于定高状态。哎,大家看是不是这么回事儿啊。嗯,好,这个态态下判断逻辑就做完了了。好了,那进到定高状态之后,你又应该做哪些判断呢?还是看着咱这张图去说啊,定高状态,我也是考虑两件事儿,一个遥控有没有失联。第二,一个没失联的话啊,我有没有接收到取消定高的信号是不应该是这么一个思路。好,其实它的判断逻辑,你跟这个判断逻辑大家说是不是一样的,是一样的。来,我拿过来给大家改一改就行了,稍微改一改就行。来吧。首先你也得判断,就是我目前的这个什么状态,遥控状态是不是已已连接,对吧?如果是已连接那完事儿之后,我收到了fixhead等于一了。那你说我现在这个状态应该切到什么状态?注意啊,咱们前面讲过,facepad等于一不一定是要进入定高,也可能是退出定高吧,能能理解吧。好,所所以这个时候应该退出定定退退定定高应该进哪个状态呢?normal吧,是不是正常工作状态呀,对吧?OK好,进入到mal状态,行了,这个就搞定了,接下来来续续下进行。那else呢?这个else是不是意味着我现在没收到这个呃,这个遥控已经断联了呀,对吧?断联了,是不是也是进入到后t就行了?对对吧?就这么简单搞定。哎,好,接下来往下走,是不是剩下最后一个状态,需要我们去处理了。如果现在我进来之后,发现目前已经处在这个false状态了。那你说我们应该干啥,是不是就应该去咱先写个土著啊,同学因为这块我们呃还不太好写这个处理逻辑啊,我们来个土土土土干啥呢?故障处理故障处理也最简单的,比如说我们就让它干啥呃,电机这个电机啊电机转速怎么着呢?是不是缓慢降至平啊,对吧?哎,缓慢呃,降至降呃,降应该是jpyipy降应该是五吧,对吧?哎,降至零缓慢降至零,这这是不是咱们的一个处理逻辑啊,对吧?哎,好,那这边咱这样啊,我先模拟一下同学,我先模拟一下,怎么模拟呢?来个来个delay,咱们来个耗几类行不行?同学,咱咱就先模拟一下,比如说我需要一秒钟的时间,让这个电解的速度降至零。那具体怎么处理的,咱们到时候再说,大家能想明白这个事儿吧。嗯,ok好,我先模拟一下啊。好,那完了之后呢,处理完之后呢,同学比如说速度已经降至零了,那我电机这边注意你降至零之后,你的飞机是不是并没有断电呀?同学它还是在运行的一个状态啊,这个时候候你应该让他怎么着?
同学,你是不是应该让它恢复到那个空闲状态下,对吧?OK好,所以这个时候应该怎么着,是不是直接星后边来一个flatstatus,等于igo啊,对吧?你看这样一来,是不是咱们这个状态,它相当于就闭环了呀。嗯对不对?好,那现在啊咱们就模拟一下,或者说我们实际的分析一下,就是这段代码将来它具体是怎么执行的啊,来吧,咱们开始首先这个方法是不是会循环不断的调用,没错吧,各位同学哎,好了,那假如说各位同学,我们目前处在的是一个什么状态呢?假如目前我们是处在一个遥控未连接的状态,能理解这个事儿吧。同学遥控未连接,就是我说白了,就是我这个飞机是不是刚开机啊,飞机刚开机啊,飞机刚开机。ok好,那也就是说我们目前会测得就是咱们呃或者或者我们遥控的连接状态,默认它就是啥?
就是呃未连接好,未连接之后,现在是不是第一次调这个方法呀,对吧?好,第一次掉了一个方法,你看它执行的逻辑是什么?第一次调,那我们初始状态flatspare初始状态是不是idl对吧?所以第一次调它是不是执行这段逻辑好,执行这段逻辑OK那我的removespare是什么状态?是是已连接吗?不是不是的话话,他是不是啥也不干,直接break了同西没错的同学好了,那那那那那是不是目前还是处在这个挨动状态啊,对吧?好,那过了一会儿过了一会儿,是不是咱们这儿又因为循环嘛,是不是这又又被调用了呀,对吧?又调用进来又调用进来,跟刚才是不是一样的对吧?还是idol,然后我还是未连接,是不是还是啥也不干呀?哎,也就是说,如果你遥控一直未连接,是不是它一直执行这段代码能能理解这个事儿吧。哎,好,继续往下进行。好,现在假如说我这次循环啊,遥控连上了遥控连上了遥控连上了之后,那我现在呢是不是就还是调这个方法呀,对吧?那进来之后呢,目前的飞行状态是不是还是挨豆,但是遥控的连接状态现在是什么了,是不是connect了呀,对吧?ok好,这个时候它就会怎么着,是不是去调这个checkunlock,也就是检查解锁信号了呀,对吧?嗯,OK好,那如果第一次检查,因为因为咱们这个解锁信号不是说一次就能查完的,为啥呢?因为解锁信号,我们是一个连续的一个操作,对吧?是不是我得推上去一秒,然后再拉下来一秒?是不是才进才能解锁呀,对吧?所以不是说这个方法掉一次就能解锁成功的,它是不是得掉好多次啊,嗯,对不对?OK好,那你要保证就是这个方法在真正的解锁成功之前,它返回的都应该是什么才行?是不都应该是false啊,都应该是error啊。OK都应该是error。OK好,因为啥呢?因为如果是error的话,是不是我这个状态它不切换呀,对吧?不切换是不是仍然处在idol,对吧?处在idle好,那一会儿下一轮循环进来之后,这个方法进来之后,是不是还是执行这段逻辑,它是不会再去调这个方法,对吧?掉n多次一直等到这个解锁信号识别成功了,那它返回什么呢?返回处了,那我这儿是不是解锁成功了,解锁成功之后,好,我这就怎么着了,进入normal状态了?好,进到normal状态之后,注意同学。那这个方法下次再循环,是不是就不执行上面这段逻辑了,它执行的就是谁呢?是不是就是这个逻辑了对吧?好,那每次循环它都会去检查,有没有失联,都会去检查,有没有接收到定高信号,一旦满足了任意一个条件,那我们的状态是不是就会进行切换呀,对不对?OK后边是不是也都是一样的道理,进到定高,也是是次次会去判判断我当前所处的呃,这个这个连接状态是不是呃连接的对吧?然后呢,还得看我有没有收到取消定稿的信号,以此类推好。那你看同学这是不是就是咱们这个状态机的这样的一个执行的流程啊,对吧?应该还是能理解的,不是很复杂啊。好,那现在我把视频停。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

07-四轴飞行器-飞控端-通讯任务-处理飞行状态-油门解锁状态机-思路分析

07-四轴飞行器-飞控端-通讯任务-处理飞行状态-油门解锁状态机-思路分析老铁各告同学,接下来咱们要做的就是检查解锁信号。大家有没有思路,这个不好检查这个我说实话不好检查啊,怎么检查解锁信号,各位同学这个不不是那么简单啊,呃,怎么检查解锁。首首先,咱们先把这个解锁信号呢,咱们先给它怎么着呢?先给它定义出来啊,什么叫做解锁信号,我们这儿的定义是什么OK好,那我现在呢应该是检查接锁状态,对吧?OK检查逻辑应该是啥呢?我写一下啊,应该是什么?应该是首先油门应该先怎么着?
先推到是不是最大呀,对吧?我写一个max啊。好,最大完事之后呢,我需要怎么着,是不是保持一秒没问题吧。同学哎,ok好,那完了之后呢,再怎么着再推到,是不是最小完了之后呢,是不是也是保持一秒啊,对吧?来呃保持仪表。ok好,这是我们的一个完整的,是不是解锁信号啊,对吧?那如如如果举个例子啊,我推到最大完了之后,每保持一秒,我就给它拉下去了。那这个时候龙源是不是这个解锁失败呀?这完事之后是不是得打回重重重来呀,对吧?你刚才那个最最大值,那个g计的值就不就不能再算了啊啊。ok能理解这个事吧吧。好了,想想怎么去实现这样的一个检查的逻辑,这个说实话也不是那么的简单啊,内先保持油门最大的状态,保持一秒。
完了之后,进到最小状态保持一秒。其实这个里边它是不是也是涉及到了状态之间的转换呀?同学。哎,所以这个解锁信号的检查,其实咱们也可以用状态机去做,也可以用状态机去做。哎,好了啊,那所以这样的同学就不大家思思考间,咱咱们现在一起来看一下,我这给出的这个状态机是什么样的,这是飞行状态的对吧?我这儿也给大家画了一张图,这是咱们那个油门解锁的一个状态机。当然这个所谓的油门解锁状态机这个状态指的是谁的状态,是不应该是咱们那个油门的状态呀,对吧?油门的状态是不是需要在最高保持一秒,然后在最低保持一秒,完事儿之后才能进入到解锁状态呀,对不对?OK应该是这么一个思路。ok好,所以大家来看一看啊,我这块呢给油门定义的状态,一共有如下这五个啊分别是谁呢?咱们一个看一下。首先第一个叫做free状态,一个自由状态。自由状态下呢,就是说是不是没有进入到这个解锁的步骤啊,对吧?这是自由状态啊OK那显然这其实说白了,就是一个初始状态,能理解这个事吧吧。油门初初始态态就是free啊。好了,那完了之后,最大状态最大状态那推到顶是不是最大呀,对吧?呃,但是按照我们目前的这个油门啊,就是咱们推到顶是不是可能到不了一千,对吧?因为咱们是不是做了那个就是偏移的校准了呀,对吧?可能到不了一千,所以说你要是非得让它等于一千才算最大,这个就有可能实现不了。所以咱这把这个门槛稍微降低一点多少,就算最大了呢?同学,比如说我大于九百,我就算最大了,能理解这个事儿吧,保证你这个推上去之后,它一定能满足这个条件啊。ok好,那完了之后呢,最大你是不是得保持一秒钟同学保持一秒钟之后,是不是得往下拉呀,对吧?哎,往下拉的时候呢,我这儿呢有一个中间的过渡状态啊,就是呃livemax就是离开最大状态。哎,好了,那完了之后呢,再怎么着呢?再拉到最小,进入最低最最小状态,当然最小正常你得到零,但是我们是不是也可能到不了零,对不对?到不了零的话呢,也没法完成,所以这也把门槛给它稍微降一降啊,小于一百。我就算它是怎么着呢?呃,就是最小了。哎,ok好了,完之后,在最小保持一秒钟,那就进入解锁状态了,这是我的一个逻辑。哎,好了啊,呃接下来呢给大家完整的梳理一下这几个状态之间的切换啊,一个个来先看最初始的状态,初始状态是不是处于辅锐状态啊,对吧?那因为状态机编程嘛,我们前面讲过状态机编程,你只要考虑清楚,你在每一个状态下,你应该做哪些判断,是不是就行了呀?那你想想当我们的油门处在自由状态的时候,你只需要考虑什么就行,你只需要看这个油门儿,它的大小有没有超过九百就行,对吧?我刚才定义了,门槛是九百啊,如果超过九百了,那我就进入什么状态了,相当于是不是就进入到最大状态了,对不对?ok好,那你再想你在最大状态下,你应该判断什么?
对,持续时间,你得判断你在最大状态下的持续时间,对吧?同学ok好,如果你在最大状态下,你呃呃怎么说呢?呃,咱们这么说吧。同学,你在最大状态下,其实也得也得判断你的油耗大小,也不是说光判断持续时间,为什么?因为你在最大状态下啊,你将来是不是一定是要离开这个最大状态的呀?呃,能能能理解没事吧,同学呃什么叫离开这个最大状态呢?也就是说你的油门小于九百的,是不是就是离开最大状态了,能能这个事儿吧。所以说你需要在最个最大状态下时刻去判断你的油门有没有小于九百,对吧?如果没小于九百,也就是说还是大于九百的那那就是什么意思呢?说明我现在还是处在最最最大状态,能理解这个事。同同学,一旦次次判判断小于九百,那那就说明什么?你已经是不是把这个油门拉下去了呀,对吧?但是拉下去之后,我应该进入哪个状态,这个事得考虑清楚,哎,对吧?这个就得根据什么判断了,根据时间了,对吧?如果某一次出现油门小于于九百了。完事之后呢,但是我max持续的时间,我不到一秒。这个时候你相当于是解锁失败了,对吧?你得重新回到原来的自由状态?你得重新是不是去做这个解锁的流程啊,对不对?好,那如果我小发现小于百了,但是我持续的时间已经超过了多少了一秒了,超过一秒,这时候就怎么着了,你是不是就说白了已经把这一步做完了呀,对吧?已经完成了,是不是解锁的?第一步了,同学完成了解锁的第一步了啊。好了,这个时候你就可以进入第二步,也就是进到这个livemax状态了。
哎,好,当然livemax状态,我这儿没做过多的判断啊,我只做了一个判断,什么判断呢?就是你的油门有没有小一百小?因为就是说白了,你你把那个油门从最高拉到最低,它不可能是不是直接从最高到最低啊,它是不中间一定是有一个过渡状态的呀,对吧?这个其实就是我那个过渡状态啊。好,你在过渡状态下不用做过多的判断,我这没做过过的判断断,我就只判断了一下什么如的油门是不是小于一百了?
如果小小一百了,我现在是不是相当于我拉到什么了,是不是拉到最小状态了呀?就相当于这个时候我就进入什么,我就进入最小状态。哎,好了,那前面讲过最小状态,咱也要干啥同学,是不是也要持续多长时间,一秒钟吧,同学。哎,好了,那接下来分析分析你在这个最小状态下,你应该怎么怎么怎么去做这个处理最小状态下,你应该做哪些判断?
因为你最小状态举个例子啊,如果你持续的时间不到一秒钟,同学能理解吧,他也会怎么着,他是不是也会解锁失败呀,对吧?你比如说我拉到最低,结果呢,我还没保持一秒钟,我就又给他推上去了。好,这个时候其实就没没完成咱们这个最小的这这这一秒钟嘛,对吧?所以你不能让他解锁成功,对不对,也应该让它重新解锁。所以这个最小状态下,我应该做哪些判断呢?大家想想应该做哪些呃,无非就是判断油门和持续时间呗,对吧?同学哎,好了,那先来分析呗,这个怎么着,这个怎么判断,这个怎么判断?哎,其实咱可以这么判断啊,这块的逻辑应该是这样的。就是ok你先判断一下,就是进入最小状态之后啊,这个时间是呃有没有超出咱们那个一秒钟。呃,比如说我的时间小于一秒,也就是说我在这个状态下啊,持续的时间目前还还不到一秒不到一秒的情况下,大家说你应该判断什么?在时间不到一秒的时候,是不是得判断油门的大小啊,对吧?如果在小于一秒的这这这一段时间里边油门大小仍然小于一百,那我是不是维持最小状态不变,嗯,能理解这个事儿吧。同学好,那如果在小于一秒的这个时间内,油门出现了大于一百的情况,那说明是不是最小没保持到一秒啊?
这个时候我就得怎么着了,我是不是就得进到辅助状态了?嗯嗯嗯,能理解我这个逻辑吧,同学啊,ok啊,ok好,再梳理一遍啊。好,你进来之后,先判断持续的时间是不是小于一秒?如果小于一秒,ok好,完了之后,你就判断油门。如果油门也是小于一百的好,那就证明你现在仍然是最小状态,你就保持住,啥也不干就行了。好,如果在小于一秒的这段时间里边,ok我怎么着了呢?出现了油门大于一百的这个时刻。好,那就证明什么小新失败,我应该是不是让它恢复到这个自由状态呀,对吧?你重新解锁,哎,ok好,那继续往下进行。
如果按照这样的一个逻辑啊,我撑到了一秒钟了,这个时间已经到了一秒了,那就说明什么,那就说明我在是不是一秒内里边是没出现油门大于一百的情况的呀,对吧?没出现,那我就怎么着了,是不是就可以解锁了呀,对吧,撑到一秒了就可以解锁了。哎,那这时候就进入解锁状态,这这是不是就解锁成功了呀?同学应该是这么一个思路啊。ok这个整体来讲,是不是也是有一点点麻烦的呀,对吧?啊?ok好,这就是咱们这个油门解锁的一个呃状态机啊。ok好,我把这个视频停。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

08-四轴飞行器-遥控端-通讯任务-发送数据-关机&定高安全问题

08-四轴飞行器-遥控端-通讯任务-发送数据-关机&定高安全问题哎,好了,同学现现在给大家说一个就是非常非常不错的一个知识点啊。刚才有同学提到的呃,看看看哪个项目,看遥控这个项目,同学遥控这个项目,遥控这个项目,咱们哪儿会有一个问题啊,就是发送数据的这块可能会有一个问题,啥问题呢?同学,咱们来看一眼哈呃来我们找到谁找到那个那个流程图啊,这是飞控咱们找遥控那边。这个问题是一个在多线程编程环境下,这可能会遇到的啊,来注意观察。同学,你看一看咱遥控的整体思路。其实比较简单,就是干啥呢?
他俩负责扫描数据数据写到这个全局变量,对吧?完事儿之后呢,让这个通讯任务读全局变量,然后把数据发出去,对不对?哎,这就是咱们的一个核心思路啊。好,虽然思路简单,但是这里边会有一些潜在的问题的哪儿有问题呢?各位同学,咱看这儿啊,呃这个地方sendddate,这是我们那个通信任务,对不对?哎,好,这是发送谁呢?这是发送咱们的那个定高信号和关机信号的这个逻辑,对不对?嗯,ok这个逻辑这块就可能会出现一点问题。什么问题呢?大家试想一个这样的场景啊,就是因为我们现在是多个任务并行执行,它是不是会来回切换呀,对吧?假如说啊同学我们当前的这个task,这是通信的那个任务,对不对?ok执行到了这一行了,这儿执行到这儿,然后执行到儿之后呢,刚好发生了上下文切换,切到了谁呢?切到了按键任务同学。切到了按键任务,那按键任务。比如说按了一下那个右边那个按键是不是就是进行定高啊,同学啊OK按了定高之后,我们之前那个处理逻辑是什么?它是不是会直接将那个全局的remotedate怎么着给它置为啥?是不是置为一啊,没多少同学OK好,好,置为一之后,完了回来又回到了我们当前的这个通信任务了啊。好,因为刚才是不是执行到这一行了,现在再往下执行,是不是接着往下走啊?对吧接着往下走,会发现我这remotedate怎么着,是不是facehead等于一了呀?对吧?因为那边是不是已经给他质疑了,对不对?OK质疑完之后呢,这边remotedate又怎么着了,是不是置零了?ok好了,那完了之后呢,TS八份里边的这个facehead,我们刚才是不是已经制成零了呀?是不是这儿相当于置了一下,一立马置为零,压根儿,咱们从来没有往TS八分里边放过这个一啊。
那这个一是不是相当于你摁了白摁了呀,能能能能理解这个事儿吧?哎,这是不是就是一个典型的一个全局共享变量的一个安全问题啊,对吧?当然这个这个事儿出现的概率呢可能没那么高,为什么呢?因为他必须得正好怎么着同学正好在这个位置是不是呃按了按键了,然后打断了我们当前的这个任务了呀,对吧?正好在这儿打断的时候才会有这个问题。哎,OK好,所以概率是比较低的啊,所以我们之前测试发现也能够正常的执行,对不对?哎,但是怎么着他打断的概率就高了呢?比比如举例子,你在这加个延时,你加个延时加个延时之后。举个例子啊,就是这段代码可能就是这个空间,它可能需要比如说十毫秒的时间,其余的可能只需要一毫秒的时间。那这样一在这儿打断的概率是不是就比较高了呀,对不对?那这儿是不是一定就会出现,就是你按下那个按键它不起作用的一个一一个现象了,对吧?这个我就不给大家测试了啊。ok好,那我刚才的分析,大家现在应该听明白了吧?哎,所以就是有风险,这个是有安全风险的。所以这个问题咱咱咱怎么解决呢?同学是不是还是保证它它的什么就行?大是保证它的原子性是不是就行啊?你保证它是一定是一起执行的,那应该就没啥问题了啊,他就是不是不会,他就不会在这个位置去打断了呀,对吧?你不在这打断就不会出现咱这个安全问题了。哎,所以这个大家注意一下啊,所以为了确保我们一个数据的完安全性啊,所以在这儿呢我们还得加一个什么加个临界区啊,加个临界区。
好,那其实你要是说为了确保咱们这个数据它没问题,确保确保没问题。其实最简单粗暴的方法,你直接怎么着同学,我直接把整个打包的这个这个这这这部分操作,我直接怎么着进入临接区域,对不对?那那是不是一定不会有问题了呀,对吧?但但是这么做的话呢,就太长了,这个邻接区咱们打的临界区的时候呢,尽量短,尽量短啊,找到最关键的那个问题。然后在那个位置加上邻接区就行了。来,我们这时候加上include后边跟上一个freecretio啊,呃然后后边我们再来一个include,后边来一个是不是taskHR对吧?OK好,这个咱们拿过来拿了之后回过来应该是不是在这两行代码之接加这个临接区域。对,对吧?来一个task,后边来一个enter,是不是cretical对不对?OK好,一定要记得啊,你完了之后得看啥得退出啊,你千万要退出啊,task后边我们再来一个,是不是exist啊,对吧?existcretical啊。好,那这个完事完了之后,下边这个关机,大家说是不是也是同理,是同理吧,同学同理啊,这边也要是不是给它拿过来,然后呢给它放进去啊,对吧?你因为关机的处理逻辑跟这个定高的处理逻辑,咱是不是一样的呀?没错吧,那当然有的同学可能会说了啊,那你这边儿你直接把它俩就是放在一个连接区里,行不行啊?呃,其实好像也行吧,是不是也也行,其实不太好不太好啊,就是你要知道,虽然我们看起来啊,你这个是不是刚出来又进去了呀,对吧?
但实际上呢,你这边出来之后啊,是不是可能人家有有有任务在等待着这个上下游切换。你这儿刚一出来,我是不是就可以立即进进行一次上下文切换了呀,对吧?人你能做一次,但是你要连起来的话呢,你是不是必须得这俩都做完之后,人家才能上下游切换呀,对吧?
所以说还是尽量怎么着呢?分开,虽然连着咱也给它分开啊,一定要保证临界区就是单个的临界区尽可能的短啊OK这一定要注意。哎,好了啊,就是当然就就是像这些问题啊,说实话呢就是光靠写代码,其实有时候不太容易发现啊,这个需要尽量的写写多了之后啊,或者说你实际测试的时候发现有问题了。哎,哎,你想到了,你给它加上就行啊,我k行,那这个大家注意一下就行了啊,呃来把这个事情停。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

09-四轴飞行器-油门别给太大

09-四轴飞行器-油门别给太大呃呃,就是刚才那个上午最后一节课的时候呢,有同学提到了,说就是咱在测试的时候测这个无人机的时候啊,就发现就是我们这个无人机上面呢有一个电阻它烫的厉害,就是这儿在这儿呢就在我们这个电源插口这块这儿是不是有一个r三三,大家应该能看清对吧?就这个这个我说大不了,这个就是它如如如果说油门给的非常大的话,这个东西烫的厉害啊,就是能烫到什么程度呢?把同学那皮筋都给烫折了,呃,这个确实是有点问题啊。呃,然后我刚才问了一下,就是咱那个就是硬件的老师啊,就是他这块设计的时候,之前是怎么回事呢?首先它发烫一定是因为啥呢?一定是电流过大,对不对啊,就是安防RC嘛,对不对啊?i安方r嘛,对不对啊,所以说这个功率非常大,所以导致就是他那个呃发热严重啊。呃这个个怎么一回事儿啊,就是还是有一个小历史给大家说一下。其实最开始这块呢设计的是一个这个呃保险丝啊。最开始的时候,我给大家先先看一下你的原理图,看的在哪儿啊?这个电阻咱们找到资料,找到这个原理图,找到飞控那个r三三,其实搜一下之后,你会发现是这个对吧?然后大家看一下,就是它接在了哪儿啊,back是不是就是直接接的电池啊,对吧?是咱们可以看一看同学这个这是我们那个IP是不是五三零五t啊,对吧?同学,你看前面讲过就是这块块是不是是接的那个咱们电池的正极啊,对吧?所以说它那块实际上是直接接的电池,然后另一侧接到了哪儿同学看一下,是不是直接接到了我们这个电机上啊,也就相相当。我之前跟大家说过,就是我们的呃这个电机呢是直接跟电池相连的对吧?但是中间实际上是隔了一个注意是一个零欧的电阻,对不对啊?是虽然说是零欧,但实际上它不可能做到真正的零欧,其实就是特别小的一个电阻,特别小的一个电阻啊,就这块最开始不是一个电阻,这最开始是一个个电丝,其其大家家应能能想象到啊,就是你这个电流它呃就是你这个电机正常情况下,它电流应该是比较大的,对不对?那所以说呢为了保护我们这个电路板最开始这块呢,实际上之之前设计是一个保险丝。
但是结果呢就是发现我们这个电流确实有点太大了,只要我们这个油门给到就是一定的长度OK那保险丝直接就烧了啊,所以老烧老烧没办法,这个老师呢也换成了一个这个r零的电阻,但实际上换成r零电阻之后也不太好,就是它它会非常非常的烫对吧?啊,OK啊好了,那是当然有同学可能讲,你当时就啥也不放不行吗?你就直接连上不行吗?大家觉得行不行?那烧的就不是电阻了,就不是你的皮筋了,电路板电路板是不是就可能直接烧了呀,对吧?
所以这块好的办法是啥呢?实际上我觉得应该可以考虑,就是把PCB上面这个布线是不是给它整的特别粗啊?大家能想就是就基基于我们这个电线为例嘛,电线越细,它呃是不是电阻相对大一点粗一点啊呃,但是电阻相微小一点啊,对吧?OK就是实际上应该是这样做好一些啊。呃,但是这个目前呢也没办法,因为硬件就这样啊,所以咱们大家在用的时候呢,就是注意一下油门,到时候别给太高,呃,可以给可以给到最高,但是持续的时间别别太长,一直最高,那就不行了。就是现在只能是应急一下了,就能能理解这事儿吧。同学啊,就是它它会特别的烫啊,当然可能也不会说把咱们这个什么东西烧毁啊,它呃但是长时间就不太好了,就是大家注意一下就行了。
呃,其实这个到时候咱们测的时候,你会发现其实这个油门呢我们基本上给到中间这个位置差不多中间这个位置,这个飞机就已经能起飞了啊,也没必要给到最高啊。这个大家注意一下就行,到时候啊行,就是就个这样啊,这是一个事儿,这个大家注意就行了。然后还有一个事儿啥啥呢?就是是是关于咱们这个s二二四幺幺这这个芯芯片啊,有的提到了,我上午不是给大家演示了吗?就是我这边在初始化的时候,我我是不是我把我这个就是这部分代码给注掉了呀,对吧?注掉之后,我就直接纯靠延时,是不是等他这个就是呃初始化成功了,对吧?但是有些同学那块啊,这会其实说实话我也没想明白啊,他就按照我做的也是纯靠延时,结果就发现呢咱们去做这个就是初始化的时候呢,发现他就又不能正常工作了。这个芯片呃,完事之后呢,怎么着就就正常工作了呢,把这个东西还给它放上。呃,我了之之后他就能正常工作,然后呢呃我就考虑是不是延延时时间不够长呢?因为说白了就是我们这一直在做自传。其实大家都知道,我们这个自检方法其实是我们自己写的嘛,对吧?
我们其实并没有对这个就是芯片做任何这个配置,我们仅仅是用用来测什么?咱们仅仅是在测,就是它的SPI通信是否正常,对吧?我们就是测了一下,我通过SPI往里写点东西,然后再读出来。
我发现我看读和写是否正是否一样一样的话,是不是就认为它的SPI工作正常了呀,对吧?但是啥也没干,仅仅是做做了这个事儿啊,所以我就怀疑,那他肯定是因为延时延的不够,所以加多加点延迟行不行,发现还是不太行,我就延到一秒了啊,就是一千毫秒,结果还是不能正常做那个东西,然后呢就把这段亮影又给它加上了,加上之后呢,发现就能正常工作,就这个事儿就很奇怪,我说啥我也没没没太想明白啊。所以大家那会儿如果也有类似的问题,就这块呢咱就你就都留着它吧,延时也留着啊。然后呃这个呃字检也留着啊就行了啊呃,这个保证它能正常的初始化就行了。
呃,这款芯片确实工作的非常不稳定,实际上最开始不是用的。这个最开始其实用的是给大家说的,就是它它不是兼容国外的一款那个二点四g芯片嘛,最开始用那个,但是那个成本有点高,所以就换成了这个,这个确实就有点不太稳定。说实话啊,就是咱也没啥办法,就是就是注意一下就行了。如果你那块儿也跟这个同学一样,那你就还把这个软件给它放开啊就行了啊。ok我提供一下这个视频啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

10-四轴飞行器-飞控端-通讯任务-处理飞行状态-油门解锁状态机编程

10-四轴飞行器-飞控端-通讯任务-处理飞行状态-油门解锁状态机编程同友好,开始之前我们把那张图打开啊,咱得照着这个图来。哎,好,我们一共定义了这样的五个状态,对吧?
最开始的自由状态完事儿之后呢,就是那个呃最大的一个油门的一个状态,完事之后,最小油门的状态之后呢,就是解锁的状态。
哎,好了,完事之后,这个利vemax状态其实就是一个从最大到最小的一个过渡状态,对吧?
呃,实际上根据我画的这张图啊,同学不知道有些同学能够意识的到啊,就是如果说同学我这个油门给到最高了,完事之后也保持了一秒之后,是不是就会来到这个状态呀?那我来到这个状态之后,你看我这个状态其实设计的比较简单,我只看它有没有把油门,是不是拉小啊,对吧?那如果说你拉下来之后又拉上去了,嗯,能能理解上面同学我这管管这种况况吗?我管管你,你只保保证最大的长持续了一秒钟,对不对?OK好,那完了之后你拉下来了,拉下之后,你再拉回去,你再拉回来了,是不是仍然是利vemax状态呀,对吧?哎,也就是你之之后呢,你再给它拉到最低,那才会进入到最角状态。也就是说我我只要有一秒的最大。完了之后,我这个油门不管怎么动,其实也不会怎么着呢,也不会就是说影响到最开始的这一步啊OK当然你要是想考虑在里边的,也也没啥问题,顶多就是怎么着呢?你这儿再多做一个判断。对不对?如果说你在这里边做了某些操作了,你比如说又拉回去了,又拉回去了之后,你就怎么着同学再给他回到free,让他是不是重新解锁也行啊,同学啊,就咱就没必要搞那么麻烦了啊。这个大家注意一下就行了。那比如说举例子,我这儿再多加多加一个判断呗,你你拉下来之后,你再判断,如果油门再大于就白了。好,那这时候呢,你就再重新解锁,是不是再让他进这这个free状态就行了,对吧?这个流程是完全是咱自己设计的,哎,咱们没必要那么复杂,稍微简单一点吧。哎,好了,那这个图咱们照着它,照着它去写代码就行了啊,这个比较容易照着它来吧。开始呃,首先找一下咱那个代码啊,我在哪儿找呢?咱进到应该是task点c这块,对吧?完了之后呢,这是处理飞行状态,我们点进来点来之后,是不是就该这个位置了呀,对吧?哎,好了,那现在我们照着那张图写这个代码啊。呃,那按照我们前面的分析啊,就是这种状态机编程,我们首先是不是得有一个状态变量用来表示咱当前是处在哪一个状态的呀,对吧?哎,或者说对对,应到我们这个解锁上面来呃,应该表示出我现在位于解锁的第几步,对吧?这个事得表达出来,所以我们需要定义一个变量啊。当然这个变量呢它的类型是不是最好是咱们自己去定义一个枚举类型啊,对不对?OK好,那现在咱们就开始定义啊,来吧,我现在呢进到test快进来。好,这个咱起个名字啊,就叫做呃,这叫什么状态呢?这叫油门状态,对吧?
油门状态啊。好,那TYP呃typedeyTYPEDF啊。好,那之后呢我们来一个米那啊,然后里边呢咱们写一下这个具体的枚举值,我先写先写名字吧,咱们就叫做就不写全程了,不写死rot了,我就稍微简单点儿PHRTHRTHRstatus。好了。那现在呢我们把里边的几个状态都写上啊,首先最开始初始状态,我们就叫做free,对吧?这是进入解锁之前的这个状态啊。好,那接下来往下走,呃,下边是不是有一个我们那个什么最大的一个状态,对吧?就叫max。那还有一个是不是离开最大值啊,对吧?LEAVElivemaxOK好,然后再来一个啥呢?再来一个是不是最小值啊,对不对?最后最后是不是就可以来一个啥了,an是不是lock了呀,对吧?哎,好了啊,那现在我们把这个呃枚举值媒语类型先给它定义。好定好之后呢,接下来我们就可以回到哪儿了。得首刚刚咱那个通讯的APP层了。
对吧?哎,好,就可以在这儿去写这个相应的代码了啊。那首先呢咱这儿得有一个什么得,有一个是不是变量用来记录咱当前所处的状态啊,各位同学来,那现在写一下呢,这个咱应该写什么?就是随便声明一个变量就行,对吧?咱们就叫做HRstatus。哎,好,我注意我我需要给它作为一个是不是全局的变量啊,对不对?OK好了,叫做THRstatus,咱们就叫three这个,没啥问题吧。哎,好了,接下来就开始写了啊,现在开始写了,这块咋写呢?各位是不是还是得来一个,是不是switch啊,对吧?
哎,用来记录咱们当前所处的状态是什么?我先来一个THRswitters。哎,好了,那下边呢就让他给咱们提示也行,提示我这儿呢就可以稍微的省一点东西啊,这个不要给去掉。行,这个括号啥的,对着呢吧。对着呢啊好,那这些咱们该删的删PR呃BREAK啊,好,这个都不要。呃,这是free,这个是呃max,对不对?OK好,那完了之后呢,中间是不是还得有一个什么六max啊,对吧?我们把那个离开这个最大,然后到最小的那个中间状态给它写上啊,好,叫做LEAVElivemaxOK好,这个就呃完事儿了。BREAK好,不要不要忘记同学。最后最后咱还还还得有啥,还有个解锁状态的对吧?
来,我们这儿来一个case,应该是UNLOCK很好。呃,哎我这个没定义这个值是吗?第二页的哎哎,我定义没定义点过来,它怎么不变色呢?应该是没定义上啊,呃,我写错了是吧?UNLOCKUNLO哎,行啊,是不是这个软件的问题,没问题,能跳过来就行啊。行,咱先不管它啊,应该应该没写过吧,语法也没问题吧。casecase行,先这着我,我编译一下,还是编译一下,可以呃,没问题呀,没问题,他说我这个是没有返回值,这个正常我还没写呢,对吧?行,就不管他了啊,应该是没问题的。哎,好的,同学,那接下来我们继续往下进行。下边呢?我们先来分析分析同学,就是咱这个方法需不需要接收什么参数?哎,然后这个方法的返回值咱应该怎么处理?因为因因为因为你看啊,同学这个方法是在哪儿?是不是在我们这个就是检查飞行状态的这个idole状态下,是不是会去掉这个方法呀,对吧?这个方法是不是得有返回值啊,返回值是什么呢?就是我目前是不是已经解锁成功了,对吧?没解锁成功就应该返回啥,是不是返回,就相当是咱们那个false啊,对吧?但是我这个叫error啊。ok好,那解锁成功了,那我是不是应该返回一个true,也就是这个OK啊,对吧?哎,OK应该是这么个逻辑。所以说大家想想咱们这个返回值应该怎么写?注意同学啊,只要我目前还处在这个空闲状态,挨轴状态啊。好,那是不是这个方法就会一直循环不断的被调用啊,对吧?OK它是这么个逻辑啊,所以说那咱应该怎么处理这个返回值呢?很简单,是不是只有进到unlog方法之后,那咱们返回啥?呃,不是unlock方方法应应该是进进到unnoff状态之后,我返回啥,我是不是返回一个OK啊,对吧?那咱这儿就没必要break了,你都return了,是不是就没必要break了呀,对吧?只有这returtain一个OK其余所有的这个情情况,所有的状态咱们完事之后都应该retain一个什么是不是ever啊?大家大家说应该是这么个逻辑吧。哎,OK啊好,那就是这么意思啊。OK好,所以接下来呢咱们把返回值搞定了,接下来咱们就可以去处理咱们这些就是解锁的这个状态了啊。首先我们先来看第一个就是当我们处在这个呃还还不能解,为啥呢?参数还没有呢,咱们想想这儿需要什么参数类中啊,你啊你再去判断我们当前的这个解锁的逻辑的时候,你需要用到什么数据同学,咱想想啊,呃油门是不是肯定得用到,对不对?那除了油门好像也就没啥了吧,因为咱们解锁就用油门解做嘛,对,解锁的就是油门了,对不对?所以只看油门就行。那所以接下来咱就怎么着呢,让他给咱们把那个也别油门了,咱就直接让他把整个是不是这控的数据给它传下来就行。没没错,同学这样,你看是不是外边会给他传一个遥控啊,对吧?那咱就顺势把这个遥控传给他,那不就行了吗?对不对?好,那上边是是不是得有一个这样的参数才行啊,对吧?哎,我们往上走,把这个参数给它定义上。好,那这样一来就行了。当然你要是觉得传参太麻烦,太啰嗦,你你是不是也可以excel直接用全局变量啊,对吧?也行啊,但是我是觉得传参的方式,这个思路要更清晰一点啊OK啊,你知道这个数据它是怎么样的一个流向啊?行了,那接下来咱们开始往下走,下边应该干啥了,下边就可以,真真的开始判断了啊。好,那现在咱就一个一个状态来呗。当我处在free这种状态的时候,也就是咱们最开始这个空闲状态,对吧?咱只需要考虑啥,我就只需要考虑我的油门是不是大于等于九百的这个九百。当时我们自己规定的一个值对吧?上午已经给大家解释原因了啊。好,那只需要考虑这个事儿就行,对吧?大于了,我是不是直接让它进max状态啊,对吧?那就写呗,哎,来开始啊,那也就是说我这直接ifif啥呢?remotedatedate点THR它应该是大于等于九百啊啊。ok好,那这样一来,我就直接检查,我就直接进入,是不是max状态,对吧?也就是上面那个THRdata四就得等于是不是max状态没没错吧,同学哎,好,那我们接着往下走啊。呃进到max之后呢,如果大于九百,我就进max了,对吧?那否则否则是不是就不管仍然都处在这个是不是自由状态就行了,对吧?哎,好,那所以这个无所谓了啊,接下来往下走,下边去就到最大状态了,最大状态咱们要考虑啥,同学就得考虑时间了。没错吧,左婷雪哎,好,这个怎么处理,咱就看考虑两点啊,最大状态。如果油,你其实就是说白了考虑两点啊,就是一个是油门,一个是时间,对不对?你看你怎么写这个代码的啊,只要考虑到位就行啊,我就这么写了啊,就是我就看我的油门,如果大于大于多少,大于九百,那我就不管你大于九百,是不是仍然是处在max状态呀,那就啥也不用干,对吧?不用不用改状态。如果小于九百,我是不是才需要去改这个咱们油门当前所处的状态呀,对不对?OK小于九百的话呢,我得分两种情况,对吧?一个是我的时间持续时间小于一秒,这个时候你没达标,没达标给你打回属余状态。没错吧。哎,好,那如果说我小于九百的时候,我发现我持续的时间已经超过一秒了。好,这个时候怎么着?同学是不是直接让它进入利用max状态啊?
对吧?说明你这一步完成了,你这个状态可以过了。对吧?不就是这么个思路嘛。哎,好,那接下来咱就开始写这个东西啊。也就是说按照我目前的分析,如果说这个remotedate点点PHR他要是大于等于九百,我啥也不干,你啥也不干,我是不是就不写代码了呀,对吧?也就是说我小于九百,哎,这个时候我是不是才可能去改它的状态啊?大家说是这个意思吧。哎,好,那所以这块儿应该怎么着,这里边就得看时间了啊,就得判断时间了,时间小于一秒,我就进福瑞时间大于一秒,我就进,是不是哪块啊,是不是进六max啊,对吧?进第二一个阶段了啊。好了,大家想想这会儿咋写,这会儿咋写,怎么比怎么看它这个所谓的max的持续时间呢?同学是不是又得涉及到计时了?哎,又得计时啊。好,大家说这回计时怎么计?
大家要善用那个getcurrenttick啊,gettickcount啊,善用那个方法,其实这儿也可以用那个方法,这会儿咱怎么用?我是不是就是我进max的时候,我记一下,那时候几点了。完了之后呢,我每次在这个max里判断的时候,都看当前时间跟当前是不是差多少就行了,应该是这么个词吧。好,那我是你么时候进maxx呢?不就是这儿吗?是不是只要执行到这儿就进max了呀,对吧?哎,好,所以既然在这儿写啊,对为这个你处在max的时候,这个方法是不是一直循环不断的掉了,对吧?
哎,我们就找进的那一刻,那不就是在这儿进的吗?对吧?这个等于它了之后,下一轮循环来的之后,不就进max了,能理解解个吧。同学,哎,所以咱们在这儿去记这个值啊。好,那所以既然要计时,我是不是得声明一个这个变量了,对吧?
哎,我们就叫呃ent进三二三十二啊,后边呢我来个啥呢?我就叫做THRlast这个不好,这个我叫啥呢?我叫做maxstartt啊,对,不就是呃这个最大值开始的那个时间呀,对吧?好,给他一个零。好,这是默认值啊,初始值啊。好了,那完了之后什么时候给它赋值,就在这儿了呢?记进max的时候,那我就把那一刻的时间给它附上,这个没问题吧。同学好了,接下来往下走,现在我在max状态下边,我发现我油门变小了,变小的时候是不是要离开max状态了,对吧?好,这个时候我看一下现在的时间,对吧?所以这里边应该怎么写呢?那就是if了啊,同学if啥,if我当前的时间减去进入max状态的时间,如果大于一千,那就说明我是不是已经待够一秒了呀,对吧?好待够一秒,我进入下一个leavemax阶段啊。好了,那否则呢否则给你打回福瑞,不是面,应该是free,大家说是不是应该是这么一个思路啊,嗯能能能干上这个逻辑啊。哎,好了,那这样一来咱们这个max的这个判断逻辑就算是写完了啊,呃写完了啊。OK好,接下来我们进入到六max。六max前面也讲过,就是咱这儿把这个逻辑简化了,没整太复杂,就这块呢,咱不管别的,我就怕你要不要把油门调到最小,你只要调到不到最小,那我是不是就精密状态啊,对吧?我不管你有没有再把它调大,这个咱们都不管啊,都不管。但是你要想管的话,你就自己把这个逻辑再再再再搞复杂一点也行啊,没必要来往下走。进到livemax之后呢,我就怎么着就行了。刚才也说了,就看油门的大小就行。如果我的油门儿,这就不是不是这个了,应该是怎么着呢?只要出现它,比如说小于等于我们规定的一个阈值,小于等于一百。好,那这个时候我就让它的状态是不是进到这个命状态呀?同学哎,好了,那这个就完事儿了,这个简单啊,这个简单好,接下来往下下边就是命了。在这个命状态下,大家想想咱应该干啥干啥main状态下,咱们想想啊,这块怎么写这个逻辑main状态下,我其实也得同时考虑,是不是油门和时间呀,对吧?怎么就保证它持持续多长时间,持续一秒之后啊,再进入到unload状态,还想想这块儿咋写的这个东西是呃,这个怎么写我这儿呢?这回以时间为准啊,就是这个大家一定要考虑考虑仔细一点啊。好,以时间为准,既然要计时,那所以说咱是不是还得有一个什么时间变量,对吧?所以这边呢我应该怎么写?uyant三十二t我再来一个啥meanstarttime呃,starttick吧?TICK是不是也让初值等于零啊,对吧?然后什么时候给它赋值?在我刚进入到min这个状态的时候,给它复制,是不是manstaratig等于等于这个呀,对吧?哎,好了,那接下来继续往下进行,那下边我们就进到min,进到min之后,接下来咱就开始判断了啊,来注意观察,我先以时间为准进行判断。我这么写啊,如果说看啊xtaskTSKgettaccount,对吧?那如果说我当前的时间减去,我进来的时间,manstaratig。如果说要是小于一千,那就说明什么东西,我是不是目前还没到,就是我这个命的状态是不是保持的还不到一秒钟啊,对吧?不到一秒钟的话,那这个时候啊,如果出现了什么呢?出现了我的油门,也就是呃remotedate点PHR对吧?如果出现了它大于一百的这个情况,那就证明是不是咱们这个解锁失失败了呀,对吧?你看啊时间不到一秒,什么时间,就是我持续就是最小值的这个状态是不是持续的时间不足一秒啊。对吧?不足一秒的时候,结果我的油门是不是超出一百了呀,对吧?哎,那就是已经不是最小了,那是不是现在就相当于解锁失败了,对不对?这个时候我就让他干干啥同学,我就让他进到,是不是辅瑞状态打回辅瑞,是不是走这边了,相当于对吧?油门小于呃min,持续时间小于一秒,油油门大一百是不是进这边来呀,对吧?哎,好了,那所以接下来呢咱们往下进行,也就是我直接改它的状态啊。THRHS我就让它等于啥了呃,等于free了,解锁失败,宣告解锁失败啊。好了,那否则呢同学就是在我这个时间小于一千的时候,油门大于一百,我让他进入福瑞。那否则我让他干啥?否否则否则的话,是不是就是说我这个油门是小一百的呀。那这个时候咱们有有有操作需要做吗?同学没有,我是不是继续让它保持这个最小状态就行了,对吧?所以这个else其实可以不写的,大家能理解这个意思吧。哎,好了,那继续往下进行啊。好,但是外边这个else外边这个else是啥意思?就是我时间是不是已经到一千到到一秒了呀,对吧?到一秒之后,咱们要执行一个什么操作,都到一秒了。你想想同学,那说明我是不是什么意思?你想啊在一秒之内只要出现remotedate点儿PHR大于一百,我是不是就会进入辅睿,对吧?那按照目前的逻辑啊,如果这个min啊,就是这时候它时间已经撑到一秒了,说明在一秒之内是不是这个事儿从来没发生过呀?你要发生过的话,你是不是早就不执行这段逻辑,你执行哪儿去了?执行mfree那个逻辑去了吧,对不对?如果说你能撑到这个值,它已经等于一千了,那就说明啥说明我是不是这个命的状态已经持续一天了呀,对吧?好,那没啥可说的了,直接怎么着解锁呗,是不是就进入解锁状态了,同学哎,就是这么一个思路啊?好了,那这样一来咱这个解锁的逻辑啊,就算是完成了,就算是完成了。哎,好了,那之后进到解锁状态之后,啥也不用干,因为你解锁了嘛,解锁了之后,我是不是直接returnOK那完了之后,下次这边是不是呃,就是这个方法调它之后,是不是就解锁之后就进入到浓抹状态了呀,是吧?嗯,哎好了,就是这么一个思路来,我编一下这个代码啊,嗯呃这就是使用这个状态机去处理咱这个解锁的逻辑啊,什么时候用这个状态机,就是还是那句话,同学你就看啊你是不是要在多个状态之间进行切换啊。然后呢,如果是有的话,你就用这种方式去写这个思路,它比较清晰。因为你在写的时候,你不用同时考虑太多的状态。那咱是不是只需要看这张图,完了之后,你只需要清楚你当前状态下需要做哪些判断,然后逐个去写就行了呀。
同学哎,这个注意就行了啊。好,那这个完了之后,咱就可以做一个简单的测试了啊。呃,呃,咱们怎么能看出来,就是我这个解锁呀,包括我这个定高啊,或者是error的这个这个这个状态怎么能看出来呢?是不是我们之前已经做了那个灯控任务了。大家还记得吧,咱这个灯控任务是不是会根据我们目前所处的飞行状态去呃展示不同的这个效果呀,对吧?哎,还大家还记得我之前是怎么定义的,我这几个状态吧。哎,我们稍微的回顾一下,看这边啊来找到灯控任务同学,这是不是在对这个flagstatus做处理?对吧如果处在idol,那我是一个低频闪烁,处在normal的是不是一个高频闪烁呀,对吧,处在定高,我是不是会让它常亮,对吧?出现障,我我是不是直接让它熄灭呀,对吧?那那我这是不是这个逻辑?
哎,好了,那就接下来呢咱们就去做一下这个实际的测试啊,来吧。那现在我给它编译一下,然后给它稍录进去,注意我们现在呢这个解锁什么的无所谓,因为啥呢?会不会有危险?同学不会有危险的啊,电机转速我们是不是没设置,对吧?你看电机这边flattask,我这边目前是不是给的全是它的初始值啊,对吧?初始值是不是都是零在这,所以电机不用不会转的,这个大家不用担心,你就尽管烧就行了啊,来我们给它烧录进去。
哎,好了,那接下来我打开摄像头,咱们一起来看一下这个实际的效果怎么样啊,来我把这个遥控呃,打开好,这个还是得把这个先拔一下啊。呃,拔了之后注意观察同学,你看我这儿是不是就已经稳定的这个连接上了呀,对吧?哎,好,我再关,然后然后是不是关了呀,对吧?那个断连了啊,我再开好,是不是没问题啊?同学ok接下来咱们开始做这个解锁的逻辑了啊,我开始解锁了呃,解锁按照我们前面讲的是不是应该是先把这个油门给它推到最高。没错吧。同学,唉,然后呢持续一秒,我这已经有一秒了,然后再拉下来。哎,好,唉,注意观察。同学,你看这俩灯是不是已经表示我们那个飞行状态了,它现在是不是已经高频闪烁了,高频闪烁,是不是就意味着已经进入到这个工作的这个正常工作模式了呀,对吧?唉,好了,那接下来呢,你正常你推油门啊,这个时候推油门是不是这个电机就该该转了呀,对吧?但是我还没做那部分逻辑啊,所以它没没问题,唉,它一直是高频闪烁。好,那接下来我们再测一下这个定高。好,那右键是不是这个定高啊,对吧?好,摁一下之后定高唉,定高是不是这俩灯,它会常亮同学,它会常亮的啊。ok好,这是一个定高的状态啊。ok好,那接下来呢,我再再按一下,是不是就是取消定高啊,对吧?
走唉,那是不是就取消定高了,对吧?我们再摁哎再取消,再摁再取消,再摁再取消,再摁再取消,这个是不是还算是比较稳的呀,对吧?这个没啥问题啊。好了,这就是我们这儿的一个就是状态机的一个转换啊。好了,然后接下来呢咱们再去测一下,就是那个故障状态故障状态同学大家还记不记得,就是我这儿会怎么着?呃,按照我目前的这个处理逻辑啊,咱那个故障我现在正常你故障出故障了之后,是不是应该让它这个电机转速缓慢下降啊,呃,缓慢降下来啊,对吧?但是我现在还没写那部分啊,我现在怎么写的,我现在就是处理的比较糙啊,咱们这儿呢就是直接做了一个啥,是不是做了一个延时啊,对吧?延一毫秒完延一秒。延秒完了之后呢,是不是将这个呃状态再给它恢复到那个爱豆状态啊,对吧?哎,所以接下来呢我们看一下这部分逻辑是怎样的一个体现啊。好,现在是正常的这个飞行状态啊呃OK好,我现在我直接怎么着?我直接把这个飞机就哎把这个遥控就给关了啊,关好关了。然后哎你会发现它是不是又低频闪烁了,同学低频闪烁,是不是就进入到爱豆状态了呀,这个没问题吧。哎,好了啊,看似没问题,但实则有一个问题,同学注意观察啊,我刚才是在什么时候关的机,这个遥控是在normal状态下关的,对不对?ok好,你注意啊,我现在把遥控打开,打开之后,你会发现它立即是不是就高频闪烁了,这俩字儿高频闪烁,说明立即进入什么状态了,工作状态,也就是说相当于你这个遥控断开,你再重连这个飞机刷一下就飞起来了吧,对吧?因为我们现在正常你的工作状态下,是不是油油门的值会作用到那个电机的转速上啊,嗯对吧?
虽然我们还没写那部分,但是呃可以预想得到啊,是这样的那所以这块儿咱们的逻辑出在哪儿了呢?你正常情况下,你遥控断连了,我进到idol了,我再连上,我连上是不是也应该让它处在idol才?对啊,那他为啥直接就进入到了normal状态了呢?这是哪儿有问题呢?各位同学来我们看看代码儿,这是哪儿有问题,大家能不能想明白哪儿有问题,你想啊我们遥控断连了,然后飞机这边呢飞机这边它的程序是不是该执行执行啊,对吧?飞机这边正常应该是进到这个idol状态,对不对?其实咱们也看到了,我遥控断联之后,飞机是不是确实是在挨斗状态呀?因为我们刚才看到的就是一个灯,它是低频闪烁的嘛,对吧?但是为什么我遥控一连上,它立马就进入到解锁状态了呢?那肯定是因为啥肯定是因为解锁的逻辑吧,对不对?你想啊同学我遥控断了之后,断了之后,是不是我们飞机这边,它其实一直执行的,是不是这段逻辑啊,对吧?
这段逻辑里边,我是不是会判断这个遥控有没有连接,没连接的话,是不是没必要去做判断,只要有连接了,也就是我遥控一连上重连了,是不是就会执行这段逻辑啊?那也就是说是不是在执行这个方法的时候,直接就是解锁了呀。大家能想明白这个事儿吧,这是为啥呢?来看一下,我们进到这里边来啊走,哎,其实应该是能想明白这个事儿的。你看啊同学,我们第一次解锁的时候啊,最终最终这个THRstatus它会落在一个什么状态,是不是最终最终会落在一个unlock解锁状态啊,那你遥控你再重连的话,那你再调这个方法,它进来之后是不是切片死在那还是什么状态,还是解锁状态吧,还是安log。所以人进来之后,直接进到是不是这个分支直接returnOK然后咱直接就解锁了呀?嗯,它是这么个逻辑,问题是出在这儿的啊,所以我们这其实只需要做一个简单的操作就行,怎么着呢?出了故障之后,故障修复了之后,我们是不是也应该把油门的状态给它复位呀,对吧?
它是不是也应该恢复到辅瑞这个状位啊OK好,所以接下来呢咱们往下翻,在哪写一下这个事就行了。走走走走走在这个位置。对吧?你飞行状态复位,我油门状态是不是也要复位,对吧?进到它那个FREE辅瑞状态这样一来是不是就没问题了呀?
哎,好,那接下来我们再去做一下这个测试啊,就这个咱们得提前给它设置好,要不然将来咱们把这个东西作用到飞机,呃,就是作用到电机的这个转速上,到时候你会发现哎,我重连之后,哎,一下就会转来来吓一跳,对吧?就比较危险啊,所以咱们提前把这个事先处理来走,你来我们再进来。呃,这个没插啊,没插,我插上它,大家稍等大家稍等收录。哎,好了啊,这个刷进去了之后呢,我们就在开始做这个相应的测试了。同学来,我把摄像头打开呃,注意啊,这个是我那个呃没连我遥控,现在没开啊。好,我现在给开了。好,开了之后呃,注意这是我的机头,对吧?机头两个灯指示灯已经常亮了,说明遥控连接上了这儿呢,这俩灯是不是低频闪烁,说明我目前处在爱豆状态,对不对?哎,好了,那接下来呢我们就开始去进行解锁啊,首先推到最高等一会儿拉到最低好,保持一秒,是不是解锁成功啊,对吧?哎,好了,那接下来呢我们就直接在这个状态下,我就让它断连了同学呃,直接把这个遥控关了。
好了,它会灭一段时间灭的那段时间,是不是处在那个就是falt那个状态,对吧?啊,完事之后,是不是就开始进行低频闪烁了,对吧?好,现在处在idle状态了啊,那现在我再重新的去开咱的这个遥控啊,点开不用闪,你看它这儿连接上了,然后这儿它会进入到那个快速闪烁吗?同学不会说明这次目前仍然处在idl状态吧,这就安全了啊,你要想让他去进入到normal状态,你得怎么着重新解锁走你,然后下来哎,是不是就解锁了呀,对吧?哎,好了,那那这样一来的话呢,呃咱这个指示灯呢,就算是工作正常了。哎,好了,同学至此,我们就已经处理完了,咱这个遥控的各项状态。哎,好了,把这个视频停一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

11-四轴飞行器-飞控端-飞控任务-整体思路

11-四轴飞行器-飞控端-飞控任务-整体思路哎,好了,各位,那接下来呢我们就一起来实现一下咱们当前的这个非控任务。当然先不用开始实行,我们先先大致的梳理一下它的思路啊,那思路应该是什么样的呢?首先第一个,我们需要去,最终最终最终最终要干的事应该是什么?是设置电机的转速,非非非非控,其实咱们控制的就是电机嘛,对不对啊?好,那当然这个电机的转速,我需要综合多方面的这个信息去进行设置啊。那具体要综合哪些这个方面的信息呢?首先第一点就是飞机的状态,这个事儿应该能想明白吧?同学就是我这个状态,如果处在idle下,我其实只应应就是啥也不用说,直接就是多少零,不管你油门给多大,我这是不是都应该是零,没错吧,各位好,那继续往下进行。
那如果我处在这个normal状态呢,正常的工作状态,正常工作状态就是我推油门他就走呗,对不对?哎,那你说我这个电机的软速,我需要考虑到什么呀?就是在normal状态下,咱们应该应应应该怎么去设置这个电机多转,就这个可能就复杂一点了。你想啊同学在这个状态下边,我给油门,那我的这个电机转速是不是应该是变大呀?没错了OK好,那同时你动个状态,我是不还能控制前后左右啊,对不对?控制前后左右,咱们前面是讲过,其实你往前走,就是让你后边那俩电机快点,前面俩电机慢点有个轻点,它是不是就往前走了呀,对不对?OK好,所以说你还得控制什么呢?就是考虑到我这个呃遥控的这个其他的这个数据,说白了就是我得考虑遥控数据。哎,在浓抹状态下。除此之外呢,还有一点就是咱这个飞机呢,其实一会儿咱们可以可以看一下,就是你直接把油油门的这个速度啊,你作用到我们这个每一个电机上,它其实它飞起来它是飞不稳的。
如果你不做任何处理,即便是你每一个电机,咱们是通过PWM去控制的对吧?即便是你每个电机它的那个占空比,你给的都是一模一样的。你会发现它实际飞起来也是不稳的。这个是为什么呢?很简单,首先第一个原因,咱们每个电机它可能是不是制造的工艺是不是完全一样的,对不对?哎,OK好,那所以说它肯定转速上是有差异的。再一个本身身,我们这个无人机,它其实也不是完全对称的吧。同学它有可能你这个电池,你比如说举例子,我往往这往往这边偏一点,或者往往那边偏一点,是不是整个飞机,它的质量不是这个完全对称的呀,对吧?就是我拖着中间,你我拖中间它它都拖不住嘛,对吧?我通拖中间它其实挺看它的是吧?很不稳啊,就是所以说即便是你PWM这四个啊PWZM占控比都是一样的,它也会不稳啊。OK好,所以说要想让它能够稳定的飞行,我们必须得做什么呢?得做所谓的PID控制PIDcontroller,对吧?哎,必须得加这个东西啊,所以说你你要在这个所谓的正常工作状态下呢,我们需要去考虑这么多东西。
当然这个PID呢呃咱们应该是根据什么去计算PID呢?根据飞行姿态,因为在normal这个状态下,我们只需要保证它是不是这个姿态的稳定性就行了,对吧?所以我们只需要根据这个飞机的飞行姿态的误差,去计算这个电机的速度就可以了。飞行姿态前面给大家讲过,咱们怎么测?飞行姿态来着,怎么表达这个飞行姿态呢?是不有有三个度度,对吧?哎,俯仰角偏航角恒滚角是不是就这几个角啊,对吧?哎,通过他们的误差呃呃跟谁的误差跟我们期望的误差啊,也OK去计算一个呃最终的一个值,然后反作用到我们这个电机上,就是在normal这个状态下啊,考虑三个点,飞机状态遥控数据,加上那个就是飞行姿态的PID啊。好了,那再有呢就是这个定高状态了,定高状态,咱们前面讲过,它需要保持在一定的高度,对不对?
那你正常的情况下,这个飞机它也不可能在一个高度保持下来的,就是你自己手动控制,你很难啊,就是你自己通过加大油门减小油门去控制很难。
哎,那我们所以也不应该自己控制怎么着呢?还是让谁啊?是不是让咱的那个谁啊PID去做这个事儿啊OK所以在定高状态下呢?呃,首先你要考虑遥控数据完之后呢,PID这个PID就得有俩个,一个是控制飞行姿态的。
因为你定高的时候,这个飞得也得稳才行,对不对?哎,好,除此之外还得带来一个啥呢?飞行高度的PID那应该是他俩的一个综合作用的结果,然后得到咱们最终的飞机转速。哎,完了之后呢,哎让它飞是这样的啊。好,然后最后呢在这个故障状态下,我们又应该怎么着呢?
故障状态下,咱是不是就得自己去设计一个算法了,对吧?就是当然我目前做一个非常简单的处理,咱们就让这个电极转速慢慢的降为零就行,能理解这个事儿吧。
哎,好了,那这样一来,咱就基本上把这个事儿就给搞定了,哎,基本就搞定了啊。行了,那基本上就是这些吧。哎,好了,那所以接下来咱这样同学,我们先这样先怎么着呢?这些东西咱们先不着急做啊,咱先把这一部分给它做了,就是根据状态去设置电机转速包,这个遥控数据什么的,或者PID什么的,我们暂时先不考虑能理解这事儿吧。同学等后边咱们做了PID,然后再往里加就行啊,来吧,那这是我们后续的一个整体思路啊,你。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

12-四轴飞行器-飞控端-飞控任务-根据状态设置电机转速-上

12-四轴飞行器-飞控端-飞控任务-根据状态设置电机转速-上还可以呃,来吧,各位,那接下来呢我们先来完成一下什么啊?我想想啊先来完成一下,咱这个非控认里边最基础的一项操作,就是去设置咱这个呃电机的转速啊,呃我们先考虑两点吧。同学呃,因为电机转速前面讲过,需要综合PID飞行状态以及那个遥控数据,对不对?那我们现在呢就先把油门和谁考虑进去呢?油门和这个就是咱们这个飞行状态给它考虑进去。
PID我们现在先不考虑啊,来吧?呃那既然要执行这么多的操作,对吧?大家看到了这么多操操作,以我们这样吧,我们就也是去定义一个什么呢?定一个APP层,对吧?把这些复杂的计算逻辑呢,咱们都给它放在APP上,这个没啥问题吧。同学哎,好了,现在开始啊。那现在呢我们去APP这边呢我们新建一个文件夹,这我就叫做flagFLIGHD对吧?flag好,完了之后呢,我们在里边新建这个呃两个文件啊。首先第一个就是APP下划线。FLIGHDflag点h肯定有可能c复制一下啊回车。然后呢,我们再来一个点c的啊。好了,那现在HC都有了,我们在h里边先拿一个hider啊。好,那接下来呢咱们要做的工作就是去干啥呀?设置这个电机的转速啊OK这边我们先声明一个方法叫做word,后边来一个啥呢?呃,FIIHHNT案例FRIGHDLIJHD呃,后边呢我叫做setMOTORmotorSPEEDsetmotorspeed的,这个没啥问题吧。哎,好,那接下来咱们想讲就是这个方法,咱应该怎么实现吧?
哎,我先录一下啊,呃,引引一下。lookde后边motor这个是不是肯定得拿进来同学呃,INT后边跟上一个MOTOR点h呃,当然这个目前引不了,引不了,是因为啥呢?
他啊能引能引,只是没提示,只是没提示啊,能引啊。行,那接下来咱们就准备实现一下这个逻辑呗。哎,先生,你说咱们这块儿应该怎么做呀?首先我还是老规矩,我先告诉大家,就是这个方法,咱们在哪儿用啊?咱应该在哪调?这个方法,是不是应该在福瑞RQSpass点c里调它呀,对吧?呃,好,当然了,我这边还是先把那个APP引进来includeAPP,后边跟上一个咱们刚才写的flasgHH啊,那应该在哪儿调呢?是不是应该在咱那个飞控任务里边去调找到飞控任务,应该是在这儿调吧。
咱之前做测试的时候,是不是直接就在这儿调了一个这个ITmotorscienceed的呀,对吧?这调了个这个啊,这回咱不在这调了啊啊,那咱去哪调呢?各位就这些东西,我们统一都给它放到哪儿,是不是给它放到?刚才咱那个APP那个方法里边啊,对吧?来,我们进到这个flight那块儿啊,来,是不是进到这个里边啊?呃,哎哎哎哎,我这个怎么叫APP呢?我不应该叫呃这个怎么叫INT呢?我应该叫APP,对不对啊,就在在这儿呢啊,我们是不是应该在这儿在这调啊,没多少东西。但是你要是在这儿钓的话,咱能够得着这几个这几个就是结构体嘛,够不着,对不对?够不着的话,那咱们怎么着呢?七统咱是extern一下呀,还是说怎么着,其实没必要医生,咱直接怎么着,我就不不在这儿声明了,是不是就行。大家想想这个东西我有没有必要在这儿声明好像没必要设置电机,就是我什么时候我放在这儿啊,如果我多个任务之间,对吧?我需要共享这个变量,你像这个你像这个他们是不是都需要被共享的呀,对吧?那我给他放在这儿,对不对?那你这个是不是只有这一个任务会用它呀,对吧?所以我放这儿其实没多必必要啊。好,这个东西我就直接给拿过来,我就得了,我就放到咱那个APP里边,对吧?APP怎么老是找不着它呢?在这呢咱就直接给他放这儿呗,这这这个没啥问题吧,同学哎,没问题啊,没问题啊。
OK好了,那前边这个地方我得改一下啊,不叫。ANT叫APP。好,那现在基本是这么个思路啊,完了之后一会儿是不是咱得CTRLC这个东西得拿到哪儿得拿到,咱这个是不是task这边来去调用啊,对吧?我们进到进到哪儿进到,哎,哎哎,哪去了,是不是进到这个位置啊,对吧?哎,好了,那就设置电机转速啊,好呃,基本上是这么个思路啊。好了啊,那这个叫做设置吧,咱们就叫做呃谁输入法设置电机转速啊?当然前面这个速度没必要是不是这么设置了呀,对吧?那一会儿肯定是根据油门,根据我们PID的计算结果来,对不对?
好,就是这么个思路啊。行了,那接下来咱要做的是不是就去设置这几个值了呀,对吧?哎,好了,那我问一下大家设置电机转速,咱这需要用到什么信息,需要用到什么信息?说白了,就是我我这儿调这个方法得得得给他得给他传什么参数儿吧。哎呃,ok需要什么呃,对摇杆的数据得拿过来,对吧?因为你这个是最关键的一个了,对不对?哎,第二一个还还得有个啥,那那个状态是不是得拿过来,对吧?哎,我得根据状态,根据呃遥控数据去进行设置啊,所以说咱这儿呢一共需要两个参数啊,来吧。那现在我们进到这个c里边先改一下啊,那咱应该叫做。首先第一个叫做什么?呃,先来一个飞行状态吧,那就是flight是不是status啊,对吧?OK好,这个实际上呢,你给个数啊,给个指针是不是都行,对吧?因为这个本身是不是也就是一个是不是一个美女啊,对吧?哎,你给啥都行啊。好了,接下来第二一个咱们这儿呃就得给那个遥控的数据了啊,那遥控的数据,这个呢咱最好给一个指针,对不对?呃,remotestruct后边我们来一个指针,后边跟上一个remote下划线塔。哎,好了,那这这样一来是不是就dok了。
哎,好了,那接下来呢我们就把这个方法呢给它controlc我们来到对应的这个c里给它复制一下就行了。哎,这个没问题吧,各位同学哎,好了,那当然这儿改了之后呢,我们立即就去改一下那个调用方啊,调用方,先让他给咱们把它传进去。哎,在哪儿呢?在那儿哎,开传。首先第一个就是那个飞行状态,那就直接是不是flightstates就行了,对不对?好,第二一个是什么remotedate的那个指针吧,对吧?根据这俩去设置咱们那个电机的可速啊,哎来吧,那接下来咱们往下进行下来,该干啥了?
接下来就是看看怎么设置咱这个天机转速呗,哎,注意这个方法是不是会循环不断的调用啊,对吧?哎,ok啊,这个要注意嗯,那想想怎么着啊,先考虑哪一种原装,先考虑状态吧,对吧?如果我的状态现在处在idol,你管你油门是多少,我是不是都不能让它转呀?对吧?应该是先考虑状态啊,所以咱就直接怎么着呢?直接就来一个,是不是switch就行,switchswitch这个个SAATUS不是应该是这个的呀,对吧?啊,OK好了,那完了之后呢,接下来往这里边来啊,首先case,如果我当前是idol状态,那是不是电极的转速直接给零就行,对不对?一会儿再说啊。好,然后往下走。如果我当前的状态是normal,那这个时候可能考虑就是比较多了,一个是考虑遥控数据,还有一个是考虑咱们那个是不是油门的大小啊,对吧?那呃一一一个是考虑遥控数据,一个考虑BID。但是PID我们还没算呢,所以我们就先只考虑那个油门吧啊,咱们先让它转起来就行啊,来再来一个casecase之后是fakehead对吧?这个考虑的也比较多,我们后边再说这个再来一个谁报的故障状态是不是应该是这么一个思路同学。嗯,好了,现在咱就开始啊呃来吧,怎么写?如果是idle,那是不是这四个电极的转速都应该是零,对吧?直接给零,那就是MOPORmotorlefttop,然后点speed,是不是等于零,对吧?那继续往下进行,这个也等于零,这个也等于零,这个是不是也等于零就行了呀,四个电机转速全给零,给零完之后呢,是不是要进行设置啊,对吧?注意啊,你你这只是改了结构体的同学能理解吧,你没有把这个值真正的作用到那个咱们PWMR呃PWMR的占控比上是不是这个方法才是作用到那个占控比上啊,能能理解这个事儿吧。同学,所以你设置置完这个之后,一定要调一下这个方法,但是这个方法咱必有必要说在每个分值里边都调吗?没必要,对不对?咱是不是不管他前边改这个结构体改成多少呢?我们最后统一的去设置一下什么就可以了,对吧?在这个位置的外边啊,呃是这个意思吧,同学哎,拿过来,哎呃在这儿回撤回撤哦,好,是不是应该是这么去写这个逻辑啊,哎好了,那接着往下走啊,哎这个没没啥问题啊,这样一来保证snormal下轴,我是永远不会转的啊,接下来往下走。normalnormal那前面也讲过,这块考虑的东西其实比较多。但是我们现在先考虑的简单一点,就直接把油门怎么着,直接油门单调速度是不是就行了呀,对吧?这是最简单的一个写法啊THR那这个呢也是一样的吧。THR这个呢也是THR,这个也给了一个啥呢?是不是?THR就行了呀,对不对?同理啊,各位,你下边这个定高的时候呢,其实也应该怎么着,也也要考虑很多东西的。但是我们现在也是先不考虑,我就先把THR给他就完事儿了。哎,好,再往下就是falt了fault这边是不是就是说白了就是什么呀?我们目前处在一个什么状态,我们现在处在一个是不是失联的状态呀,对吧?失联的状态,如果你不做任何处理,你如果说你让这个电机的转速一直保持原来的值,那指令就飞哪去了,对不对?哎,所以现在呢我们这个故障状态下呢,我应该让它怎么着速度降零降到零。哎,如果说你直接这么来,倒也没啥毛病,咔直接就是零。
那这样一来是不是就说就就摔一一下。对吧?就咱们这个倒也飞不太高,那其实也扛摔,你就这么处理也没啥问题,其实也摔不坏啊,我这个刺儿都打折了,打折了,我用那个透明胶带胶带粘上了,照样能这个挺扛到的,没啥问题啊,东西那是无所谓的,所以这个这么处理也行啊。但是你要是想这个好好处理一下的话呢也行啊,怎么着怎么着呢?让它慢慢的降啊,对吧?呃,慢慢降这块怎么做呢?先来个简单的吧,就是让它的转速缓慢,降低,缓慢降低,然后降到零之后,就认为是不是这个故障处理完了呀,对吧?
注意故障处理完了之后,那咱的这个飞行状态是不是得回到哪儿?回到埃州吧,就是这块儿是不是又涉及到了两个任务之间的联动啊,对吧?这儿是处理故障,对不对?这儿故障处理完了,那谁我们刚刚的这个通讯任务,这个地方,你得让他干啥?同学是不是得让他去回到这个idol,然后油门是不是也得回到索瑞亚这儿是不是也得处理一下?同学所以两这是俩任务吧,一个是通信任务,一个是飞控任务,对不对?这俩任务之间大家说应该怎么办,是不是应该同步啊?俩任务之间是不是得进行同步,对吧?哎,所以这儿应该怎么着,同学怎么通过,怎么同步,怎么同步OK啊。好,咱们都知道故障处理完,我这儿之前就是做了一个延时啊,咱们现在把这个去了,咱这是不是需要如果进到这个default了,这儿是不是需要进行这个故障处理啊,对吧?但是故障处理不是在这儿做的,他是不是在那个非控认那那边去做的呀,对吧?所以咱这呢应该是怎怎么着呢?是等待故障处理,能能理解这事儿吧,同学哎,等待他怎么着呢?处理完成。哎,好了,那之后咱再干啥,是不是再去恢复咱们这个剩下的这俩状态,对吧?能能能理解这个事儿吧,同学哎,恢复到这个呃什么状态呢?这个这个挨豆状态,这个恢复到这个这个这个有这个辅助状态,你得等待故障处理完成。我的问题是怎么等这怎么等我怎么知道你那个就是飞控任务已经把故障处理完了,所谓的故障处理完我们这儿的简单的理解,就是电机的转速已经缓慢的降到零了,能理解这个事吧。同学哎,我怎么就能知道呢?给什么同给个什么同学,我这儿怎么等那边怎么告诉我给什么?哎,对呀,这不就是又是信号量吗?同学,你看这不就是任务间通讯嘛,对吧?你看啊我非空状态,哎,当我进到bot状态之后,我啥也不干,我就直接等一个信号,对不对?好了,那完了之后,那边处理完了之后,哎,给一个信号,那是不是就完事了,两个任务之间是不是就完成这个同步了呀?哎,是这么一个思路啊,所以这块呢大家得知道啊,行了。那呃思路咱们就有了。有了之后,接下来咱就准备开始写了。呃,呃,怎么写这块儿让它缓慢降至零嘛,咋写啊?同学呃,大姐呀,行,你要是不知道这个怎么让它缓慢降至零,那咱就先先不写这一部分,我们先把这个任务间通讯先给它搞定,行吧。哎,好了,那当它这个降至零之后啊,那也就是说如果我这四个电机的转速都等于零,是不是才算是零的呀,对吧?
所以这直接咱们做一个判断啊,那前面怎么处理?一会再说,我们先写一个土度啊啊土豆好,那写下边如如果四个电机的转速降降到零,那也就是说应该怎么么写呃,motorleft这个呃当然谁谁先谁后无所谓啊,来我们这儿按照顺序来吧,lefttop点speed,如果它等等于零,对不对?OK好,然后呢,并且哎这个它也等等于零,对吧?并且后边它也等等于零,对吧?并且它是不是也等等于零吧,对不对?OK哎,不是这个这个写的啥乱七八糟的,该给应该是motor,这个该谁了?该right得写并了吧,是不是写完了,怪不得他乱写了一个两个三个四个,是不是都等于零呀?对吧?好,这个时候咱要做的应该是啥呢?是不是去释放一个信号量对吧?这边是要释放那边是要等待的啊。OK好,那释放的话,那咱就直接还是调之前那个x呃,应该是pask吧,pask是不是notify对吧?NOTIFY后边应该是来一个来一个gave吧,对不对?OK我这引不了,是不是因为咱们没没引那个啥呀,没引那个free。RQS的是不是那个头文件呀,对吧?来引一下includefreertos,然后后边再来一个include,后边跟谁?哎,TASKpask四点HOK好了。ok那所以接下来咱们应该在这个位置去释放这个信号量啊。好,应该是xtchnonotifygame,后边我们跟上谁呃,应该是传一个任务句柄,对吧?你想通知哪个任务,是不是把那个任务的句柄拿过来呀,对吧?那我通知的是是不是他呀,所以我得拿到他的句柄啊,这个锯柄咱得去哪儿了?呃,这个句柄我们是在那个cast点c是不是在这声明的呀?对吧?那咱们就ifturn一下吧,同学这这这这个咱就不传它了,我们就直接接turnn啊,这个是不是更方便一点,对吧?来找一下那个非控应该是通讯任务吧,通讯任务的句柄controlc拿过来,咱就放在哪儿,放在刚才的那个非控的那个文件里啊,嗯文件太多了,找到它来往上翻。各位,咱就在这个位置是不是给它ifturn一下就行,对吧?拿过来EXTR好,这个是谁?
是咱那个通讯任务的任务句点,对不对?来给动期商务区没问题。好,接下来control再往下走,那这个直是是是就往这儿做就行了呀,对吧?哎,好了,那这样一来这个信号量是不是就给它释放过去了呀,没没没错吧,各位哎,好,那接下来呢,我们进到这边来,进到这边来这一儿,你等它那个故障处理完成,说白了就是等什么?是不是就是等信号量啊,就是等信号量了啊,所以这边应该是x,哎,不是x,应该是UL吧,ULtask后边应该是有一个notifytake吧。哎,应该是这个哎,好了,那里边是不是也要传弹传俩参数?一个是呃PD数PD数,是不是表示的?
是我现在模拟的二十信号量,对吧?那我们就还是传输数就行。那这个等待的时长,大家想想咱这可以多少嗯,给多少比较合适啊,一直打吗?一直等下去。如果一直等下去,那这个是不是一直处在放的状态啊?好像也不是特别好啊,这边咱就这样,你给他个最长时间吧,比如说我最多就等多少,我最多就等两秒两秒。如果你那边速度还没降至零,但其实应该已经降至零了啊,如果时秒还没降至零,就算就算没降至零,是不是理论上应该转速已经比较低了呀,对吧?这个时候咱就直接怎么着,直接就取消阻塞状态,然后呢,咱直接就怎么着了,就恢复到这个相应的状态了,恢复到这个状态之后,那当然你进到idle了,进到idol之后,按照们那个飞控那边的逻辑,只要进到idol速度,是不是立即变为零了呀,对吧?就是这边咱们给它一个最长的处理时长啊OK好,是不是就是这么一个思路?哎,好了啊,这个我还用还用去做这个判断吗?不用了,不管他是在两秒之前退出的这个方法,还是说是在两秒的时候退出的那我剩下的事儿是不是都要去做这俩事啊?哎所以不用去做这个返回值的,这个比较了。哎,行,这个就完事儿了。完了之后,接下来呢我们再回到这个通信呃,这个飞控那边呃,这块是不是就只剩下那个处理那个转速那个事了,对吧?就让它缓慢降值零零就行,这个其实也好写,咋写,这个先不写了,下一个再写吧,大家先休息会儿,时间太长了啊,来听一下视频。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

13-四轴飞行器-飞控端-飞控任务-根据状态设置电机转速-下

13-四轴飞行器-飞控端-飞控任务-根据状态设置电机转速-下呃,来吧,各位同学,那接下来呢我们就一起来看一下这个错故障处理这块到底怎么去实现啊?呃,故障处理按照我目前的逻辑,其实处理非常简单啊,就是怎么着呢?就是让它的这个电机转速缓慢下降,对吧?咱们都知道这个设置电机转速的这个方法,实际上它是会是不是循环不断的执执行的呀,对吧?哎,那我每次来这儿之后,我都怎么着呢?都让它减点儿,每次来都减点,每次来都减点减到。比如说零为止能能能理解吧,同学减到零为止,然后呢,是不是就释放一下这个信号量释放下来之后,那边是不是就呃就是咱们那个通讯任务就会将当前的运行状态是不是给它变成挨豆啊,对吧?哎,变成idol之后,它是不是就处在这个状态下,就就一直是零了呀,对吧?哎,不就这么个思路啊,哎好了啊,所以接下来呢咱们就开始啊呃这边呢我们就呃直接写了啊,就是怎么解啊,应该呃如果就是因为啊就是咱们这几个电机的转速,它可能并不是完全一样的,大家能理解我这个意思吧。那所以说我们最好一个一个去进行判断啊,来注意观察。如果我们先设置第一个motor,这个lettopOK好点儿speed。如果这个东西要怎么着呢?要是大于零,哎,也就说明我现在是不是还没有降至零啊,对吧?大于零,那我就怎么着呢?我就motorlefttop,然后点speed,我就比如说我就减等于十或减等于多少。这个其实可以根据测试嘛,看看怎么着效果比较好啊。ok好减等于十。但是注意注意同学减着减着就有可能会出现一个什么情况呢?对吧?咱们是int类型,对不对?就有可能会出现小于零的情况吧,同学对不对?哎,ok好,那所以说咱这儿应该怎么着呢?咱这儿做一个判断,就是每次减完,这是减完了,下边是不是才是真正的去设置那个转速啊,对吧?每次减完咱都做一下这个判断。如果说减完之后,我这个速度呢现在已经变成多少了,点儿speed已经小于零了。好,那这个时候咱就让它怎怎么着,那就让它是不是等于零啊,嗯,对吧?OK好,这样一来的话呢,是不是就完成了这一个电机的转速的设置了呀,对不对?OK好,其他那几个是不是也是同样的道理了,对吧?我们就也这么写一下啊,来来个ifif我们后边直接提示了啊,leftbottom哎,OK这个没啥问题OK接下来往下走,下一个,还是if直接判断呃,让它提示这个是righttop,然后呢再来一个是不是rightbottom就行了呀,对吧?来拿过来OK好,这样一来是不是咱就完成了这样的四个电机的转速的设置了呀,对吧?好,那注意观察同学当某一次再进来之后,我发现了OK我这几个电机的转速都等于零了。那是不是就证明咱是不是已经处理完这个所谓的故障呀,对吧?这样把信号量一释放,那咱这边阻塞的那个任务这一块是不是就会被唤醒了,对吧?被唤醒之后呢,直接就进进入啥了,直接是不是进入挨豆状态了呀,对吧?进入挨的状态之后,那我们非控这边它下次再去循环,再执行咱这个方法,他是不是就不会进入到这个ftt了,对吧?那他就进哪儿了?进猫呃idle了idole之后是不是就意识到是你们了,这不就稳了嘛,对吧?同学ok好,这就是咱这儿的一个呃完整的思路啊。ok好了,这个完成之后呢,现在呢我给它编译,然后稍录一下,我们测试一下这个实际的效果怎么样啊?来吧,那现在我们编译呃,然后大家稍等一下啊。好,那现在呢我们给它稍录进去,注意这回啊,咱是不是已经把这个油门作用到这个电机上了呀?对吧?哎,所以大家在测的时候就得注意一下啊,我没没插线插一下摩插的线。大家测的时候呢,最好把这个线拔了啊,就是别别别缠住,别绕住啊。
好,现在是不是就已经ok了呀,对吧?呃,好,那接下来呢我就用手拿着它给大家做测试吧。呃,这边我往这边躲躲,把这个摄像头也开开。好,那现在呢我就把这个东西放在这儿,其实也不用拿,就是稍微的慢一点就行,别把这个线绕过就行。哎,我就这么放着,那就打手了,是不是是不是打手了,听这声音啊?行,那这边呃目前我限拔了遥控,我现在打开遥控打开之后,那边是不是机头是冲大家的啊?呃,然后是不是已经闪呃,亮了呀,对吧?哎,好,现在我油门解锁先推到最高,然后拉到最低,看那个灯是不是已经闪起来了?同学这时候就推油门了,推油门的时候一定要慢点来看我这哎哎哎,我这手速哎,就一点点,一点点,给一点点,哎,是不是就转起来了,同学就千万别给大了啊。就是你看我就给了这么一点,就给这么一点优吧,一点点啊,就是它它它它就转起来了,转起来之后呢,但是接下来呢我们测一个这个什么呢?测一个就是它的故障处理,按照我们目前的分析是不是只要我断了之后它会自动的。首先这个电机会降至为零,然后是不是飞行状态会恢复为挨豆了,对吧?哎,好,那现在呢我把这个遥控关了,哎,没关了啊,呃,摁两下哎,停了,然后是不是也已经进入到爱豆了呀,对吧?哎,好,那现在呢我再给他呃,连上连上之后注意观察同学,他是不是也没有立即进入到那个工作状态呀,对吧?你要写再想让他这那你就就得先推上去,然后再拉下来,让它快速闪烁,然后呢再给一个门走走走,哎,这个没啥问题吧,同学哎,ok啊。好了,那完事之后呢,我们再解锁,呃,不是带解构带那个呃故障。哎,行,那就是这么一个思路啊,同学应该是没啥问题的,还算比较安全。然后呃这块其实可以给大家演示一下,就是之前那块那个问题啊,就是之前一再给大家强调就是哪儿呢?我们是不是在通讯任务这个地方之前没加这行那块啊啊,这行一定要加啊,我就不也不演示了吧,就大家应该能知道它它的意思,对不对?比如你自己可以测试啊,你把它去了。所以说说你遥控断联断联之后再重连之后,会立即就进入解锁状态,飞机一下就开始转了,这个就有点危险啊。所以这块呢大家注意就行了,一定切记一定要加了它。好了,那应该就没啥事了啊,行,停一下视频。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

14-四轴飞行器-遥控端-显示任务-通信协议说明

14-四轴飞行器-遥控端-显示任务-通信协议说明跟你说话。哎,好了,各位,那接下来呢咱们再看一看,就是遥控那边那个显示。
呃,这个咱们这个就是课程的安排,就是遥控显示这块呢,咱就是直接就是呃直接移植了,就啊,然后移植过来之后呢,我再呃给带着大家去看一下这个源码,然后给大家说一下,就是它的一个核心思路是什么样的啊?呃,大家还记不记得就是我们这块屏幕,咱之前学五耀的时候用的就是跟它同款的屏幕,对不对?唯一的区别是什么呢?大家还能想起来吗?唯一的区别是咱之前是用的一个OLED模块,咱是用的现成的模块,大家还记得吧?哎,那个模块呢是不是说白了就是一块屏屏幕带带一个什么东西,是不是带了一小块PCB啊,对吧?哎,那个PCB实际上呢它呃呃就就就它里边有一有一些这个外围电路啊哈完了之后,它那个PCB只给我们暴露出来的是四个眼角,还记得吧?那四个眼角相当于就是什么?是不是就是iphonec的接口啊,对吧?哎,有那个电源呃,有正有有有有有d对不对?然后还有一个就是时钟,还有一个就是数据信号,是不是一共四根线呀,对吧?哎,是这样的啊,但实际上咱们大家都知道啊,如果不用它那个PCB的话,那这块屏幕应该会给我们暴露出来一大堆的眼角,这一大堆眼角其实在这儿也能看出来。你看背面密密麻麻的,是不是一根就是一个眼角啊?ok好,那我问一下大家,大家知不知道?就是这些眼角是谁的眼角,呃,还能想起来不?关于这块ORED屏幕,大家还记得什么东西?这这种屏幕是不是一般都会带一个主控芯片呀,对吧?
OK那这块屏幕它的主控芯片跟咱之前是同款是是不是那个SSD幺三幺五啊,没延角啊。OK啊好了,那告诉大家呃呃,需要给大家说明一点,就是什么呢?就是这些引角,就是那个主控芯片给咱们提供的眼角或者是暴露出来的眼角。注意啊,这个有点危险啊,就是它暴露出来的眼角没错吧,同学OK好了,那是这一定要注意。所以实际上呢我们再去往这个屏幕上边显示内容,或者是对这个屏幕进行控制的时候,我们一直都是在跟谁进行通讯呢?那个主控芯片一直都是在跟SSD幺三幺五进行通信啊,是这样的啊。OK好,那这是这块屏幕它的一个基本说明啊,就是咱们得知道那个主控芯片。呃,完了之后呢,那接下来我在移植这个代码之前呢,我我那因为大家都忘了啊,所以我就在简单带着大家去回顾一下这块屏幕的一些呃基本内容啊。呃咱们这样你找一下五幺里边那个资料资料里边咱们找芯片手册这块是不是有一个SSD幺三幺五啊,对吧?啊,来我们点开可以好,都是这个没有中文的啊,就是英文,嗯,他好像也没有那个目录是吧?好,SSD幺三幺五就是呃简单梳理一下,就是这个东西啊,它给咱们暴露出来了一大堆的银角。哎,OK好了,那完了之后呢,我们跟这个屏幕进行通讯,实际上呢都是通过这个屏呃,主控芯片给咱们露露出的银角进行通讯讯啊。好,大家家都还记得吧,就是SSD幺三幺五。这个芯片呢它是支持多种通信协议的,还有印象吧。呃,你要是不记得了呢?我们就找一下它这个目录目录里边有一张是专门讲它那个MCUinterface的。大家看到了吧?呃,MCU是不是接口啊,对吧?哎,可以看一下这个目录啊,它支持这么多种通讯协议啊,有什么呃,六八零零seriiousseriousinterface,那么八八八零seriousseriousinterface,还有什么呀?这个是不是咱们大家所熟悉的那个SFI啊吧。那们线的有三线线,那实际上也并也并不是我们三二里边就是那种特别标准的那种SPI啊,也有区别。哎,OK好,那继续往下看东西,还有什么是不还有iphonec啊,那咱之前用的那块模块啊,咱咱当时不是用的谓谓模模块嘛,对吧?那个模块实际上呢就是相当于谁,是不是用的是iphonec接口啊,然后把iphone接口是不是咱们们暴露出来了之之前是这么一个逻辑啊。好,那一会儿咱们可以看一下,就是我们自己的这个PCB看一看。目前咱选的是这里边的哪一个这个个个个这个这个这个接口的一会可以看一下下啊,甭管用哪个甭管用哪个同学啊,那你使用咱们这个SSD幺三幺五这个主控芯片的时候,甭管用哪个通讯接口啊。好,你在跟这个芯片进行通讯的时候,大家还记不记得我们给他发送的内容的具体是什么?还能想起来不?咱们给他发送的内容,其实分两种,一种是控制命令。还有一种是什么显示数据,大家能想起来了吧?哎,控制命令用来控制什么呢?比如说点亮这个屏幕熄灭这个屏幕,这是不是都叫控制命令啊,控制命令啊,对吧?呃,再有呢比如说我调整屏幕亮度,调整屏幕的这个就是对比度等等,这是不是都是命令啊?
哎,还有一种就是什么?就是显示数据显示数据OK我想显示什么东西?
我是不是得通过二进制的这个形式,把数据传给它,它才能够显示出来呀,对吧?哎,好,那完了之后,大家再回忆一下,在这个SS幺e幺三幺五里边,实际上它是有一块显存的,大家还记得吧?呃,这块显存它的大小整稿是整稿是多少呢?是不是一百二十八乘以六十四个比特呀,嗯,对吧?这一百二十八乘以六十四个,比特是不是正好就对应着我们这个屏幕上边的一百二十八乘以六十四个像素。对OK好,那实际上呢我们前边往这个SSD幺三幺五里边写这个所谓的显示数据,你就是写在哪儿呢?就是写到这块显存里边写到显存里边之后呢,那屏幕上这个对应的位置是不是就会显示出来相应的内容。哎,它是这么一个思路,这个大家应该有点印象了啊,有点回忆起来了。哎,好了啊,那这是关于这块屏幕的一些基本信息啊。
好了啊,那所以接下来咱们这样,我们我就不打开五幺的文档了。五幺文档里边,我当时还给大家画了一个那个PPT呃,展示了一下,就是这块显存的内部信息啊,包括我们给他发这个指令,怎么发发数据,怎么发之之前是不是都有了,对吧?这个咱们就不再去看了啊。OK好,那接下来咱这样呃,我们结合着我们自己这块屏幕,它的这个就是原理图。
咱们去看一看这儿采用的是什么样的通信协议,然后这个通信协议具体应该怎么去操作啊,来吧。那现在咱们开始我们找到这个四轴,无人机找到资料,找到它的原理图,应该找飞控找手柄,对吧?找手柄啊,来点过来,点过来之后呢,咱们找一下,哎,注意观察这儿是不是就有一个OLEDSSD幺三幺五啊,这就是OLED幺三幺五那个主控芯片啊,然后大家可以看到,就是这一排这么多东西,对不对?这实际上呢就是啥,就是我们看到的这个屏幕背面的,是不是这一排页脚啊?哎就是这些啊。好了,这个东西看起来就密密麻麻啊呃OK然后呢咱们再来看一下同学,呃,咱们重点看一下什么东西呢?
咱先看啥,就是这些东西都是啥,你不用管啊。这其实外围电路这个手册上都有,我们现在重点关注一下,就是咱现在选择的是哪一个通信协议,这个事儿是不是先搞清楚啊,对吧?之前用的iphonec,但是这回可以告诉大家用的不是iphonec啊,那到底怎么看这个东西呢?其实手册上人家也有说明,哎,还是看手册,这个没啥好办法,找手册,手册完了之后注意观到这是不是就有一个什么MCUinterfaceselection呀,对吧?是不是就是选择对吧?那你就点过去看看他是怎么选的。呃,这块儿其实也告诉咱们了,来注意观察。他说呃,看这他说differentMCUmode呃,canbesetbyhedwareselectionon什么BS二到零pince啥意思?就是说你不同的是不是这个MCU的这个这个接口是可以通过,是不是硬件去进行选择的呀,对吧?哎,怎么通过硬件选择呢?通过BS二到零,也就是BS二BS幺BS零是不是是这仨引角去选择呀?嗯,对不对?OK好,那具体怎么选呢?那他说他告诉你,让你去参考谁参考table五杠二里边的,是不是这几个的设置啊,对吧?那这边能点唉,直接点是不就点过去了呀,对吧?哎,五杠二好,这就是五,然后杠这是五杠幺吧,然后我们找五杠二啊,好,是不是五杠二同学。哎,好了,这就是咱们这个呃通信接口的选择可以看到这个BS二到零注意,这是三引角啊,同学这是仨引角。这三引角呢?如果全是零的话,那是不是就是它那个所谓的四线SPI如果是零零幺,那就是三线的。如果是零幺零,那就是好appc。那也就是说我们之前用的那个PCB的模块里边,它是不是这仨引角,应该是这么去给这个给的电平啊。哎,OK啊好了,那接下来看一看咱目前这个原理图,咱给的是怎样的一个呃这个什么呀?这个在这样一个选择啊,咱们找一下原呃,手柄呃,注意观察同学这里边有没有?咱们刚刚所提到那个BS零一二啊,有吧,这是不是那个BS零一二,那发言角这发言角,你看咱们原理上是不是直接全接地了呀,对吧?那也就是我们选的是零全是零,全是零的话,那对应到刚才这个手册上,咱选的应该是是不是这种通信协议啊?
嗯,没错吧,同学。那所以说接下来咱们要做的工作应该是啥呢?就是得看一看他这个四线的SPI到底是怎么个通信流程?哎,OK好,那所以接下来呢我们就得找一找了,我们再回到这个最开始的目录上。这玩意儿你要是想自己写的话,那就得熟读这个手册了啊,这没啥好办法,来找到四线的,是不是SPI啊,对吧?点进来点进来之后呢,看一看他这的一个说明啊,这边是不是往下翻往下翻这个吧ICUinterface四线SPI对不对?好了,那这四线SPI到底是怎么一回事呢?我们来看一看啊,同学呃,这四线SBI说的是这四个演角是这四个引角啊,有一个什么RW呃,这是什么意思啊?还有CS还有DC还有d零。首先注意这都是什么?都是我们这个芯片上边的,是不是眼角啊,对吧?谁的眼角是不是那个SSD幺三幺五的眼角同学,那可以看到啊,这里边是不是有什么CS看到了吧,同学什么DC什么d零什么d一,是不是有这些东西啊,对吧?啊,OK好了,那咱这儿呢其实对应的就是这几个眼角啊,来吧。那接来咱们看一看,就是这几个眼角,我们要用的话,应该怎么去用啊,看能不能用,明白,看能不能用明白呃,能能能看懂不同弟来吧,不太好不太好看懂啊,这玩意儿你要想看的话,得得得得干啥得看。人家下边这个实域图了,对吧?怎么样?哎,这是它的持续度,其实它的介绍非常简单,下边是不是就是换成另外一个这个通讯的流程了呀,对吧?
哎,好,那所以这个是不是跟咱们之前学的那个SPI它不是一个就是标跟咱们之前那个比起来,这个是不是不是一个特别标准的SPI啊,对吧?确实是这样的啊。好,那所以这个具体应该怎么着呢?同学具体应该怎么着来吧,就看人家这块这几个这个这个实际图吧,咱们所有的信息都得从这个图上面来了啊OK看一看这边能不能看懂。首先这有一个所谓的CS页面CS其实我们就可以把它理解为是什么?chipselect是不是就是骗选嘛,对吧?你会发现要想通讯是不是先给个垃低,没错吧,同学ok好,那这个DC又是什么意思呢?DC哎,大家还记得吧,我们刚才讲过,在给SSB幺三幺五发这个具体的内容的时候,我们有两种两种内容可选,对不对?一种是命令,一种是什么数据,对吧?所以DC其实是在选什么date,或者是command能理解吧。OK你看他这个选法跟咱之前iphonec那个选法不一样吧,iphonec里边当时应该是有一个控制位,是不是零或者是一啊,对吧?
大家还能想起来吧。OK好,那他这儿呢是直接通过什么直接通过一个眼角拉高垃圾,是不是来去告诉他,我发的是这个命令还是数据啊?
哎,是这样的啊,他是这么一个逻辑啊。OK好,那所以根据他这个描述,应该是如果是高电平,那我发的应该就是啥date。OK如果是低电频,那我发的是是不就是的呀,对吧?不是这么一个思路啊。好了,那接下来再往下进行下边就是啥呢?下面就是啥下边那个其实就是什么史丹跟commcomme或者是SCLK对吧?这个实际上呢我们就暂时不用管它啊,不用管它。其实我们这块用的其实主要是哪个,主要是下边这两个,咱们重点看这俩,重点看这俩这个上边我们暂时先不用管啊。好,下边这俩是啥呢?我们先看这一个是是不是SCLK啊,对吧?这个对应的是哪个引件,是那个d零引脚啊,同学。那还有一个是呃SDIin这个对应的是哪个音脚?呃,其实哎他这画的是啥意思?我看啊,他这儿起哦哦,我知道了,我知道了啊,我知道了,实际上是这么一份,他他这会是不是一个放大图啊,同学看到没有?他是把这一个东西是不是给你放大了,放大成是不是这样的呀?能能能能看明白吗?同学啊,ok好了,你可以认为啥呢?你可以认为这就是发送的一个字节,这是发了一个字节,这是发了一个字节,这是发了一个字节。完了之后呢,他是不是把这个东西展开成了什么了,是不是展开成了,是不是这么大的呀,对吧?哎,OK好了,那所以说应该是能看明白了,你看SDN嘛SDNSCLKSCR能看明白了,对吧?
哎,好了,那下来看看它这个具体怎么做的啊?呃,显然这个d零它充当的是那个SCLK呃,这个d一是不是充当的是什么SDN呀,对吧?时钟信号数据的信号,这个对应到我们的原理图上应该也能找到呃,d零是不是d一啊,对吧?d零我们叫做CLK,然后呢这个d一咱们就叫做DN呀,对吧?哎,就是这样的啊。好了,那所以接下来呢我们继继续看看这个这个图啊,呃看能不能看明白,你看一看它这个数据是怎么发的?很明显,这个数据是在什么什么什么时候发,是不是每来一个上升沿,我发一位啊,没没错吧,十中信号上家来了,是不是发发一个?
这个就是你的SDI页是不是发一位,是不是来一上线员,我发一位来一个限员,我发一位啊。哎,好了,那这不就是这么个逻辑吗?所以你自己要是写这个驱动的话,其实整体来讲也不难解。这个我们直接用软件模拟是不是非常方便,对吧?因为这个咱们要用硬件SPI的话,可能就不太不太方便,为啥?因为它那个不是一个标准的,是不是四星SPI呀,对吧?你需要通过这个东西去控制,你是发的命令,还是还是什么,还是数据,对吧?所以这边咱直接怎么了?直接软件模拟是最方便的啊。好,这一点大家注意行了,你只要把这个图看懂了啊,只要把它看懂了,剩下的内容跟咱之前学那个iphonec的时候就没区别了。你像之前呃iphonec的时候说白了之前咱们是不是也是写了一个技术驱动。完事之后呢,呃,就是要么就是发命令,要么就是发数据嘛,这这块是不是也是一样的呀,对吧?
只不过就是说你你你发数据的时候,你你的模式不一样了,哎,就是这么一回事啊,其实没有太大的区别。好了,那现在大家应该基本上能搞清楚了。比如举例个我现在呢想发送一个字节,这个字节的是一个命令。那你说我应该怎么发呢?首先需要保证CS引脚是不是给它拉低,对不对?
OK好,那其次呢呃那我们这个DC引角是不是需要给它命?就是呃你要发的是什么?是是命令啊,命令是不是就是可的的呀,对吧?可的是不是也得拉低嗯,对不对?得拉低。哎,好了,那完事之后呢,完事儿之后,是不是就是写一个负循环就行。你要是软件模拟的话,对不对?写for循环先怎么着?先把这个SCLK引角,它的电型拉高还是拉低?先拉低再准备数据。所谓准备数据,是不是就是将你那个呃SDI印这个引角的电平置为你要发的高或者是低啊,对吧?然后注意它这个发的时序啊,人家是先发高位,还是先发低位,是不是先高位啊,对吧?就是一个字节里边先发高位嘛,对吧?好,先高位高位给它设置到我们这个SDI印这个引角上之后再拉高SCLK这是不是上升沿就来了呀,对吧?来了之后,是不是你这个数据就发过去了,对不对?OK好,那这个操作是不是循环执行八次就行了,对吧?这就是它这个基础驱动的一个写法。那反过来我现在不发数呃,这个命令了,我发数据你要发数据的话,那是不是就是把这个眼角给它拉高就行了呀,对吧?
别的是不是还是一样的操作,就这点区别,这就是它的这个所谓的四线SPI的一个通信逻辑,整体来看是不是也还行,不是很难吧。同学哎,好了,咱们把这个事理解了就行啊。好了,行,那呃就就就就先呃说这么多啊,那一会儿接下来咱们要做的事儿,就是把那个代码咱们移植过来,移植过来之后,我再结合代码再给大家去呃,带着大家去看一下这个协议啊,来停一下视。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

15-四轴飞行器-遥控端-显示任务-驱动说明

15-四轴飞行器-遥控端-显示任务-驱动说明开始了啊。好了,同学,那接下来呢我们需要先找到,就是咱那个就是代码啊,这个直接从咱这个word文档里边复制就可以啊,我们打开遥控器这边大家稍等一下啊,打开遥控器。好,遥控器打开之后呢,我们就先全部的给它收起来啊,折叠折叠之后呢,咱们找哪个模块,是不是找这个下边的显示模块就可以了呀,对吧?
可以看到这里边呢一共是有呃四个接口层的文件。然后呢还有两个是不是应用层的文件呀,对吧?我们这几个文件呢都要给它创建出来啊。好了,那现在咱们就呃先一个一个来吧。呃,我们先从哪个开始,我们先从这俩文件开始,显然这俩文件里边放的是啥东西,是不是就是咱那个字模啊,对吧?咱之前是不是在学那个五幺的时候也给大家讲这个字模的一个设计的一个思路啊,对吧?哎,之前也讲过啊。好,那我们现在找先找这个字母,先把字模放上来吧。那现在我们进到这个咱们的项目当当中啊,这是flag啊,这个得进到那个遥控端啊,我看一下那个遥控的项目,找到这个flags找到remote,找到它啊,进来之后,我再先把代码拿进来,然后我再给大家梳理他的思路啊,来这里全部关闭呃,呃全部关闭啊。好,那这个收起来完事之后呢,我进到IT之后呢,我们新建一个目录呃,这个目录呢我就叫做OLEDORED好了。然后在这个里边呢,我们新建这个几个文件啊,首先第一个INT呃,刚才可以看到我们这有有一ORED是不是点h啊,对吧?controlnetc完了之后呢,我们再新建一个文件叫做是不是点c对吧?然后呢,是不是还有啊,对吧?我们就统一在这里面放的INT后边跟上一个是不是found点h好t,是不是就是字体的意思,对吧?然后再来一个INTFONTfunt点c啊。好了,那我们按照这个顺序呢,把这几个文件一个一个放下来,咱先找这个字体的。
因为我们OET这俩文文会会演这个字体的文件啊,来先这这个文文件来。那现在呢我们就直接把这个东西拿过来就行了。controlc呃呃算了,我我我不拿那个n的if了啊,我只拿中间这些,我拿中间这些的好处是啥?就是我想重新自己写一下这个韩语,因为我名字跟他不一样,是吧?这个h啊HADR哎,好,然后呢把这部分容给它放进来。呃,这块儿其实可以看到就是extern呢是不是一大堆的,这个就是那个字母数组啊,对吧?哎,好,那完了之后呢,我们去找第二一部分代码,找这个放了点c好,这块还是一样的啊,上周我就不动了。你看这是IC克码的那个表,是不是还有一些这个呃咱们还放了一些这个汉字的啊,来往下翻,往下翻走,走走走走这个有点长啊,这个内容来往下翻。哎,到这个位置了。好controlccontrol。c完了之后呢,我们进到进到哪儿呢?我们进到这个咱这个文件里啊啊,应该是在这个放点c对不对?哎,这这这边咱就直接拿过来了。当然拿过来之后呢,我们这儿是不是得引个头文件啊?同学这个得引谁呃,是不是得把对应的它那个front点c引进来,对吧?interlude后边我们跟上一个INT后边来一个funt点h,对吧?哎,好了,那这样一来就搞定了,这俩文件有了啊,有了之后我们再去引入其他的那几个文件啊,大家稍等呃打开word文档,然后往下翻。呃,首先拿OED点h这个也是一样的,我就拿这一部分吧。走,这是函数的声明啊,controlz来,我们进到remote进到LED点h里。嗯,这候我还是先写一个hider啊,好,放下来,但是放下来之后,大家注意观察一下,就是它这里边是不是还引入了慢点h和GPIO啊,对吧?因为我们这是采用软件模拟的,所以说是不是得操作这个GPIN,但但你这个都演了慢点h还有标要引没必要了吧?这个里边是不是应该是它会引入这个慢点HR对吧?所以没必要重复的演了啊,这个当然重复演也没啥问题题,给他去了就行啊。好,这个就咱就搞定了。但是这个完了之后,咱最好把谁引进来,各位呃呃不用引了,这是这是这是h文件,对吧?
来接来,我们进到CC里边呢,我还是就只只拿代码,然后其他需要引入的东西,我自己写了,来往下翻,这就是咱们那个实际的这个代码了呃,来吧,往下翻往下翻。嗯,这部分代码呢其实是从网上找的现成的驱动,这个代码我都读了一遍。其实写说实话呢,就是有点儿有点儿有点有点乱,有点乱啊,这个代码写的。嗯,就是我来吧,我就我就先给他换进来啊的一下。这边呢我们叫做应该是bluiNT啊INT后边跟上一个OLED是不是俩h啊,对吧?把它拿进来就行啊啊,这v好了,那这样一来咱这个该演的基本上就就都引进来了啊,就行了啊。好了,那现在我们是不是这个基础驱动,就算是搞定了呀,对吧?那现在我先给他编译一下啊,看他能不能过。那当然这块儿呃他呃过不了,有点问题,有点问题。那是不是说明我们这儿呃,有些地方咱们那个啥呀,肯定是哪哪哪,我看看肯定是哪没演这个相应的头文件了,可能是呃这边是不是需要用到咱们那个这个明显是不是一个字,一个字模数组啊?同学,所以说它需要用到咱们那个字模的头文件啊?呃我们在这个这个文件里吧,我们引一下,这是OREDH啊,引入谁是不是引入INT后边跟着那个fut点h就可以了。
对吧?哎,拿过来,那重新再编译一下,大家稍等一下啊。好,这个是不是就过了呀,对吧?哎,好,这个过了啊,过了之后呃,我们现在先不用去做展示,我们现在先快速的读一下,就是他写的这部分代码啊。
呃,首先因为他这采用的是软件模拟的方式。没错吧。各位同学既然是软件模拟,那所以他是不是就把我们刚刚的那几个呃OLE的就是那个LED屏幕,它那个所需的那个数据传输的几个眼角,是不是给定义出来了,对吧?定义出来了。那定义出来之后,我们接下来往下进行同学,呃,往下走,往下走。看这块这块是不是就是定义了几个宏函数啊,对吧?呃,有clear有set注意clear就是置为是不是低呀,对吧?set是不是就是置为高啊,对吧?一个置位,一个复位,这个一定要注意一下啊,好拉低拉不拉低。好,这个是它啊,然后再往下注意观察。你看这里边是不是就做了一系列的这个方法的定义啊,对吧?这里边包括了什么最基础的这个就是通信协议的函数,这个是不是就是rightback呀,对吧,是不是是写入一个字节呀,对吧?哎,好了,那再往下走这儿是什么呢?什么displayondisplayoff?这是不是就是开开屏幕关屏幕啊,对吧?这个大家还记得吧,哎,这儿于就是什么?是不是OLEDrefresh,这叫什么?grvegraan,你可以理解为就是刷写这个画面吧,能理解这块吧。同学一会儿你会发现他这块人家去刷写这个屏幕的时候非常简单粗暴啊。OK非常简单粗暴啊,跟咱们之前用五幺的时候,那个抠抠搜搜那种劲儿啊,就差太多了啊,这个非常爽,一会儿你就知道他怎么做的了啊。而再往下呢,是不是ORED的一个初始化呀,对吧?然后这个明显是在干啥,是不是在clearclear,就是是不是清屏啊,对吧?然后下边呢就是呃描点呀,哎展示符号啊,展示数字啊等等,就是这些内容了。哎,好,我们重点关注一下它这个基础的驱动函数就行了啊。来,那现在我们进到语池对应的这个点c里看一看它这是怎么去做的啊。来,我们先看这里边最最最最基础的一个函数了。这个这个是不就是向OLED里边写入一个字节呀,对吧?这个逻辑是怎么写的,同学完全是不是仿照着,就是我们刚刚看的他那个手册上面那个图写的呀,对吧?就是仿照这个写的,咱们可以盯着对照一下嘛,来我这来哎,来一个f三,我盯这儿啊。好,你看看人家怎么写的,先看一下它这个函数的定义吧,它这个函数呢叫做rightback,对吧?但是这个back他也没有说到底是数据还是命令,这个没问题吧。同学哎,那这个到底是数据还是命令呢?你看它俩俩参数,就这个参数命名也很不规范啊。第一个参数是什么?是DAT它叫date对不对?要写入的数据或者是命令,对吧?结果他叫date了啊。好,那第二一个这个参数是什么呢?是CMD呃,他给的这个呃说明是什么呢?是数据或者是命令的标识,零表示命令一表示数据。好,那完了之后,他叫CMD对吧?就是是不是很容易让人产生误会啊,对吧?哎,所以大家记住一下就行了啊,这个是命令或数据的标识。这个你是你要写的具体内容吧,同学能能理解这个事儿吧。同学哎,好,所以下来看这怎么做的啊。首先先判断了一下,是不是这个CMD哎,因为如果是CMD的话啊,同学按照这个图来讲,你要怎么着?同学是CMD,那我这个眼角应该怎么着?是不是垃圾对吧?同学,如果你要是想写这个呃呃,是是说法了是吧?CMDCMD应该拉高吧,对不对?ok好,那如果是这个这个这个这个呃不对,datedate拉高CMD就是拉低啊,因为人有井号嘛,对不对?呃,是CMD,那你就拉高,那不是的话呢,你就拉高,那呃你就拉低,不是你就拉高啊,就这个意思啊。好,那你看人家是不是就这逻辑啊?如果CMD呃,他说的是呃,一表示什么来着一表示数据,那对吧?那一要是数据的话,那这儿应该是拉高还是拉低啊,数据拉高嘛,对吧,是不是就三十来回了。哎,否则就是不是clear了,对吧?能能看明白这个事儿吧。哎,好了啊,那这个应该挺简单的OK好,那接着往下进行,那下边要做的就是干啥?甭管是发数据我还是发命令CS是不是要拦底,所以CS是不是拉低了clear了嘛,对不对?ok好了,接下来继续往下进行下边,实际上呢就是在做什么?是不是大家都这个for循环了呀,对吧?哎,注意观察。首先每轮循环里边,我都要先干啥,先把SCL时钟信号是不是拉低,对吧?拉低完了之后,一会儿要干啥?一会儿,是不是要拉高了,对吧?那所以这八轮循环下来之后,我是不是就会生成一个这样的时钟信号,对吧?同学哎,好,然后拉低之后,我是不是去准备咱们这个数据啊,对吧?哎,好了,那完了之后准备数据再拉高,是不是相当于上升沿儿就把这个数据发出去了呀,就这么个逻辑,然后发的时候他要怎么着嘞,是不是先发那个是不是最最最最高位啊?对吧?所以这目前是怎么着的?用你要发的这个具体的数据去跟零x八零捋一下语一下之后拿到的是不是就是最高位?没错吧?OK好,那每发完以后,一位之后,我这个date是不是左移一位?那这样一个是不是就是从最高位到最低位一位一位的往外发呀,是不是就把人家这个时序图给模拟出来了?大家现在写这种代码应该没啥问题了吧。咱们五幺的时候写这代代码是不是写了不少了,呃,应该没问题吧。啊,OK啊,好了,就是就算你写的话有有bug,但是你这个东西你慢慢调,应该能调明白这个东西咱们看应该也能看明白啊,这就是它最基础的这样的一个驱动函数,就是用来往这个SSD幺三幺五里边写数据的。哎,好,你甭管是写一个命令,还是写一个字,写一个数据,都是调这个方法就行了。然后按照这个模式,是不是传参就完事了呀,对吧?哎,好了,那接下来我们再往下就行,这个接接来其实就已经搞清楚了啊,接下来要做的事儿,就是你得知道怎么往里边去刷这个数据了,对吧?人家这块儿的逻辑是什么样的啊?大家回忆一下,咱之前是怎么写的来着,还记得吗?比如举例子,我想在这个屏幕上的某一个位置显示某一个这个字符或字符串,咱之前是怎么着来着?还还记得不是不是那个呃SSD幺三幺五,它里边的那块显存,是不是给咱们提供了几种寻址方式啊啊,对吧?有什么水平寻址垂直寻址,还有液寻址,这个回忆还能想起来吧。然后甭管用哪种寻址方式吧,你是能够怎么着的,是能指定咱们那个起始位置的,对不对?你想往哪写,你就把那个起始位置指定到哪儿。然后呢,我就只写这一小块内存是不就完事了呀,那就显示出来咱们想要的内容了OK好,但是你看他这怎么写的啊,非常简单粗暴,注意观察他这儿直接定义了一个这样的二维数组,注意什么类型的u也是八位类型的。
所以说大家想想这个数组一共就相当于这就相当于什么呢?这就相当于什么?这是不是就相当于是那一百二十八乘以六十四比特的什么呀?显存啊,对,它这个你看啊它这个就是二维数组是一百二十八乘八的。但是你不要忘记人家元素是是是是什么类型,是不是uin八呀,对吧?我是不是一个元素,就是八v啊,能理解吧。OK好,那所以说它实际上就相当于是这就是啥,这就是你可以把它理解为是哪儿呢?是我们那个SSD幺三幺五里边的那块显存到,我们这边是不是映射过来的一个内存啊,对吧?哎,好了,那完了之后,注意观察同学,他那儿写了一个什么哇,都飞起来了啊,注意观察看这个方法,看这个方法,同学看这个方法呃,这个方法叫做什么?叫做refresh是不是gram嘛?对吧?gram就可以理为是整个一帧啊,你可以理解为是一帧画面啊。OK好,完了之后,你看他是怎么做的注意啊,这儿是不是设置那个页地址?对吧这是在设置什么?是不是列地址啊,还能想起来一点吧,就是这个东西咱们忘了也没关系啊,同学这个也不用咱们记。你将来如果说需要写的话,再去翻那个手册就行了。总之,这是在设置什么?是不是设置起始地址?完了之后呢,直接怎么着?直接是不是把整个OLEDgram,也就是它这个一百二十八乘六十四的这块内存,直接怎么着?是不是全部都写到了,是不是这个OLED里边啊,对吧?同学ok好,并且你注意观察同学就是这个方法啊,它是什么时候掉的?往下翻举个例子,这是什么显示,这是关闭。这个其实说白了就是发几个,是不是那个特定的命令啊,对吧?咱们前讲过这个不多说了,然后举个例子,你看这个可列尔屏幕可列尔屏幕,你看它怎么实现的,是不是直接就往咱们当前的OREDgram这个二维数组里边是不是全写零全写零,完了之后呢,直接是不是掉上面这个方法,是不是把这整个的一百二十八乘以六十四个位的数据全一块写进去啊,对吧?这是清平清平确实应该这么干,对吧?你确实应该每个位置是不都写零啊,咱之前也是这么干的。但是你看下边下边他画这个数据的时候,呃,显示数据的时候啊,来注意观察同学。比如说这一块是不是要显示一个字符啊?对吧?当然这里边呢他做了一些额外的判断啊,关键是你看就是他这些字符啊,同学他都是他都是这个这个这个这个个呃最终是怎么写的啊,呃处理完这些东西之后,所有东西是都调这个什么OLED招point下对吧?就是瞄点瞄点,这个其实在操作谁呢?各位,你看其实是在操作,是不是咱们当前内部的这块内存呀,能能能看明白啊,同学他并没有直接就是往哪往那个LED那块屏幕里边写,他直接操作了。我们当前这个程序里边这块内存啊。好,那完了之后,我将来想显示数据它会怎么着呢?它会直接去调我的。下边有一个应该是呃刷新的一个方法啊。呃,ok我看一看啊,这个方法咱们没在这儿聊啊,在对对,没在这儿聊在哪调论呢?咱们是在那个呃就是这个方法是在哪调论的?是在那个就是将来咱们是不是会有一个显示任务啊?同学那显示任务它是不是会定期执行,对吧?其实到时候定期执行,咱们执行的就是谁,就是这个方法,也就是说我们定期的是不是一直怎么着呢?是不是一一屏一屏的往咱们的那个ORE里边去进行刷新呀,对吧?所以我们现在这里边呢写一个字符,或者是写一个什么汉字啊等等。这些所有的操作都是在在在对谁进行操作,是不是在对这块内存进行操作呀,对吧?
然后我那边呢在周期性的怎么着呢?把这个数据就是把这轮数据一帧一帧的,就往咱们那个屏幕里刷,定期的往里刷就行了。就是这个意思啊OK好,这其实就有点类似于我们正常的个个屏里里边一个指标的叫什么东西是么?叫做刷新率啊,同学学能理解吧。比如说举例例,假如如说我目前这块屏幕,我的刷新率,比如是六十赫兹能理解这事儿同学,那就说明什么呢?我一秒钟是不是刷刷多少,我一秒钟是不是刷多少啊?六十赫他是一般钟刷多少?一秒钟,是不是就刷六六十次啊,对吧?六十帧嘛,对不对?OK好,那将来举个例子,咱们这个屏幕啊,我是不是也是定期的去刷一帧一帧的呀,对吧?一屏一屏的。OK好,举个例子,假如说我将来我比如说给它配成一秒钟,执行一百次,一秒钟执行一百次。那我们这就是多少赫兹一百赫兹吗?大家能理解这个道理吧,哎,就是他这块是这么一个逻辑了啊。
好了,那为什么我们之前五幺没用,这没用,这种方式去做呢?五幺里边大家是不是没有这么大的内存啊,对吧?五幺里边内存空间非常有限,我们建大内存都得省着建啊,就是不敢建这么大的话。但是你现在三二这里边首先第一个本身内存也大,再再有一个,我往那个SSD幺三幺幺五里边写数据,我写的是不是也快呀,对吧?我写的也快啊。那所以说这边呢你就正常的啊,直接定义一块内存,然后呢定期的往里边去刷就行了。
然后我们所有的这个操作呢,你都只需要怎么做,只需要做这儿就行了啊,你就往这里边去进行这个各种各样的一个设置,呃,就是这个这个这个设置就行了,对吧?你想让哪块点亮,你就给它置一想让哪块熄灭,你就给它置零啊。OK好,那你像下边所有的展示字符串也好,展示符号也好,就是这些逻辑呢其实都是怎么着的,都是在操作,是不是咱们上边的,是不是这块内存空间呀,对吧?
哎,都是在操作它啊,然后呢它会定期的刷到LED屏幕里,这是这个驱动的一个核心啊,然后就是这块儿下边的,像这些方法啊,就是大家感兴趣的话,你可以看一看,但实际上就是他写的这个挺挺绕的,挺绕的啊。呃,OK这块儿呢咱们就不课上去说这个事儿的啊啊行。然后大家将来如果需要用这个驱动,其实也可以直接拿。这也也算是一个比较通用的驱动。它里边那些字体呢支持呃,当然只支持这个中这个这个这个艾斯特码,你要是想显示中文的话呢,得特定的得有特定的这个字母才行,你再自己往里边去直就行了啊。好,这个大家知道一下就行啊。好了,那这个驱动咱们就先介绍到这就行啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

16-四轴飞行器-遥控端-显示任务-驱动移植

16-四轴飞行器-遥控端-显示任务-驱动移植来接下来呢我们快速的去找一下它那个应用层的两个逻辑啊,来这俩文文件呢我们直接拿过来就行了啊,来吧,那现在咱们就开始。呃,首先呢我们先进到这个咱的APP层啊,这边呢我新建一个文件夹,那这个就叫做display吧。
DISPLAY好了,完了之后往里边新建两个文件,一个叫做APP后边DISPLAY点hcan这acontrolc拿过来,然后我们再来一个点c啊点c好,那接下来呢我们去找一下。呃,先拿h呃,这边边呢我还是就直接从呃我我我我从这儿开始吧,一会儿缺什么?咱咱再拿什么吧啊OK啊,它里边那个include的东西跟咱们不一样啊,大家也是一样的,到时候缺什么,咱们再拿什么啊?
来这边我先来一个hider啊,好contterv好,先放下来。呃,放下来之后呢,接下来我们再把它那个点c的文件也给它复制过来啊。好呃,这个in可录的可以带往下翻,往下翻,往下翻走哪的。呃,完了之后呢,我们就放到与之对应的这个c里。好,那接下来咱们要做的工作呢就是进行这个编译,大家稍等啊。好,编译的话,这里边会缺很多的东西啊,那咱们就一个一个来吧。首先它缺的是不是就是uint八t啊,对吧?
呃,这个类型不对,那我们进到h里边吧。h里边首先我们先引入一个STDint对吧?嗯INT点h。嗯,好,那这个再编译一下,他们还缺啥缺啥,咱们拿啥啊?好了,那这边首先它需要一个什么呢?需要一个这个OLED以neet这样的一个方法对吧?那这个方法应该是从哪来的呢?是不是应该是从我们刚才那个就是OLED那个那个硬件层那个ininterface那一层来的呀,对吧?所以这边呢我们需要引入呃,INT后边跟上一个OLED是不是点HH对吧?这个没啥可说的。好,我们再进行编译。好,然后这块呢就还需要还缺一些东西。首先第一个它是不是缺一个CH啊,对吧?呃,注意就是我们这个屏幕上最终会显示出来,就是以当前的这个呃就是无线通讯采用的是哪个信道,它这儿那个CH其实就是啥呢?我们找这边一观察,这这里边是不是用到了一个CH啊,对吧?就是咱那个通道啊,所以咱现在是不是得有一个这个通道给他才行啊,对吧?呃,咱这个通道直接怎么做一下就行,东西咱直接就就一个字测上一下得了啊,一个字测上一下应该没啥问题吧。同学哎OK好,那所以我们在这个位置,咱声明一个啊,来这边我们来一个呃EX呃,哎不对,咱那个是一个什么,咱当时应该是定义了一个,应该是定义一个红吧。同学,我们当时应该是定义了一个红啊,那个红咱们给它放在哪儿来着?还记得不?咱是在那个SI二四二点四g通讯,应该是这这边定义义的吧,且且当时还给给定义,在在这这头文件里,所所以这边你一串还不行,咱这样我们给他放到它的。呃,我刚才是原文件啊,我们我们现在给它放到哪儿呢?放到这个头文件里,呃,完了之后呢,那边是不是再演一下这个头文件就行了,对不对?
OK好,那当然可能有点有点绕啊,但是这么做也行啊,那也行啊,要不然你就声明一个变量,你直接一侧上也行啊,都可以来。那接下来呢我们再进到d类这边来进到这里,咱们演一下plinclude啊呃后边跟上一个INT后边SI二四二VH。好,那当然这个拿进来之后,咱也不叫这个CH我那是不是叫做channel啊,对吧?所以大家记得就是把这一行就是这儿实际上是在显示咱们有无线信道,对对吧?
把这个CH改成channel就行了。哎,好,那这个完了之后,我们再重新编译一下啊。呃,好了,这个也就完事儿了,完事之后这块还缺东西啊,呃,缺的是什么呢?是是缺一个,是不是droisstick对对吧?这是个啥东西给大大家释一下下注观观察看这块块,实际上就是在显示是不是咱那个遥控的数据了呀,对吧?呃,这个遥控数据完了之后呢,有油门的有这个呃恒滚角的有偏航角的,有这个呃呃这个俯仰角的那我们那个是不是不叫drawstick,我们是不是统一的给它封装到了一个叫做remotedate的结构比例呀,对吧?所以咱这拿到那个remotedate结构体就行,这个是不是就可以直接怎么着了?这个咱直接excel二行不行?行吧?哎,这个应该是可以的啊。exexto二后边我们跟上一个,咱们去找一下吧,找一下那个应该是在free。RTOS那个task里边了,来,咱们找一下点,你,然后往上翻找到,是不是这个就行了呀,对吧?controlc我们再回到这边来给它放进来。好,这样一来就呃相当可以引到这个web出去了。
当是演完之后,我们那是不是也得改一下了?因为咱这不叫joinspeak了,我们统一替换吧,咱直接controlf所有的它的所谓的droaSTSCK咱是不是都统一的给它替换成remomodata就行了呀,对吧?来拿过来,我放到这儿,完了之后,我们直接全局替换。正好我们那个remodeldate里边的那个属性名,是不是跟它是一样的呀?这个没啥问题。好,那接下来我们再重新编一下,看一下这个效果。好,那大家看这次咱们编译是不是就通过了呀,对吧?哎,好,这个通过之后,接下来我们继续往下进行。呃,接下来后边咱们要做的工作应该是什么呢?其实我们要做的就是循环的去调那个方法,同学循环的,是不是调这个方法呀?
循环的调这个方法,你看就是每次调的时候,它都会怎么着,是不是会掉?我刚才所说的那个OLEDrefreshgrade,也就是这个整个是不是写一一屏数据的这个方法呀,对吧?哎,就是定期的往里边刷啊。OK好,那这一点大家注意就行了啊。好,那这个完事儿之后呢,其他的咱们就不用管了,下边咱要。哎对,还有一个事要过注意OLED咱需要怎么做?咱是不是得一一逆t一下,对吧?大家还记得吧?OLED咱们在点亮之前,我们是要做,是不是各种各样的配置的呀,对吧?呃,你看它这块的配置有什么呢?呃,首先因为我们采用的是这个软件模拟的方式,这个大家就不用再单独的去q五MS里边配那个GPS引脚太麻烦了,这直接给大家就封装好了,这是不是在初始化那几个引脚了,对吧?然后接下来这是在干啥?这是不是就是在设置咱们的OLED屏幕的那一系列的参数了?这还能讲起来,这本有啥?不比如说那个行列的反转,比如说点亮RED屏幕,什么开启那个什么电磁泵等等等等,这些是不是前面都提到过呀?我我我这样呢就不再一个一个给大家去看了啊,这个东西,这个太嗦嗦了个东西啊。好了,那所以就是大家知道这个在干啥就行。所以我们在点亮RED之前是需呃在显示之前是需要做一个初始化的。它初始化这块呢封装装了一个什么APPP不是didisplaystar这样的一个方法里啊,你调这个也行,或者直接调REDneit也可以啊。好,这个初始化的时候调一次,这个是不是在我们的任务里边循环调用就可以了呀,对吧?就是这么一个思路啊?好了,那所以接下来呢咱们就快速的给它落实一点了,来这个得进到哪儿得进到tass这里边吧,我们这儿需要创建一个显示任务啊,来吧,创建一个呃咱们叫做显示任务。哎,好,那这个呃咱们需要首先给它定一个名字啊,这个叫做worddisplaytask,这个没啥问题。好,接着往下走,这是它的名称。那这个呢是它的这个栈的大小,这个栈的大小,先给幺二八吧,不够的话,咱们再调啊。好,那完了之后往下走,这个是优先级。大家说这个屏幕的显示的优先级,它它它重要吗?同学他好像不是那么的重要,对吧?所以这个呢我们暂时先给它调调低一档啊,调低一档。那这个我们给他三吧啊,给他三啊。好,那接着往下走,但是给三的话,就是可能会出现一个什么样的问题呢?就如果其他那个高优先级任务,确实他那个呃执行的太密了,就是他那个周期太短了,那是不是有可能它轮不到它执行啊,轮不到执行,一会儿咱们再再给它调高吧,一会再再看好,那接来往下走。先给三那接下再往下走,下面这个是不是给他一个任务句柄就行了,对不对?呃,然后再往下,就是他那个就是刷新的这个周期了。但是周期其其肯定定是越短,越怎着着越短,越丝滑跟你自己那手屏屏幕样样吧,你一百二十赫兹的刷新率和六十赫兹的刷去,你看起来是不是不一样,对吧?那我们这边呢其实也无所谓,这个咱们给他个十吧,先给个十,相当于是多少赫兹就是十十是十毫秒吧,我们是不是相当于十毫秒刷一次啊,对吧?十毫秒刷一次,我的相当于是多少赫兹啊,哼十毫秒刷一次,一秒,刷多少次,一秒不刷一百次吗?刷一百次,这这是多少赫兹不相当于一百赫兹吗?对吧?这刷新率是不还挺高的。哎,OK啊呃这么算没问题吧,应该没问题啊。好了,那接下来呢我们往下进行啊,下边咱们要做的,就是在这里边呢去哎,调用咱们这个具体的这个显示的这个方法了啊。好,那接下来我们往上走,各位同学,我们进到这儿先演那个文件啊来走。你include后边跟一个APP后边再跟上一个啥display点h啊。好了,把这个拿过来呃,拿过来之后呢,我们在这里边,首先咱们是不是要做这个循环调用啊,对吧?来一个well一啊,well一完了之后呢,这里边是不是也要执行一个这个taskdelay,对吧?拿过来完了之后呢,里边放谁放?刚才那个是不是display的period了呀,对吧?DISPLAYdisplayperiod的,哎,我没定义出来吗?往上翻啊哦,它叫做找喜地方是吧?咱们给改一下啊,DISPLAY啊,拿过来CTRLC啊,应该在这儿各位行了。那这个完了之后呢,其实咱们调哪个方法就行了,其实文档上也给大家列出来了啊,你要调的话,是不是就调咱们这个瘦方法就行了。对不对?就调它就行啊,好拿过来。哎,当然我们这还差个东西差一下那个是不是当前时间呀,对吧?哎,拿过来。好,那这样一来是不是就完成的,咱们这块的一个调用量,对吧?但是大家一定要记得是不是得进行啥来着?初始化吧,初始化是一定要做做啊,这个我们还是放到哪儿呢?对,们放到这这儿吧,哎,咱们叫做呃OLED屏幕初始化。好,这块呢应该叫谁,是不是叫刚才那个呃应该叫做APPdisplay,它叫做scarf,对吧?这个名字起的也其实挺那啥的start,其实直接就是调了一下OID那个隐秘的方码了。对吧?哎,行了,那这样一来应该就算是完事儿了。哎,好,接下来呢,我们编译一下这个代码,然后给它捎录进去,我没我我还差一步,我我没干啥,我说没没创建这个任务啊,对吧?这个千万别忘了啊,我们需要去创建一下这个呃显示任务嗯,来让他提示提示改一下啊,任务。好了,那这样一来的话呢,我们这儿就完成了啊,完成之后重新编译。然后呢,咱们再重新上录,看看能不能正常显示,不能显示,咱就得调优先级啊,调啥的,稍微等一下啊,呃插不进去了,插进去了好了啊,那现在我给它插录进去,哎,又得重新重启一下。我这个板本好,抄录进来,然后呢捎录进去好了,来吧,同学我们来看一下这个效果。呃,可以看到这块是不是已经能显示了呀,对吧?呃,有点频闪啊,应该能能理解,这是为啥,对吧?哎,好了,注意观察,你看我推这个摇门,唉,其实就还行,是不是感觉那个挺丝滑的,同学是不是还挺丝滑的,还可以还可以啊。来,然后我们再动一动,其他的,哎,不对,不行,不行,我这个得稍微注意一下,我待会儿别把那个解锁了啊,我还是给它关了吧,一会飞起来了,咱们就单看遥控啊。哎哎,你看这次这次我再再调它的话,是不是不动了,同学对不对?这个应该就是怎么着了,这个应该就是就是就就是卡住了啊,这个就是卡住了,就是因为咱们那个优先级,它就不相对比较低啊,对吧?就可能它来不及刷新了,能能能看到吧,同学这个就不行了啊,那怎么着呢?还是得调优先级,优先级,我们还是得调,我们给它调到呃,调到目前是不是咱都是最高原级的同学,那也最高吧,就是强制让他们进行,是不是时间线轮学啊,对吧?呃,实际上我想想咱这要是不想调最高,也可以稍微划分一下啊,我就说一下啊,如果分的话,大家觉得这里边到底把谁作为最高优先级比较合适。其实我现在觉得应该是把这个电源作为最高。因为因为这个东西啊,你想啊我们目前的问题是啥呢?这个CPU是不太够用的,我们是不是CPU基本占满了呀,对吧?所以最高的应该是它。因为这个东西你要是被被被饿着了呃,所谓被饿着就没时间执行,对不对?那是不是直接整个这个断电了呀,对吧?所以它应该是最高啊,他最高完了之后,我们的通讯任务按键任务遥杆任务这些其实次之咱们调个三就行,对不对?
完了之后呢,这个显示任务其实也应该给个三呃,就是这么给其实也行。但是咱这儿呢,目前就直接全给最高吧,对高保证每个人都有机会执行到就行了啊。
好了啊,那接下来呢我们就重新烧录一下。呃,你给他最高,他应该就没啥问题了,就是因为优先级的问题。嗯,我现在已经给到最高了是吧?编译啊,然后呢我们收录进去。好的,来看一下这次这个有没有好一些啊?哎,注意观察同学,你看这次是不是就不会再卡住了呀,对吧?呃,然后大家应该是能够看懂,就是它上面的一个逻辑的啊。
呃,咱这边呢相当于是左上角这个位置,这个四十显示的是什么?是我们当前那个信道,对不对?哎,OK我这是四十啊。好,那完了之后的下边这四个呃相当于进度条吧,显示的就是我们这个摇杆的这个四个值。呃,然后你看最左上角那个THR对吧?这就是油门吧,对不对?油门啊,好,那完了之后第一行的第二一个也就是那个肉肉,是不是就是横滚呀?同学横滚应该是是不是这个呀,这是横滚角没问题吧。哎,好了,然后再往下那个要要就是那个那个偏航角嘛,对吧?应该是左边这个摇杆控制的,对不对?哎,好,这个没啥问题啊,然后再有呢就是那个呃俯仰角了,就是它那就是这么个逻辑。好了。哎,那这就是咱这儿的一个具体的思路啊。好,那行,那完事儿了,这个屏幕的一直咱也就完成了。也就是到目前为止,咱这个遥控端应该就就完成了,遥控端,所有的内容都完成了。然后剩下的就是咱们那个非控非控端,然后那个非控任务了,对不对?计算PID然后呢计算完之后设置电机转速,这是我们剩下的就置内容了。就啊剩下的内容呢我们可能得讲个两两三天,这部分内容啊,因为比较复杂性的来讲啊,来评价视频。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值