矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 4671|回复: 20

【原创】单片机的正确吃法:挂风筝上测海拔

[复制链接]
     
发表于 2020-3-6 22:12:11 | 显示全部楼层 |阅读模式
本帖最后由 t3486784401 于 2020-3-6 22:10 编辑

在家宅着没事干,一晃都三月份了,拿个去年三月份的作品来给大家分享下。

【背景】
去年春天去踏青,女票吵吵着要去放风筝。刚巧江边有这种十块钱一套的玩意,再加一卷线二十,就算放丢了也不心疼。
“你说这风筝能放多高”?两卷线也就百来米,最高也就垂直到顶了。想要准一点的估算,怕是要上悬链线。

IMG0.JPG

不过作为电工,可以有另一个选择:搞一套嵌入式的高度计,挂风筝上测海拔。


【制作】
手头有之前玩过的 BMP180 模块,很小一个探头可以测试气压、温度。
如果能配合一个小点的单片机、小点的电池,就可以搞一套这个系统来。

整个方案并不复杂,一小块万用板就可以搞起。
电源用 401215 锂电,基本上是淘宝能买到最小的了,60mAh 容量很充足;
单片机用 ATTINY13,这玩意低压稳定性、温度稳定性好到可以起飞;
存储器用 24C128,总计 16KB 空间省着点用可以记录几个小时;
气压探头 BMP180,整个系统每 5s 记录一次数据,存入EEPROM.

由于是要上天的玩意,可靠性是第一要务。于是用了圆孔版插座,皮实抗冲击。

IMG1.JPG

所有的器件(包括电池)都要牢靠地固定在 PCB 上,避免意外短路。
除了采集系统外,其他功能(例如锂电池充电)一概外接跳线完成,可以节省重量。

IMG2.JPG

最后找一个尺寸恰当的零件盒(内设减震棉、屏蔽棉),装入其中即可工作。
含外壳总计 17.2g,对风筝的影响在可接受范围内。

IMG3.JPG

IMG4.JPG


【代码】
我用 ICCAVR 写的代码,T13 就两个任务:读取BMP180,写入24C128,期间等待5s。
实际编写过程中最大的挑战是 T13 的 FLASH 空间只有 1KB,需要优化代码避免超出。

最后设定 T13 工作在 150kHz 主频,平均耗电 0.5mA 左右,电池工作几十小时没问题;

每个样本仅存储原始数据(4Byte),具体气压、温度、高度等结果都回到地面后再行解算,
这样一来 16KB 存储器可以连续记录两个多小时,足够放飞一遍风筝了。

附上主代码: MAIN.zip (1.21 KB, 下载次数: 47)

IMG7.png


【测试】
整个高度计需要挂在风筝的重心位置,也就是风筝线捆绑扣附近,之后尽管大胆放飞。
测试这天江边风也很是给力,直接两卷线全都放出来了,贴上事后解算结果:

IMG5.png

挂了载荷的风筝特性微微有点变化,需要适应了几把才最终放起来,也就有了高度曲线(红)上边第一个小峰。
另一条曲线(蓝)是温度变化,随着风筝放起来温度掉的还是很明显的。

后来放到最高点实测约 75m,这下总算是有确切的数据说明风筝到底放了多高了。
同时可以看到,在最高点附近有 ±10m 的振幅,显然空中的气流不很稳定。

附上放飞的一小段视频: IMG_1042.zip (594.28 KB, 下载次数: 42)


-----------------------------------------------------------------------------------------------


以上,用 T13+BMP180 做了一套嵌入式的高度计,搞定了风筝飞多高的问题。
如果加上无线数传,可以实时观察高度,不过电池、重量啥的都要另行计算了。

最后祝大家身体健康,远离瘟疫!



评分

2

查看全部评分

     
发表于 2020-3-6 22:54:38 | 显示全部楼层
学习下,高度怎样换算?
回复 支持 反对

使用道具 举报

     
发表于 2020-3-6 23:13:14 | 显示全部楼层
楼主可否把sen_DoMeasure()函数也放出来学习下?
回复 支持 反对

使用道具 举报

     
发表于 2020-3-6 23:38:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-6 23:50:30 | 显示全部楼层
chhds 发表于 2020-3-6 22:54
学习下,高度怎样换算?

我只读取了原始的 ADC 数值,气压、高度解算待事后用上位机来完成。
算法直接 BMP180 的手册上就有,高度就是 10Pa <-> 1m 换算
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-6 23:52:05 | 显示全部楼层
mstwoow 发表于 2020-3-6 23:13
楼主可否把sen_DoMeasure()函数也放出来学习下?

底层的 I2C 都是通用玩意就不贴了,DoMeasure 就是读取 ADC:

  1. //--------------------------------------------------
  2. // 名称:sen_DoMeasure
  3. // 作用:读取BMP180测量ADC (温度/气压)
  4. // idx :0=温度,1=气压(OSC=0)
  5. // 返回:ADC原始数值
  6. //--------------------------------------------------
  7. WORD sen_DoMeasure(BYTE idx)
  8. {
  9.         // BMP180控制指令表(ADDR=F4H)
  10.         union
  11.         {
  12.                 struct
  13.                 {
  14.                         BYTE l;
  15.                         BYTE h;
  16.                 } u8;
  17.                 WORD w16;
  18.         } dat;
  19.        
  20.         // 指令表译码: idx -> Cmd
  21.         if(idx==0) idx= 0x2E;        // Temp
  22.         else       idx= 0x34;        // Press(OSC=0)

  23.         // 发送温度转换指令
  24.         BMP180_iicStart();               //起始信号
  25.         BMP180_iicWrite(BMP180_ADDR_W);  //发送设备地址+写信号
  26.         BMP180_iicWrite(0xF4);                 // write register address
  27.         BMP180_iicWrite(idx);            // write register data for temp/prss
  28.         BMP180_iicStop();                //发送停止信号
  29.         BMP180_Delay8ms();               // max time is 4.5ms
  30.        
  31.         // 读取转换结果
  32.         BMP180_iicStart();               //起始信号
  33.         BMP180_iicWrite(BMP180_ADDR_W);  //发送设备地址+写信号
  34.         BMP180_iicWrite(0xF6);           //发送存储单元地址
  35.         BMP180_iicStart();               //起始信号
  36.         BMP180_iicWrite(BMP180_ADDR_R);  //发送设备地址+读信号
  37.         dat.u8.h= BMP180_iicRead();
  38.         BMP180_iicAck();                 //回应ACK
  39.         dat.u8.l= BMP180_iicRead();
  40.         BMP180_iicNack();                //最后一个数据需要回NOACK
  41.         BMP180_iicStop();                //停止信号
  42.        
  43.         // 直接返回原始ADC数据
  44.         return dat.w16;
  45. }
复制代码
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 00:10:48 | 显示全部楼层
这个技术,高!
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 00:18:19 | 显示全部楼层
加个风力发电机,就完美了。很简单的,铷磁铁,小扇叶线圈,无线发射。
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 10:12:05 来自手机 | 显示全部楼层
比无人机有意思!无人机测几分钟就要下来了!这个能测一小时。再加上摄像头什么的搞空中拍摄。这个是我小时候的梦想啊!!!
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 17:01:21 来自手机 | 显示全部楼层
打开手机微信视频通话,然后绑风筝上,让后体验飞一般的感觉,然后风筝挂树上了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-7 18:39:01 | 显示全部楼层
jysl 发表于 2020-3-7 00:18
加个风力发电机,就完美了。很简单的,铷磁铁,小扇叶线圈,无线发射。

确实高空风很大的,下次加个皮托管试试测风速
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-7 18:39:44 | 显示全部楼层
无敌吴刚 发表于 2020-3-7 10:12
比无人机有意思!无人机测几分钟就要下来了!这个能测一小时。再加上摄像头什么的搞空中拍摄。这个是我小时 ...

所以要趁年轻使劲折腾
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-7 18:40:28 | 显示全部楼层
tudou2048 发表于 2020-3-7 17:01
打开手机微信视频通话,然后绑风筝上,让后体验飞一般的感觉,然后风筝挂树上了。

后来有一次测试就真的挂树上了,找街边商店借了个长竹竿才捅下来
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-7 18:40:49 | 显示全部楼层
LPC2119 发表于 2020-3-7 00:10
这个技术,高!

大家一起交流哈哈
回复 支持 反对

使用道具 举报

     
发表于 2020-3-10 08:37:00 | 显示全部楼层
无敌吴刚 发表于 2020-3-7 10:12
比无人机有意思!无人机测几分钟就要下来了!这个能测一小时。再加上摄像头什么的搞空中拍摄。这个是我小时 ...

我还想着怎么弄个视觉甲壳虫,可以爬墙的那种,触角做成天线,无线实施传输音视频的那种,可以攀爬类似玻璃这样的光滑表面,想想就激动。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-5-9 23:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表