设为首页收藏本站

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

dexin 发表于 2017-7-22 02:02:38 | 显示全部楼层 [复制链接]
7 848
本帖最后由 dexin 于 2017-7-22 02:02 编辑

戳出一枚演示视频!


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

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

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

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

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

接下来就是逐步调试了。

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

)$((R3WO1Y5F6QMI%~{1Y]D.png

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

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

[XML] 纯文本查看 复制代码
<!-- 用于进行网络定位 -->[/p]    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 用于访问网络,网络定位需要上网 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 用于读取手机当前的状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 用于申请调用A-GPS模块 -->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <!-- 用于申请获取蓝牙信息进行室内定位 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <!--用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!--用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!--获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!--用于访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <!--用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!--用于申请调用A-GPS模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <!--用于申请获取蓝牙信息进行室内定位-->
    <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

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

接下来在android:theme下加两句

[XML] 纯文本查看 复制代码
 <meta-data[/p]            android:name="com.amap.api.v2.apikey"
            android:value=属于你的高德地图key" />

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

一、图标更换子线程:

{F5B95S_`B3_IT7M3NY7)~U.png

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

二、热点开启函数:

OOF@A1@I1OBV8`[3WD%(R1I.png

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

三、地图选点、单点生存

MK1P(N82]8)IFK)E9@YU7GV.png

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

四、iBikeTo IP地址输入

YMGV]3Y%K9FF%$TO]9RNNIJ.png

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

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

五、Socket建立

24JNPMW1VA63J_3NM{6KUK8.png

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

比如说:

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

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

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


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

N2V37H{9~F4G1]}[T6UWOQC.png

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

D3_3RZUNJL0(@T0Y70CN_LO.png

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

[C] 纯文本查看 复制代码
  int ip_get;
  int IP_int[4];
  ip_get = (int) WiFi.localIP();
  for (int i = 0; i < 4; i++)
    IP_int = ip_get >> (8 * i);
  IP_int[2] -= IP_int[3] * 256;
  IP_int[1] = IP_int[1] - IP_int[2] * 256 - IP_int[3] * 256 * 256;
  IP_int[0] = IP_int[0] - IP_int[1] * 256 - IP_int[2] * 256 * 256 - IP_int[3] * 256 * 256 * 256;
  if (IP_int[3] < 0)
    IP_int[3] += 256;
  String int_IP_Address = (String)IP_int[0] + "." + (String)IP_int[1] + "." + (String)IP_int[2] + "." + (String)IP_int[3];[/p][p=30, 2, left]  for (int looper = 0; looper < int_IP_Address.length(); looper++)
    waitPlot[looper] = int_IP_Address[looper];
  ht1632c.clearScreen();
  server.begin();[/p][p=30, 2, left]  ht1632c.print(waitPlot, 40);

接下来就是开放端口给上位机,然后就是接收上位机Android发来的字符串即可,代码如下:

[C] 纯文本查看 复制代码
WiFiClient ipclient = server.available();
  if (ipclient) {
    String currentLine = "";
    Serial.println("client connected");
    while (ipclient.connected()) {
      if (ipclient.available()) {
        char c = ipclient.read();
        if (c == ';') {
          if (currentLine.length() == 0)
            break;
          else {
            currentLine = "";
          }
        }
        else {
          currentLine += c;
        }
        Serial.println(currentLine);

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

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

FireBeetle,你值得拥有~~~
ibikeTo_dexin.zip (2.93 KB, 下载次数: 2)

发表于 2017-7-22 18:27:53 | 显示全部楼层
厉害了666
回复 支持 反对

使用道具 举报

发表于 2017-7-23 00:34:24 | 显示全部楼层

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

使用道具 举报

发表于 2017-7-24 10:47:47 | 显示全部楼层
这个吊,好强大。
回复 支持 反对

使用道具 举报

发表于 2017-7-24 10:51:22 | 显示全部楼层
6666这个想法真的很不错,非常的黑科技!楼主用心了~
回复 支持 反对

使用道具 举报

发表于 2017-7-24 12:40:49 | 显示全部楼层
luna 发表于 2017-7-24 10:51
6666这个想法真的很不错,非常的黑科技!楼主用心了~

我会接着努力哒
回复 支持 反对

使用道具 举报

发表于 2017-7-24 16:38:03 | 显示全部楼层
太厉害了
回复 支持 反对

使用道具 举报

发表于 2017-7-27 14:58:27 | 显示全部楼层
太强了,看大佬装逼
回复 支持 反对

使用道具 举报

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

本版积分规则 允许回帖同步到新浪微博  

推荐阅读

精华导读




公司简介| 联系我们| 小黑屋| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网| OneNET|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表