智能行走宠物机器狗
摘要:未来社会,机器狗将可能作为家庭的一员进入我们的生活。
此课题的提出就是为了使将来机器狗智能化,进入家庭生活并为家庭带来欢乐。
我们拟研究设计一种外形机构模仿真实的狗的机器宠物。
此机器狗将实现四足行动、前进、后退、躲避障碍物等功能。
此次机器狗的外形设计采用舵机结合关节型结构作为腿部,兼相应的驱动程序。
此机器狗是科技、教育与玩具的结合,将使玩具更智能、更具可玩性、更具吸引力,充分体现互动玩具的理念。
课题意义:智能仿生宠物机器狗从表演性和娱乐性方面着手,显示其存在的价值和实力,同时又是从高技术方面展现当今科技的发展方面和前景。
从市场前景看,互动性、高科技玩具将成为未来玩具发展的主流。
发展科技型玩具是必然趋势,不仅世界大玩具公司争相开发,世界电脑巨头微软、英特尔、IBM等,世界电器霸主东芝、松下、索尼也都垂青电子玩具。
科技、教育与玩具制造业的结合,将会是玩具业在技术上的又一次革命,将使玩具更可爱、更具吸引人。
本题所研究的机器人并不同于一般的工业机器人,因为它不再固定在一个位置上。
这种机器人具有灵活的行走系统,以便随时走道需要的地方,完成人或智能系统预先设置指定的工作。
机器人行走系统的灵活性和对地面的适应能力将直接影响机器人的工作范围和工作能力。
仿生学以及力学分析表明,智能机器狗比类人型步行机器人容易实现得多。
因此,智能机器狗的研究具有一定的实用价值和科研意义。
实现目标:此机器狗将实现四足行动包括前进、后退、坐下、打招呼、站起等功能。
原理图:
主要程序代码:
#include <iom8v.h>
#include <macros.h>
#include <signal.h>
#include <interrupt.h>
#define uchar unsigned char
#define uint unsigned int
void timer2_init(void);
void timer1_init(void);
void port_init(void);
void init(void);
volatile unsigned char count=0;
volatile unsigned char pwm11,pwm12,pwm13,
pwm14,pwm21,pwm22,pwm23,pwm24,pwm31,pwm32,pwm33,pwm34;
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1140;y>0;y--);
}
void Reset(void) //复位&站立
{
pwm11=35,pwm12=35,pwm13=35,pwm14=35,
pwm21=35,pwm22=35,pwm23=35,pwm24=35,
pwm31=35,pwm32=35,pwm33=35,pwm34=35;
}
void SitDown_1(void) //坐下分解动作1
{
pwm11=35,pwm12=35,pwm13=35,pwm14=35,
pwm21=35,pwm22=11,pwm23=35,pwm24=62,
pwm31=35,pwm32=35,pwm33=35,pwm34=35;
}
void SitDown_2(void) //坐下分解动作2
{
pwm11=35,pwm12=56,pwm13=35,pwm14=16,
pwm21=35,pwm22=11,pwm23=35,pwm24=62,
pwm31=35,pwm32=35,pwm33=35,pwm34=35;
}
void SitDown(void)
{
SitDown_1();
delay_ms(500);
}
int main(void)
{
init(); //初始化
Reset(); //复位站立
delay_ms(1000);
Forward();
delay_ms(500);
Reset();
delay_ms(800);
SitDown();
delay_ms(800);
SayHello();
delay_ms(800);
StandUp();
delay_ms(500);
Reset();
}
void init(void)
{
cli(); //中断停止
port_init(); // 端口初始化
timer2_init(); //计时器0初始化
timer1_init(); //计时器1初始化
sei(); //中断启用
}
void port_init(void)
{
DDRB = 0x3F;
PORTB = 0x00;
DDRC = 0x3F;
PORTC = 0x00;
}
void timer2_init(void) //定时器2初始化程序(产生20ms 的周期)
{
TIMSK|=(1<<OCIE2); //T/C2输出比较匹配中断使能
TCCR2|=(1<<WGM21); //CTC工作模式(比较匹配时清零定时器模式)
TCNT2=0;
OCR2=155;
//50HZ=Foc2=(Fclk_I/0)/[2*256*(1+ocr2)]
TCCR2|=(1<<CS22);
}// 256分频;初始化函数里计时器2开始计数
void timer1_init(void) //定时器1初始化程序
SitDown_2();
{
TIMSK|= (1<<OCIE1A); //T/C1输出比较A匹配中断使能
TCCR1B|= (1<<WGM12); //CTC模式,技术上限值(top)为OCR1A
TCNT1=0;
OCR1A =15; /////////////////////注意初始时计时器1不要开始计数要到计时器2的中断函数里开始计数(产生20/N ms周期)
}
SIGNAL(SIG_OUTPUT_COMPARE2)
{
TCCR1B|= (1<<WGM12); //CTC模式
OCR1A = 15;
TCCR1B|=(1<<CS11); //计数器1经过8分频开始计时
count=0;
}
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
count++; //每中断一次加1
if (count<pwm11) //判断pwm1是不是输出高电平{PORTB|=(1<<2); }
else //不是则输出0
{ PORTB&=~(1<<2);}
if (count<pwm12)
{PORTB|=(1<<5); }
else
{PORTB&=~(1<<5);}
if (count<pwm13)
{ PORTC|=(1<<1); }
else
{ PORTC&=~(1<<1);}
if (count<pwm14)
{ PORTC|=(1<<4); }
else
{ PORTC&=~(1<<4);}
if (count<pwm21)
{ PORTB|=(1<<0); }
else
{ PORTB&=~(1<<0); }
if (count<pwm22)
{ PORTB|=(1<<4); }
else
{ PORTB&=~(1<<4); }
if (count<pwm23)
{ PORTC|=(1<<3); } else
{ PORTC&=~(1<<3); }
if (count<pwm24)
{ PORTC|=(1<<5); }
else
{ PORTC&=~(1<<5); }
if (count<pwm31)
{ PORTB|=(1<<1); }
else
{ PORTB&=~(1<<1); }
if (count<pwm32)
{ PORTB|=(1<<3); }
else
{ PORTB&=~(1<<3); }
if (count<pwm33)
{ PORTC|=(1<<0); }
else
{ PORTC&=~(1<<0); }
if (count<pwm34)
{ PORTC|=(1<<2);
else
{ PORTC&=~(1<<2); }
if(count>=60) //2.5ms脉冲后停止计数等待到下一个20ms///N=300,count=2.5ms/20ms*300
{ TCCR1B|=(0<<CS11); } //停止计时}。