机器人制作开源方案 | 自主消毒防疫机器人

2023-12-21 11:25:00

作者:陈毅豪 张植铜 罗郡 马鑫龙 王丹晶

单位:西安外事学院

指导老师:陈小虎 杜喜

一、产品说明

1.1 目的及意义

? ? ? 消毒是疫情防控工作中的重要一环,传统的消毒方式需要人工操作消毒设备,不仅工作量大,且一些消毒剂会对人体造成伤害,消毒机器人便成了代替人工的不二之选,因此开发一款能够搭载多种消毒设备的消毒机器人控制系统对疫情防控具有重要意义。

1.2 研究背景

? ? ? 以当下疫情大环境为背景,在智能化设计理念的指导下展开设计研究。现有的消毒方式大多采用人工消毒,需要消毒人员做好防护后才能进入消毒区进行消毒,人工消毒的工作区域大,工作强度高,且在人流量大的区域需要每天进行多次消毒,增加了工作人员的感染风险。旨在用于替换传统的人工消毒模式,将消毒功能赋予智能化机器人,同时将人工消杀死角及环境监测考虑在内,进行设计实践。

1.3难题与解决方法

? ? ? 难题:自2019年末新冠肺炎疫情暴发以来便迅速席卷全球,新型冠状病毒极强的传染性使得全世界人民的生命和健康面临着巨大的风险,目前我国疫情防控工作已从应急状态转为常态化管理,但全球新冠肺炎疫情防控形势依然严峻复杂。境外输入病例、无症状感染者、变异毒株都在挑战我国的疫情防控工作,在传染病预防阶段,对可能受到病原微生物污染的场所和物品进行消毒是阻断病毒传播的重要技术手段。

? ? ? 解决方法:通过对车站等有效地阻断公共场合的预防性消毒,能够有效的阻断疫情的传播途径,降低新冠病毒的接触性传播以及气溶胶传播所造成的感染。研究着眼于疫情背景下人流密集地的消毒工作,用智能消毒机器人来取代人工消毒作业,确保人员的健康安全。提升人流密集地的消毒效率和杀菌率,使得各个环境的工作运行效率大大增加,更进一步的减小了疫情在人流密集地传播的可能。

二、机械结构设计

2.1 机械结构设计及建模

? ? ? 通过实地考察来分析人流密集地消毒环境,并在传统消毒机器人的基础上进行场景的细分处理,通过测量地面与座椅、座椅与扶手的距离来进一步确定智能消毒机器人的工作状态,并根据人流密集地内空间数据,探究智能消毒机器人的行走模式。利用模块化设计,整合功能与结构,并分析其安全性。

2.2 创新点

? ? ? 本小组所制作的消毒防疫机器人同时具备喷雾和紫外线消杀两种功能,并且因室内兼顾室外进行消毒杀菌,小组成员采用可拆卸组装式底盘,室内消毒杀菌采用轮式底盘,室外消毒杀菌则采用履带式底盘。

三、总体设计

3.1 动力设计

? ? ? 通过对现有消毒形式进行调研分析,了解其在运作中存在的问题,结合现有消毒机器人工作状态以及执行特定化场景任务来进行优化。采用模块化设计法和限量性结构变化法,进行大量广泛的资料收集与实地调研,分析现有消毒机器人的优劣势,并从中分析未来发展趋势。

3.2 机器人控制系统设计

? ? ? 机器人采用1个超声波传感器用于对前方障碍物进行识别感知,4个电机实现底盘的驱动,3个舵机用于消杀执行机构的驱动。超声波传感器连接STM32系统扩展板的传感器区A0、A1引脚,4个电机分别连接扩展板的X、Y、Z和A接口,3个舵机连接到扩展板的3、4和7引脚。控制系统软件采用Arduino进行C语言编程。

感知与控制软件流程图如下所示:

四、制作过程

1. 二维图纸绘制

侧视图观察机械臂上下运作

俯视图观察机械臂平面摆动

2. 三维绘图成像

2. 现场组装制作

4. 整体装配与调试

五、应用前景

随着机器人技术的迅猛发展,医用领域早已出现了机器人的身影,防疫消毒机器人虽有所发展,但发展缓慢,各公司研发动力不足。直到疫情暴发以来,为降低人工消毒的劳动强度及交叉感染风险,解决前线医护人员不足等问题,用消毒机器人替代人工,在医院、户外等场所从事消毒工作,使得医院对消毒机器人的需求迅速增加,各国开始加大了对医用服务型机器人的研发力度。

六、示例程序

#include<Servo.h>

#define SERVO_SPEED 40 ? ? ? ? ? ? ? ? ?//定义舵机转动快慢的时间

#define SERVO_SPEED1 1

#define SERVO_SPEED_WalkForward_low 10 ? //设定前进的慢速动作

#define SERVO_SPEED_WalkForward_high ? 40 //设定前进的快速动作

#define SERVO_SPEED_WalkBack_low 10 ? ? ?//设定慢速的后退动作

#define SERVO_SPEED_WalkBack_high ? 5 ? ? //设定快速后退的动作

#define SERVO_SPEED_Right_low 6 ? ? ? ? ?//设定慢速右转动作时间

#define SERVO_SPEED_Right_high ? 4 ? ? ? ?//设定快速右转动作时间

Servo myServo[3]; ? ? ? ? ? ? ? //定义3个舵机

int f = 30; ? ? ? ? ? ? ? ? ? ? //定义舵机每个状态间转动的次数,以此来确定每个舵机每次转动的角度

int servo_port[3] = {3,4,7}; ? ? ? ? ? ? ? ? ? ? ?//定义舵机引脚

int servo_num = sizeof(servo_port) / sizeof(servo_port[0]); ? ? //定义舵机数量

float value_init[8] = {1650,1300,2400}; //定义舵机初始角度

int Judge=0;

int GetIntData=0;

const int xdirPin = 44; ? // 方向引脚

const int xstepPin = 45; // 步进引脚

const int ydirPin = 32; ? // 方向引脚

const int ystepPin = 33; // 步进引脚

const int zdirPin = 42; ? // 方向引脚

const int zstepPin = 43; // 步进引脚

const int adirPin = 30; ? // 方向引脚

const int astepPin = 31; // 步进引脚

const int STEPS_PER_REV =200;

#define ECHOPIN A0

#define TRIGPIN A1

void setup() {

//超声波传感器设置

 ?pinMode(TRIGPIN, OUTPUT);

 ?pinMode(ECHOPIN, INPUT);

 

//底盘设置

 ?pinMode(8,OUTPUT);

 ?pinMode(xstepPin,OUTPUT);

 ?pinMode(xdirPin,OUTPUT);

 ?pinMode(ystepPin,OUTPUT);

 ?pinMode(ydirPin,OUTPUT);

 ?pinMode(zstepPin,OUTPUT);

 ?pinMode(zdirPin,OUTPUT);

 ?pinMode(astepPin,OUTPUT);

 ?pinMode(adirPin,OUTPUT);

 

//执行器舵机设置

 ?for(int i=0;i<servo_num;i++)

 ?{

 ? ? ? ServoGo(i,value_init[i]); ? //使能舵机并赋予初始角度

 ? ?}

}

void loop() {

 ?//超声波测距

 ?//以下代码为计算超声波测距传感器进行测距并计算,返回距离的单位为cm

 ?//Serial.begin(9600);

 ?digitalWrite(TRIGPIN,LOW); ? 

 ?delayMicroseconds(2);

 ?digitalWrite(TRIGPIN,HIGH);

 ?delayMicroseconds(10);

 ?digitalWrite(TRIGPIN,LOW);

 ?float distance=pulseIn(ECHOPIN,HIGH);

 ?distance=distance/58;

 ?//Serial.println(distance);

 ?delay(200);

 ?if(distance>10) ? ? //10cm以内无障碍

 ?{

 ?//底盘的运动控制

 ?digitalWrite(xdirPin,LOW);

 ?digitalWrite(ydirPin,HIGH);

 ?digitalWrite(zdirPin,LOW);

 ?digitalWrite(adirPin,HIGH);

 ?for(int x = 0; x < STEPS_PER_REV; x++)

 ?{

 ? ? ? digitalWrite(xstepPin,HIGH);

 ? ? ? digitalWrite(ystepPin,HIGH);

 ? ? ? digitalWrite(zstepPin,HIGH);

 ? ? ? digitalWrite(astepPin,HIGH);

 ? ? ? delayMicroseconds(400);

 ? ? ? digitalWrite(xstepPin,LOW);

 ? ? ? digitalWrite(ystepPin,LOW);

 ? ? ? digitalWrite(zstepPin,LOW); ?

 ? ? ? digitalWrite(astepPin,LOW);

 ? ? ? delayMicroseconds(400);

 ? ? ? }

 ?}

else

 ?{

 ? ?//停止,避障

 ? ?digitalWrite(xdirPin,LOW);

 ? ?digitalWrite(ydirPin,LOW);

 ? ?digitalWrite(zdirPin,LOW);

 ? ?digitalWrite(adirPin,LOW);

 ?}

 ?//舵机的运动控制

 ? ?servo_move(950,1300,1500, SERVO_SPEED_WalkForward_low);

 ? ?delay(5000);

 ? ?// ? ? ? ? ? ? ? 950, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1300, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1500, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SERVO_SPEED_WalkForward_low

 ? ?//表示D3引脚连接的舵机要转到的角度 ? ? 表示D4引脚连接的舵机要转到的角度 ? ? ? ?表示D7引脚连接的舵机要转到的角度 ? ? ? ? ? ? ? ? ? ? ?表示舵机转动时的速度

 ? ?servo_move(2400,1800,2500, SERVO_SPEED_WalkForward_low);

 ? ?delay(5000);

 ? ?// ? ? ? ? ? ? ? 2400, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1800, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2500, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SERVO_SPEED_WalkForward_low

 ? ?//表示D3引脚连接的舵机要转到的角度 ? ? 表示D4引脚连接的舵机要转到的角度 ? ? ? ?表示D7引脚连接的舵机要转到的角度 ? ? ? ? ? ? ? ? ? ? ?表示舵机转动时的速度 ? 

}

 ?//自定义函数

 ?void ServoActionReset()

 ?{

 ? ? ?servo_move(1500,1000,2400, SERVO_SPEED); //初始化

 ?}

void ServoStart(int which)//使能舵机

{

 ?if(!myServo[which].attached()) myServo[which].attach(servo_port[which]);

 ?pinMode(servo_port[which], OUTPUT);

}

void ServoStop(int which)//释放舵机

{

 ?myServo[which].detach();

 ?digitalWrite(servo_port[which],LOW);

}

void ServoGo(int which , int where)//打开并给舵机写入相关角度

{

 ?if(where!=200)

 ?{

 ? ?if(where==201) ServoStop(which);

 ? ?else

 ? ?{

 ?ServoStart(which);

 ?myServo[which].write(where);

 ? ?}

 ?}

}

void servo_move(float value0, float value1, float value2, float t)

// ? alue0, value1, value2, value3这四个参数时要写的舵机角度,float t这个参数是代表舵机运动的时间

{

 ?float value_arguments[] = {value0, value1, value2};

 ?float value_delta[servo_num];

 ?for(int i=0;i<servo_num;i++)

 ?{

 ? ?value_delta[i] = (value_arguments[i] - value_init[i]) / f; ? //f=30,舵机初始角度定义为(1650,1300,2400)

 ?}

 ?for(int i=0;i<f;i++)

 ?{

 ? ?for(int k=0;k<servo_num;k++)

 ? ?{

 ? ? ? value_init[k] = value_delta[k] == 0 ? value_arguments[k] : value_init[k] + value_delta[k];

 ? ?}

 ? ?for(int j=0;j<servo_num;j++)

 ? ?{

 ? ? ? ?ServoGo(j,value_init[j]);

 ? ?}

 ? ?delay(t);

 ?}

}

?更多详情请见:【S037】自主消毒防疫机器人

文章来源:https://blog.csdn.net/Robotway/article/details/135039647
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。