您的当前位置:首页正文

机器人课程结课总结报告

2021-01-09 来源:个人技术集锦


课程结课总结报告

课程名称: 机器人的制作 实验一 基于arduino控制器的轮式机器人循迹避障功能设计 实验二 应变式传感器电子秤实验 实验三 基于C51单片机控制器的轮式机器人电机控制系统 实验四 基于ARM控制器的博创平台轮式机器人循迹避障功能实现 实验五 摄像头实现轮式机器人循迹功能的应用

实验六 应用卓越联盟实验室设备进行设计和实现作品说明

指导教师 许晓飞

系 别 机电工程学院 专 业 机械电子工程 学生姓名 邓银涛 班级/学号 机电1401/2014010339 成 绩

实验一 基于ardunio控制器的轮式机器人循迹避障功能设计

实验目的

1.了解ardunio平台,并熟练使用此软件完成小车的各种活动

2.了解HC-SR04超声波测距模块的原理,并且熟练使用此模块作为小车的传感器进行工作 3.了解并且熟悉红外线传感器循迹原理 实验器材:

Adrunio软件,超声波传感器,红外线传感器,导线,底板,电机,电池,单片机等 实验内容:

1.将硬件组装成小车,即轮式机器人 2.利用ardunio使小车完成循迹功能 步骤:(1)写好后缀为.txt的c语言循迹文件 (2)将文件导入单片机中

(3)根据具体路况,运行并且进行调试红外线传感器的灵敏程度 3.利用ardunio使小车完成避障功能 步骤:(1)写好后缀为.txt的c语言避障文件 (2)将文件导入单片机中

(3)运行并且进行调试小车躲避障碍物的距离 实验程序 1.循迹程序:

小车循迹程序思路图 #include

int Left_motor_back=8; //左电机后退(IN1) int Left_motor_go=9; //左电机前进(IN2) int Right_motor_go=10; // 右电机前进(IN3) int Right_motor_back=11; // 右电机后退(IN4) int key=7;//定义按键 数字7 接口

const int SensorRight = 3; //右循迹红外传感器(P3.2 OUT1) const int SensorLeft = 4; //左循迹红外传感器(P3.3 OUT2) int SL; //左循迹红外传感器状态 int SR; //右循迹红外传感器状态 void setup() {

//初始化电机驱动IO为输出方式

pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM) pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM) pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM) pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM) pinMode(key,INPUT);//定义按键接口为输入接口

pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入 pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入 }

void run(int time) // 前进 void run()

{

digitalWrite(Right_motor_go,HIGH); // 右电机前进 digitalWrite(Right_motor_back,LOW);

analogWrite(Right_motor_go,255);//PWM比例0~255调速 analogWrite(Right_motor_back,0);

digitalWrite(Left_motor_go,HIGH); // 左电机前进 digitalWrite(Left_motor_back,LOW);

analogWrite(Left_motor_go,255);//PWM比例0~255调速 analogWrite(Left_motor_back,0);

//delay(time * 50); //执行时间,可以调整

} //void left(int time) //左转(左轮不动,右轮前进) void left() {

digitalWrite(Right_motor_go,HIGH); // 右电机前进 digitalWrite(Right_motor_back,LOW); analogWrite(Right_motor_go,200);

analogWrite(Right_motor_back,0);//PWM比例0~255调速 digitalWrite(Left_motor_go,LOW); //左轮后退 digitalWrite(Left_motor_back,LOW); analogWrite(Left_motor_go,0);

analogWrite(Left_motor_back,100);//PWM比例0~255调速 //delay(time * 50); //执行时间,可以调整 }

void right(int time) //右转(右轮不动,左轮前进) void right() {

digitalWrite(Right_motor_go,LOW); //右电机后退 digitalWrite(Right_motor_back,LOW); analogWrite(Right_motor_go,0);

analogWrite(Right_motor_back,100);//PWM比例0~255调速 digitalWrite }

2.避障程序:

char L1 = 9 ; // zheng char L2 = 8 ;

char R1 = 10 ; // zheng char R2 = 11 ;

int echopin = 13 ; int trigpin = 12 ;

void setup ( ) //初始化动作的区块,定义串行端口和脚位 { pinMode ( echopin , INPUT ) ; // pwm pinMode ( trigpin , OUTPUT ) ; }

void loop ( )//版子重复执行动作的区块 { int currDist ;

long randnumber ;

currDist = MeasureDistance ( ) ; // 读取前端距离 delay ( 5 ) ;

if ( currDist > 10 ) { straight( ); }

if ( currDist <= 10 )

{ randomSeed ( analogRead ( 0 ) ) ; randnumber = random ( 0 ,10 ) ; if ( randnumber > 5 ) { back ( );

delay ( 1000 ); turnright ( ); delay ( 800 ); } else

{ back ( ) ;

delay ( 1000 ) ; turnleft ( ) ; delay ( 800 ) ; } } }

int MeasureDistance ( )

{ digitalWrite ( trigpin , LOW ) ; delay ( 2 ) ;

digitalWrite ( trigpin , HIGH ) ; delay ( 10 ) ;

digitalWrite ( trigpin , LOW ) ;

int distance = pulseIn ( echopin , HIGH ) ;

distance = distance / 58.0 ; // 计算距离 344 * 100 / 1000000 * pulseIn ( ) / 2 delay ( 60 ) ; // 循环间隔60uS return ( distance ) ; }

void straight ( )

{ analogWrite ( L1 ,100 ) ; // 255 0 zhengzhuan analogWrite ( L2 ,0 ) ;

analogWrite ( R1 , 100 ) ; // 255 0 zhengzhuan analogWrite ( R2 , 0 ) ; }

void turnright ( )

{ analogWrite ( L1 ,100 ) ; // 255 0 zhengzhuan

analogWrite ( L2 ,0 ) ;

analogWrite ( R1 ,0 ) ; // 255 0 zhengzhuan analogWrite ( R2 ,0 ) ; }

void turnleft ( )

{ analogWrite ( L1 , 0 ) ; // 255 0 zhengzhuan analogWrite ( L2 , 0 ) ;

analogWrite ( R1 , 100 ) ; // 255 0 zhengzhuan analogWrite ( R2 , 0 ) ; }

void back()

{ analogWrite ( L1 , 0 ) ; // 255 0 zhengzhuan analogWrite ( L2 , 100) ;

analogWrite ( R1 , 0 ) ; // 255 0 zhengzhuan

analogWrite ( R2 , 100 ) ; }

实验过程中遇到的问题及解决办法 循迹中:

1.电机速度差异控制:发现左右轮写入同一数值时,小车行进方向偏离直线,——对左右两轮写入不同数值,多次测试,指导左右轮速度相等。

2.电机驱动器给arduino供电出现问题,改用充电宝给arduino供电,直接从gnd和5v输出脚给电机驱动器供电

3.一个电机有两根信号输入线,一根控制正转,一根控制反转。两个轮子一起测转地眼晕,容易出错。 避障中:

1.超声装置避障距离的确定——将HC-SR04超声波避障程序中数值改短,提高避障灵敏性 2.硬件的安装:超声装置无法固定——曾尝试过用胶带,废旧车轮等但不理想,并未得到很好的解决 实验结果

小车可以成功的进行循迹和避障

实验二 电子秤实验

一 单臂实验 数据处理源码:

axis([0 200 0 50])

coords=[0 20 40 60 80 100 120 140 160 180 200;0 2.8 5.1 7.5 9.9 12.4 14.8 17.2 19.6 22.0 24.6] grid hold

plot(coords(1,:),coords(2,:),'*') x=coords(1,:) y=coords(2,:)'

b=size(coords) c=ones(1,b(2)) MT=[c;x] M=MT'

f=inv(MT*M)*MT*y

['y=',num2str(f(2)),'x+',num2str(f(1))]

x=-max(x):max(x) y=f(1)+f(2)*x

mistake=max(x-y)/(max(y)-min(y));

fprintf('电阻传感器的系数灵敏度S=%5.3f%%\\n',abs(f(2))) fprintf('非线性误差f=%5.3f%%\\n',mistake) plot(x,y,'--') xlabel('x/g') ylabel('V/mv')

title('单臂实验')

legend(['y=',num2str(f(2)),'x+',num2str(f(1))]) Matlab处理结果

电阻传感器的系数灵敏度S=0.122% 非线性误差f=3.607%

半桥实验 源码:

axis([0 200 0 50])

coords=[0 20 40 60 80 100 120 140 160 180 200;0 4.0 8.8 13.7 18.6 23.5 18.4 33.2 38.2 43.1 47.9]

grid hold

plot(coords(1,:),coords(2,:),'*') x=coords(1,:) y=coords(2,:)' b=size(coords) c=ones(1,b(2)) MT=[c;x] M=MT'

f=inv(MT*M)*MT*y

['y=',num2str(f(2)),'x+',num2str(f(1))] x=-max(x):max(x) y=f(1)+f(2)*x

mistake=max(x-y)/(max(y)-min(y));

fprintf('电阻传感器的系数灵敏度S=%5.3f%%\\n',abs(f(2))) fprintf('非线性误差f=%5.3f%%\\n',mistake) plot(x,y,'--') xlabel('x/g') ylabel('V/mv') title('半桥实验')

legend(['y=',num2str(f(2)),'x+',num2str(f(1))]) Matlab处理结果

电阻传感器的系数灵敏度S=0.238% 非线性误差f=1.615%

全桥实验

源码:

axis([0 200 0 100])

coords=[0 20 40 60 80 100 120 140 160 180 200; 0 7.4 15.3 23.1 30.9 38.8 46.7 54.6 62.6 70.5 78.4] grid hold

plot(coords(1,:),coords(2,:),'*') x=coords(1,:) y=coords(2,:)' b=size(coords) c=ones(1,b(2)) MT=[c;x] M=MT'

f=inv(MT*M)*MT*y

['y=',num2str(f(2)),'x+',num2str(f(1))]

x=-max(x):max(x) y=f(1)+f(2)*x

mistake=max(x-y)/(max(y)-min(y));

fprintf('电阻传感器的系数灵敏度S=%5.3f%%\\n',abs(f(2))) fprintf('非线性误差f=%5.3f%%\\n',mistake) plot(x,y,'--') xlabel('x/g') ylabel('V/mv') title('全桥实验')

legend(['y=',num2str(f(2)),'x+',num2str(f(1))]) Matlab数据处理

电阻传感器的系数灵敏度S=0.393% 非线性误差f=0.774%

实验三 基于C51单片机控制器的轮式机器人电机控制系统

实验目的

了解PWM波控制电机的原理。

基于C51单片机利用PWM波控制电机。 实验器材

C51单片机、L298N驱动芯片、直流电机、杜邦线、普通导线、keil软件、STC下载器、示波器 实验内容

用keil新建一个“.c”文件,编写程序并对程序进行调试。 将程序烧录进单片机内。 进行硬件连接

C51引脚如图所示:

L298N引脚如图所示:

用单片通过P1.0、P1.1和L298的第一对输入端IN1和IN2相连,然后又L298的第一对输出端OUT1和OUT2与直流电机相连;单片通过P1.5、P1.6和L298的第二对输入端IN3和IN4相连,然后又L298的第二对输出端OUT3和OUT4与直流电机相连。 给单片机上电。 用示波器观察波形。

程序内容

1、PWM波控制电机启动 #include \"reg51.h\" #include \"intrins.h\"

#define FOSC 11059200L

typedef unsigned char BYTE; typedef unsigned int WORD; void delay_ms(int x);

/*Declare SFR associated with the PCA */

sfr CCON = 0xD8; //PCA control register

sbit CCF0 = CCON^0; //PCA module-0 interrupt flag sbit CCF1 = CCON^1; //PCA module-1 interrupt flag sbit CR = CCON^6; //PCA timer run control bit sbit CF = CCON^7; //PCA timer overflow flag sfr CMOD = 0xD9; //PCA mode register sfr CL = 0xE9; //PCA base timer LOW sfr CH = 0xF9; //PCA base timer HIGH

sfr CCAPM0 = 0xDA; //PCA module-0 mode register

sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH sfr CCAPM1 = 0xDB; //PCA module-1 mode register

sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH sfr PCAPWM0 = 0xf2; sfr PCAPWM1 = 0xf3; sbit IN1=P1^0; sbit IN2 = P1^1;

sbit IN3=P1^5; sbit IN4 = P1^6; void main() {

CCON = 0; //Initial PCA control re CL = 0; //Reset PCA base timer CH = 0;

CMOD = 0x02; //Set PCA timer clock source as Fosc/2

CR = 1; //PCA timer start run while(1) {

int i;

IN1=0; IN2=1; IN3=0; IN4=1; for(i=100;i>=0;i--) {

CCAP0H = CCAP0L =i; //PWM0 port output 50% duty cycle square wave

CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt

CCAP1H = CCAP1L = i; CCAPM1 = 0x42; delay_ms(100); }

for(i=0;i<=100;i++)

{

CCAP0H = CCAP0L =i; //PWM0 port output 50% duty cycle square wave

CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt

CCAP1H = CCAP1L = i; CCAPM1 = 0x42; delay_ms(100); }

IN1=1; IN2=0;IN3=1; IN4=0; for(i=100;i>=0;i--) {

CCAP0H = CCAP0L =i; //PWM0 port output 50% duty cycle square wave

CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt

CCAP1H = CCAP1L = i; CCAPM1 = 0x42; delay_ms(100); }

for(i=0;i<=100;i++) {

CCAP0H = CCAP0L =i; //PWM0 port output 50% duty cycle square wave

CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt

CCAP1H = CCAP1L = i; CCAPM1 = 0x42; delay_ms(100); }

} }

void delay_ms(int x) {

int y;

for(;x>0;x--)

for(y=0;y<1000;y++); }

控制方向

#include \"reg51.h\" #include \"intrins.h\"

#define FOSC 11059200L typedef unsigned char BYTE;

typedef unsigned int WORD; sbit IN1 = P1^0; sbit IN2 = P1^1; void main() {

IN1=0;IN2=1; }

PWM波对电机调速

#include \"reg51.h\" #include \"intrins.h\"

#define FOSC 11059200L

typedef unsigned char BYTE; typedef unsigned int WORD;

/*Declare SFR associated with the PCA */

sfr CCON = 0xD8; //PCA control register

sbit CCF0 = CCON^0; //PCA module-0 interrupt flag sbit CCF1 = CCON^1; //PCA module-1 interrupt flag sbit CR = CCON^6; //PCA timer run control bit sbit CF = CCON^7; //PCA timer overflow flag sfr CMOD = 0xD9; //PCA mode register sfr CL = 0xE9; //PCA base timer LOW sfr CH = 0xF9; //PCA base timer HIGH

sfr CCAPM0 = 0xDA; //PCA module-0 mode register

sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH sfr CCAPM1 = 0xDB; //PCA module-1 mode register

sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH sfr PCAPWM0 = 0xf2; sfr PCAPWM1 = 0xf3;

void main() {

CCON = 0; //Initial PCA control register CL = 0; //Reset PCA base timer CH = 0;

CMOD = 0x02; //Set PCA timer clock source as Fosc/2

CCAP0H = CCAP0L = 0x80; //PWM0 port output 50% duty cycle square wave

CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt

CCAP1H = CCAP1L = 0xff; //PWM1 port output 0% duty cycle square wave PCAPWM1 = 0x03;

CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode and no PCA interrupt

CR = 1; //PCA timer start run while (1); }

五、实验心得

本次实验中我学会用软件来延时实现PWM的输出,从而实现对电机的控制。

实验四 基于ARM控制的博创平台轮式机器人循迹蔽障功能 实验目的

了解NorthStar平台,并熟练使用此软件完成小车的各种活动 了解RobotServoTerminal机器人舵机调试系统并掌握使用 了解并且熟悉灰度传感器循迹原理 实验材料

ARM控制器 灰度传感器 红外探测器 舵机电机等 实验内容

小车硬件的组装 蔽障功能的实现 循迹功能的实现 循迹功能的实现 NorthStar循迹程序

#include \"Apps/SystemTask.h\"

uint8 SERVO_MAPPING[4] = {1,2,3,4}; int main() {

int lgray = 0; int rgray = 0; MFInit();

MFInitServoMapping(&SERVO_MAPPING[0],4); MFSetPortDirect(0x00000FF8); MFSetServoMode(1,1); MFSetServoMode(2,1); MFSetServoMode(3,1); MFSetServoMode(4,1); while (1) {

lgray = MFGetAD(0); rgray = MFGetAD(1); //右偏

if ((lgray<=460)&&(rgray>=350)) {

//左转

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,-512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,-512); MFServoAction(); DelayMS(400); } else {

//左偏

if ((lgray>=460)&&(rgray<=350)) {

//右转

MFSetServoRotaSpd(1,512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,512); MFSetServoRotaSpd(4,512); MFServoAction(); DelayMS(400); } else {

//meipian

if ((lgray>=460)&&(rgray>=350)) {

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,512); MFServoAction();

DelayMS(400); } else {

MFSetServoRotaSpd(1,0); MFSetServoRotaSpd(2,0); MFSetServoRotaSpd(3,0); MFSetServoRotaSpd(4,0); MFServoAction(); DelayMS(100); } } } } }

蔽障功能的实现 程序

#include \"Apps/SystemTask.h\"

uint8 SERVO_MAPPING[5] = {1,2,3,4,5}; int main() {

int io0 = 0; int io1 = 0; MFInit();

MFInitServoMapping(&SERVO_MAPPING[0],5); MFSetPortDirect(0x00000FFC); MFSetServoMode(1,1); MFSetServoMode(2,1); MFSetServoMode(3,1); MFSetServoMode(4,1); MFSetServoMode(5,0); while (1) {

io0 = MFGetDigiInput(0); io1 = MFGetDigiInput(1); if ((io0==1)&&(io1==1)) {

MFSetServoRotaSpd(1,1023); MFSetServoRotaSpd(2,-1023); MFSetServoRotaSpd(3,1023); MFSetServoRotaSpd(4,-1023); MFSetServoPos(5,512,512); MFServoAction(); DelayMS(500); } else {

if (io0==0) {

//后退

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,512); MFSetServoPos(5,512,512); MFServoAction(); DelayMS(1000); //右转

MFSetServoRotaSpd(1,512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,512); MFSetServoRotaSpd(4,512); MFSetServoPos(5,512,512); MFServoAction(); DelayMS(2000); } else {

//后退

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,512); MFSetServoPos(5,512,512); MFServoAction(); DelayMS(1000); //左转

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,-512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,-512); MFSetServoPos(5,512,512); MFServoAction(); DelayMS(2000); } } } }

实验中遇到的问题以及解决方案

1、NorthStar编程完成后下载时遇到的问题

解决方案及拓展步骤

(1)打开NorthStar软件

点击帮助

(3)点击帮助

主题

(4)点开附录以及里边的常见问题及解决将出现一些列常见

问题

(5)点击遇到的问题,按照操作步骤即可解决

环境对灰度传感器影响较大,赛道多次取点进行传感器灰度值测量,之后修改程序内AD值条件。

(1)用NorthStar打开循迹的程序 (2)打开工具菜单下的查询传感器

出现传感器页面,调整好下载模式以及端口的设置,点击启动服务

(4)完成之后调整好查询数据模式电机查询AD,会在相应AD口内看到数据的变化。 (5)测完后取黑线与地面值的中间值调整if条件。

功能同时装在小车上,通过一个自制红控制小车的程序选择。

实验拓展 将红外蔽障功能,以及灰度传感器巡线外开关来

程序

#include \"Apps/SystemTask.h\"

uint8 SERVO_MAPPING[4] = {1,2,3,4}; int main() {

int lgray = 0; int you = 0; int key = 0; int rgray = 0; int zuo = 0; MFInit();

MFInitServoMapping(&SERVO_MAPPING[0],4); MFSetPortDirect(0x00000FF8); MFSetServoMode(1,1); MFSetServoMode(2,1); MFSetServoMode(3,1);

MFSetServoMode(4,1); while (1) {

MFGetDigiInput(0); if (key==0) {

MFGetDigiInput(1); MFGetDigiInput(2);

if ((zuo==1)&&(you==1)) {

//前进

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,512); MFServoAction(); DelayMS(1000); } else {

if (you==0) {

//后退

MFSetServoRotaSpd(1,512); MFSetServoRotaSpd(2,-512); MFSetServoRotaSpd(3,512); MFSetServoRotaSpd(4,-512); MFServoAction(); DelayMS(400); //左转

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,-512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,-512); MFServoAction(); DelayMS(400); } else {

//后退

MFSetServoRotaSpd(1,512); MFSetServoRotaSpd(2,-512); MFSetServoRotaSpd(3,512); MFSetServoRotaSpd(4,-512);

MFServoAction(); DelayMS(400); //右转

MFSetServoRotaSpd(1,512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,512); MFSetServoRotaSpd(4,512); MFServoAction(); DelayMS(400); } } } else {

lgray = MFGetAD(0); rgray = MFGetAD(1); //右偏

if ((lgray<=460)&&(rgray>=350)) {

//左转

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,-512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,-512); MFServoAction(); DelayMS(400); } else {

//左偏

if ((lgray>=460)&&(rgray<=350)) {

//右转

MFSetServoRotaSpd(1,512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,512); MFSetServoRotaSpd(4,512); MFServoAction(); DelayMS(400); } else {

//meipian

if ((lgray>=460)&&(rgray>=350))

{

MFSetServoRotaSpd(1,-512); MFSetServoRotaSpd(2,512); MFSetServoRotaSpd(3,-512); MFSetServoRotaSpd(4,512); MFServoAction(); DelayMS(400); } else {

MFSetServoRotaSpd(1,0); MFSetServoRotaSpd(2,0); MFSetServoRotaSpd(3,0); MFSetServoRotaSpd(4,0); MFServoAction(); DelayMS(100); } } } } } }

通过本次实验对NorthStar熟练掌握,进而对今后使用博创平台实现视觉系统等一系列功能掌握。

实验五 摄像头实现轮式机器人电机控制系统 一.实验目的

1.了解OpenCv的使用方法,并以此为平台实现基于OpenCv摄像头巡线小车的制作 2.掌握基于HSV颜色模型的图像阈值分割算法

3.使用OpenCv图像去噪相关算法:膨胀腐蚀滤波等

4.掌握串口通讯,并实现PC机与Arduino以蓝牙模块为载体通讯 二.实验器材

OpenCv,HC-05主从一体蓝牙模块,Arduino,小车底盘,usb摄像头实验内容 三.实验内容 1.HSV颜色模型

HSV(Hue-Saturation-Value),色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色,黄色等;饱和度(S)是色彩的纯度,越高色彩越纯,低则逐渐变灰;明度(V),指色彩的亮度。HSV以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”

HSV把颜色描述为在圆柱坐标系的点,这个圆柱的中心轴取值为自底部的黑色到顶部的白色,而在它们中间是灰色;绕这个轴的角度对应色相,取值范围0—360°,到这个轴的距离对应饱和度,取值范围0.0—1.0,而沿这个轴的高度对应亮度,取值范围0(黑色)—1.0(白色)。

2.阈值分割策略

阈值化的基本思想是:给定一个数组和一个阈值,然后根据数组中的每个元素的值是低于还是高于阈值而进行一些处理。 :

检查源图像的每一个像素点的范围。在下限和上限之间的像素点,被置为255;否则置0。即感兴趣区域为白色,不感兴趣区域全为黑色。 受光照影响,不同时刻表示同一颜色的空间模型取值不同。因此在图像处理之前先手动标定图像,把合适的H,S,V取值范围输出到文本文件里,供后续处理读取。

3.图像去噪

分割得到二值化图像之后,可以很明显看到图中仍然有很多细微的点噪声存在,而且目标内部出现空洞,周围存在毛刺,所以需要对噪声进行进一步处理,下面介绍滤出噪声的常用方法。 3.1膨胀

膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。

膨胀的算法:用3X3的结构元素,扫描图像的每一个像素;用结构元素与其覆盖的二值图像做“与”操作;如果都为0,结果图像的该像素为0,否则为1;结果使二值图像扩大一圈。

函数

这个函数膨胀源图像,存储结果到目标图像。 参数详解:源图像,图像通道的数量是任意的,但图像深度应

CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。 目标图像,尺寸和类型与源图像相同

膨胀操作核。若为NULL时,表示是使用参考点位于中心3x3的核。一般使用函数配合参数使用。函数会返回指定形状和尺寸的结构元素(内核矩阵)。其中函数的第一个参数表示内核的形状,如下: 矩形:MORPH_RECT 交叉形:MORPH_CROSS 椭圆形:MORPH_ELLIPSE 锚的位置,默认值(-1,-1),表示锚位于中心 迭代使用erode()函数的次数,默认值为1

用于推断图像外部像素的某种边界模式,默认值:BORDER_DEFAULT

使用erode函数时,一般我们只需要设置前三个参数,后面四个参数都有默认值。例:

3.2腐蚀

腐蚀是一种消除边界点,使边界向内收缩的过程。可以用来消除小而无意义的物体。

腐蚀的算法:用3x3结构元素,扫描图像的每一个像素;用结构元素与其覆盖的二值图像做“与”操作;如果都为1,结果图像该像素为1,否则为0;结果使二值图像减小一圈。

4.串口通讯

串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。 串口进行通信的方式有两种:同步通信方式和异步通信方式。同步通信方式要求通信双方以相同的时钟频率进行,而且准确协调,通过共享一个单个时钟或定时脉冲源保证发送方和接收方的准

确同步,效率较高;异步通信方式不要求双方同步,收发方可采用各自的时钟源,双方遵循异步的通信协议,以字符为数据传输单位,发送方传送字符的时间间隔不确定,发送效率比同步传送效率低。 4.1串口通讯过程

4.2串口通讯重要函数 (1)

(2)DCB结构包含了串口的各项参数设置,下面仅介绍几个该结构常用的变量

4.HC-05蓝牙一体化模块

HC-05 嵌入式蓝牙串口通讯模块(以下简称模块)具有两种工作模式:命令响应工作模式和自动连接工作模式,在自动连接工作模式下模块又可分为主(Master)、从lave)和回环(Loopback)三种工作角色。当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;当模块处于命令响应工作模式时能执行下述所有AT 命令,用户可向模块发送各种AT 指令,为模块设定控制参数或发布控制命令。通过控制模块外部引脚(PIO11)输入电平,可以实现模块工作状态的动态转换。 实验成果

四.实验心得

通过这个实验尝试并学习了以前只听过没做过的东西,在做的过程中遇到很多问题,但都在与同学的讨论下找到了解决方法。

在调试蓝牙模块时不能进入AT模式,被这个问题绊了两个晚上;给电脑装了蓝牙驱动后,却不能连接到蓝牙模块,一直认为是驱动装错了,后来用手机测试成功连接上了,意识到是电脑有问题;

巡线时小车突然动不了了,一开始认为是电机或驱动坏了,后面才知道是因为控制方法不当使电机在下次启动时进入死区,后来改进为PWM控制; 这是非常有意义的一次实验课。

实验六 应用卓越联盟实验室设备进行设计和实现作品说明

1.Protell99SE的使用及电路板的雕刻 一.实验目的

1.了解Protell99se的使用方法,并以此为平台设计电路板

2.了解将原理图转化为雕刻机所需的输出格式,并运用雕刻机制作出自己独有的电路板 二.实验器材

Pretell99se设计软件 ,电路原理图,pcb电路板雕刻机等 三.实验内容

将Protell99软件安装进电脑 查看所给文件的电路图

设计出自己组独有的pcb电路板 将电路板雕刻出来

Protell99制作原理图库的方法

将元件库文件和原理图文件放在同一个设计中

在原理图所在的设计数据库文件夹下新建一个原理图库文件,取名为mylibrary。名字可任取。

打开原理图库文件,默认状态下此库文件里已经存在一个名为component_1的元件 选择绘图工具框中的绘制矩形工具绘制元件的边框(即绘制元件的符号或外形)

左键点击绘图工具栏里的绘制管脚图标,按下Tab键进入管脚属性编辑对话框。1管脚名字为com,其他管脚名隐藏,管脚编号为1~9。

依次放置9个管脚,在放置管脚时,管脚的一端有一个小黑点,旋转管脚使小黑点朝外 双击矩形方框进行边框属性设置。Border Width选择SmallBorder Color选择合适的颜色。 用上述方法绘制8个电阻形状的矩形框,放置在上面画好的边框里 点击画图工具栏里的画线工具,将画好的电阻和管脚连接好。 修改元件描述 保存后退出编辑。

当所有的元件制作完成后,保存并关掉元件库文件 (2)单独创建一个元件库(仓库),注意这个元件库还是Protel设计数据库文件。

1)新建一个设计,取名为“mylibrary”或者是“XX的库文件”保存在某个地方,记住这个地址。这个库可做为自己的专用库文件。在以后绘制原理图时只需把此库添加进去即可,以后也可以不断地丰富此库中的元件

2)在设计里新建一个原理图库文件,保存文件,给它起一个有特色又能反应元件库特点的名字。如“电阻类”,“插件类”,“AD转换”等等。利用此法可建立若干个原理图库文件,将元件归类存放

3)打开某一类原理图库文件,在此文件中制作新元件,具体作法见上文。也可以从系统自带的库文件中拷贝元件,或者是从现有的原理图中提取元件添加到自己的库文件中 实验创新与思考

Protell99作为一个老版本的pcb设计软件,在兼容性及汉化方面有许多不足,相比现今较火的AD系列的软件操作起来也较难,但对于简单的pcb电路设计,Protell系列还是不错的。对于某些电路而言,单面镀铜的电路板无法满足需求,因此,在学习课内单面镀铜电路板的设计基础上应再学习双面镀铜电路板的设计,以满足实际需要 2.3D打印机激光切割机机械臂的工作原理及实际应用 机械臂的原理及其应用 实验目的

了解机械臂的工作原理,操作过程以及在实际生产过程中的应用 掌握机械臂的操作 实验器材

机械臂及其控制系统,机械臂控制器等 三. 实验内容

1.了解机械臂的工作原理 2.了解机械臂的程序 3.操作机械臂进行工作

实验原理

机器人空间描述和坐标变换:

在一个三维空间中对两个质点的位置关系进行描述,一般会用一个的位置矢量来表示。在笛卡尔坐标系中,坐标系中的任意质点的位置都可以用一个3*1的位置矢量来表示该质点到坐标原点的位置关系。

机器人连杆的坐标转换

创新与思考

通过了解机械臂的运行原理,知道可以通过矩阵进行最佳位姿的求解,但在求解矩阵的过程中,我们会求得多解,如何选取运动方式是程序编写的重中之重,所以,根据需要,同时根据各种机器人自身机构对运动转动角度的限制,以及机构运动方式所产生的压力角大小,机械转动效率等选取最优解,进行程序编写。理论上6R的工业机器人可进行全方位运动工作,但由于机器本身,促使机器人在工作时会存在一些盲点,故在应用机器人的进行工作的时候,应尽量避免触及这些机械盲点,以求的效率最大化。 3D打印技术 实验目的

了解3D打印技术的原理及其应用

利用建模软件创建模型,打印出树脂梳 实验器材

3D打印机,树脂,MakerBot软件等

实验原理

3D打印机原理其实是以一种数字模型文件为基础,运用粉末状金属或塑料等可粘合材料,通过逐层打印的方式来构造物体的技术。由于在3D打印机原理中把复杂的三维制造转化为一系列二维制造的叠加,因而可以在不用模具和工具的条件下生成几乎任意复杂的零部件,极大地提高了生产效率和制造柔性。

首先得通过计算机辅助设计(CAD)或计算机动画建模软件建模,再将建成的三维模型“切片”成逐层的截面数据,并把这些信息传送到3D打印机上,3D打印机会把这些切片堆叠起来,直到一个固态物体成型。 打印原理:

3D打印的过程是这样的:先通过计算机建模软件建模,如果你有现成的模型也可以,比如动物模型、人物、或者微缩建筑等等。然后通过SD卡或者USB优盘把它拷贝到3D打印机中,进行打印设置后,打印机就可以把它们打印出来,其工作结构分解图如下:

思考与创新

3D打印技术作为一种新型便捷的生产技术,虽然初见成效,但在很多领域仍存在问题,比如说,对于打印所需的材料,如果所选材料熔点低,那么打印出来的产品必然刚性差,易折断或变形,不利于高负荷的实际使用,但倘若熔点较高,必然对打印机的墨盒的要求提高,如若想正确打印,必然需要墨盒熔点更高于打印所需原材料,在工艺上的要求会更高,成本也会更大,甚至可能超过原有工业生产所需成本,这样,3D打印技术就变得毫无意义。因此,为了使3D打印技术更加成熟,必须在以上两点之间权衡,找到突破口。 激光切割机 实验目的

了解激光切割机的原理

了解激光切割机与传统切割技术相比的优势 激光切割机的实际应用 实验仪器

激光切割机,材料板等 实验原理

激光切割是将从激光器发射出的激光,经光路系统,聚焦成高功率密度的激光束。激光束照射到工件表面,使工件达到熔点或沸点,同时与光束同轴的高压气体将熔化或气化金属吹走。随着光束与工件相对位置的移动,最终使材料形成切缝,从而达到切割的目的。 激光切割加工是用不可见的光束代替了传统的机械刀,具有精度高,切割快速,不局限于切割图案限制,自动排版节省材料,切口平滑,加工成本低等特点,将逐渐改进或取代于传统的金属切割工艺设备。激光刀头的机械部分与工件无接触,在工作中不会对工件表面造成划伤;激光切割速度快,切口光滑平整,一般无需后续加工;切割热影响区小,板材变形小,切缝窄(0.1mm~0.3mm);切口没有机械应力,无剪切毛刺;加工精度高,重复性好,不损伤材料表面;数控编程,可加工任意的平面图,可以对幅面很大的整板切割,无需开模具,经济省时。

智能工厂 实验目的 智能工厂原理 工厂接单

工厂在电脑终端接收订单指令,并把订单指令下达给各个工作区域,是整个工厂围绕该订单展开生产工作

原料供给

通过机械臂从工厂仓库中提取原材料,仓库架采取单齿轮驱动双板双齿条的方式,节约

了仓库的空间加大了仓库的储备量

机械臂通过空间坐标抓取货物,并将货物放在循迹运输车中,进行下一步工序

铣床加工

通过铣床等机械加工方法,得到生产工件

并利用装载机械臂的小车将做好工件放入公差测量仪进行检测

工件纠偏,装载出库

利用机器人视觉对图像的处理,将工件放入指定位置,并用循迹小车将生产完成工件封装出库

创新与思考

智能工厂却为工业4.0概念的产物,但这个工厂确实存在以下几点问题: 机械臂抓取货物只能适用于低重量产品,对于质量较大的产品并不适用。个人认为应采取液压传动

循迹小车思路很好,但单线路的循迹线,很难满足工作需要,应将但循迹线改为一条主线路多通路与其共同连接的思路,如同铁路轨道,可允许多辆小车在不冲突的条件下同时工作,以提高效率

缺少反馈设施,在加工过程中很容易产生误差,尤其在高精度加工之中,如果一旦出现误差却没能及时发现,损失将是巨大的,应在误差检测仪系统中设置反馈装置,以防止出现较大误差

因篇幅问题不能全部显示,请点此查看更多更全内容