系统实现功能
本次设计为研究探索性课题,旨在为后续的家政机器人产品设计提供一个原型,故本系统仅为智能家政机器人的雏形,并非具有完善功能的机器人。
本系统已实现通过安卓手机进行语音识别,并将语音识别结果发送至机器人,机器人控制器按照接收到的指令驱动舵机完成用户的命令。机器人可以前后左右的移动,并且机器人携带的机械臂可以完成5个自由度的受控运动。上述命令为简单的用户命令,最终系统实现能够完成特定的复杂用户命令。比如当用户命令机器人取来某个位置的盒子,机器人会自动运动到该位置抓取盒子,送到用户手中。
6.2 系统实物图
下图为机器人正常启动之后的效果图:
机器人运行效果图
int main(void)
{
u8 reclen=0;
unsigned short int distance=520;
unsigned short int height=750;
unsigned short int weight=512;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
IIC_Init(); //初始化I2C接口
uart_init(72,1000000); //串口1初始化为1M
LED_Init(); //初始化与LED连接的硬件接口
EXTIX_Init(); //外部中断初始化
MPU6050_initialize();
HMC5883L_SetUp();
delay_ms(50);
HMC5883L_SetUp();
SetMode(1,0,0);delay_ms(30);
SetMode(2,0,0);delay_ms(30);
SetMode(3,0,0);delay_ms(30);
SetMode(4,0,0);delay_ms(30);
SetMode(5,0,1023);delay_ms(30);
SetMode(6,0,1023);delay_ms(30);
SetMode(7,0,1023);delay_ms(30);
SetMode(8,0,1023);delay_ms(30);
SetMode(9,0,1023);delay_ms(30);
HC05_Init();
delay_ms(1000);
PostureInit();
while(1)
{
int reach=0;
//printf("ANGLE: angle=%d \n",jiao);
//delay_ms(500);
if(USART2_RX_STA&0X8000) //接收到一次数据了
{
//printf("%c",tt);
reclen=USART2_RX_STA&0X7FFF; //得到数据长度
USART2_RX_BUF[reclen]=0; //加入结束符
USART2_RX_STA=0;
if(tt=='1') //前进
{
Forward();
}
if(tt=='3') //后退
{
Back();
}
if(tt=='0') //停止
{
LED0=1;LED1=1;
Stop();
}
while(tt=='4') //右转
{
USART2_RX_STA=0;
TurnRight();
}
if(tt=='2') //左转
{
TurnLeft();
}
if(tt=='5') //打开爪子 f
{
SetMode(9,0,1023);
delay_ms(30);
OpenPaw();
LED0=0;
}
if(tt=='6') //抓取
{
SetMode(9,0,1023);
delay_ms(30);
ClosePaw();
}
while(tt=='8') //收回
{
USART2_RX_STA=0;
distance-=10;
if(distance<=200)distance=200;
SetMode(7,0,1023);
delay_ms(30);
PawGoFar(distance);
delay_ms(75);
LED1=0;
}
while(tt=='7') //伸出
{
USART2_RX_STA=0;
distance+=10;
if(distance>=520)distance=520;
SetMode(7,0,1023);
delay_ms(30);
PawGoNear(distance);
delay_ms(75);
LED0=0;
}
while(tt=='9') //机器人手臂抬起
{
USART2_RX_STA=0;
height+=10;
if(height>=750)height=750;
SetMode(6,0,1023);
delay_ms(30);
ArmRaiseUp(height);
delay_ms(75);
LED0=0;
}
while(tt=='a') //机器人手臂放下
{
USART2_RX_STA=0;
height-=10;
if(height<=500)height=500;
SetMode(6,0,1023);
delay_ms(30);
ArmSetDown(height);
delay_ms(75);
LED1=0;
}
while(tt=='b') //手臂右转
{
USART2_RX_STA=0;
weight-=10;
if(weight<=20)weight=20;
SetMode(5,0,1023);
delay_ms(30);
ArmLeft(weight);
delay_ms(75);
}
while(tt=='c') //手臂左转
{
USART2_RX_STA=0;
weight+=10;
if(weight>=1000)weight=1000;
SetMode(5,0,1023);
delay_ms(30);
ArmRight(weight);
delay_ms(75);
}
if(tt=='d') //取北方1M处物体
{
TurnRight();
reach=0;
while(!reach)
{
USART2_RX_STA=0;
IICreadBytes(HMC58X3_ADDR,HMC58X3_R_XM,6,hbuffer);
hx=(((int16_t)hbuffer[0]) << 8) | hbuffer[1];
hz=(((int16_t)hbuffer[2]) << 8) | hbuffer[3];
hy=(((int16_t)hbuffer[4]) << 8) | hbuffer[5];
if(hx==0)
{
if(hy & 0x8000)
angle=270;
else
angle=90;
}
else
{
if(hy & 0x8000)
angle=360-atan2(-hy,hx)*(180/3.141592653);
else
angle=atan2(hy,hx)*(180/3.141592653);
}
jiao=(int)angle;
if(jiao==86||jiao==87)
{
reach=1;
Stop();
delay_ms(1500);
times=0;sig=0;
Forward();
Forward();
while(sig==0);
Stop();
delay_ms(30);
SetMode(9,0,1023);
delay_ms(30);
OpenPaw();
delay_ms(300);
SetMode(6,0,1023);
delay_ms(30);
ArmSetDown(500);
delay_ms(1000);
SetMode(7,0,1023);
delay_ms(30);
PawGoNear(520);
delay_ms(1000);
SetMode(9,0,1023);
delay_ms(30);
ClosePaw();
delay_ms(500);
SetMode(6,0,1023);
delay_ms(30);
ArmRaiseUp(750);
delay_ms(1000);
sig=0;times=0;
Back();
while(sig==0);
Stop();
tt='0';
}
}
}
while(tt=='e')
{
sweep();
Stop();
tt='0';
}
}
}
}
word文档和程序原理图下载:
STM32 Android实现的智能家政机器人电路代码文档.7z
(7.68 MB, 下载次数: 0)
|