1 如何为自行车制作车速表/跟踪器-德赢Vwin官网 网
×

如何为自行车制作车速表/跟踪器

消耗积分:0 | 格式:zip | 大小:0.15 MB | 2022-10-28

张艳

分享资料个

描述

介绍

使用 Raspberry Pi 和 Arduino,我为我的自行车制作了一个速度计和跟踪器,称为“Bike Dashboard”,它在 OLED 显示屏上显示速度、日期和时间,还可以跟踪自行车的路线。以下是有关如何制作自己的“自行车仪表板”的教程。本教程并不意味着完全遵循,我们鼓励您进行自己的更改,以便它最适合您!!!

通过报告错误和建议升级来帮助改进项目。浏览源代码并在此处做出贡献

背景

在 2021 年 4 月的春假期间,我使用 Arduino Nano、LCD 屏幕和 GPS制作了一个“自行车仪表板”(项目描述,Github Repo) 。我这样做是为了在骑车时更安全地查看时间,而且我还想跟踪我在没有手机的情况下骑车的路线。我认为把我的自行车停下来检查我的手机时间是不方便和危险的。除此之外,我还对骑自行车时查看速度感兴趣。

然而,这种设计有很多问题:

  • 因为 Arduino Nano 没有太多内存,所以我无法在上面添加那么多功能。
  • LCD 上的速度更新非常缓慢。
  • 液晶屏幕非常大,引起了人们的注意。
  • 即使它可以跟踪,我也无法在地图上查看它。由于这些问题,我想要一个新的设计。

这种设计

此自行车仪表板具有连接到 Arduino 的 Raspberry Pi Zero W。速度、日期和时间显示在 OLED 和 LED 面板上。Raspberry Pi 可以更快地获取数据,它还可以托管一个本地网站,在地图上显示您跟踪的路线。

我之前的设计没有用于 Bike Dashboard 的外壳,但这个设计包括一个基本的木箱。但是,您不必用木头制作,我鼓励您自己设计一个案例。

自行车仪表板分为 2 部分:中央部分和把手部分。中心部分是 Raspberry Pi 和 GPS 所在的位置,它处理大部分操作。这件和电池安装在自行车的中心。手柄是显示器和开始跟踪的按钮所在的位置。这块安装在自行车的右把手上,在那里我可以很容易地看到屏幕并按下按钮。

我为 Bike Dashboard 添加了一个 LED 面板,以另一种方式显示速度,我计划用它实现其他功能。

 

pYYBAGNYupKAST0XABTQKTOW0AQ482.jpg
开发中的自行车仪表板
 

如何制作自行车仪表板

所需零件

这些是您制作此项目可能需要购买的零件。根据您制作此项目的方式,您可以省略一些部分或获取其他部分。

电子产品

  • 面包板(如果您不想焊接,建议在焊接前进行测试)

硬件

这些是我使用的:

  • 椴木(我得到了一种更硬更厚的木材。这种木材应该很容易用剃须刀片或 X-acto 刀切割。)

原理图

可以在此处找到有关接线的信息

如果您不想焊接,可以使用面包板。

我没有设计定制 PCB,而是将所有这些组件焊接到原型 PCB 上。我以后可能会设计一个定制的PCB。焊接 LED 面板是可选的,因为那里显示的所有信息都将显示在 OLED 上。

外壳和安装

本节仅显示我为案例和安装所做的工作。由于我们的自行车不同,您可能必须自己设计。

对于中心件和底座,我切割了 6 块木头,这样它就可以包围中心件电子设备和 PCB,我在木头上切了一些孔,以便暴露端口和电线(USB 到 Arduino,USB 到移动电源,和 I2C 到 OLED)可能来自电子产品。

“盒子”被设计成两部分,所以我可以把它们拆开:平底部分将连接到自行车上,顶部部分(其他 5 个部分粘在一起)将充当封闭电子设备的盖子. 他们被拧在一起了。

对于支架,我切割了 3 块木头,它们会绕在自行车的上管上,然后将它们粘在一起。然后,我拿了两个螺丝和两个螺母,将“盒子”的底部连接到支架上。

手柄的过程大致相同。我剪了 5 块来封装手柄的电子设备,但我没有制作第 6 块放在上面,而是剪了一张透明的活页纸并将其粘在上面,这样我就可以看到显示器了。

为了安装它,我将它粘在前自行车反射器的安装座上。我无法为中央部分执行此操作,因为上管比手柄大得多并且形状不同。

pYYBAGNYupWAez6wAADbyIj41UM24.jpeg
中央部件的安装(左侧显示的电池使用 Velcro 带安装)
 
poYBAGNYupeAdgMNAACgkvKoj1s52.jpeg
手柄片安装
 

软件安装

安装过程中有两个步骤:配置您的 Raspberry Pi 以使该软件能够正常工作,以及安装该软件。但是,在此之前:

如果您尚未安装 Raspberry Pi 操作系统,请按照以下说明进行操作。确保安装“Raspberry Pi OS(32 位)”而不是任何其他操作系统,因为它们可能不附带 Python、cURL 或 git。

设置树莓派

设置无头 Raspberry Pi

如果没有安装 Python 安装:

sudo apt update
sudo apt install python3 idle3

如果您没有安装 cURL 安装:

sudo apt update
sudo apt install curl

如果没有安装 Git 安装:

sudo apt update
sudo apt install git

配置

吉特:

git config --global user.name "Your name"
git config --global user.email "your@email.com"

将“Your name”和“your@email.com”替换为您的实际姓名和电子邮件。

配置引脚:

1. 输入sudo raspi-config

2. 进入“接口选项”并选择I2C,然后选择是。

3. 返回“界面选项”并选择Serial Port当它询问时Would you like a login shell to be accessible over serial?,选择否。然后它会询问,Would you like the serial port hardware to be enabled?然后选择是。

4. 单击完成。

5. 重启树莓派:sudo reboot

安装

在安装之前,确保所有东西都连接到 Raspberry Pi 上查看原理图部分以了解如何连接 Raspberry Pi。

运行此命令,最好在您的主(~/home/pi)文件夹中。

curl -sO https://raw.githubusercontent.com/jonyboi396825/BikeDashboardPlus/master/install.bash

运行此程序后,您将必须弄清楚您的 Arduino 的串行端口。键入ls -l /dev以查看所有串行端口。Arduino 的端口应该是ttyUSB*ttyACM*检查 Arduino 位于哪个端口的最佳方法是插入 Arduino,记下是ttyUSB*或的端口ttyACM*,然后拔下 Arduino,看看哪些端口消失了。那个端口就是Arduino。

获取到串口的路径(例如/dev/ttyUSB0/dev/ttyACM0)后,输入以下命令:

bash install.bash /dev/port

替换/dev/port为串口的实际路径。安装过程在 Raspberry Pi 4 上大约需要 1-2 分钟,在 Raspberry Pi Zero 上大约需要 8-10 分钟。

2. 备份/etc/rc.local

sudo cp /etc/rc.local /etc/rc_backup.local

3.编辑/etc/rc.local

  • 类型sudo nano /etc/rc.local
  • 向下滚动。在.su pi -c "bash /path/to/BikeDashboardPlus/run.bash" &之前输入exit 0您可以通过键入来查看路径是什么cat ~/BikeDashboardPlus.txt确保添加 & 符号,否则 Pi 将无法启动。此行将使 Raspberry Pi 在启动时运行程序。以用户su pi -c身份运行程序,pi以便您稍后可以访问程序中的文件。
  • 保存并退出:按 ^X (Control-X),然后按 Y,然后输入。
pYYBAGNYupuANk-rAAAnF30TWWg300.png
不要输入“vvvv Add here vvvvv”。这只是为了显示添加行的位置。
 

不要键入“ vvvv Add here vvvvv". 那只是为了显示在哪里添加行。

4. 重启 pi:sudo reboot

从现在开始,该程序应该在您启动 Raspberry Pi 后运行。

禁用

这可以防止程序在您启动 Raspberry Pi 时运行。

  • 类型sudo nano /etc/rc.local
  • 删除安装时添加的行(如上图所示)。
  • 保存并退出:按 ^X (Control-X),然后按 Y,然后输入。
  • 重启树莓派:sudo reboot

要重新启用它,只需/etc/rc.local在同一位置键入该行。

卸载

  • 禁用程序(参见“禁用”)
  • cd进入您安装 BikeDashboardPlus 的目录。
  • 您可以通过键入检查cat ~/BikeDashboardPlus.txt

3. 键入rm -rf BikeDashboardPlus以删除文件夹及其所有内容。

4.类型rm ~/BikeDashboardPlus.txt

5.重启树莓派:sudo reboot

用法

自行车仪表板有 2 种模式:自行车模式和服务器模式。自行车模式是您在骑自行车时设置的模式。OLED显示屏将显示时间、速度等,您可以跟踪您的路线。服务器模式设置服务器,您可以在其中配置自行车仪表板并查看跟踪路线的地图。

要打开 Bike Dashboard,请打开 Raspberry Pi 电源并等待 30 秒到 1 分钟以使其启动。

要关闭它,请按下中央单元上的按钮 2(连接到 RPi 上 BCM 引脚 18 的按钮)。

自行车模式

自行车仪表板在启动时会自动进入自行车模式。

显示一些设置文本后,OLED 将显示您将在自行车模式下看到的内容。此图将显示 OLED 上显示的每个组件所代表的内容:

poYBAGNYup2AK7pAAAEGPhDGSDU257.png
 

这是 LED 面板上 LED 的编号方式:

poYBAGNYuqCATlDnAACOlWGpQuI092.png
 

工作原理:如果配置“LED”为 0,则 LED n (在面板上)会在您行驶n mph、km/h 或 m/s 时亮起。如果“LED”设置为 1,则当您以n mph、km/h 或 m/s 行驶时, LED n/2将亮起。

要开始跟踪,请按下连接到 Arduino Nano 上引脚 D4 的按钮。Arduino 上的绿色 LED 会亮起,并且 OLED 显示屏的右下角会出现一个“T”,表示您当前正在跟踪。请注意,如果您断开连接,即红色 LED 亮起或 OLED 上显示“M:D”,则无法进行跟踪。

一旦您开始跟踪,它将立即写入一个新的跟踪文件。如果您不小心开始了此操作,请不要担心,您可以稍后将其删除。

要暂停跟踪,请按下连接到 Arduino 上引脚 D5 的按钮。您已暂停的指示灯是绿色 LED 闪烁而不是一直亮着,并且 OLED 在右下角显示“P”。要恢复,请按相同的按钮。

要结束跟踪,请按与开始跟踪时按下的按钮相同的按钮。绿色 LED 将关闭,并且 OLED 的右下角应该没有任何显示。

服务器模式

要从自行车模式进入服务器模式,您需要将其关闭并重新打开。为此,请按下中央单元上的按钮 2(连接到 RPi 上 BCM 引脚 18 的按钮)。

当“设置”屏幕出现在 OLED 上时,按住中央单元上的按钮 1(连接到 RPi 上 BCM 引脚 17 的那个)。当“服务器模式”屏幕出现时,您处于服务器模式,并且 Raspberry Pi 正在您的网络上托管一个网站。请注意,如果没有互联网连接,服务器模式将失败并进入自行车模式。

转到 OLED 上显示的网站。

在主页上,您应该会看到这个(版本号会有所不同):

pYYBAGNYuqOAQuZ4AAAkJoF15EI249.png
 

有3个选项:配置页面、地图页面和组合页面。我将介绍每个人所做的事情。

配置

配置页面应如下所示:

poYBAGNYuqaAKxzfAAA9a_j32Ac996.png
 

它是一个表格,显示了所有配置、它们的含义以及您必须输入的值。您必须将该值输入到表格右列的文本框中。

对于时区,您应该从链接中的列表中复制和粘贴,而不是输入它,因为您必须像在表格中一样输入它。

最后点击提交。

地图

如果您没有任何轨迹文件,您应该无法在地图页面上看到任何内容。如果这样做,链接名称将类似于:

Started tracking at:  

当你点击它时,它应该是这样的:

pYYBAGNYuqiAe2JfAABd0xCLvmY193.png
 

(别担心,我不住在这里。)

如果您看到一条建议您删除文件的消息,则说明在写入/读取跟踪文件时出现了一些错误,您应该将其删除。

数据不应该像从谷歌地图复制的那样精确。

在地图上,您应该能够看到您的路线。有一个开始标记、一个结束标记和多个暂停/恢复标记,具体取决于您暂停的位置。

在地图的底部,您应该会看到您已经走了多远,具体取决于您的“UNT”配置。

  • 如果“UNT”为 0 (mph),则以英里和英尺显示
  • 如果“UNT”为 1 (km/h) 或 2 (m/s),则以公里和米为单位显示

如果您不小心开始跟踪并且想要删除文件,请按页面底部的“删除此文件”。

故障排除

如果我的程序总是退出怎么办?

如果程序在进入自行车模式之前退出,并且您的 OLED 和 Arduino 都已连接,则可能是port文件中 Arduino 的端口错误。

如果发生这种情况,ssh请进入您的 Pi,然后转到此处并在“安装”下查看您的 Arduino 连接到哪个串行端口。之后,输入

nano raspberrypi/port

然后将文件中的端口更改为Arduino的新端口。然后保存并关闭文件(按 ^X,然后按 Y,然后输入)。

如果我的 Arduino 或 OLED 断开连接怎么办?

如果您的 Arduino 断开连接,OLED 应显示以“哦,不!”开头的内容。

重新连接您的 Arduino,等待约 5 秒,然后按下按钮 1(连接到 RPi 上 BCM 引脚 17 的按钮)。如果仍然显示“Oh no!”,则尝试断开 Arduino 并重新连接,等待约 15 秒,然后按下按钮 1。如果问题仍然存在,请尝试将其关闭并重新启动,确保Arduino 已连接。如果它仍然发生,请转到“如果我的程序总是退出怎么办?”。

如果您的 OLED 断开连接,它应该是一个空白屏幕,或者 OLED 上的时间与实际时间不匹配,并且 Arduino 上的 TX 和 RX LED 没有快速闪烁。

尝试按下按钮 1 重新启动您的 OLED。如果它再次快速断开连接,请尝试拔下 OLED 并重新插入。如果问题仍然存在,请重新启动您的 Pi 并确保 OLED 已连接。

结合

如果您的 GPS 在跟踪时断开连接,而您不得不重新开始跟踪,导致 2 个或更多单独的跟踪文件,您可以在“合并”页面中将它们合并。但是,在地图上,它将指示您在一个跟踪文件的末尾暂停并在下一个跟踪文件的开头恢复,而不是在两者之间绘制一条连续的线。

请注意,您不能在合并文件后将它们分开。

按要合并文件的顺序单击复选框。您将在下面看到文件编号的顺序,以便您确认您的选择。

单击提交以合并文件。

关机

按下连接到 BCM 引脚 18 的按钮以关闭 Pi。

结论

您不必完全按照本教程进行操作,因为这只涵盖了对我有用的内容我鼓励您修改代码并找到自己的方式来制作和安装外壳,以便它适合您。

如果您发现任何问题,请在此处报告。在提交问题之前,请务必阅读贡献页面。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"//www.hzfubeitong.com/m/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="https://m.elecfans.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'如何为自行车制作车速表/跟踪器',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.hzfubeitong.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);