标题:
基于机器视觉的网球识别与回收装置—智能小车STM32代码
[打印本页]
作者:
1092648746
时间:
2019-6-5 21:38
标题:
基于机器视觉的网球识别与回收装置—智能小车STM32代码
好久没逛51hei电子论坛了,最近看到有人询问智能小车(其实很多人都喜欢做小车),又想起自己写过智能小车,上传了,让大家参考下。
实物忘了放哪就不拍了,注意是拿来参考的,不是让你直接烧录的…………,直接烧录也没用是吧
。当时靠这个代码拿了个电赛省二,新人们可以参考下,STM32的初学者也可以参照下思路,设计出一款自己的小车…………
好的,就这样吧。
对了,第二个py文件是OPENMV的代码,要用OPENMV摄像头做颜色识别的同学也可参考下
0.png
(4.91 KB, 下载次数: 62)
下载附件
2019-6-6 04:30 上传
单片机源程序如下:
/**************************************************************************************
* 基于机器视觉的网球识别与回收装置 *
摘要:本设计旨在制作出一个能够在网球场上自动搜寻网球并自动回收网球的装置。
本设计是以STM32单片机为核心设备,通过OPENMV摄像头对网球进行图像识别并回传,
回传数据处理后STM32将驱动回收装置自动行驶到目标位置,实现将球自动拾取并存
放的功能。本设计基本模块包括MCU、驱动板、摄像头、捡球装置、收集装置和电源。
其中MCU为STM32F103核心板,驱动板为L293D电机驱动板,摄像头为OPENMV,捡球装
置及收集装置为定制结构。
适用单片机:STM32F103ZET6 适用开发板:野火科技 F103霸道开发板
默认时钟频率:72MHZ
***************************************************************************************/
//连接方式 :请参考interface.h文件
#include "stm32f10x.h"
#include "interface.h" //STM32各种接口
#include "LCD1602.h" //1602液晶屏(提供坐标可视化)
#include "IRCtrol.h" //定时及中断相关
#include "motor.h" //电机及舵机驱动
#include "uart.h" //串口相关
#include "redvoid.h" //红外避障相关
#include "UltrasonicCtrol.h"//超声波模块相关(已弃用)
/******注意:各个子文件并未清晰注释,请读者自行研究****/
/**************************************************************************************/
//全局变量定义
unsigned int speed_count=0;//占空比计数器 50次一周期
char front_left_speed_duty=SPEED_DUTY;
char front_right_speed_duty=SPEED_DUTY;
char behind_left_speed_duty=SPEED_DUTY;
char behind_right_speed_duty=SPEED_DUTY;
unsigned int tick_5ms = 0;//5ms计数器,作为主函数的基本周期
unsigned int tick_1ms = 0;//1ms计数器,作为电机的基本计数器
unsigned int tick_200ms = 0;//刷新显示
unsigned int tick_10ms = 0;
unsigned int tick_500ms = 0;
unsigned int zhuanjiao; //舵机角度参考值
unsigned int ServoFlag; //舵机标志位
unsigned int DetectFlag; //红外避障标志位
unsigned int DataBuf_x[3]; // 摄像头传回的x坐标数据
unsigned int DataBuf_y[3]; // 摄像头传回的y坐标数据
unsigned int buf_i;
int x_pos;
int y_pos;
int x_pos_last;
int y_pos_last;
int Cam_key=0;
int Turn_Flag=0;
char ctrl_comm = COMM_STOP;//控制指令
char ctrl_comm_last = COMM_STOP;//上一次的指令
unsigned char continue_time=0;
unsigned char bt_rec_flag=0;//蓝牙控制标志位
unsigned char redray_flag=0;//红外循迹标志位
unsigned char duoji_count=0;
unsigned char RecFlag;
/*****************************************************************************************/
//定时器周期是0.1ms
//舵机PWM周期是20ms,0 - 180°分别对应 0.5 - 2.5ms 的脉宽
//变量zhuanjiao可调范围为 5 - 25 对应 0 - 180°,当zhuanjiao = 15 时对应90°
//为了让舵机运行更精确,建议向右或向左转是不要使用0°或180°,建议向中间靠近一点
//右转时选用zhuanjiao=7 左转时用zhuanjiao=23
/*******************************************************************************
* 函 数 名 :DuojiMid
* 函数功能 :舵机下压
* 输 入 :无
* 输 出 :无
*******************************************************************************/
void DuojiMid()
{
zhuanjiao++;
Delayms(20);
}
/*******************************************************************************
* 函 数 名 :DuojiRight
* 函数功能 :舵机上升
* 输 入 :无
* 输 出 :无
*******************************************************************************/
void DuojiRight()
{
zhuanjiao--;
Delayms(20);
}
//void DuojiLeft()
//{
// zhuanjiao = 230;
// Delayms(300);
//}
/*******************************************************************************
* 函 数 名 :DuojiRight
* 函数功能 :舵机相关动作
* 输 入 :无
* 输 出 :无
*******************************************************************************/
void Duoji() //舵机动作函数
{
int i;
zhuanjiao=100;
CarStop();
for(i=0;i<110;i++)
{
DuojiMid(); //zhuanjiao ++ 向下压
}
for(i=0;i<110;i++)
{
DuojiRight(); //zhuanjiao -- 向上抬起
}
}
/*******************************************************************************
* 函 数 名 :search
* 函数功能 :小车处理摄像头发送的坐标,根据不同情况执行不同功能
* 输 入 :无
* 输 出 :无
*******************************************************************************/
void search()
{
if(Turn_Flag==1)
{
if(x_pos_last == x_pos)
{
CarRight();
}
}
else{
if(x_pos>200)
{
CarRight(); //修正转右
}
else if(x_pos<120)
{
CarLeft(); //修正转左
}
else if(120<x_pos && x_pos<200) //x坐标在区间内
{
if(y_pos<150) //y坐标bu在区间内
{
CarBack(); //go straight,wrong name
}
if(y_pos>180)
{
CarGo(); //go backwards,wrong name
}
else if(150<y_pos && y_pos<180 )
{
if(VOID_R_IO==BARRIER_Y||VOID_M_IO==BARRIER_Y||VOID_L_IO==BARRIER_Y)
Delayms(10);
if(VOID_R_IO==BARRIER_Y||VOID_M_IO==BARRIER_Y||VOID_L_IO==BARRIER_Y)
Duoji();
}
}
}
if( (x_pos_last - x_pos) > 50 || (x_pos_last - x_pos) < -50 )
{
CarRight();
} //比较x轴与前一次值避免两球同时判断混乱
x_pos_last=x_pos;
y_pos_last=y_pos; //记录上一次的坐标
}
/*******************************************************************************
* 函 数 名 :TurnBack
* 函数功能 :小车强制右转(适用于红外避障)
* 输 入 :无
* 输 出 :无
*******************************************************************************/
void TurnBack()
{
CarRight();
Delayms(1000);
}
/*******************************************************************************
* 函 数 名 :main
* 函数功能 :主函数
* 输 入 :无
* 输 出 :无
*******************************************************************************/
int main(void)
{
unsigned int i;
delay_init();
GPIOCLKInit();
UserLEDInit();
LCD1602Init();
IRCtrolInit();
TIM2_Init();
TIM5_Init();
MotorInit();
//UltraSoundInit();
RedRayInit();
ServoInit();
USART1Conf(9600);
USART3Conf(9600);
Delayms(500);
for(i=0;i<3;i++)
{
DataBuf_x[i]=0x30;
DataBuf_y[i]=0x30;
}
/******************************************************************************************/
while(1)
{
if(tick_5ms >= 5)
{
tick_5ms = 0;
tick_200ms++;
if(tick_200ms >= 40)
{
tick_200ms = 0;
LEDToggle(LED_PIN);
}
continue_time--;//200ms 无接收指令就停车
if(continue_time == 0)
{
continue_time = 1;
CarStop();
}
LCD1602WriteCamData();
x_pos=(DataBuf_x[0]-0x30)*100+(DataBuf_x[1]-0x30)*10+(DataBuf_x[2]-0x30);
y_pos=(DataBuf_y[0]-0x30)*100+(DataBuf_y[1]-0x30)*10+(DataBuf_y[2]-0x30);
if(Cam_key==1)
{
search();
}
if(VOID_R_IO==BARRIER_Y||VOID_M_IO==BARRIER_Y||VOID_L_IO==BARRIER_Y)
{
Delayms(10);
if (VOID_R_IO==BARRIER_Y && VOID_M_IO==BARRIER_Y && VOID_L_IO==BARRIER_Y) //检测前方是不是墙,是的话就掉头
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
小车V6.1.7z
(618.95 KB, 下载次数: 54)
2019-6-5 21:32 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
湘知权
时间:
2020-6-18 11:26
谢谢 分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1