microbit 气球跟踪器

micro:bit编程、教学、展示
STEM
回复
头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

microbit 气球跟踪器

#1

帖子 shaoziyang »

原文:http://www.daveakerman.com/?p=2019

我一直想做这件事,项目之间的短暂间隙给了我一些时间去尝试。

Microbit功能在codebug和Raspberry Pi之间。它的处理器有足够多的闪存和RAM来运行基本跟踪器(稍后会详细介绍),此外还有加速计和指南针芯片。

图片

更重要的是,microbit带有SPI、I2C和串口,可以通过转接板引出,而不用直接焊到焊盘上。

图片

此外我还购买了专用电池盒。

气球跟踪器硬件
要做一个气球跟踪器,我们还需要一个合适的GPS(我的意思是在高空时仍然可以发送位置)和一个ISM频段无线电发射机。我选择了 UBlox 模块:

图片

有用的是,这个模块包括一个I2C端口以及通常的串行端口。由于microbit的串口通常是由USB连接到PC,如果我们使用串口的GPS软件的开发将变得困难,因此I2C让开发更容易。

再来看无线电部分。最受欢迎的选择是ntx2b无线电发射器,但它也需要一个串行口,所以我选择了 LoRa收发器:

图片

它有一个SPI接口,所以串行口仍然可以用于调试。

第一件事情是让设备连接在一起。在原型板上没有太多的空间,而且最好让GPS远离其他设备(干扰更少),所以我把GPS和无线电放在电线尾部上:

图片

GPS 软件
在microbit上编程有多个选择,我选择了micropython,因为我已经用 Mu editor 写了很多 Python 程序。我开始用一些简单的代码,从GPS获取NMEA数据流,这只用了几分钟:

图片

然后将我的PI Python GPS的NMEA分析器(这意味着,只要改变代码使用microbt的I2C库而不是PI的串口)移植过来。你可以在这里看到我的测试程序(但是请不要在飞行中使用它,因为它是为汽车使用而编写的,因此不把GPS放到飞行模式中)!。

LoRa 无线软件
我在另外项目中也有Lora Python代码,所以在测试设备连接好后(只要在microbit的REPL输入很少一些命令输入),我完成了移植。变化在于SPI的库,此外我不得不删除所有LoRa 寄存器定义,因为它使程序过大。您可以在这里看到生成的测试程序

为了收到LoRa的传输数据,你需要另一个Lora 模块作为接收器,加上合适的软件。我用我自己的C Lora 网关代码进行接收:

图片

气球跟踪程序
一切都很容易,看上去和最终的目标非常接近了;一旦你让GPS和无线模块开始工作,那么你只需要少量的额外的代码将GPS数据作为一个字符串,添加一个前缀(“$$”和有效的ID)和后缀(“*”以及CRC),然后通过无线发送结果。

然而,当我将GPS和LoRa代码放在一起,甚至无法编译。记住,在microbit上代码不能太大:

图片

幸运的是,它不是太大,所以我删除了一些不必要的代码(主要是在代码中关闭未使用GPS的NMEA句子),很快的编译器快乐的通过了。

然而得到的结果并不快乐。一旦编译完成,由此产生的字节码加载到microbit的RAM,它将何程序所使用的任何数据(变量、栈、临时工作区)共用。Python的本质是内存一直被分配,并在必要时释放(如当没有空闲内存可用)时,当程序试图分配比可用内存更多的内存时,我的程序将运行很短一段时间,然后在内存不足的情况下崩溃。它在崩溃前的工作结果:

图片

所以,我不得不减少内存占用。我习惯在微控制器上用 C 语言,但 micropython 需要不同的技术。例如,在微存储器上 C 通常位于闪存中,对RAM中数据的限制要少,所以有时您可以重写代码以使用较少的RAM,而不必担心新代码使用更多的代码空间。而不像在 micropython 中,一切都会在RAM共享。我的一些尝试使情况更糟(通过在主循环中调用gc.free_ram()),所以,在很大程度上,我通过移除不需要的代码来增加剩余RAM。这样做之后,程序变得稳定。每个循环都会分配内存,自由内存会不断增加和减少,然后最终释放。

容易改进是用LED显示GPS卫星数量,特别是只导入所需的模块,而不是整个microbit库。代码的最相关的部分原来是建立一个NMEA。在C中,只需为需要解析的最长语句分配足够的内存,然后使用指针或数组将传入的字节放入内存中,检查缓冲区溢出的过程。在Python中的字符串是不可变的,你不能用同样的方法。可以用“string = string + new_character”。当然,Python解释器将为结果字符串分配新内存,将旧字符串标记为“不再使用”,因此稍后可以释放它,最终会有很多闲置的内存等待释放。现在,我的NMEA代码中每当收到新的字节都会释放内存。我曾短暂的改变代码使用bytearrays,这是最接近C语言的方法,但内存还略有下降(我假设原来占用更多的空间),所以我回到原代码。长期来看,我重写NMEA代码,使用二进制UBX协议代替。

代码已经连续运行了12个多小时,而空闲内存图是实心的(在主循环中每一次都在同一个点上测量)。我确实还需要添加飞行模式代码,但这很简单,不应该引起问题图片。如果一切顺利的话,我希望能在星期日(当然是天气允许的情况下)开始飞行。

最后,这是一个我最近通过Python Lora网关程序接收的遥测结果:

图片

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章