2017-7-22 02:02:38 [显示全部楼层]
15544浏览
查看: 15544|回复: 15

【挑战FireBeetle系列】iBikeTo让骑行更轻松

[复制链接]

在这个拥共享单车的时代,当你兴致冲冲地骑着小车车去一个比较陌生地方时,你有没有这种烦躁:时不时掏出手机看看要怎么往目的地骑?或者是带着耳机听着语音导航,却发现后面有一辆大巴正在疯狂地朝你按喇叭。居然还有买了手机支架,却忘了带!带着朋友转圈,结果……迷路了。是的没错,这些事儿我都干过了。
终于我决定让手机导航安心呆在我的小书包里!(因为我只想看方向!)用一个低功耗的导航小神器——iBikeTo代替手机为我指路,肯定不管去哪心里都能踏实~

那么问题来了,咋!弄!啊!

想要获取导航信息,那就先要学会自己写AP!Android写程序式有神器滴——AndroidStudio。据说这是google的亲儿子,因此兼容性那是杠杠滴。那么第二个问题来了,导航信息点怎么获啊~果断选择靠谱的高德地图SDK。至于为什么我没有选用百度地图。。因为我看不懂他们的开发者文档啊(有那么一丝丝尴尬。。。配置了两三天环境,整个人都不好了。。)下面是APP的功能分割。因为这个APP只有我一个人,所以我也就去掉了美工什么的。功能分割为:

  • 基本定位(地图显示+坐标显示+坐标的读出)
  • 兴趣点选取(用户交互+坐标获取)
  • 导航规划(坐标输入+路径规划+动作捕获+动作传出)
  • WIFI通信(热点开启+Socket建立+信息流输入输出)

当然,一些细节程序如子线程建立,就作为基础功能在调试中应用即可。

接下来就是逐步调试了。

打开AS(AndroidStudio的简称,安装教程网上超多我这里就不多言了),新建一个项目,然后到在高德官网上下载相应的jar包和so库。首先完成定位功能的调试。
这里,很重要!!你需要在注册了高德地图开发者以后,在高德开放平台注册应用获得一个key,整个过程并不复杂,SHA1值的获取查询说明即可~高德开发者文档高德应用管理申请key

【挑战FireBeetle系列】iBikeTo让骑行更轻松图1

记下自己的key哦,接下来,才是见证奇迹的时刻~!

在AndroidManifest.xml中,在application前添加:

  1. <p style="line-height: 30px; text-indent: 2em;"><!-- 用于进行网络定位 --></p>    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  2.     <!-- 用于访问GPS定位 -->
  3.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  4.     <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
  5.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  6.     <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
  7.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  8.     <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
  9.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  10.     <!-- 用于访问网络,网络定位需要上网 -->
  11.     <uses-permission android:name="android.permission.INTERNET" />
  12.     <!-- 用于读取手机当前的状态 -->
  13.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  14.     <!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 -->
  15.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  16.     <!-- 用于申请调用A-GPS模块 -->
  17.     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
  18.     <!-- 用于申请获取蓝牙信息进行室内定位 -->
  19.     <uses-permission android:name="android.permission.BLUETOOTH" />
  20.     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  21.     <uses-permission android:name="android.permission.INTERNET" />
  22.     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  23.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  24.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  25.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  26.     <uses-permission android:name="android.permission.INTERNET" />
  27.     <!--用于进行网络定位-->
  28.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
  29.     <!--用于访问GPS定位-->
  30.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
  31.     <!--获取运营商信息,用于支持提供运营商信息相关的接口-->
  32.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  33.     <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
  34.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
  35.     <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
  36.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
  37.     <!--用于访问网络,网络定位需要上网-->
  38.     <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  39.     <!--用于读取手机当前的状态-->
  40.     <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
  41.     <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
  42.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  43.     <!--用于申请调用A-GPS模块-->
  44.     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
  45.     <!--用于申请获取蓝牙信息进行室内定位-->
  46.     <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
  47.     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
复制代码

这是所有需要使用到的权限信息。一次填写终身受用哈哈哈~

接下来在android:theme下加两句

  1. <p style="line-height: 30px; text-indent: 2em;"> <meta-data</p>            android:name="com.amap.api.v2.apikey"
  2.             android:value=属于你的高德地图key" />
复制代码

把你紧握着的key放进去就好啦~剩下的初始化过程和普通Android程序完全相同。完成初始化以后:恭喜你!程序你已经写好一半啦~
因为高德地图对于定位和导航都有自己的demo,只需要下载下来调试相关函数即可。我就不再多做说明(因为我们的主角是ESP-32啊!)大家可以直接在我文末给出的demo里进行自定义的修改。我这里主要交代一下我自定义的内容:

一、图标更换子线程:

【挑战FireBeetle系列】iBikeTo让骑行更轻松图2

这个子线程主要用于显示WIFI热点的开关状态,当使用iBikeTo时,手机会默认开启一个名为iBikeTo的热点。iBikeTo根据预先设定好的密码连接与此热点,并且和手机socket通信,完成事件的响应和信息的显示。

二、热点开启函数:

【挑战FireBeetle系列】iBikeTo让骑行更轻松图3

根据你的要求更换热点的密码和名称就可以啦,但是还需要在ESP-32的软件中修改相关参数吼!还是一样的道理,由于热点开启时个耗时的活儿~所以不能放在onCreat中哦,我还是选择了用子线程做这件事。

三、地图选点、单点生存

【挑战FireBeetle系列】iBikeTo让骑行更轻松图4

因为不想让最后在地图上选太多不相关的点、所以在这里我应用hasMarkerOnMap来作为状态清理。也就是说,如果在地图上已经有选点的情况下再去点击POI关键点,APP会优先关闭上一次的marker,清理屏幕~

四、iBikeTo IP地址输入

【挑战FireBeetle系列】iBikeTo让骑行更轻松图5

iBikeTo在局域网中的IP地址显示在面板上,由使用者填入APP中,让手机找到iBikeTo硬件,(这的确有些不合理,正在想办法改进!)

大部分的系统中,会给子网分配192.168开始的IP地址,因此如果一般情况下,输入后几位就可以了,但是对于特殊情况,只需要把IP全长输入进去,由于有s.length()>6的分支,会让程序将输入的IP全部读入,提高啦环境滴兼容性~

五、Socket建立

【挑战FireBeetle系列】iBikeTo让骑行更轻松图6

知道啦ibikeTo的网络位置,手机就可以建立socket连接传输数据了。只需要在路口等转折处发送相关的字符给ESP-32就可以了!

比如说:

【挑战FireBeetle系列】iBikeTo让骑行更轻松图7

由于只是简单demo所以我只显示直走、和左右转弯的状态(哈哈哈 幸亏没有路试不然简直会是灾难的啊~)

然后,就是给我APP画一个漂亮得图标了!然而缺少美工得本宝宝只能可怜巴巴滴去easyicon下载,我强烈安利你们一发easyicon,真的是很不错得网站,很用心~

基本上,到这里,Android端可以说已经布置完毕了,由于我手里只剩一台4.3的Android旧机,所以所有的调试也都是基于4.3的(在这里为旧机抱怨一下,好几年不,翻出来就是被我调试得一顿闪退,也是辛苦了 不过!略略略~虽然你是我得战斗机~)Android端测试软件ibikeToibikeTo_Android_demo(文件过大 提取码:zst1)


所以!我又可以回归Arduino的怀抱了!

【挑战FireBeetle系列】iBikeTo让骑行更轻松图8

看到者青春的小界面我一楞,才想起来因为要调试3D打印机,所以把1.8给卸了。。。

【挑战FireBeetle系列】iBikeTo让骑行更轻松图9

项目里我自己写了两个动画(link和showMode)(不能算库,库的写法我将ibikeTo 一代demo会说,别找。。我是先发的二代demo教程),在视频里应该已经看到过了。
为了让LED Matrix可以显示出来自己的IP地址,我写了个IP的解算,解算原理很简单,关于IP地址,不懂的百度哦~~

  1. <p style="line-height: 30px; text-indent: 2em;">
  2.   int ip_get;
  3.   int IP_int[4];
  4.   ip_get = (int) WiFi.localIP();
  5.   for (int i = 0; i < 4; i++)
  6.     IP_int = ip_get >> (8 * i);
  7.   IP_int[2] -= IP_int[3] * 256;
  8.   IP_int[1] = IP_int[1] - IP_int[2] * 256 - IP_int[3] * 256 * 256;
  9.   IP_int[0] = IP_int[0] - IP_int[1] * 256 - IP_int[2] * 256 * 256 - IP_int[3] * 256 * 256 * 256;
  10.   if (IP_int[3] < 0)
  11.     IP_int[3] += 256;
  12.   String int_IP_Address = (String)IP_int[0] + "." + (String)IP_int[1] + "." + (String)IP_int[2] + "." + (String)IP_int[3];</p><p style="line-height: 30px; text-indent: 2em;">  for (int looper = 0; looper < int_IP_Address.length(); looper++)
  13.     waitPlot[looper] = int_IP_Address[looper];
  14.   ht1632c.clearScreen();
  15.   server.begin();</p><p style="line-height: 30px; text-indent: 2em;">  ht1632c.print(waitPlot, 40);[/mw_shl_code]</p><p style="line-height: 30px; text-indent: 2em;">接下来就是开放端口给上位机,然后就是接收上位机Android发来的字符串即可,代码如下:</p><p style="line-height: 30px; text-indent: 2em;">[mw_shl_code=c,true]WiFiClient ipclient = server.available();
  16.   if (ipclient) {
  17.     String currentLine = "";
  18.     Serial.println("client connected");
  19.     while (ipclient.connected()) {
  20.       if (ipclient.available()) {
  21.         char c = ipclient.read();
  22.         if (c == ';') {
  23.           if (currentLine.length() == 0)
  24.             break;
  25.           else {
  26.             currentLine = "";
  27.           }
  28.         }
  29.         else {
  30.           currentLine += c;
  31.         }
  32.         Serial.println(currentLine);</p>
复制代码

最后是,执行结果的显示~交互界面我采用三种箭头的跃动显示指明方向~这个动画的制作原理,是利用了我之前的一片帖子里的Python代码。复杂动画采用逐帧解算再调试时间间隔,简单的动画采用了直接偏移的方法。具体的解算代码见:FireBeetle开箱测评——借助DF驱动库实现我的LEDMatrix玩法大家可能会好奇一代的功能,其实是用来再骑行过程中相互指路的小神器,毕竟本宝宝是一个不甘寂寞的人 一个人骑车多没意思~

在手机端定位选择目的地,然后连接iBikeTo就可以发车啦!合理的应用LED Matrix和WiFi功能打造你个性化的出行神器吧!(BLE正在研究,完成后就可以实现一代二代demo的正式合并啦。)其实,我还在给怎么给iBikeTo设计一个好看些外壳,毕竟。。3D打印机都买好了~再不搞点事情,真的就要变成寂寞宅啦~哈哈哈!
最后的最后,附赠上我的ESP-32代码!microPython是个特别强的开发工具!我还有加油加油!为脱离寂寞宅、争做技术牛而fighting~当然!要感谢DFRobot给我这次宝贵的机会,用美美的板子充分实现了自己的小梦想!!

FireBeetle,你值得拥有~~~
下载附件ibikeTo_dexin.zip


dbc0301  高级技匠

发表于 2017-7-22 18:27:53

厉害了666
回复

使用道具 举报

dexin  中级技师
 楼主|

发表于 2017-7-23 00:34:24


还要完善很多东西呢,为了用着更舒服!
回复

使用道具 举报

Chocho2017  初级技匠

发表于 2017-7-24 10:47:47

这个吊,好强大。
回复

使用道具 举报

luna  初级技神

发表于 2017-7-24 10:51:22

6666这个想法真的很不错,非常的黑科技!楼主用心了~
回复

使用道具 举报

dexin  中级技师
 楼主|

发表于 2017-7-24 12:40:49

luna 发表于 2017-7-24 10:51
6666这个想法真的很不错,非常的黑科技!楼主用心了~

我会接着努力哒
回复

使用道具 举报

xiaohe9527  高级技师

发表于 2017-7-24 16:38:03

太厉害了
回复

使用道具 举报

killerlist  中级技匠

发表于 2017-7-27 14:58:27

太强了,看大佬装逼
回复

使用道具 举报

krwlng  初级技师

发表于 2017-12-8 00:15:13

那个APP可以直接使用吗??
回复

使用道具 举报

kongmeng  见习技师

发表于 2018-1-12 21:25:04

没有“我的位置” 和 “搜索目的地” 按钮吗??
回复

使用道具 举报

哎呀了吧  见习技师

发表于 2018-1-28 19:39:45

厉害厉害,有时间试试
回复

使用道具 举报

dexin  中级技师
 楼主|

发表于 2018-2-9 14:02:17

kongmeng 发表于 2018-1-12 21:25
没有“我的位置” 和 “搜索目的地” 按钮吗??

当时设计的时候犯懒 哈哈哈 不过还是很有用的 我争取把它加上
回复

使用道具 举报

dexin  中级技师
 楼主|

发表于 2018-2-9 14:03:12

krwlng 发表于 2017-12-8 00:15
那个APP可以直接使用吗??

不可以的哦 申请一个高德地图的key修改好 就可以了
回复

使用道具 举报

kongmeng  见习技师

发表于 2018-4-7 19:48:29

dexin 发表于 2018-2-9 14:02
当时设计的时候犯懒 哈哈哈 不过还是很有用的 我争取把它加上

想复制一个,但是没有搜索目的地。。。。。:lol
回复

使用道具 举报

设计chen  学徒

发表于 2018-4-27 11:56:11

人才,可以加一下你微信吗,我的是13723776917
回复

使用道具 举报

Jawa_D  学徒

发表于 2020-3-22 22:29:38

如果能装在车上就不用打方向灯了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail