【S135】特殊环境多功能遥控机器人
作品说明 按位置移动 |
作者:顾志恒 陶源 梁家栋 卢翔倩
单位:苏州大学
指导老师:孙承峰
1. 项目背景
在现实中,有很多恶劣、有害、高温高压或危险环境下的作业活动,如火山取样、抢险救灾、爆炸物处置、核电站检修、高压带电作业、深海搜索等,这些工作会对人体生理、心理,或对一般机械产生不良影响,因而需要由机器人代替人去完成。然而,此类特殊环境又往往具有复杂性、不确定性、多变性,需要由操作人远程操控,从而实现“人——机——环境”一体化,更加高效、精确的完成相应作业。通过分析现状,结合本次大赛“打通产、学、研转化通道,培养学生创造能力”的主题,本项目以目前已有资料为基础进行精简及创新,运用“探索者”零件,融合机械、二次开发、仿生、电子信息、人因工程等技术,设计出此次项目作品“特殊环境多功能遥控机器人”。
作品说明
特殊环境多功能遥控机器人
2. 产品设计功能指标与设计理念
① 夹取作业
利用“探索者”零件,设计搭建机械臂。考虑到小空间、低承重等特殊环境,本项目作品尽最大限度精简机构,最终采取三自由度机械臂设计方案,利用三个舵机,达到最大化运动限度。
② 机器人移动
考虑到特殊环境中可能的复杂地形,本作品利用“探索者”零件、Makeblock组件,设计了履带轮差速结构,实现“轻便、稳定、多方位”的最终目标。
③ 障碍物报警
利用“探索者”零件及Mackblock超声波、蜂鸣器组件,实现特殊环境下“遇险即报”的功能。倒车时,超声波会检测机器人后方情况,当与障碍物距离达到危险值时,触发蜂鸣器发出警报。
④ 夜间工作
利用照明设备及光线传感器,当光线值小于最小值时,自动触发照明设备,以保证工作的准确性。
⑤ 突发情况报警
利用温度传感器、光线传感器、蜂鸣器,从多方位综合判断是否有突发事件或机器人所处环境是否对机械本身不利。当指数达到指定危险临界值,自动触发蜂鸣器,发出警报。
⑥ 遥控
利用2.4G模块,远程利用手柄向机器人发出信号,使其按指令完成各类工作。
3. 作品功能介绍及先进性说明
3.1 夹取作业
① 手爪移动
为保证机械手抓的水平移动,减小工作当中的误差,本作品采取了平行四边形四连杆结构,并运用双足支杆加强手抓的灵活性、平稳性。
② 抓取
利用两种不同的连杆及偏心轮驱动结构,达到只用一个舵机即可驱动手爪开合的目的,使结构最大化精简。为加大手爪强度,增强手臂的多功能性、强适应力,本作品采用了螺柱参与铰接,达到“结构最简化、质量最小化、功能最多样化”的最终目标。
3.2 机器人移动
利用履带,以使作品能在各种复杂地形中灵活运动。运用Mackblock组建搭建正方形底座,加强整体稳定性。此外,差速结构使得作品活动自如。
3.3 障碍物报警
经测量,机械臂的移动范围是:中心至最远280mm,转角135度,因此设定安全距离为15cm。利用超声波探测器,探测小车与后方障碍物距离,当返回数值小于最小安全距离时,触发蜂鸣器,发出警报。
3.4 夜间作业
利用光线传感器,探测机器人所处环境的照度、亮度,当指数达到规定值时,灯带亮起。
3.5 突发情况报警
使用了光线传感器、超声波模块、温度传感器等多种传感器,使得设备可以更加全面、敏感地“感知”周围环境,“遇险即报”,便于根据传感器返回的数据值制定更为合理的排险方案。
3.6 遥控
手柄手感舒适、按键丰富,可以满足复杂功能的需要。同时手柄结实,不容易损坏,可以降低因维护不当而造成设备不能使用的几率。
4. 产品制作过程说明
4.1 思路来源
在当今社会,越来越多的机器人开始代替人来工作,特别是在一些危险环境,如火灾现场、冰川之地等。在这些地方,如果让人去操作将会有极大的危险,到目前为止,已经有许多人因此而丧生,所以本项目决定以此为起点,制作一款能够在危险环境中代替人去工作的产品。
4.2 方案选择过程
① 在机器的行动机构上,本作品选择了履带,因为履带在一些复杂地表中能够安稳的运作。
② 在机器的操作部分,考虑到舵机的承重问题,本项目选择了三自由度机械臂,这简化了结构,使得机构能够稳定运行。
③ 在三自由度机械臂的制作方案选择上,本作品利用一个舵机控制机械臂朝向,一个舵机控制夹子的前后移动,一个舵机控制夹子,并且在控制前后移动的机构中,我们选择了平行四边形的四杆机构,使得夹子能水平移动。
④ 在夹子的制作中,本作品利用偏心轮加上舵机的方案。
⑤ 在传感器的选择上,考虑到实际情况,我们选择了超声波传感器、光线传感器、温度传感器。当机器倒退快碰到物体时,将会发出警报;当在黑暗环境作业时,将会自动照明;当温度超出一定限制时,将会发出警报。
4.3 控制程序源代码
① 遥控代码
#include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> #include <MeMegaPi.h> //Encoder Motor MeEncoderOnBoard Encoder_1(SLOT1); MeEncoderOnBoard Encoder_2(SLOT2); MeEncoderOnBoard Encoder_3(SLOT3); MeEncoderOnBoard Encoder_4(SLOT4); void isr_process_encoder1(void) { if(digitalRead(Encoder_1.getPortB()) == 0){ Encoder_1.pulsePosMinus(); }else{ Encoder_1.pulsePosPlus(); } } void isr_process_encoder2(void) { if(digitalRead(Encoder_2.getPortB()) == 0){ Encoder_2.pulsePosMinus(); }else{ Encoder_2.pulsePosPlus(); } } void isr_process_encoder3(void) { if(digitalRead(Encoder_3.getPortB()) == 0){ Encoder_3.pulsePosMinus(); }else{ Encoder_3.pulsePosPlus(); } } void isr_process_encoder4(void) { if(digitalRead(Encoder_4.getPortB()) == 0){ Encoder_4.pulsePosMinus(); }else{ Encoder_4.pulsePosPlus(); } } void move(int direction, int speed) { int leftSpeed = 0; int rightSpeed = 0; if(direction == 1){ leftSpeed = -speed; rightSpeed = speed; }else if(direction == 2){ leftSpeed = speed; rightSpeed = -speed; }else if(direction == 3){ leftSpeed = speed; rightSpeed = speed; }else if(direction == 4){ leftSpeed = -speed; rightSpeed = -speed; } Encoder_1.setTarPWM(rightSpeed); Encoder_2.setTarPWM(leftSpeed); } void moveDegrees(int direction,long degrees, int speed_temp) { speed_temp = abs(speed_temp); if(direction == 1) { Encoder_1.move(degrees,(float)speed_temp); Encoder_2.move(-degrees,(float)speed_temp); } else if(direction == 2) { Encoder_1.move(-degrees,(float)speed_temp); Encoder_2.move(degrees,(float)speed_temp); } else if(direction == 3) { Encoder_1.move(degrees,(float)speed_temp); Encoder_2.move(degrees,(float)speed_temp); } else if(direction == 4) { Encoder_1.move(-degrees,(float)speed_temp); Encoder_2.move(-degrees,(float)speed_temp); } } double angle_rad = PI/180.0; double angle_deg = 180.0/PI; double __var__22841_23376; double __var__21069_36827; double __var__22238_36716; MePS2 MePS2(PORT_15); Servo servo_60; Servo servo_69; Servo servo_61; void setup(){ //Set Pwm 8KHz TCCR1A = _BV(WGM10); TCCR1B = _BV(CS11) | _BV(WGM12); TCCR2A = _BV(WGM21) | _BV(WGM20); TCCR2B = _BV(CS21); MePS2.begin(115200); servo_60.attach(60); servo_69.attach(69); servo_61.attach(61); attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING); Encoder_1.setPulse(8); Encoder_1.setRatio(46.67); Encoder_1.setPosPid(1.8,0,1.2); Encoder_1.setSpeedPid(0.18,0,0); attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING); Encoder_2.setPulse(8); Encoder_2.setRatio(46.67); Encoder_2.setPosPid(1.8,0,1.2); Encoder_2.setSpeedPid(0.18,0,0); __var__22841_23376 = 90; __var__21069_36827 = 90; __var__22238_36716 = 90; } void loop(){ if(MePS2.ButtonPressed(1)){ servo_60.write(__var__22841_23376); __var__22841_23376 += 1; _delay(0.02); } if(MePS2.ButtonPressed(3)){ servo_60.write(__var__22841_23376); __var__22841_23376 += -1; _delay(0.02); } if(MePS2.ButtonPressed(5)){ servo_69.write(__var__21069_36827); __var__21069_36827 += 1; _delay(0.02); } if(MePS2.ButtonPressed(7)){ servo_69.write(__var__21069_36827); __var__21069_36827 += -1; _delay(0.02); } if(MePS2.ButtonPressed(9)){ servo_61.write(__var__22238_36716); __var__22238_36716 += 1; _delay(0.02); } if(MePS2.ButtonPressed(10)){ servo_61.write(__var__22238_36716); __var__22238_36716 += -1; _delay(0.02); } if(MePS2.ButtonPressed(14)){ Encoder_1.runSpeed(-100); Encoder_2.runSpeed(100); }else{ if(MePS2.ButtonPressed(15)){ Encoder_1.runSpeed(100); Encoder_2.runSpeed(-100); }else{ if(MePS2.ButtonPressed(16)){ Encoder_1.runSpeed(0); Encoder_2.runSpeed(100); }else{ if(MePS2.ButtonPressed(17)){ Encoder_1.runSpeed(-100); Encoder_2.runSpeed(0); }else{ Encoder_1.runSpeed(0); Encoder_2.runSpeed(0); } } } } _loop(); } void _delay(float seconds){ long endTime = millis() + seconds * 1000; while(millis() < endTime)_loop(); } void _loop(){ MePS2.loop(); Encoder_1.loop(); Encoder_2.loop(); } |
#include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> #include <MeMCore.h> MeDCMotor motor_9(9); MeDCMotor motor_10(10); void move(int direction, int speed) { int leftSpeed = 0; int rightSpeed = 0; if(direction == 1){ leftSpeed = speed; rightSpeed = speed; }else if(direction == 2){ leftSpeed = -speed; rightSpeed = -speed; }else if(direction == 3){ leftSpeed = -speed; rightSpeed = speed; }else if(direction == 4){ leftSpeed = speed; rightSpeed = -speed; } motor_9.run((9)==M1?-(leftSpeed):(leftSpeed)); motor_10.run((10)==M1?-(rightSpeed):(rightSpeed)); } double angle_rad = PI/180.0; double angle_deg = 180.0/PI; MeUltrasonicSensor ultrasonic_1(1); MeBuzzer buzzer; MeLightSensor lightsensor_6(6); MeRGBLed rgbled_3_2(3, 2, 32); MeTemperature temperature_3_1(3,1); void setup(){
} void loop(){ if((ultrasonic_1.distanceCm()) < (15)){ buzzer.tone(262, 1000); delay(20); } if((lightsensor_6.read()) < (500)){ rgbled_3_2.setColor(0,150,150,150); rgbled_3_2.show(); }else{ rgbled_3_2.setColor(0,0,0,0); rgbled_3_2.show(); } if((temperature_3_1.temperature()) > (40)){ buzzer.tone(440, 1000); delay(20); } _loop(); } void _delay(float seconds){ long endTime = millis() + seconds * 1000; while(millis() < endTime)_loop(); } void _loop(){ } |
② 传感器代码
5. 市场调研与及市场前景分析
就目前状况来讲,当面对一些高位状况时,多数情况下还是采取人工排险的手段。在机械化、自动化如此发达的今天这显然是不合理的。采用无人装置代替人工方式,可以保障人的生命安全,节约成本,同时也顺应科技发展的潮流。
本作品采用履带代替传统的轮子,可以适应更多的路面情况。采用远程遥控的方式,使得机动更加灵活。所搭载的机械臂自由度较高,机械爪可以替换为其他工程器械,可以满足各种情况下的需求。目前无人排险这一领域市场较为空缺,如果可以推出一款成本低、易操作的排险机器人,就可以为大部分用户所接受。在一些高危场所,比如矿井、核电站等,可以将这款机器人作为常规设备,在一些突发情况下,可以由专业知识丰富但缺乏抢险经验的工程师自行操作排险,不必要等待国家机关响应。由此看来这款作品的市场前景较为广阔。
6. 作品实物总体展示
按位置转动,是指给定一个位置参数,让电机运动到该位置。
按位置转动包含三种不同的模式:
——1.1 直接位置模式
在该模式下,电机从一个位置直接转动到一个或多个指定位置。直接PID控制位置,对实时位置命令响应迅速,急起急停,但位置命令频率高时容易抖动。
1.2 滤波位置模式
在该模式下,电机从一个位置平滑地转动到一个或多个指定位置。电机的运动曲线经过滤波处理,有一个加速和减速的过程。对实时位置命令响应较快,但运动姿态平顺,位置命令频率高时表现优异。
1.3 轨迹位置模式
在该模式下,电机从一个位置平滑地转动到一个指定位置,只对最终指定位置发生响应。电机有一个均匀加速的过程和一个均匀减速的过程。无法快速响应实时位置命令,但运动非常平顺,且轨迹的运动时间非常稳定,位置命令频率低时较为常用。
3. 实现步骤
3.1根据3D图,完成电机模组的装配,扫描二维码,可查看及下载3D文件。
3.2 按照图示,完成电路连接。
4.Python编程
以下代码在Linux系统下,Jupyter环境中测试实现。
4.1 输入并运行以下代码,可实现直接位置模式:
# 初始化电机对象
from protobot.can_bus import Robot
from protobot.can_bus.nodes import MotorFactory
motor = Robot().add_device('motor0', MotorFactory(), node_id=0x10, reduction=-44)
# 电机使能
motor.enable()
# 进入直接位置模式
motor.position_mode()
# 设置位置参数
motor.set_pos(6.28) # 6.28代表2π位置,您可以修改为其他参数以体验本功能
4.2 输入并运行以下代码,可实现滤波位置模式:
# 初始化电机对象(Linux)
from protobot.can_bus import Robot
from protobot.can_bus.nodes import MotorFactory
motor = Robot().add_device('motor0', MotorFactory(), node_id=0x10, reduction=-44)
# 电机使能
motor.enable()
# 进入滤波位置模式
motor.position_filter_mode(4) # 括号中的参数代表“滤波带宽 / 控制频率(Hz)”
# 设置位置参数
motor.set_pos(6.28) # 6.28代表2π位置,您可以修改为其他参数以体验本功能
4.3输入并运行以下代码,可实现轨迹位置模式:
# 初始化电机对象(Linux)
from protobot.can_bus import Robot
from protobot.can_bus.nodes import MotorFactory
motor = Robot().add_device('motor0', MotorFactory(), node_id=0x10, reduction=-44)
# 电机使能
motor.enable()
# 进入轨迹位置模式
motor.position_traj_mode(2,0.5,0.5) # 括号中的参数代表“(最高速度,加速度,减速度)”
# 设置位置参数
motor.set_pos(6.28) # 6.28代表2π位置,您可以修改为其他参数以体验本功能
2.准备工作
序号 名称 备注
1 Robodyno pro电机模组 购买链接
2 CAN数据线 购买链接
3 Robodyno pro通信坞 购买链接
4 12V电源适配器 购买链接
5 TypeC数据线
6 系统准备 查看教程
7 Jupyter准备 查看教程
作品说明 |
作者:顾志恒 陶源 梁家栋 卢翔倩
单位:苏州大学
指导老师:孙承峰
1. 项目背景
在现实中,有很多恶劣、有害、高温高压或危险环境下的作业活动,如火山取样、抢险救灾、爆炸物处置、核电站检修、高压带电作业、深海搜索等,这些工作会对人体生理、心理,或对一般机械产生不良影响,因而需要由机器人代替人去完成。然而,此类特殊环境又往往具有复杂性、不确定性、多变性,需要由操作人远程操控,从而实现“人——机——环境”一体化,更加高效、精确的完成相应作业。通过分析现状,结合本次大赛“打通产、学、研转化通道,培养学生创造能力”的主题,本项目以目前已有资料为基础进行精简及创新,运用“探索者”零件,融合机械、二次开发、仿生、电子信息、人因工程等技术,设计出此次项目作品“特殊环境多功能遥控机器人”。
作品说明
特殊环境多功能遥控机器人
2. 产品设计功能指标与设计理念
① 夹取作业
利用“探索者”零件,设计搭建机械臂。考虑到小空间、低承重等特殊环境,本项目作品尽最大限度精简机构,最终采取三自由度机械臂设计方案,利用三个舵机,达到最大化运动限度。
② 机器人移动
考虑到特殊环境中可能的复杂地形,本作品利用“探索者”零件、Makeblock组件,设计了履带轮差速结构,实现“轻便、稳定、多方位”的最终目标。
③ 障碍物报警
利用“探索者”零件及Mackblock超声波、蜂鸣器组件,实现特殊环境下“遇险即报”的功能。倒车时,超声波会检测机器人后方情况,当与障碍物距离达到危险值时,触发蜂鸣器发出警报。
④ 夜间工作
利用照明设备及光线传感器,当光线值小于最小值时,自动触发照明设备,以保证工作的准确性。
⑤ 突发情况报警
利用温度传感器、光线传感器、蜂鸣器,从多方位综合判断是否有突发事件或机器人所处环境是否对机械本身不利。当指数达到指定危险临界值,自动触发蜂鸣器,发出警报。
⑥ 遥控
利用2.4G模块,远程利用手柄向机器人发出信号,使其按指令完成各类工作。
3. 作品功能介绍及先进性说明
3.1 夹取作业
① 手爪移动
为保证机械手抓的水平移动,减小工作当中的误差,本作品采取了平行四边形四连杆结构,并运用双足支杆加强手抓的灵活性、平稳性。
② 抓取
利用两种不同的连杆及偏心轮驱动结构,达到只用一个舵机即可驱动手爪开合的目的,使结构最大化精简。为加大手爪强度,增强手臂的多功能性、强适应力,本作品采用了螺柱参与铰接,达到“结构最简化、质量最小化、功能最多样化”的最终目标。
3.2 机器人移动
利用履带,以使作品能在各种复杂地形中灵活运动。运用Mackblock组建搭建正方形底座,加强整体稳定性。此外,差速结构使得作品活动自如。
3.3 障碍物报警
经测量,机械臂的移动范围是:中心至最远280mm,转角135度,因此设定安全距离为15cm。利用超声波探测器,探测小车与后方障碍物距离,当返回数值小于最小安全距离时,触发蜂鸣器,发出警报。
3.4 夜间作业
利用光线传感器,探测机器人所处环境的照度、亮度,当指数达到规定值时,灯带亮起。
3.5 突发情况报警
使用了光线传感器、超声波模块、温度传感器等多种传感器,使得设备可以更加全面、敏感地“感知”周围环境,“遇险即报”,便于根据传感器返回的数据值制定更为合理的排险方案。
3.6 遥控
手柄手感舒适、按键丰富,可以满足复杂功能的需要。同时手柄结实,不容易损坏,可以降低因维护不当而造成设备不能使用的几率。
4. 产品制作过程说明
4.1 思路来源
在当今社会,越来越多的机器人开始代替人来工作,特别是在一些危险环境,如火灾现场、冰川之地等。在这些地方,如果让人去操作将会有极大的危险,到目前为止,已经有许多人因此而丧生,所以本项目决定以此为起点,制作一款能够在危险环境中代替人去工作的产品。
4.2 方案选择过程
① 在机器的行动机构上,本作品选择了履带,因为履带在一些复杂地表中能够安稳的运作。
② 在机器的操作部分,考虑到舵机的承重问题,本项目选择了三自由度机械臂,这简化了结构,使得机构能够稳定运行。
③ 在三自由度机械臂的制作方案选择上,本作品利用一个舵机控制机械臂朝向,一个舵机控制夹子的前后移动,一个舵机控制夹子,并且在控制前后移动的机构中,我们选择了平行四边形的四杆机构,使得夹子能水平移动。
④ 在夹子的制作中,本作品利用偏心轮加上舵机的方案。
⑤ 在传感器的选择上,考虑到实际情况,我们选择了超声波传感器、光线传感器、温度传感器。当机器倒退快碰到物体时,将会发出警报;当在黑暗环境作业时,将会自动照明;当温度超出一定限制时,将会发出警报。
4.3 控制程序源代码
① 遥控代码
#include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> #include <MeMegaPi.h> //Encoder Motor MeEncoderOnBoard Encoder_1(SLOT1); MeEncoderOnBoard Encoder_2(SLOT2); MeEncoderOnBoard Encoder_3(SLOT3); MeEncoderOnBoard Encoder_4(SLOT4); void isr_process_encoder1(void) { if(digitalRead(Encoder_1.getPortB()) == 0){ Encoder_1.pulsePosMinus(); }else{ Encoder_1.pulsePosPlus(); } } void isr_process_encoder2(void) { if(digitalRead(Encoder_2.getPortB()) == 0){ Encoder_2.pulsePosMinus(); }else{ Encoder_2.pulsePosPlus(); } } void isr_process_encoder3(void) { if(digitalRead(Encoder_3.getPortB()) == 0){ Encoder_3.pulsePosMinus(); }else{ Encoder_3.pulsePosPlus(); } } void isr_process_encoder4(void) { if(digitalRead(Encoder_4.getPortB()) == 0){ Encoder_4.pulsePosMinus(); }else{ Encoder_4.pulsePosPlus(); } } void move(int direction, int speed) { int leftSpeed = 0; int rightSpeed = 0; if(direction == 1){ leftSpeed = -speed; rightSpeed = speed; }else if(direction == 2){ leftSpeed = speed; rightSpeed = -speed; }else if(direction == 3){ leftSpeed = speed; rightSpeed = speed; }else if(direction == 4){ leftSpeed = -speed; rightSpeed = -speed; } Encoder_1.setTarPWM(rightSpeed); Encoder_2.setTarPWM(leftSpeed); } void moveDegrees(int direction,long degrees, int speed_temp) { speed_temp = abs(speed_temp); if(direction == 1) { Encoder_1.move(degrees,(float)speed_temp); Encoder_2.move(-degrees,(float)speed_temp); } else if(direction == 2) { Encoder_1.move(-degrees,(float)speed_temp); Encoder_2.move(degrees,(float)speed_temp); } else if(direction == 3) { Encoder_1.move(degrees,(float)speed_temp); Encoder_2.move(degrees,(float)speed_temp); } else if(direction == 4) { Encoder_1.move(-degrees,(float)speed_temp); Encoder_2.move(-degrees,(float)speed_temp); } } double angle_rad = PI/180.0; double angle_deg = 180.0/PI; double __var__22841_23376; double __var__21069_36827; double __var__22238_36716; MePS2 MePS2(PORT_15); Servo servo_60; Servo servo_69; Servo servo_61; void setup(){ //Set Pwm 8KHz TCCR1A = _BV(WGM10); TCCR1B = _BV(CS11) | _BV(WGM12); TCCR2A = _BV(WGM21) | _BV(WGM20); TCCR2B = _BV(CS21); MePS2.begin(115200); servo_60.attach(60); servo_69.attach(69); servo_61.attach(61); attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING); Encoder_1.setPulse(8); Encoder_1.setRatio(46.67); Encoder_1.setPosPid(1.8,0,1.2); Encoder_1.setSpeedPid(0.18,0,0); attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING); Encoder_2.setPulse(8); Encoder_2.setRatio(46.67); Encoder_2.setPosPid(1.8,0,1.2); Encoder_2.setSpeedPid(0.18,0,0); __var__22841_23376 = 90; __var__21069_36827 = 90; __var__22238_36716 = 90; } void loop(){ if(MePS2.ButtonPressed(1)){ servo_60.write(__var__22841_23376); __var__22841_23376 += 1; _delay(0.02); } if(MePS2.ButtonPressed(3)){ servo_60.write(__var__22841_23376); __var__22841_23376 += -1; _delay(0.02); } if(MePS2.ButtonPressed(5)){ servo_69.write(__var__21069_36827); __var__21069_36827 += 1; _delay(0.02); } if(MePS2.ButtonPressed(7)){ servo_69.write(__var__21069_36827); __var__21069_36827 += -1; _delay(0.02); } if(MePS2.ButtonPressed(9)){ servo_61.write(__var__22238_36716); __var__22238_36716 += 1; _delay(0.02); } if(MePS2.ButtonPressed(10)){ servo_61.write(__var__22238_36716); __var__22238_36716 += -1; _delay(0.02); } if(MePS2.ButtonPressed(14)){ Encoder_1.runSpeed(-100); Encoder_2.runSpeed(100); }else{ if(MePS2.ButtonPressed(15)){ Encoder_1.runSpeed(100); Encoder_2.runSpeed(-100); }else{ if(MePS2.ButtonPressed(16)){ Encoder_1.runSpeed(0); Encoder_2.runSpeed(100); }else{ if(MePS2.ButtonPressed(17)){ Encoder_1.runSpeed(-100); Encoder_2.runSpeed(0); }else{ Encoder_1.runSpeed(0); Encoder_2.runSpeed(0); } } } } _loop(); } void _delay(float seconds){ long endTime = millis() + seconds * 1000; while(millis() < endTime)_loop(); } void _loop(){ MePS2.loop(); Encoder_1.loop(); Encoder_2.loop(); } |
#include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> #include <MeMCore.h> MeDCMotor motor_9(9); MeDCMotor motor_10(10); void move(int direction, int speed) { int leftSpeed = 0; int rightSpeed = 0; if(direction == 1){ leftSpeed = speed; rightSpeed = speed; }else if(direction == 2){ leftSpeed = -speed; rightSpeed = -speed; }else if(direction == 3){ leftSpeed = -speed; rightSpeed = speed; }else if(direction == 4){ leftSpeed = speed; rightSpeed = -speed; } motor_9.run((9)==M1?-(leftSpeed):(leftSpeed)); motor_10.run((10)==M1?-(rightSpeed):(rightSpeed)); } double angle_rad = PI/180.0; double angle_deg = 180.0/PI; MeUltrasonicSensor ultrasonic_1(1); MeBuzzer buzzer; MeLightSensor lightsensor_6(6); MeRGBLed rgbled_3_2(3, 2, 32); MeTemperature temperature_3_1(3,1); void setup(){
} void loop(){ if((ultrasonic_1.distanceCm()) < (15)){ buzzer.tone(262, 1000); delay(20); } if((lightsensor_6.read()) < (500)){ rgbled_3_2.setColor(0,150,150,150); rgbled_3_2.show(); }else{ rgbled_3_2.setColor(0,0,0,0); rgbled_3_2.show(); } if((temperature_3_1.temperature()) > (40)){ buzzer.tone(440, 1000); delay(20); } _loop(); } void _delay(float seconds){ long endTime = millis() + seconds * 1000; while(millis() < endTime)_loop(); } void _loop(){ } |
② 传感器代码
5. 市场调研与及市场前景分析
就目前状况来讲,当面对一些高位状况时,多数情况下还是采取人工排险的手段。在机械化、自动化如此发达的今天这显然是不合理的。采用无人装置代替人工方式,可以保障人的生命安全,节约成本,同时也顺应科技发展的潮流。
本作品采用履带代替传统的轮子,可以适应更多的路面情况。采用远程遥控的方式,使得机动更加灵活。所搭载的机械臂自由度较高,机械爪可以替换为其他工程器械,可以满足各种情况下的需求。目前无人排险这一领域市场较为空缺,如果可以推出一款成本低、易操作的排险机器人,就可以为大部分用户所接受。在一些高危场所,比如矿井、核电站等,可以将这款机器人作为常规设备,在一些突发情况下,可以由专业知识丰富但缺乏抢险经验的工程师自行操作排险,不必要等待国家机关响应。由此看来这款作品的市场前景较为广阔。
6. 作品实物总体展示
7. 项目总结
本项目按照“研究问题——提出想法——小组讨论——分头找资料——分工协作——相互检查——提出改进意见”的流程,抓住设计中追求的目标——创新、实用、高效、准确,最终商讨出作品的设计方案并明确分工,最后完成作品。最后衷心地感谢学校给予我们这次机会完成这个项目,锻炼我们的创新能力和团队合作等多方面能力。感谢老师给我们提出得宝贵意见和给予的大力支持,让我们的工作更有效率,受益匪浅。
* 本项目未获得作者开源授权,无法提供资料下载。
|