继续接着上篇讲述,本课题的上本部分主要研究各个功能区的机械结构设计,但是作为机器人的灵魂部分——控制,是必不可少的,本篇主要讲解所研究的控制部分,将分成各个层面进行说明。

  一、气压检测模块

  RSCM17100KP090-V10气压传感器模块可测试-90kpa到0kpa的气压值,并输出一个成线性关系的模拟电压,MCU的ADC口可以直接读取和判断,接于硅胶吸盘和电池阀之间,检测药丸是否吸取成功。

                                                                                               

                                                                                          图1. 气压传感器模块

二、步进电机

  使用42步进闭环电机驱动器模块,其中功能有:FOC矢量控制,力矩、速度、位置三环控制;支持开环、矢量闭环、串口控制三种控制模式;支持1-256任意细分,支持0.9度和1.8度最小转动角度控制,能够精确控制药盘和往复机构转动。

                                                                           

                                                                       图2. 42步进闭环电机驱动模块

                                                                       

                                                                      表1. 电机性能参数

                                                                         

                                                                   图3. 电机规格设计

三、DC-DC直流可调降压模块

  由于履带底盘的减速电机额定功率为120W,因此选择这款ZS-Q5 200W可调同步降压模块,尺寸大小为70mm*mm*mm,输入电压为8-55V,输出电压1-32V连续可调,输出额定电流为10A,转换效率高达94%,大大降低了能源的转换损失,同时模块自带过电流保护和反极性保护,防止电压电流过大,烧毁其他模块。

 图4. DC-DC直流降压模块

四、履带底盘驱动部分

1.双通道电机调速模块

  考虑到履带底盘减速电机负载转动所需功率过大,一般的减速电机无法提供强劲动力,因此选用这块APO-D1直流有刷电机调速和换向控制器,为履带车底盘提供恒定电流的同时,能稳定的控制电机的转速以及电机的正反转。

                                                                                     

                                                                                    表2. 电机额定参数表

                                                                                 

                                                                               图5. APO-D01直流有刷电机调速模块

                                                                               

                                                                                       图6. 模块设计规格图

2.Arduino与L298N模块

  L298N模块是一种双H桥电机驱动芯片模块,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48V,逻辑部分5V供电,接受5VTTL电平;一般情况下,功率部分的电压应该大于6V,否则芯片不能正常工作。

                                         

                                                                       图7. L298N PCB原理图

                                                                                                 

                                                                                           图8. L298N 实物图

  Arduino与L298N电机驱动模块和直流电机接线具体步骤为:

  (1)将数字3、4脚接L298N模块的IN1和IN2(逻辑输入)脚;

  (2)10接ENA脚(通道A使能)电机接OUT1和OUT2输出口;【如下简图所示】

                                                                                           

                                                                                     图9. Arduino与L298N模块和电机接线图

  (3)把控制板上的GND和VCC分别接到L298N驱动模块上的供电GND和板载5V;【如下简图所示】

                                                                                                 

                                                                                      图10. Arduino和L298N模块接线图

  (4)编写代码。(代码就不在这里放啦,需要的小伙伴评论联系我喔~)

五、Arduino Nano与SIM800C模块实现拨打电话功能(急救120)

  从某种意义上来讲,SIM800C卡是一个服务器,MCU像一个客户机,发送AT指令给SIM800C,SIM800C回复信息给MCU。

                 

                                                                                             图11. SIM800C开发板原理图

  Arduino Nano和SIM800C的接线:(注:SIM800C可以与5V的单片机连接也可以和3.3V的单片机连接,我在这里选择的Arduino Nano产品是一个5V的单片机,如果是使用5V的MCU,可以用MCU的电源,为SIM800C供电,但这里要注意的是:SIM800C的电源是有要求的,一般要求是在5V电源情况下能达到500mA,甚至有时会超过500mA,用一般的USB 5V供电不能保证电源满足确切需求。

接线端子5V:外接5V电源                  V_TTL:MCU电源

GND:接地                                           TXD:连接MCU的接收端,SIM800C串行通讯的发射端(在这里是连接MCU的端子10,是MCU的RX)

RXD:连接MCU的,SIM800C串行通讯的接收端(在这里是连接MCU的端子11,MCU的TX)

这里要注意的是MCU的端口要互换,TXD<一>RX,RXD<—>TX.【接线实物图如下所示】

                                                                                       

                                                                                   图12. Arduino Nano接线图

  关于拨打电话的部分,利用LU-ASR-01语音模块通过TX输出给Arduino Nano单片机RX接受信号,再由Arduino Nano单片机给SIM800C发出AT指令从而完成整个电话的拨打过程。

六、Arduino与LU-ASR-01语音模块

  LU-ASR-01语音模块烧写编译软件为专用软件——天问BLOCK软件,利用字符和图形化编程实现控制语音的指令的发出。

  I/O输出配置介绍:

  一共8个I/O,1路串口TXD,1路传感器接口;其中I/O1-I/O6可以输出PWM信号,I/O7、I/O8不能输出PWM信号,DHT接口可接DHT11模块或DS18B20模块,对应的软件上要选对传感器型号和播报类型,DHT11是选择温度进行播报,DS18B20是选择温度进行播报。

                                                         

                                                                       图13. Arduino和SIM800C和LU-ASR-01语音模块接线工作方式

  I/O输出特性:

  高电平:持续电平信号-3.3V                                                                         低电平:持续电平信号-0V

  高脉冲:需要配置高电平的时间                                                                   低脉冲:需要配置低电平的时间

持续的舵机信号:信号一直保持,舵机转到一定角度保持                             舵机信号n秒:频率2Hz、100Hz、1KHz、100KHz可选,占空比5%-95%可选;每一个识别词条后面都可以输出一个串口信号,

                                                                                                                                              可以是字符或16进制,串口波特率1200-115200可选。

七、药品图像检测——YOLOv5

  图像处理部分主要通过YOLOv5在Openvino上部署推理,实现目标检测,这部分代码主要是用C++和Python编写,在实现整个功能前,先要完成数据采集、格式转换、模型文件配置和训练模型测试转化以及部署的一系列步骤,最终完成对药品的检测和识别。

  我给各个常备药品和需要的急救药品各拍了200张左右的图片进行图像训练,并传输到深度相机上,进行实时检测识别,训练时长近8个小时左右,效果如下图:

                 

                          图14、15. 药品在电脑自带摄像头下(未接深度相机时)的实时检测

                         图16. YOLOv5训练结果

【这里就不详细说明过程了,如果想详细了解可以翻阅我之前写的文章有关于YOLOv5的详解,文章链接放在这里啦~

https://www.guyuehome.com/38482

https://www.guyuehome.com/38968

八、基于ROS的路径规划

1.Dijkstra算法的设计与实现

  Dijkstra算法是求一个图中一个点到其他所有点的最短路径的算法(有了解过数据结构中邻接矩阵的小伙伴可能更容易听明白些~),此算法是一个基于贪心、广度优先搜素、动态规划,求一个图中一个点到其他所有的点的最短路径的算法;其要点是:每次从(未求出最短路径的点)中取出举例起点最短路径的点,以这个点为桥梁刷新(未求出最短路径的点)的距离。【以下是部分示例代码(Java)】

public class Dijkstra {
    public static int[] dijkstra(int[][] graph,int startVertex){
        //初始化 以求出最短路径的点 result[]
        int length = graph.length;
        int[] result = new int[length];
        for (int i = 0; i < length; i++) {
            result[i] = -1;
        }
        result[startVertex] = 0 ;
        // 初始化 未求出最短路径的点 notFound[]
        int[] notFound = new int[length];
        for (int i = 0; i < length; i++) {
            notFound[i] = graph[startVertex][i];
        }
        notFound[startVertex] = -1;
        // 开始 Dijkstra 算法
        for (int i = 1; i < length; i++) {
            //1. 从「未求出最短路径的点」notFound 中取出 最短路径的点
            //1.1 找到最短距离的点
            int min = Integer.MAX_VALUE;
            int minIndex = 0;
            for (int j = 0; j < length; j++) {
                if (notFound[j] > 0 && notFound[j] < min){
                    min = notFound[j];
                    minIndex = j;
                }
            }
            //1.2 将最短距离的点 取出 放入结果中
            result[minIndex] = min;
            notFound[minIndex] = -1;
            //2. 刷新 「未求出最短距离的点」 notFound[] 中的距离
            //2.1 遍历刚刚找到最短距离的点 (B) 的出度 (BA、BB、BC、BD)
            for (int j = 0; j < length; j++) {
                // 出度可通行(例如 BD:graph[1][3]  > 0)
                // 出度点不能已经在结果集 result中(例如 D: result[3] == -1)
                if (graph[minIndex][j] > 0
                && result[j] == -1){
                    int newDistance = result[minIndex] + graph[minIndex][j];
                    //通过 B 为桥梁,刷新距离
                    //(比如`AD = 6 < AB + BD = 4` 就刷新距离)( -1 代表无限大)
                    if (newDistance < notFound[j] || notFound[j]==-1){
                        notFound[j] = newDistance;
                    }
                }
            }

        }
        return result;
    }
    /** 测试案例 */
    public static void main(String[] args) {
        char[] vertices = new char[]{'A','B','C','D'};
        int[][] graph = new int[][]{
                {0, 2, -1, 6}
                , {2, 0, 3, 2}
                , {-1, 3, 0, 2}
                , {6, 2, 2, 0}};
        int[] dijkstra = dijkstra(graph, 0);
        for (int i : dijkstra) {
            System.out.println(i);
        }
    }
}

2.基于Dijkstra的ROS导航

  ROS Navigation包里面的Global Planner自带是提供了两种全局路径规划的方法,Dijkstra和A*,评估函数f(n)=g(n)+h(n),g(n)为起点到已经搜索过大的节点的代价值,h(n)为当前节点到目标节点(终点)的值,当g(n)=h(n)的时候就为Dijkstra算法,效果图如下所示:

 

   图17. ROS的效果图

九、触摸屏的设计

  触摸屏大小为7寸,触摸屏桌面运用Python的turele库编写动画程序作为桌面展示动画,并用pyqt5编写多个界面,实现取药、放药等功能,这些最后通过旭日X3派反馈到触摸屏上,实现人机交互界面,详细展现效果见下图:

                                                                                                       

                                                                    图18. Python—turtle库编写的动画界面

                  

                            图19. pyqt5编写的多个人机交互界面(药品识别和取药、放药界面)

十、整体展示

                                                                                                     

                                                                                                       图20. 智能机器人整体外观展示

有关于如何脱机依赖于旭日X3派做主控制板的文章大家敬请期待~此篇中有关于旭日X3派的运用部分在之前进行X3派体验篇的时候有讲到喔~大家感兴趣的小伙伴可以翻阅我之前的文章链接也附在这里啦

https://www.guyuehome.com/38686

  机器人的全部从机械结构部分到控制部分的整个概述就到这里啦~感兴趣的小伙伴可以一起探讨聊聊哇,也欢迎各位大神进行批评指正!