基于四轴飞行器的管道机器人的研究与设计.docx
《基于四轴飞行器的管道机器人的研究与设计.docx》由会员分享,可在线阅读,更多相关《基于四轴飞行器的管道机器人的研究与设计.docx(37页珍藏版)》请在冰豆网上搜索。
基于四轴飞行器的管道机器人的研究与设计
基于四轴飞行器管道机器人的研究与设计
摘要
本设计以STM32F103C8T6为主控核心,由相应的电机驱动、超声波传感器、无线通信、姿态检测模块MPU6050以及摄像头模块OV7670组成。
该飞行器体积小,质量轻,能够在管道中自由、稳定的飞行。
超声波模块能够检测飞行器与前方障碍以及管壁之间的距离;姿态检测模块能够检测飞行器的飞行姿态,能够更好地进行控制;摄像头模块能够采集管道中的情况,通过无线实时传输到上位机上。
该飞行器不仅可以应用于各种管道,而且在其他检测中也可以使用。
【关键词】单片机 电机驱动 超声波传感器 MPU6050 OV7670
目 录
第1章 引言
1.1特色举例
管道机器人是迅速发展的机器人技术的一种重要应用。
由于管道环境作业的特殊性,目前还没有一种令人满意的机器人结构能够很好地满足管道作业的各种要求。
工业管道的工作环境非常恶劣,管道中的气体或液体通常是有毒有害的。
管道在长期使用后容易发生腐蚀生锈甚至有可能破裂,这将会导致管道破损而引起有毒有害物质的泄漏。
因此,定期对管道进行检测和维护是必不可少的。
但是由于工业管道中恶劣的环境,检测和维护难度较大,通过人力是难以实现的。
飞行器技术已经有了100多年的发展历史,近年来的发展更为迅速,因而可以大胆设想将飞行器技术应用于管道机器人,形成一种全新的飞行式管道机器人结构。
现在的管道机器人常采用轮式、履带式和蠕动式,而轮式和履带式在遇到淤泥的时候就会卡死,人无法进入很难解决;蠕动式运动速度很慢,而且转动不易实现,前进方式为收缩前进方式,而且蠕动式管道机器人运动不连续且效率低。
现有的管道机器人由于自身结构所限,在实际应用中存在以下的问题:
1)对管道的适应性差,特别对于很小的管径;
2)在管道内转弯困难,特别是丁字路口的转弯;
3)管道内可能有异物,管道本身也可能发生变形,阻碍机器人的运动。
本系统所设计的管道机器人能够很好的解决上述问题,具有较高的研究价值和应用前景。
1.2技术说明
随着信息技术的飞速发展,单片机科技、传感器技术以及远程监控技术在很多方面得到了应用。
同时飞行器技术已经有了100多年的发展历史,近年来的发展更为迅速,因而可以大胆设想将飞行器技术应用于管道机器人,形成一种全新的飞行式管道机器人结构。
在这个大背景下,我们结合所学知识和现在的设计水平,设计了这个能够检测管道的四轴飞行器。
我们以化工管道为例,管道中通常都是一些具有毒性和腐蚀性的气体和液体,在长时间使用后管道会受到不同程度的腐蚀,利用人力来检测时人无法进入并且对人体也会有伤害,是无法实现的。
所以我们设计了这款可在管道内飞行的四轴飞行器,能够在管道内自由飞行。
1.3适用范围
该款飞行器主要适用于管道的检测。
具有体积小,质量轻,能够在管道中自由、稳定的飞行等特点。
能够时时检测管道内的状况,能够确定管道内障碍物的具体位置。
同时也能够检测路面上的信息,具有多用途、灵活性和可靠性等优点。
本课题是定义在管道检测的用途上设计的,对飞行的灵活性以及可靠性具有非常严格的要求。
在设计时,我们利用mpu6050姿态检测模块来检测飞行器的姿态,通过PID算法加以调整飞行器姿态,使之能够平稳的飞行及实现转弯悬停等操作。
飞行器还通过超声波来检测周围障碍物的距离,以避免撞到障碍物上。
而且飞行器上还搭载了一个小型摄像头,所以能够保证飞行器在管道中飞行及观测管道情况。
此外,本飞行器还可以用于航拍,记录如运动会之类的体育竞技活动等。
第2章 总体方案
本设计以STM32F103C8T6为主控核心,由相应的电机驱动、超声波传感器、无线通信、姿态检测模块MPU6050以及摄像头模块OV7670组成。
超声波模块能够检测飞行器与前方障碍和上下管壁之间的距离,防止与管壁发生碰撞;姿态检测模块能够检测飞行器的飞行姿态,能够更好地进行控制;摄像头模块能够采集管道中的情况,通过无线实时传输到上位机上。
该系统总体设计框图如下图所示。
系统总体设计图
超声波传感器:
超声波传感器用于测量距离的使用,能够测量前方障碍的距离以及飞行器与管壁的距离,当飞行器与管壁之间的距离小于设定值时,飞行器会自动调整与管壁之间的距离。
姿态检测模块MPU6050:
姿态检测模块用于检测飞行器的当前姿态,当飞行器在管道中飞行时可通过上位机来观测飞行器的姿态,以便于对飞行器更好地控制。
摄像头模块OV7670:
摄像头模块用于检测管道中的信息,将采集的管道中的信息通过WIFI时时传输到上位机上。
WIFI模块:
WIFI模块用于数据的传输,不仅能够将采集的图像传输到上位机上,也能够通过上位机来对飞行器进行操作。
第3章 器件简介
该款飞行器选用了工业常用的超声波传感器、姿态检测模块和摄像头模块等。
3.1超声波传感器简介
超声波传感器图
3.1.1特点
1.广泛的探测范围
2.高灵敏度、快速响应恢复
3.性能稳定,测量距离精确
4.简单的驱动电路
3.1.2应用
超声波传感技术应用在生产实践的不同方面,而医学应用是其最主要的应用之一,在工业方面,超声波的典型应用是对金属的无损探伤和超声波测厚两种。
超声波距离传感器也可以广泛应用在物位(液位)监测,机器人防撞,各种超声波接近开关,以及防盗报警等相关领域,工作可靠,安装方便,防水型,发射夹角较小,灵敏度高,方便与工业显示仪表连接,也提供发射夹角较大的探头。
而且在测距方面应用也非常广泛。
3.1.3使用原理
超声波模块通过发送超声波,检测被反射回来所用的时间来判断被检测物体的距离。
3.2无线通讯模块简介
WIFI模块图
无线通信模块是基于GPRS网络研发的数据通讯产品,多安装在监控子站。
监控子站现场设备通过无线通信模块和监控中心互联,远程传输数据,实现监控子站与监控中心的通信。
广泛地运用在车辆监控、遥控、遥测、小型无线网络、无线抄表、门禁系统、小区传呼、工业数据采集系统、无线标签、身份识别、非接触RF智能卡、小型无线数据终端、安全防火系统、无线遥控系统、生物信号采集、水文气象监控、机器人控制、无线232数据通信、无线485/422数据通信、数字音频、数字图像传输等领域中。
3.2.1无线通讯的特性
(1)低功耗设计,实时在线平均电流≤10mA/12V。
(2)体积小巧、安装方便。
(3)弹出式卡槽设计,安装SIM卡无需打开设备外壳。
(4)支持短消息、专线、VPN专网等多种组网方式;支持域名解析功能。
(5)支持UDP、TCP协议;支持数据透明传输。
(6)可选配水资源监测数据传输规约、水文监测数据通信规约等。
(7)支持各家组态软件和用户自行开发软件系统。
(8)工业级设计,适用室外恶劣环境。
(9)采用上位机召测的数据上报方式;可扩展支持定时上报、数据变化上报等上报方式(扩展功能需定制)。
3.3姿态检测模块简介
MPU6050模块图
MPU-6050是全球首例9轴运动处理传感器。
它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(DigitalMotionProcessor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。
扩展之后就可以通过其I2C或SPI接口输出一个9轴的信号(SPI接口仅在MPU-6000可用)。
MPU-60X0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。
3.4摄像头模块简介
摄像头模块图
摄像头又称为电脑相机、电脑眼等,它作为一种视频输入设备,在过去被广泛的运用于视频会议、远程医疗及实时监控等方面。
近年以来,随着互联网技术的发展,网络速度的不断提高,再加上感光成像器件技术的成熟并大量用于摄像头的制造上,这使得它的价格降到普通人可以承受的水平。
同时这两年摄像头被广泛应用于智能手机,这样也促进感光成像技术的进一步提高。
将摄像头组装在飞行器上,可以实现全方位多角度的拍摄,本飞行器采用OV7670型摄像头,OV7670图像传感器,体积小、工作电压低,提供单片VGA摄像头和影像处理器的所有功能。
通过SCCB总线控制,可以输出整帧、子采
样、取窗口等方式的各种分辨率8位影响数据。
该产品VGA图像最高达到30帧/秒。
用户可以完全控制图像质量、数据格式和传输方式。
所有图像处理功能过程包括伽玛曲线、白平衡、饱和度、色度等都可以通过SCCB接口编程。
OmmiVision图像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、托尾、浮散等,提高图像质量,得到清晰的稳定的彩色图像。
3.5上位机简介
随着现代信息技术的飞速发展以及计算机网络的广泛应用,计算机通信技术已经日趋成熟。
通过上位机来控制下位机的运行、维护与优化得到了广泛的应用。
串行通信是一种广泛使用且实用的通信方式,由于具有线路简单、应用灵活、可靠性高等一系列优点长期以来获得了广泛的应用。
计算机串行通信在数据通信、故障检测、计算机远程监控等方面有广泛的应用与利用价值,特别是在Windows
下的串口通信可以充分利用Windows下的软件资源优势,实现多任务条件下对外部的数据传输、信息收集和处理。
本系统使用VisualStudio2010的编程环境来编程。
结合.NETFramework
类库中提供的SerialPort类来编写接收来OV7670摄像头采集数据并通过stm32f103c8t6和wifi下位机发送的数据。
实现了对下位机数据以及图像的采集、存储,进而对存储图像和数据的分析来管道的具体情况。
第4章 硬件设计
驱动方式
1.蜂鸣器驱动电路
2.蜂鸣器驱动设计
3.电路原理图
4.a)PWM输出口直接驱动蜂鸣器方式
5.b)I/O口定时翻转电平驱动蜂鸣器方式
本系统外围电路包括超声波传感器输入部分、摄像头模块OV7670输入部分、姿态检测模块MPU6050。
硬件电路图
4.1超声波传感器输入模块
本系统的超声波传感器模块我们选用的是HC-SR04模块,后接集成运算放大器,经三极管输入接至单片机的管脚,用于测量距离使用。
超声波传感器HC-SR04模块电路图
4.2姿态检测模块MPU6050
本系统的姿态检测模块我们选用的是MPU6050,此模块直接接至单片机的管脚,用于检测6轴的角速度以及角加速度,经过互补滤波得到飞行器的三个姿态。
姿态检测传感器MPU6050电路图
4.3摄像头输入模块
本系统的摄像头模块为OV7670,使用它的原因是比较小巧,采集图像清晰。
摄像头模块部分电路图
4.4WIFI模块
WIFIESP8266模块原理图
本系统的无线模块为WIFIESP8266,当飞行器在飞行时,通过上位机与WIFI之间进行通讯,实现对飞行器的操作以及图像的传输功能。
参考文献
[1]一种新型管道检测机器人系统[J].上海交通大学学报,2004,(8):
41-43.
[2]管道机器人的研究进展[J].机床与液压,2008,(4):
111-112.
[3]油烟管道清洗机器人控制系统设计与研究[D].上海:
东华大学,2009.
[4]国内外微小管道机器人的研究现状[J].机械设计,2010,(12):
53-54.
[5]电缆管道机器人视频监测系统的开发[D].上海:
上海交通大学,2008.
[6]管道机器人的发展现状[J].机器人技术与应用,2003,(4):
71-72.
附录
1.实物照片
2.主程序流程图
3.部分程序
iic.c
#include"iic.h"
//#include"delay.h"
#include"SysTick.h"
voidI2C_delay(void)
{
delay_us
(1);
}
//?
?
?
IIC
voidI2C_Init_IO(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//?
?
GPIOC?
?
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//GPIO_Mode_Out_OD;//?
?
?
?
/*GPIO_Mode_Out_PP;*/
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_11);//PC11,12?
?
?
}
voidI2C_Start(void)
{
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SDA_L;
I2C_delay();
SCL_L;
}
voidI2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
u8I2C_WaitAck(void)
{
u8errtime=0;
SCL_L;
I2C_delay();
SDA_H;//?
?
?
?
?
?
?
?
?
?
?
I2C_delay();
SCL_H;
I2C_delay();
while(SDA_read)
{
errtime++;
if(errtime>250)
{
I2C_Stop();
return0;
}
}
SCL_L;//?
?
?
?
I2C_delay();
return1;
}
voidI2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
voidI2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
voidI2C_SendByte(u8SendByte)
{
u8i;
for(i=0;i<8;i++)
{
SCL_L;
I2C_delay();
if(SendByte&(0x80>>i))SDA_H;
elseSDA_L;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
I2C_delay();
}
u8I2C_ReadByte(void)
{
u8i=0;
u8ReceiveByte=0;
for(i=0;i<8;i++)
{
SCL_L;
SDA_H;//?
?
?
?
?
?
?
?
?
?
?
I2C_delay();
SCL_H;
ReceiveByte<<=1;
if(SDA_read)
{
ReceiveByte++;
}
else
{
}
I2C_delay();
}
SCL_L;
I2C_delay();
returnReceiveByte;
}
u8Single_Write(u8REG_Address,u8REG_data,u8SlaveAddress)
{
I2C_Start();
I2C_SendByte(SlaveAddress);//?
?
?
?
?
?
+?
?
?
while(!
I2C_WaitAck());
I2C_SendByte(REG_Address);//?
?
?
?
?
?
?
while(!
I2C_WaitAck());
I2C_SendByte(REG_data);
while(!
I2C_WaitAck());
I2C_Stop();
delay_ms(5);
return1;
}
//********?
?
?
?
?
*********//
u8Single_Read(u8REG_Address,u8SlaveAddress)
{
u8data=0;
I2C_Start();
I2C_SendByte(SlaveAddress);//?
?
?
?
?
?
+?
?
?
while(!
I2C_WaitAck());
I2C_SendByte(REG_Address);//?
?
?
?
?
?
?
while(!
I2C_WaitAck());
I2C_Start();
I2C_SendByte(SlaveAddress+1);//?
?
?
?
?
?
+?
?
?
while(!
I2C_WaitAck());
data=I2C_ReadByte();
I2C_NoAck();
I2C_Stop();
returndata;
}
voidMultiple_write(u8star_addr,u8num,u8SlaveAddress,u8*send_buf)
{
u8i;
I2C_Start();
I2C_SendByte(SlaveAddress);//?
?
?
?
?
?
while(!
I2C_WaitAck());
I2C_SendByte(star_addr);//?
?
?
?
?
?
while(!
I2C_WaitAck());
for(i=0;i{
I2C_SendByte(send_buf[i]);
while(!
I2C_WaitAck());
}
I2C_Stop();
}
voidMultiple_read(u8star_addr,u8num,u8SlaveAddress,u8*recv_buf)
{
u8i;
I2C_Start();
I2C_SendByte(SlaveAddress);//?
?
?
?
?
?
while(!
I2C_WaitAck());
I2C_SendByte(star_addr);//?
?
?
?
?
?
while(!
I2C_WaitAck());
I2C_Start();
I2C_SendByte(SlaveAddress+1);//?
?
?
?
?
?
+?
?
?
while(!
I2C_WaitAck());
for(i=0;i{
recv_buf[i]=I2C_ReadByte();
if(i==(num-1))I2C_NoAck();//?
?
?
?
?
?
?
?
?
NOACK
elseI2C_Ack();
}
I2C_Stop();//?
?
?
?
}
///////////////////////////////////////////MPU6050?
?
?
?
////////////////////////////////////////////////////////
voidi2cRead(u8SlaveAddress,u8star_addr,u8num,u8*recv_buf)
{
Multiple_read(star_addr,num,SlaveAddress,recv_buf);
}
voidi2cWrite(u8SlaveAddress,u8REG_Address,u8REG_data)
{
Single_Write(REG_Address,REG_data,SlaveAddress);
}
Imu.c
#include"imu.h"
#include"mpu6050.h"
#include"math.h"
ANGLEQ_ANGLE;
floatnumber_to_dps(s16number)
{
floattemp;
temp=(float)number*Gyro_Gain;
returntemp;
}
floatnumber_to_dps1(s16number)
{
floattemp;
temp=(float)number*Gyro_GainR;
returntemp;
}
floatnumber_to_g(s16number)
{
floattemp;
temp=(float)number*Acc_Gain;
returntemp;
}
voidGet_Accel_Angle(s16x,s16y,s16z,float*roll,float*pitch)
{
floattemp;
temp=sqrtf((float)(y*y+z*z));
temp=atan2((float)x,temp)*(180/3.14159265);
*pitch=temp;
temp=sqrtf((float)(x*x+z*z));
temp=atan2((float)y,temp)*(180/3.14159265);
*roll=temp;
}
floatroll_data[4];
floatpitch_data[4];
voidACC_Angle_Filter(floatroll_in,floatpitch_in,float*roll_out,float*pitch_out)
{
u8i;
for(i=0;i<3;i++)
{
roll_data[3-i]=roll_data[3-i-1];
pitch_data[3-i]=pitch_data[3-i-1];
}
roll_data[0]=roll_in;
pitch_data[0]=pitch_in;
*roll_out=(65*roll_data[0]+20*roll_data[1]+10*roll_data[2]+5*roll_data[3])/100;
*pitch_out=(65*pitch_out[0]+20*pitch_out[1]+10*pitch_out[2]+5*pitch_out[3])/100;
}
voidIMUupdate(s16gx,s16gy,s16gz,s16ax,s16ay,s16az,s16yaw_gyro_tar)
{
staticfloatx1=0,y1=0,z1=0,x2=0,y2=0,z2=0;