
本帖最后由 点点&木木 于 2019-4-15 10:25 编辑 3 ^. ^$ D$ u7 x; c! v9 z: l 您是否注意到蜜蜂死亡的主要原因与其发作引起的死亡有关? ![]() " r" k( ], Q B9 ~ 硬件组件 STMicroelectronics STEVAL-STLKT01V1 × 1 STMicroelectronics STM32 Nucleo-64板 × 1 Android设备 × 1 手动工具和制造机器 烙铁(通用) + u' W9 A% J; t0 U [' Q7 X 介绍 大家好,我在这里,但是这次有一个完整的项目进入SensorTile比赛! 那么,我在这里建造了什么?我的目标是提供一个传感器节点,帮助养蜂人更安全地执行他的蜜蜂养殖任务,我希望降低蜜蜂死亡率,这主要影响两点: 降低死亡率意味着更多的蜜蜂致力于花授粉,因此获得更多的水果对每个人的食物供应产生积极影响; 帮助养蜂人避免因蜜蜂死亡率高而失去蜂箱,并保持蜂蜜提取生产力稳定或最大化。 该项目并不复杂!我相信你会对这款传感器有很多乐趣: LittleBee展示! 在进入这个项目的细节之前,我们需要了解监测蜜蜂声音的基本原理,第一个方面,蜜蜂执行不同的声音发射,用不同的手段,对我们的兴趣是嘶嘶声,这基本上翻译了它的攻击性水平。 根据一些参考文献(放在最后),嘶嘶声水平位于3K可听频带附近,在某些情况下具有+ - 200Hz的带宽。所以这个想法,监视嘶嘶声并通过一些UI或者一个Android应用程序告诉BeeKeeper,Beehive目前是多么具有侵略性。在SensorTile发挥作用的时候,低功耗麦克风,CortexM4F CPU和易于使用的BlueNRG模块的组合就像魅力一样! 信号流很简单,SensorTile麦克风输出通过PDM机制捕获的音频,板载MCU,捕获它并发送到DFSDM,DFSDM是一种提取RAW 16位PCM格式音频的sigma-delta解调器信号,通过此样本设置,固件将缓冲区发送到实际的快速傅立叶变换块,然后是幅度计算块,这可以通过微控制器的硬件启用浮点单元(一种流行的STM32L4系列)实现,在3KHz频率范围内进行简单搜索并获得RMS,这就是所谓的BeeDSP固件模块的连续行为。 通信模块使用蓝牙低功耗传输测量结果,执行它,BlueNRG ACI堆栈用于设置BLE并添加一个名为Bee服务的服务,该服务具有4字节大小的特征,通知对等设备(a关于测量新的嘶嘶声水平的Android手机)。 手机应用程序,扫描LittleBee设备,并且只连接到LittleBee设备,在发现可用设备后,它立即接受Bee服务上的通知,然后获取读取值并绘制在使用GraphView小部件创建的图形上。查看系统运行的一些图片: ![]() 传感器执行广告 ![]() 应用启动画面 ![]() 蓝牙传感器扫描! ![]() Whow!找到传感器,让我们得到一些数据! : c- {. a0 G% p6 f4 o: k) K![]() 哦耶!有些数据到了! 8 } U6 \4 E/ }4 k+ U1 D' e+ g 该应用程序使用一个定期更新的实时图表(刷新率为100毫秒),UI的目的是对嘶嘶声级别进行主要监控,因此没有提供自定义UI,当然应用程序的源代码是开放,免费使用! $ B0 U! Q1 P; j9 @; n/ P) o% v; {$ a( s0 t7 U9 x$ z' e* @4 k" p 因此,现在是时候指导如何部署这个功能强大的传感器(但不仅限于)Bee环境。第一条指令是获得两个开发环境,attolic真正的工作室开发固件,之所以选择它是因为它是免费的,是一个专业级和稳定的IDE来编程设备。选择Android工作室是出于显而易见的原因开发移动应用程序。 打开True Studio,您将看到如下屏幕: ![]() 真正的工作室工作 部署固件组件的第一个任务是获取源代码,你可以在我的github上找到它,项目完成后相关路径中的依赖关系得到解决,所以你只需要导航True Studio然后File->Import,in弹出窗口选择:工作区上的现有项目,取消选项复制工作区上的项目,找到从Github下载的根项目文件夹。 # T% _1 n X4 y) @ 现在你问自己:“嘿,NúcleoBoard在组件清单上的目的是什么?” 简短的anwser,您是否注意到SensorTile套件没有配备闪光灯或调试器?是的,它没有!您需要一个外部工具来刷新固件,另一个选择是使用套件扩展音频板上的USB端口和通过DFU工具的闪存固件,但这似乎是一个复杂而不必要的步骤,因为Nucleo板非常便宜和容易找到。所以选择一个,将它连接到USB,不要担心已经在项目设置上配置的调试设置(让我们遵循KISS理念 - 保持简单)。现在回到SensorTile套件。正如你所说,它由一些项目组成, 其中4项非常重要: SensorTile本身(真的,Felipe?XD); 电池支架; 塑料外壳(我认真的是完整组装的传感器在这种情况下变得非常迷人); 电池,我们不想要电线。 , H9 `" w9 q+ ^4 t2 ]* @6 @, y 我们现在将组装唯一的硬件要求步骤,所有你将有这样的东西: ![]() 完全组装的传感器节点 所以,带上烙铁: ![]() SensorTile 注意它的边缘,这是像垫一样的城堡形状,焊接非常简单,将膨胀电池支架放在下面: ![]() 注意边缘的标题,这个用于通过微控制器的SWD端口编程或调试固件,这是我指示NucleoBoards的另一个原因,它有一个针对外部设备的引脚兼容接头,这将简化固件部署! 现在用烙铁和一些焊接,小心地将垫圈垫焊接在支架垫上,警告!注意SensorTile位置,确保底座的针脚1与传感器的针脚1匹配,否则会变热! 执行焊接后,您将获得以下信息: ![]() 仔细检查以找到开路和短路,使用最低电阻测量范围的万用表来帮助您。现在只需拿起电池并将其插在连接器上,然后在最后一步中挑选塑料外壳并将带有电池的传感器板放入其中,使用螺丝关闭塑料外壳。 这是我们现在要执行部署所需的唯一硬件步骤,因此选择两条USB线,一块mini到Nucleo板,一块micro到SensorTile板,也可以选择编程线: ![]() 将其连接到传感器板。 然后连接Nucleo外部调试器上的所有USB和编程电缆,警告!不要忘记打开CN2跳线,它将允许将STLINK调试器与外部目标一起使用。连接将是这样的: ![]() 注意传感器节点的引脚1,它标记为插头连接器底部的方形焊盘!将它与Nucleo板的引脚1匹配,然后打开通断开关。回到TrueStudio,导入项目,只需按CTRL + B构建工作区,你会看到几个警告,不用担心它们,它与未使用的cmsis SIMD功能有关,只有FFT从CMSIS DSP Lib使用和幅度来执行计算。在成功构建之后,然后按F11调试并下载固件,现在让我们庆祝,固件似乎正在运行,如果你想看到BLE流量只是删掉一些BLE扫描工具应用程序,你就可以连接到LittleBee传感器! 对于应用程序部分,步骤甚至更简单,首先在我的github 上获取源代码,打开Android Studio后,使用下面的import选项并搜索项目下载的位置: 1 X. j! l- f$ b. K' G6 Z8 Z ![]() 这就是项目在工作区中,所以只需连接Android设备,转到Build->Rebuild项目。稍等一下,看起来成功构建与固件相同,现在使用Run-> Run App将应用程序部署到设备,这将使用AndroidDebug Bridge下载应用程序,对于称为ADB的移动开发人员将立即启动。 * c; w8 g" k. a$ J, C% t ......就是这样!您的LittleBee已准备就绪!所以去养蜂场,离开传感器,开始探索蜜蜂发出的声音,这意味着。作为一个黑客建议你可以继续固件并将频率仓数据选择修改为另一个值,并将发送给App另一种类型的声音!只需返回固件打开文件bee_dsp.c,然后转到第70行并选择一个新索引,每个索引对应的频率为92Hz。 6 O# Y+ n+ g9 }# k, T) X* ~+ T5 r$ @' P n4 |% V( P5 x2 f 一些结论 这个项目最初是提交给ST SensorTile比赛的,我在这个项目中面临的主要挑战是在比赛截止日期之前没有硬件,但是我只剩下几天才收到它,解决方案是保持范围更简单并显示良好的交付准备成为商业甚至开源的大规模生产设备。 该应用程序具有简单直观的界面,可扩展以集成到云上!另一方面固件功能更强大,今天只对频率箱进行简单搜索,但当前频谱始终保留在RAM上以执行更复杂的分析,作为未来的改进,我们希望添加群音频,其中表示蜜蜂在蜂箱上做了多少工作。 代码 & l ~/ h: }! j, W4 x7 O /* * @file lilbee.c * @brief littlebee firmware applicationentry point * */ #include "lilbee.h" 7 ?, `& Y) q, K. k. X0 [0 b' r! m7 L. p0 }3 x& g /** internal functions */ /** * @fn sysclk_config() * @brief setup processor clock units * * @param * @return * * */ static void sysclk_config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); /* Enable the LSE Oscilator */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.LSEState = RCC_LSE_ON; if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){ while(1); } c, `. `) S- z) s /* Enable the CSS interrupt in case LSE signal iscorrupted or not present */ HAL_RCCEx_DisableLSECSS(); 8 n1 N1 I7 o% I0 D6 B6 ~. m6 A /* Enable MSI Oscillator and activate PLL with MSI assource */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_MSICALIBRATION_DEFAULT; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; RCC_OscInitStruct.PLL.PLLM = 6; RCC_OscInitStruct.PLL.PLLN = 40; RCC_OscInitStruct.PLL.PLLP = 7; RCC_OscInitStruct.PLL.PLLQ = 4; RCC_OscInitStruct.PLL.PLLR = 4; if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){ while(1); } 7 _3 X5 M4 E$ i: k* p# W+ I$ j /* Enable MSI Auto-calibration through LSE */ HAL_RCCEx_EnableMSIPLLMode(); 1 t: i; i2 U @5 X0 p- u+ ^4 E- v5 X /* Select MSI output as USB clock source */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB; PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); /* Select PLL as system clock source and configure theHCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK){ while(1); } } ( ^+ c1 Y" b8 d2 F: g! d/** Public functions */ 8 A" j, Q3 W1 R. t& o# R0 j( V5 P2 T) E /** * @fn main() * @brief application entrypoint and aloop * * @param * @return */ int main(void) { sysclk_config(); HAL_Init(); H: X: j- r8 g5 Z/ p8 X BSP_LED_Init(LED1); ]" \8 n6 u! F /* inits the sub applications */ bee_dsp_init(AUDIO_SAMPLE_FREQ); audio_acq_init(); bee_ble_init(); /* start the analysis*/ audio_start_capture(); for(;;){ system_event_tev = event_queue_get(); audio_handler(ev); bee_dsp_handler(ev); bee_ble_handler(ev); 0 O/ z& r+ a2 M1 U0 g4 s1 t$ W if(event_queue_peek() ==k_noevent) { /* No event pending, sleep the cpu */ __WFI(); } BSP_LED_Toggle(LED1); } } littlebee 这个repo是LittleBee系统的Android应用程序源代码---
![]() |
嗯,这是分享大神的帖子