机电系统综合实践
机电工程学院_________专业_______年级______班 姓名_________学号________________ ………………………………………装 …………………………………订 …………………………… 线 …………………………
15 级机械电子专业《机电系统综合实践》课程设计报告
三、设计原理
OV2640_JPEG_Mode();
//切换为 JPEG 模式
(2)由于室内光线原因及采集图片反光问题,根据设计问题进行分析,编程
设置如下程序设计:
//OV2640 自动曝光等级设置 //若要取得一定量的曝光量,则光强度越大,曝光时间越短;光强度越小,曝 光时间越长。
//level:0~4
OV2640_Auto_Exposure(0);
3.程序流程图
图一 程序路程图
4.获取目标点和距离(函数) //寻找棋子的中心点
left=0; right=0;
for(i=100-1;(int)i>0;i--) for(j=0;j<right1[i];j++) if(ov2640_HSV[i*120+j]==min) { left=j; for(k=right1[i];k>0;k--) if(ov2640_HSV[i*120+k]==min) { right=k; goto MAN_X; } }
SCCB_WR_Reg(0XFF,0X01);
SCCB_WR_Reg(0X11,clkdiv); //设置 CLK 分频
}
//OV2640 拍照 jpg 图片
//pname:要保存的 jpg 照片路径+名字
//返回值:0,成功
//
其他,错误代码
u8 ov2640_jpg_photo(u8 *pname)
//寻找图像的最低亮度 min=255;// for(i=0;i<100;i++) for(j=0;j<120/2;j++) if(ov2640_HSV[i*120+j]<min) min=ov2640_HSV[i*120+j];
//寻找相邻的像素小于 50 的像素点 for(i=0;i<100;i++) for(j=120-1;j>0;j--) if((int)ov2640_HSV[i*120+j] -(int)ov2640_HSV[i*120+j-1])<-50) { right1[i]=j-1; break; }
会出现内存不足的问题,当过小时会无法成功获取到图像,因此
if(res==FR_NO_FILE)break; //该文件名不存在=正是我们需要的.
index++;
第 3 页 (共 10 页)
机电工程学院_________专业_______年级______班 姓名_________学号________________ ………………………………………装 …………………………………订 …………………………… 线 …………………………
} pixcnt=0; pixcnt1=0;
img_out();
第 1 页 (共 10 页)
机电工程学院_________专业_______年级______班 姓名_________学号________________ ………………………………………装 …………………………………订 …………………………… 线 …………………………
extern u8 ov_frame;
//在 timer.c 里面定义
便于大家的理解,对模型进行精简,先去掉下方云台的旋转关节,
//文件名自增(避免覆盖)
这样就可以在二维的平面上进行运动学分析了。
//mode:0,创建.bmp 文件;1,创建.jpg 文件.
//bmp 组合成:形如&文件名
(2)DH 模型通过限制原点位置和 X 轴的方向,人为减少了两个自由度, 因此它只需要用四个参数即可表达关节之间原本是六自由度的坐标变换。DH 选 的四个参数都有非常明确的物理含义:
link length(连杆长度):两个关节的轴(旋转关节的旋转轴,平移关节的平 移轴)之间的公共法线长度。
link twist(连杆扭转):一个关节的轴相对于另一个关节的轴绕它们的公共法 线旋转的角度。
}else if(lcddev.width==320) //3.5 寸 LCD
{
clkdiv=3;
pclkdiv=15;
}else
//4.3/7 寸 LCD
{
clkdiv=15;
pclkdiv=4;
}
SCCB_WR_Reg(0XFF,0X00);
SCCB_WR_Reg(0XD3,pclkdiv); //设置 PCLK 分频
//jpg 组合成:形如"0:PHOTO/PIC13141.jpg"的文件名
void camera_new_pathname(u8 *pname,u8 mode)
{
u8 res;
u16 index=0;
while(index<0XFFFF)
{
if(mode==0)sprintf((char*)pname,"0:PHOTO/PIC%05d.bmp",index);
四、程序设计
1.函数源码及注释 //图像转换
while(pixcnt < 100*120*2) {
r=ov2640_rgb565[pixcnt] & 0xF8; g=((ov2640_rgb565[pixcnt]&0x07)<<5) +((ov2640_rgb565[pixcnt+1] & 0xE0)>>3); b=(ov2640_rgb565[pixcnt+1] & 0xF8)<<3; ov2640_HSV[pixcnt1++]=(r*30 + g*59 + b*11 + 50)/100; pixcnt += 2; } pixcnt=0; pixcnt1=0; img_out(); //图像处理 min=255; for(i=0;i<100;i++) for(j=0;j<120/2;j++)
当扫描到某点时,就通过图像传感芯片将该点处图像成一一对应关系的电压值, 然后将此电压值通过视频信号端输出,并将图片保存在相应的存储器内。通过图 像矩阵赋值为对应的 RGB 值,调试出所需的灰度图像。
2.功能(函数)分解 图像转换及灰度处理功能函数: //图像转换将 16 位值分别赋值给 r,g,b
二、设计内容
它与上一个关节的公共法线绕这个关节轴的转角。
u8* ov2640_framebuf;
//帧缓存
(3)逆运动学最基本的思路,是从正运动学反过来,对于机
u8* ov2640_rgb565;
械臂而言,也就是已知末端执行器的位置和朝向,求每个关节的
u8* ov2640_HSV;
角度。机械臂的三维运动是比较复杂的,这里为了简化模型更加
while(pixcnt < 100*120*2) {
r=ov2640_rgb565[pixcnt] & 0xF8; g=((ov2640_rgb565[pixcnt]&0x07)<<5)+((ov2640_rgb565[pixcnt+1]& 0xE0)>>3); b=(ov2640_rgb565[pixcnt+1] & 0xF8)<<3; //图像的灰度处理 ov2640_HSV[pixcnt1++]=(r*30 + g*59 + b*11 + 50)/100; pixcnt += 2;
{
FIL* f_jpg;
u8 res=0;
u32 bwr;
u32 i=0;
u32 jpeglen=0;
u8* pbuf;
f_jpg=(FIL *)mymalloc(SRAMIN,sizeof(FIL));//开辟 FIL 字节的内存区域
if(f_jpg==NULL)return 0XFF;
//内存申请失败.
}
}
//OV2640 速度控制
//根据 LCD 分辨率的不同,设置不同的参数
void ov2640_speed_ctrl(void)
{
u8 clkdiv,pclkdiv;
//时钟分频系数和 PCLK 分频
系数
if(lcddev.width==240)
//2.8 寸 LCD
{
clkdiv=1;
pclkdiv=28;
第 2 页 (共 10 页)
机电工程学院_________专业_______年级______班 姓名_________学号________________ ………………………………………装 …………………………………订 …………………………… 线 …………………………
link offset(连杆偏移):一个关节与下一个关节的公共法线和
本实验使用 OV2640 获取“跳一跳”游戏界面图像,经 STM32 开 发板处理后获取控制信息,发送至机械臂控制其自动进行游戏。 具体内容分解如下: 1.在 STM32 开发板上使用 OV2640 获取图像,并在液晶显示屏 上显示; 2.通过异步串口(蓝牙)在上位机上显示预处理后的图像; 3.对预处理后的图像进一步处理,获取目标点和距离等信息,进 一步计算获取机械臂控制信息; 4.经串口将控制信息发送至机械臂; 5.使用按键控制 STM32 开发板的工作状态。