【DIY项目】智能自行车系统BikeX【8-21更新】
本帖最后由 Maker张小豪 于 2017-8-21 20:11 编辑8月21日更新:测试2:测量坡度、高度
咳咳咳。。。懒了这么久,今天把另一个基础功能给搞定吧,那就是检测高度、坡度等数据。常玩手机游戏的童鞋估计都知道,用重力感应玩的手机游戏都是依靠手机内部的加速度计和陀螺仪来计算出手机摇摆的角度的(什么?你说你不知道?),而读过初中的童鞋都知道海拔高度和气压的关系。(什么?你小学还没毕业?)所以要获取这些数据,就要靠相关的传感器了。 一开始我是非常头疼这个的,加速度计获得的是加速度,陀螺仪获得的是角速度,而我要获取骑车时的坡度要的是角度。OMG那要怎么办!然后我在网上找到了三种姿态融合算法,可以用加速度和角速度融合计算出姿态角,那就是四元数法 、一阶互补算法和卡尔曼滤波算法。 WTF!?这些都是什么鬼?我一个都没听说过耶!我觉得我研究会这些算法的时候都已经开学啦,虽说我可以直接复制别人的代码,但有没有更简单的方法啊!!!我苦恼着,直到在某宝发现了这个宝贝↓↓↓(为了避免广告嫌疑我还是打个码吧,有兴趣的自己去找) 这个模块非常牛逼,它将加速度计、陀螺仪、气压计、磁力计集为一体,还支持连接标准协议(NMEA-0183)的GPS模块,(以后估计还可以增加一个电子指南针的功能),更牛逼的是,它内置的单片机包含了卡尔曼滤波算法,也就是说它可以直接输出计算好的姿态角,甚至连海拔高度都计算好了,更更牛逼的是,它提供了Arduino的库文件和示例程序!也就是说我不用研究它的通信协议,可以直接依靠它提供的库文件,一句代码就能获取我想要的数据!简直就是懒人必备,连复制代码的劲都省了。唯一的缺点就是——贼贵。但我还是果断下单了。模块非常小,只有手指头那么大。 模块有配套上位机软件(设计者太有爱了),用串口连接电脑试试先。 模块可以获取到许多数据,加速度、角速度、磁场的XYZ轴、气压,还有计算好的角度、高度,也可以按需要设置要输出的数据内容,还有好玩的3D模型,当然,使用前要校准一下。 接下来就试试连接Arduino吧。。。 这个模块有串口和IIC两种通信方式,由于Arduino串口有限,而我的屏幕只能用串口,那这个模块就用IIC来连接吧,IIC相对麻烦,需要接上拉电阻到VCC,接法如图。(翻遍工具箱才找到4.7KΩ的电阻) 先在屏幕的界面上加上高度和坡度吧。 接下来就要写代码了读取数据可以直接调用库文件里的函数,直接复制示例里的代码就是了,再加上修改屏幕数据的代码,搞定。#include <Wire.h>
#include <JY901.h>
void setup() {
Serial.begin(9600);//串口初始化
JY901.StartIIC();//iic初始化
}
void loop() {
JY901.GetAngle();//获取角度
JY901.GetPress();//获取气压、高度
Serial.print("t3.txt=\""); //这是修改屏幕数据的命令
Serial.print((float)JY901.stcAngle.Angle/32768*180);//修改角度值(X轴)
Serial.print("\"");
Serial.write(0XFF);
Serial.write(0XFF);
Serial.write(0XFF);
Serial.print("t4.txt=\""); //这是修改屏幕数据的命令
Serial.print((float)JY901.stcPress.lAltitude/100);//修改高度
Serial.print("\"");
Serial.write(0XFF);
Serial.write(0XFF);
Serial.write(0XFF);
delay(100);//加个延时呗
}
试下先。(放视频太麻烦,上动图吧) Perfect!角度测量还是非常准确的。高度的话准确度还可以,半米以上距离还是比较准确的,只移动个几厘米你说气压能有多少变化。 (为什么我叫它高度而不叫海拔高度?因为它的气压值和我手机上的气压计的值差很多,所以不敢肯定是不是海拔高度,反正我骑行的时候需要的只是高度的相对值,知道我骑了多少上坡路就行了,管他海不海拔呢)
P.S.:现在已经测试通过测量踏频、速度、坡度、高度等功能了,接下来我打算直接开始成品制作,暂时先做好这几个功能,后续再慢慢添加进新功能。
如果你想随时追踪项目进度,可以扫码关注一下我的公众号哦~------------------丑陋的分割线-----------------7月31日更新:测试1:测量速度、里程和踏频
啊啊啊啊啊哈哈哈最近真是越来越懒了拖了这么久不行我不能再拖了再拖就要上学了啊啊啊啊不说废话了马上进入正题!!!!!!!!!!!!!!!!!为了显得我更有文学气息,我TM特意上网搜了一个名言警句来作开头。(老师说这样可以加分~)有句话叫作【行远必自迩,登高必自卑】(手持扇子诵诗状)意思就是要走远路就必须要先从近处开始,要登高就必须从低处开始,就像要打牛头怪就必须先打死哥布林一样,所以,要做好这个智能自行车,我们就必须先从最简单的功能——速度、踏频、里程测量做起~⭐测量的基本原理 市面上的码表的测速方式无非只有两种:一种是利用GPS定位来进行测速,这种码表没有额外的部件,安装比较简单,直接装在车头上就可以了,但受GPS定位精度和采样密度的影响,这种码表的精确度相对没有那么高。另外一种就是通过检测车轮转动来推算速度,这种码表要在车轮的辐条上安装一个磁铁,然后在车架相应的地方安装一个感应器来检测车轮转动,由于采样于车轮,所以得到的数据是非常准确的,踏频检测也是利用了这个原理,在这个项目中我就以这种高精度的方式来测量。⭐霍尔传感器模块的使用 What is 霍尔传感器?霍尔传感器是一种磁场传感器,那它理所当然就是用来检测磁场的咯,也就是上面说的要安装在车架上的“感应器”。霍尔传感器常用于测速,我们的手机里大多数也有霍尔传感器,它是用于支持智能翻盖保护套的,保护套的盖子上有一个小小的磁铁,当盖上盖子时,手机的霍尔传感器检测到磁铁,手机就自动地锁屏了,同理,盖子打开时,霍尔传感器检测不到磁铁了,手机也就自动点亮了(这都能叫智能)。下面是我买的开关型霍尔传感器模块。 在测试阶段,我先用Arduino UNO作主控板,先将程序跑通,以后做成品的时候再用小体积的Arduino Pro Micro。 这一个霍尔传感器的用法很简单,当它检测到有足够大的磁场时,它就会输出低电平,相反,没有磁场时,它就会输出高电平。这里我用个小磁铁测试下。 指示灯能随磁铁亮和灭,用Arduino读取电平,能成功输出数据。⭐计算速度 要能检测到轮子转动,就要在轮子上装上一个磁铁,然后在相应位置装上霍尔传感器,因为车子前面有避震器,所以我把这些装在后面的轮子上。(这只是一个测试,不要在意那么多。。。) 要计算速度,我的思路是这样的:先测量出轮子转一圈的时间,再用轮子的周长除以时间就能计算出速度。Arduino的一个函数Millis()可以获取从开机开始计算的毫秒数(1s = 1000ms),我便可以用此测量出轮子转一圈所用的毫秒数。公式如下: 时速(km/h) = 车轮直径(m) × π(圆周率) ÷ 车轮转一圈的时间(ms) × 3600 我的车轮直径为26英寸,约等于0.66米,圆周率取3.14,可以把计算公式简化成这样: 时速(km/h) = 7460 ÷ 车轮转一圈的时间(ms)
⭐计算总里程 要计算总里程非常简单,只需添加小小的程序,在检测轮子转动时,累计轮子转动的圈数,再用转动总圈数乘以轮子周长即可。公式: 总里程(km) = 车轮直径(m) × π(圆周率) × 转动总圈数 × 0.001 简化: 总里程(km) = 0.0020724 × 转动总圈数
⭐计算踏频 计算踏频需要在脚踏上多加一块磁铁,车架上也要多装一个霍尔传感器。
计算方式和计算速度差不多,公式: 踏频(rpm) = 60000(一分钟的毫秒数) ÷ 转一圈的毫秒数
⭐屏幕显示 我用的屏幕是USART HMI屏,有现成的交互界面,画界面就像初中学的VB一样简单,通讯是用串口,Arduino直接向屏幕发送串口信息就能修改屏幕显示的数据,使用非常简单,这里不详细解释,想了解的请百度,我画了一个这样的捞B界面:
⭐测试 接下来就要连电路写代码了,测速需要用到Arduino的外部中断功能,Arduino UNO恰好有两个外部中断,是2和3号引脚,和霍尔传感器的输出口连接就行了,屏幕就用串口连接,电路比较简单,就不画出来了。 以下是Arduino代码:float num = 7460.64; //d0.66m * pi3.14 * 3600
float c = 2.0724; //车轮周长(m)
int r; //车轮已转圈数
int lastTime1; //上次检测到车轮的时间
int lastTime2; //上次检测到脚踏的时间
void setup() {
attachInterrupt(0, stateChange1, FALLING); //外部中断1,用于检测车轮转动
attachInterrupt(1, stateChange2, FALLING); //外部中断2,用于检测脚踏转动
Serial.begin(9600);
lastTime1 = millis(); //获取当前时间
lastTime2 = millis();
r = 0;
}
void loop() {
}
//计算速度、里程
void stateChange1(){
int newTime = millis(); //获取当前时间
int t = newTime - lastTime1; //计算时间差
if(t<100) return; //时间差太短忽略
lastTime1 = newTime; //赋予新时间
r++; //圈数加一
int v = num/t; //计算速度
int s = r*c; //计算里程
Serial.print("t0.txt=\""); //这是修改屏幕数据的命令
Serial.print(v);
Serial.print("\"");
Serial.write(0XFF);
Serial.write(0XFF);
Serial.write(0XFF);
Serial.print("t2.txt=\"");
Serial.print(s);
Serial.print("\"");
Serial.write(0XFF);
Serial.write(0XFF);
Serial.write(0XFF);
}
//计算踏频
void stateChange2(){
int newTime = millis(); //获取当前时间
int t = newTime - lastTime2; //计算时间差
if(t<100) return; //时间差太短忽略
lastTime2 = newTime; //赋予新时间
int f = 60000.0/t; //计算踏频
Serial.print("t1.txt=\""); //这是修改屏幕数据的命令
Serial.print(f);
Serial.print("\"");
Serial.write(0XFF);
Serial.write(0XFF);
Serial.write(0XFF);
}
全都准备好了!!!来吧!!!(这只是测试...线乱很正常...成品当然不会这样...) 看我人肉马达~!https://v.qq.com/iframe/player.html?vid=p13229jj08u&width=670&height=376.875&auto=0 速度、里程、踏频都能即时显示出来!完美!
⭐存在的问题在速度较慢的时候,数据会有异常的跳动,但不影响数据正常测量。这是因为霍尔传感器检测到有与无之间有一个临界点,当转动速度慢的时候,就很容易在这个临界点之间来回跳动,从而出现了异常高的数据跳动,这个问题就像按键抖动一样,后续要加入一些防抖程序。
-----------------华丽的分割线--------------------
7月21日:项目发起
最近放暑假了,终于有许多时间来做自己喜欢的东西,被高考掏空了身体的我,当然就要趁着这个暑假多做运动,锻炼好身体了。我个人比较喜欢骑车,它不像跑步一样枯燥乏味,也没有游泳时的空间限制,它会让你感到畅快无比,同时还能欣赏沿途的风景,它不再只是一种代步工具,更是愉悦心灵的方式。将一样传统的东西赋予新颖的技术是很有趣的,当我骑车的时候,我就想,在我现在的技术允许下,还能给这台自行车加上什么功能呢?于是,我费尽心思,打算为我的爱驹加上下面的这些配置和功能,按照我以往的命名方式,这次的项目我就命名为BikeX,X代表未知数,代表无限的可能,意为为Bike(自行车)加上无限的可能~
1.最基本的功能:速度、踏频的检测和里程的计算 许多骑自行车的人会在车上装上一个码表,这样就可以在骑行过程中知道自己的速度和走过的里程。速度检测和里程计算是最最最基本的功能,这么基本的功能都实现不了,怎么敢称是智能单车呢?!另外一个就是踏频的检测,踏频可能对大部分人来说比较陌生,顾名思义,踏频即脚蹬踏的频率,用脚踏每分钟转动的次数(rpm)来表示。当一个车手蹬踏频率过低时,不稳定的输出功率和肌肉的松弛会浪费能量;但是当车手蹬踏得太快的时候,身体为了克服肌肉内部的阻力也会损失能量,因此合适的踏频能让能量的利用率更高。在长途骑行的时候,能够实时地知道自己的踏频是非常有用的。
2.装逼必备:坡度、海拔、气压、温度的测量 这几个数据就能和普通单车拉开差距啦。在上下坡的时候能够准确地知道斜坡的坡度,走了多少上坡路、下坡路,还能通过海拔数据知道自己骑行过程中爬升了多少米或是下降了多少米,还能获取气压、温度等数据,这都是普通自行车甚至配合上手机都无法实现的。那么有人就要问了,你这些数据对专业车手来说可能还有点用,但我平时就骑车上学上班回家,这些东西对我有个卵用??那么你就错了,想象一下这样的聊天场景: “啊,小张,今天骑自行车上学啊,非常环保哦” “是小刘啊,对啊,我跟你说,今天骑车可累了!特别是上那个大斜坡,我顶着35.6°C的高温,在101.325kPa的气压下,以15km/h的速度、90rpm的踏频,骑上那个坡度30.2°的斜坡,整整爬升了8.45m,真是累死我了” “......” 有木有感觉逼格瞬间上升了不少!!!(当然也不排除别人当你傻逼)这些功能对于大部分骑行者可能实际用途不大,但许多高端的自行车码表都是带有这些功能的,当然也有它存在的意义,对我来说,这些东西的功能就是装逼吧哈哈~
3.高逼格:蓝牙连接手机APP统计数据 既然收集了数据,当然就需要对数据进行统计,对这次骑行进行详细分析。我们可以通过蓝牙与手机连接,再配合自己开发的安卓APP进行数据统计分析。对于安卓APP开发我没有太多的经验,上一次试着写安卓应用已经是高一的时候了,当时做的是一个简单的蓝牙遥控小车的APP,而如今安卓系统更新迭代太快,开发环境也从Eclipse变成了Android Studio,在安卓APP的开发上肯定要花不少时间。
4.高清触控大屏幕 数据只通过手机来显示是远远不够的,这些数据必须要能够实时显示才有意义,为此我准备了一个3.5寸带触屏的屏幕,大点的尺寸能显示更多的数据,触屏功能可以免去加上各种按钮的麻烦,控制也更加直观。不过有个问题就是,会不会有人以为那是手机然后拿走???
5.尾灯功能拓展:控制尾灯开关、夜间自动开尾灯、刹车闪烁 为了夜间骑行的安全,我们都会在车子后面装上一个尾灯,这样在夜晚老司机们就能更清楚地看到我们的存在,有效避免事故发生。然而有时候在已经骑上车的时候,想要打开尾灯,就要把手伸到屁股后面开,而且还不知道有没有开成功,回到家发现尾灯压根没开! (ノ`ー´)ノ・・・~~┻━┻因此我要把尾灯开关整合在系统里,通过车前的屏幕就可以方便地打开车灯,同时还可以拓展新的功能,例如在夜晚自动打开尾灯、刹车时自动闪烁等。
6.真正的智能:智能防盗系统 这个防盗系统就是真正的牛逼了。大致功能是这样的:当我把车停好,开启防盗系统后,如果有小偷触动、移动我的自行车,它首先会像电瓶车一样哔哔哔地发出警报,同时利用内置的GSM(可以理解为以前手机用的2G网络)向我的手机发送警报信息或给我的手机打电话,这样我就能第一时间赶回现场,防止小偷得逞。要实现这个功能成本会比较高,要给它装上GSM模块,还要给它配一张手机卡,才能实现发信息、打电话的功能。
7.最后的挽回:找回自行车 再高级的防盗系统都有失手的时候,如果当我跑回停车的地方的时候,小偷已经把我的车抬上面包车了,再如果小偷还没有将我的车四分五裂,那么就要用这个“找回自行车”功能试着挽回了。听名字就知道,这就是“找回手机”功能在自行车上的应用,在自行车上配备GPS模块,配合GSM模块,此时我可以用手机向自行车的手机号发送一个定位请求信息,自行车收到后会向我发送一个定位信息,可以在地图软件中查看车子的精确位置,同时叫上警察叔叔帮忙,也许能够成功找回我的车子。值得一提的是,GPS模块、GSM模块、控制器、电池等这些硬件一定要隐藏好,否则如果小偷看见了一下子给拔了,那这个功能就完全废了。
8.假装有第八~~~ 好了,以上就是我暂时想到的要实现的功能,如果你有更好的想法,可以在下面回复,我会择优采纳~~同时由于本人技术有限,设想中的某些功能可能会做得不完善或者实现不了而放弃,敬请原谅~明天开始我就会开始这个项目的制作,后续我会将制作的所有过程、程序源代码、演示视频等发上来~ 本帖最后由 shifeng3705 于 2017-8-21 20:07 编辑
有一次坐 出租车的时候,看到司机师傅的后视镜上挂着一块MINI板,不知道是谁DIY的一个测胎压的装置,看起来成本应该不是很高,自行车经常会出现扎带等问题,应该做一个这个功能也会有用处吧,期待楼主的设计,加油 不错啊。。。。。。。。。。。。 testtesttesttest 66666:lol:lol:lol:lol:lol:lol:lol 没有后续了吗 楼主还发不发。。。。。。等了许久,不耐烦,我都开始做了。。。 520了解一下。 楼主一年了。。。
页:
[1]