Hi3861智能小车(二) 代码说明 原创

细嗅蔷薇05
发布于 2022-6-4 13:39
浏览
2收藏

        小车第2版的系统环境是基于OpenHarmony3.02 LTS这个系统版本。调用\device\hisilicon\hispark_pegasus\sdk_liteos\include下的设备接口实现功能。在

\device\hisilicon\hispark_pegasus\sdk_liteos\app\demo这个目录下有很全很好的例子可以做为参考,我的开发过程也就对案例“抄-改”的过程。对接口.H文件的目录浏览一遍,每个函数下都有详细的说明,后面遇到问题主要是通过阅读这些函数说明来找到解决办法。

 

        写完的代码主要是分2大部分,主函数(car_entry.c)和其他功能模块函数。        Hi3861智能小车(二) 代码说明-鸿蒙开发者社区

        功能模块完全是基于模块手册写的,每个模块的参数我都写在了代码头部的说明部分。模块数据采集完的数据需要再处理一下才能转换为可以使用的数据,这个换算过程,很多都是大浮点数的计算,很吃CPU的,把采集数据跟处理数据分离,根据实际情况提取,最大节省CPU资源。

        car_hcse04 超声波模块

        car_motor 电机控制模块

        car_mpu6050 陀螺仪模块

        car_qmc5883 磁力计模块

        car_wifi WiFi网络连接

        display_board 套件显示屏板

 

        主函数(car_entry)是小车主要的功能部分。

Hi3861智能小车(二) 代码说明-鸿蒙开发者社区

         主要的功能部分在static void *Car_Task(const char *arg)大循环里。

 

         功能围绕网络接收信息返回信息的循环过程展开。

 

        第一部分:

// 客户端 重新连接
        if(sock_stat == 2)
        {
            // OLED 清缓存
            OLED_Clear();
            // 显示 IP 和 端口
            OLED_String(0, 0, addr_str);
            OLED_String(0, 2, port_str);
            OLED_String(23, 5, "Accept ...");
            // OLED 显示信息
            OLED_Show();

            // 客户端 client socket 套接字
            Sock_Client();

            // OLED 清缓存
            OLED_Clear();
            // 显示 状态
            OLED_String(35, 3, "Car Run");
            // OLED 显示信息
            OLED_Show(); 

            // 状态 值 恢复
            sock_stat = 0;
        }

 

        客户端往往会断联,实际调试中这也是经常性的操作,状态值提示断联,屏幕显示重新连接,然后进入等待连接中。

 

        有客户端连接后,首先接收信息,当然客户端并不一定会发送信息,如果没有信息就跳过,如果接收到了有效信息,根据信息执行相应的功能,执行完功能后设置小车的运行状态。如果一切正常加一个工作时间。

 

        接下来进入发送信息环节。首先并没有全部开启功能模块,这个主要是各个模块太消耗资源了,有个手动开关,根据需要开启。

 

        首先是超声波,避碰首要工作的模块,如果测出的数据说明与障碍物过近,马上停止小车的运行。然后把距离信息写入发送缓存,随后发送到客户端。

 

        然后是磁力计模块,数据采集完,可以发送到客户端,或者转化成实际数据,用于自动行驶的参数,如果发生偏转,对小车做出修正。这个数据需要后期校正。很有意思的现象我是北半球,产生的磁切面是个由北向南延长的椭圆形,如果有精度要求需要进行修正。

 

        陀螺仪模块,能够反映出运动姿态,这个在四轴无人机上必备的一个模块,小车在地面只需要XY轴,主要加速度,加速度加上系统时间可以换算出行驶速度,加速度是个有大小有方向的量,对高精度的运动控制非常有用,因为是基于平面,而且实际编译中C语言里面的有些数学函数好像是运行不了,我无法确定这个问题,所以全部转成高中第一象限的问题。这个里面有个问题,大量浮点数计算,会出现延迟,然后使得接收数据结果滞后,谁有好办法教教我。

 

        后面就是小车左右轮子的转速和小车运行状态的反馈。

 

        然后就这样周而复始、周而复始... 直到接收“quit”指令退出循环,关闭网络。通过字符传递命令是很低效的,只是对开发者友好一点而已,最后优化后一定要搞成简单的数值型。

 

        现在整篇是流水账,通篇从上到下,只是适合跑通功能,要跑出效率还需要做很大的重新整理。

 

        上位机用C#写的,就是简单的接收数据,图形化显示。以前学Java学了好几年,用C#找个例子抄抄改改就能做个像模像样的应用了,我用的vs2019,用现在新出的版本智能化程度太高了,未来一些小程序人工智能就能写了。

 

Hi3861智能小车(二) 代码说明-鸿蒙开发者社区

        扯远了,顶部输入小车IP和端口,然后连接,右边是功能模块开关,具体信息右侧显示,下面是实际接收和发送的数据,也可以通过最下面输入框发送信息。蓝色箭头是磁力计方向,也就是指南针,280度是正南方,没做校正,红色是陀螺仪,长度是大小,角度是方向。图形化就是对数据看的更直观。现在是只有手动,自动和预设控制,做的还不够理想,等下一版再发。

 

        谢谢,第一版有很多关注和提问,我希望能对大家学习有所帮助。

 

        

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
2
收藏 2
回复
举报
回复
    相关推荐