关于红外光电对管、微动开关及光电码盘的安装及应用_第1页
关于红外光电对管、微动开关及光电码盘的安装及应用_第2页
关于红外光电对管、微动开关及光电码盘的安装及应用_第3页
关于红外光电对管、微动开关及光电码盘的安装及应用_第4页
关于红外光电对管、微动开关及光电码盘的安装及应用_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关于红外光电对管、微动开关及光电码盘的安装及应用 (新器件2005年6月执行)1.关于红外光电对管的安装 红外光电对管印制板SL-DIY02-8D,可用于寻迹、避障、避悬崖、光电码盘计数检测等使用,可以任意调节安装高度及位置。光电对管面与印制板垂直安装,可用于寻迹、避悬崖等使用; 光电对管面与印制板平行安装,可用于避障、光电码盘计数检测等使用。见图1。 SL-DIY02-8A轮式机器人出厂时装三块印制板作寻迹、避悬崖用;装二块作避障或光电码盘计数检测用。 机器出厂时,光电对管等不装在机器上,由用户自己根据实验需求安装。 机器出厂时,写入机器演示程序,声控启动,前进后退二次(1M),左转右转二次,LED指示,放1首歌曲停止,再等声控启动。 图 1 2.关于微动开关的安装利用带滑轮的轻触微动开关作避悬崖及避障用,使复杂问题简单化,尤其避悬崖,不受台子材质及色彩限止,安装也方便。采用2块塑料直角件组装,见图2。程序编写,可以前进遇悬崖后退左转(右转)前进。 图2微动开关避障安装,由用户自己用废塑料板、废印制板等材料自制安装在注塑底板上,见图3。程序编写,可以前进遇障后退左转(右转)前进。出厂时,给二只带滑轮的轻触微动开关,一只如图2方法安装接线(不装在注塑底板上),直角塑料板间应加双面胶固定。另一只微动开关,只焊接线(附2只2x10mm螺钉螺母, 2只3x10mm螺钉螺母),转接板由用户自己解决安装。如为了更好地在机器人前方多点碰撞而能正确地避开障碍,建议用户在注塑底板上加碰撞环,碰撞环与注塑底板间加弹簧调节,无障碍时不触发微动开关,有障碍时,使碰撞环压微动开关,触发机器人动作。用户也可采用接触式触须传感器,解决避障问题。如有的比赛项目中不准触碰墙壁,则必须采用红外光电对管或超声波等非接触传感器,作为避障检测了。图33.光电编码盘原理与安装双龙电子的SL-DIY02-8A简易型轮式机器人、豪华型轮式机器人、SL-3010轮式机器人及SL积木式轮式机器人等,均可加光电码盘,达到精确计算轮式机器人行走路程。光电编码器 你不仅可以用延时函数控制机器人走过的时间,也可以用轮子内侧的两个光电编码器控制机器人走过的距离。 图:光电编码器 通过延迟函数我们可以控制机器人走一定的时间,而计算轮子转过的距离就要用机器人内侧的光电编码器来实现了,在主动轮内侧有黑白相间格子的码盘。轮子每转过 33个格子,轮子转一圈。编码器可以记录经过光电编码器格子的个数,从而可以计算出轮子走过的距离。 图:光电编码器的工作原理 光电编码器每产生一个脉冲,驱动轮转的角度是: 360 / 33 10.91(度) SL-DIY02-8A简易型双马达电机驱动轮的直径是43mm,驱动轮每转一圈,机器人行走的距离是: 2R=2*3.14*(43/2)= 138.6(mm) 每一个脉冲机器人行走的距离应该是: 138.6 / 33 4.2(mm) SL-DIY02轮式机器人光电码盘图,可根据轮子大小打印后,剪下后贴在轮子内侧上,作光电计数用。豪华型单马达电机驱动轮的直径是60.8mm,驱动轮每转一圈,机器人行走的距离是: 2R=2*3.14*(60.8/2)= 191.0(mm) 每一个脉冲机器人行走的距离应该是: 191.0 / 33 5.8(mm) SL-3010轮式机器人及SL积木式轮式机器人电机驱动轮的直径是63mm,驱动轮每转一圈,机器人行走的距离是: 2R=2*3.14*(63/2)= 198.0mm) 每一个脉冲机器人行走的距离应该是: 198.0/ 33 6.0(mm) 本机采用双列直插式LG9110电机驱动集成芯片。PD4,PD5到电机驱动芯片U2 LG9110控制左电机;PD6,PD7到电机驱动芯片U3 LG9110控制右电机; 表 1 LG9110管脚分配电机转动状态编码表左电机J3右电机J4左电机右电机机器人运行状态PD7黑线BPD6红线APD5黑线BPD4红线A1010正转正转向前行0110反转正转向左转0(1)0(1)10停正转左电机为中心原地向左转1001正转反转向右转100(1)0(1)正转停右电机为中心原地向右转0101反转反转向后退0(1)0(1)0(1)0(1)停停停4光电码盘实验程序以SL-DIY02-8A简易型双马达轮式机器人为例,利用光电编码盘准确行走路径计算程序-走正方形路线。【程序清单】/*8*/* 广州天河双龙电子公司 */* */* SL-DIY02-8A小车带光电编码盘演示程序 */* 作者: */* 2004年4月21日 */* 目标MCU:MEGA48 晶振:内部 8MHZ */*/*说明: 1。通过光电管对编码盘(等分黑白相间的格)计数可以算出车子所走的距离。 2。编码盘安装在轮子上,可以安装一个,也可以两个(更好),具体安装方法,还有光电管的安装方法,请参照附带说明。 3。如果编码盘的等分黑白相间的格越多,那么所计算的距离越准确,但对光电管相应的相应速度要求越高,出现的漏检几率越高(不能检测到黑白格变化),所以要合理等分编码盘(本例中等分了33份)。这也和车轮速度和光电管的反射距离有关,所以要控制好车速,还有选择发射距离远的光电管,以减少光电管漏检的几率,提高车走距离控制的精度。 */#include ;器件配置文件,采用ATmega48单片机#include ;定义宏unsigned char GO_FLG=0; /检测编码轮盘光电管标志unsigned char GO_count=0;/光电管检测轮盘黑白格计数#define GO_BACK 0 /控制向后走命令定义#define GO_FORD 1 /控制向前走命令定义#define TURN_R 3 /控制转右命令定义#define TURN_L 2 /控制转左命令定义/* 延时uS */void delay_us(int time) do time-; while (time1); /* 毫秒级延时程序*/ void delay_ms(unsigned int time) while(time!=0) delay_us(1000); time-; /* 向前,向后走控制子程序 round=0向后 ,round=1向前 fa_sl1 走 ,不是1 停 tim 前进,后退持续时间控制(ms)*/void FORWARD_go(unsigned char round,unsigned char fa_sl,unsigned int tim) if(fa_sl=1) /向后 if(round=0) PORTD= 0x50; /PD4=0,PD5=1;PD6=0,PD7=1反转 /向前 else if(round=1) PORTD= 0xa0; /PD4=1,PD5=0;PD6=1,PD7=0正转 else PORTD=0X00; /停止 delay_ms(tim); /* 转左快慢控制,fa_sl0停,fa_sl1 慢,fa_sl2 快 tim 前进,转左持续时间控制(ms)*/void LEFT_go(unsigned char fa_sl,unsigned int tim) if(fa_sl=1) PORTD= 0x10; /PD4=1,PD5=0;PD6=0,PD7=0 慢速左转 else if(fa_sl=2) PORTD= 0x90; /PD4=1,PD5=0;PD6=0,PD7=1 快速左转 else PORTD=0X00; /停止 delay_ms(tim); /* 转右快慢控制,fa_sl0停,fa_sl1 慢,fa_sl2 快 tim 前进,转右持续时间控制(ms)*/void RIGHT_go(unsigned char fa_sl,unsigned int tim) if(fa_sl=1) PORTD= 0x20; /PD4=0,PD5=0;PD6=1,PD7=0 慢速右转 else if(fa_sl=2) PORTD= 0x60; /PD4=0,PD5=1;PD6=1,PD7=0 快速右转 else PORTD=0X00; /停止 delay_ms(tim); /* 时间中断,在中断服务程序中检测光电管的状态*/void timer0_init(void) TCCR0B = 0x00; /stop TCNT0 = 0x10; /set count OCR0A=0X30; TCCR0A = 0x00; TCCR0B = 0x02; /start timer/*中断服务程序:检测光电管的状态 PB6-测步数光电管 GO_FLG=0 没反射 GO_FLG=1 有反射*/#pragma interrupt_handler timer0_compa_isr:15void timer0_compa_isr(void) if(PINB&0x40)=0x40) /-步数 GO_FLG=0; else GO_FLG=1; TCNT0 = 0x10; /reload counter value/*/停止;/*void STOP_go(void) PORTD=0X00;/停止 delay_ms(30); /* 控制向前,向后,左传,右转 type=0 向后 ; type=1 向前 ;type=2 向左;type=3 向右转 round 转的圈数 1round=4.2mm */void GO_round(unsigned char type,unsigned int round) unsigned int GO_step=0; / r=2.15cm,每次计数走4.2mm, if(type=0) /向后round圈 FORWARD_go(GO_BACK,1,0 );/向后 GO_count=0; GO_step=round; do while(!GO_FLG); while(GO_FLG); /GO_FLG跳变一次,说明走过了一格黑线。 GO_count+; /计算轮子走过了多少格 while(GO_step!=GO_count); FORWARD_go(GO_BACK,1,40 );/反方向,为了克服车的向后惯性,让车准确停止 STOP_go() ;/停 if(type=1) /向前round圈 FORWARD_go(GO_FORD,1,0 );/向前 GO_count=0; GO_step=round; do while(!GO_FLG); while(GO_FLG); GO_count+; while(GO_step!=GO_count); FORWARD_go(GO_BACK,1,40 );/反方向,为了克服车的向前惯性,让车准确停止 STOP_go() ;/停 if(type=2) /向左round圈 LEFT_go(2,0);/控制向左转 GO_step=round; GO_count=0; do while(!GO_FLG); while(GO_FLG); GO_count+; while(GO_step!=GO_count); RIGHT_go(2,20);/反方向,为了克服车的左转惯性,让车准确停止 STOP_go() ;/停 if(type=3) /向右round圈 RIGHT_go(2,0);/控制向右转 GO_step=round; GO_count=0; do while(!GO_FLG); while(GO_FLG); GO_count+; while(GO_step!=GO_count); LEFT_go(2,20);/反方向,为了克服车的向右惯性,让车准确停止 STOP_go() ;/停 else STOP_go() ;/停 /* 主程序*/void main(void) unsigned char temp,i; DDRD = 0xF0; /motor control port PORTD = 0xF0; DDRB = 0X07; /led control port PORTB = 0XF7; DDRC=0x00; /SENSOR INPUT PORT PORTC=0xff; OSCCAL=0XAB; /insert your functional code here. timer0_init(); MCUCR = 0x00; EICRA = 0x00; /extended ext ints EIMSK = 0x00; TIMSK0 = 0x02; /timer 0 interrupt sources TIMSK1 = 0x00; /timer 1 interrupt sources TIMSK2 = 0x00; /timer 2 interrupt sources EIMSK = 0x00;/中断使能 SEI(); delay_ms(100); while(1) /走边长42cm的正方形 GO_round(GO_FORD,100); /走42cm GO_round(TURN_L,33); /左转90度(一圈) GO_round(GO_FORD,100); GO_round(TURN_L,33); GO_round(GO_FORD,100); GO_round(TURN_L,100) ; /ICC-AVR application builder : 2005-3-10 11:52:48/ Target : M48/ Crystal: 8.0000Mhz/#include ;器件配置文件,采用Atmega48单片机#include ;定义宏unsigned char tt=0;定义无符号字符型(PC口)unsigned char ML_FLG=0; 中左指示灯unsigned char MR_FLG=0; 中右指示灯unsigned char MM_FLG=0; 中间指示灯unsigned char L_FLG=0;左转unsigned char R_FLG=0;右转unsigned char GO_FLG=0; 前进unsigned char BLACK_FLG=0; 向后unsigned char BIAN_FLG=0; 向后unsigned char STOP_FLG=0;停unsigned int GO_step=0;停unsigned char GO_count=0;继续#define GO_BACK 0;向后#define GO_FORD 1 ;向前#define TURN_L 2;左转#define TURN_R 3;右转/延时uSvoid delay_us(int time);延时函数 do/由这里开始 time-;/自减 while (time1);/ time1循环 /* 毫秒级延时程序*/ void delay_ms(unsigned int time) while(time!=0)/先判断,再循环 delay_us(1000); time-;/自减 /*/转左快慢控制,fa_sl0停,fa_sl1 慢,fa_sl2 快/*void LEFT_go(unsigned char fa_sl,unsigned int tim) if(fa_sl=1) /turn right slowly PORTD= 0x10; / PD7=0, PD6=0, PD5=0, PD4=1; 慢速右转/PORTB &=(0X04);/中间LED亮,只是为了标识 else if(fa_sl=2) /turn right quickly PORTD= 0x90; / PD7=1, PD6=0, PD5=0, PD4=1 快速右转/PORTB &=(0X04);/中间LED亮,只是为了标识 else PORTD=0X00; /停止/PORTB=0X07; delay_ms(tim); /*/转右快慢控制,fa_sl0停,fa_sl1 慢,fa_sl2 快/*void RIGHT_go(unsigned char fa_sl,unsigned int tim) if(fa_sl=1) /turn left slowly PORTD= 0x40; / PD7=0, PD6=0, PD5=0, PD4=1 慢速左转/PORTB &=(0X02);/中间LED亮,只是为了标识 else if(fa_sl=2) /turn left quick PORTD= 0x60; / PD7=0, PD6=1, PD5=1, PD4=0P 快速左转/PORTB &=(0X02);/中间LED亮,只是为了标识 else PORTD=0X00; /停止/PORTB=0X07; delay_ms(tim); /*/向前,向后快慢控制,/ round=0向前,round=1向后 /fa_sl0停,fa_sl1 慢,fa_sl2 快/*void FORWARD_go(unsigned char round,unsigned char fa_sl,unsigned int tim) if(fa_sl=1) /向前 if(round=1) PORTD= 0xa0; / PD7=1, PD6=0, PD5=1, PD4=0正转 / PORTB &=(0X01);/中间LED亮,只是为了标识 else /向后 PORTD= 0x50; / PD7=0, PD6=1, PD5=0, PD4=1反转/PORTB |=0X01;/中间LED灭,只是为了标识 else if(fa_sl=2) /向前 if(round=1) PORTD= 0xa0; /PD4=1,PD5=0;PD6=1,PD7=0正转/ PORTB=0X00;/LED亮,只是为了标识 else /向后 PORTD= 0x50; /PD4=0,PD5=1;PD6=0,PD7=1反转/PORTB=0X00; else PORTD=0X00; /停止/PORTB=0X07; delay_ms(tim); / desired value: 8MHz/ actual value: 0.000MHz (800000100.0%)void timer0_init(void) TCCR0B = 0x00; /stop TCNT0 = 0x10; /set count OCR0A=0X30; TCCR0A = 0x00; TCCR0B = 0x02; /start timer#pragma interrupt_handler timer0_compa_isr:15void timer0_compa_isr(void)/PC4,PC3,PC2,PC1,PC0 光电管/M-PB0,L-PB1,R-PB2 指示灯/-PB6-测步数/ flg=0 没反射/ flg=1 有反射 if(PINB&0x40)=0x40) /-步数 GO_FLG=0; /PORTB &=(0X04 else /PORTB |=(0X04); GO_FLG=1; / tt=PINC; if(tt&0x02)=0x02) /-中右 PORTB &=(0X04);/中间右LED亮 MR_FLG=0; else PORTB |=(0X04);MR_FLG=1; if(tt&0x04)=0x04) /-中间 PORTB &=(0X01);/中间LED亮 MM_FLG=0; else PORTB |=(0X01);MM_FLG=1; if(tt&0x08)=0x08)/-中左 PORTB &=(0X02);/中左间LED亮 ML_FLG=0; else PORTB |=(0X02);ML_FLG=1; if(tt&0x10)=0x10)/-左 /PORTB &=(0X04);/右LED亮 L_FLG=0; else /PORTB |=(0X04); L_FLG=1; if(tt&0x01)=0x01)/-右 /PORTB &=(0X02);/左LED亮 R_FLG=0; else /PORTB |=(0X02); R_FLG=1; TCNT0 = 0x10; /reload counter value/*/停止;/*void STOP_go(void) PORTD=0X00; /停止 delay_ms(30); /*/控制向前,向后,左传,右转/ type=0 向后 ; type=1 向前 ;type=2 向左;type=3 向右转/ round 转的圈数 1round=4.2mm /*void GO_round(unsigned char type,unsigned int round) / r=2.15cm,每次计数走4.2mm, if(type=0) /向后round圈 FORWARD_go(0,1,0 );/前正 GO_count=0; GO_step=round; do while(!GO_FLG); while(GO_FLG); GO_count+; while(GO_step!=GO_count); FORWARD_go(1,1,0 );/前正 delay_ms(40); STOP_go() ;/停 if(type=1) /向前round圈 FORWARD_go(1,1,0 );/前正 GO_count=0; GO_step=round; do while(!GO_FLG); while(GO_FLG); GO_count+; while(GO_step!=GO_count); FORWARD_go(0,1,0 );/前正 delay_ms(40); STOP_go() ;/停 if(type=2) /向左round圈 PORTD= 0x90; /PD4=1,PD5=0;PD6=0,PD7=1 GO_step=round; GO_count=0; do while(!GO_FLG); while(GO_FLG); GO_count+; while(GO_step!=GO_count); PORTD= 0x60; /PD4=0,PD5=1;PD6=1,PD7=0 delay_ms(40); STOP_go() ;/停 if(type=3) /向右round圈 PORTD= 0x60; /PD4=0,PD5=1;PD6=1,PD7=0 GO_step=round; GO_count=0; do while(!GO_FLG); while(GO_FLG); GO_count+; while(GO_step!=GO_count); PORTD= 0x90; /PD4=1,PD5=0;PD6=0,PD7=1 delay_ms(40); STOP_go() ;/停 else STOP_go() ;/停 /* 主程序*/void main(void) unsigned char temp,i; DDRD = 0xF0; /motor control port PORTD = 0xF0; DDRB = 0X07; /led control port PORTB = 0XF7; DDRC=0x00; /SENSOR INPUT PORT PORTC=0xff; OSCCAL=0XAB; /insert your functional code here. timer0_init(); MCUCR = 0x00; EICRA =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论