做网站模板平台,python网站开发入门,兼职做Ppt代抄论文的网站,0基础做网站用什么语言文章目录 一、任务清单1. 硬件部分2. 软件部分 二、OpenMV巡线三、舵机转向四、停止线识别五、技术交流 一、任务清单
1. 硬件部分
主控板#xff1a; MSP432P401R数据显示#xff1a; OLED电机#xff1a; 霍尔编码器电机电池#xff1a; 7.3V航模电池巡线#xff1a; … 文章目录 一、任务清单1. 硬件部分2. 软件部分 二、OpenMV巡线三、舵机转向四、停止线识别五、技术交流 一、任务清单
1. 硬件部分
主控板 MSP432P401R数据显示 OLED电机 霍尔编码器电机电池 7.3V航模电池巡线 OpenMV H7 Plus警报 蜂鸣器电机驱动 TB6612仪器 3D打印机视觉云台 3D建模打印转向 数字舵机其他 铜柱、螺丝螺母、开关、面包板等。
2. 软件部分
编译器 Keil、OpenMV IDE建模软件 SketchUp Pro 2022切片软件 Cura编程方式 库函数编程语言 C、Python
二、OpenMV巡线
这里巡线不用红外探头的原因是考虑到市面上大多红外对该虚线采集的信号并不是很准确存在偶然因素故选择摄像头巡线。
这里我通过寻找有效区域内的最大色块将其x轴坐标返回给单片机在单片机端进行数据处理例如摄像头下的分辨率为w:320,h:240设感应区域ROI为(0,90,320,60) 采集到的有效色块X坐标为162下图可见被圈出的大白框矩形为感应区域ROI中间被圈出的为最大有效色块图中色块阈值选择为黑色下方红色圈出的为该色块的X轴坐标。 获取目标色块
img sensor.snapshot() //截取摄像头的一个图像
blobimg.find_blobs([thresholds[0]], roiROI1, x_stride10, y_stride5,pixels_threshold10, area_threshold10, mergeTrue) 筛选出最大色块
def find_max(blobs):max_size0for blob in blobs:if blob[2]*blob[3] max_size:max_blobblobmax_size blob[2]*blob[3]return max_blob输出最大色块X坐标
xmax_ID.cx()将有效色块坐标发送至单片机端后该怎样对数据进行处理呢 方法一 例如采集到的坐标为140可知中心坐标为160已速度闭环为例可先将坐标差值Err140-160-20可拟定为负值为偏左正值为偏右假如你的闭环在每10ms单相双边沿产生15个脉冲信号可设定一个线性系数k有Err/kP,Err2Err_Last-ErrI,则Target_L15PI,Target_R15-PI,Target_L和Target_R则为计算后的目标脉冲具体公式推导这里不做介绍仅供参考 方法二 这种方法也是更为简单更为方便的。 对色块的X坐标进行区域划分例如中线为160则 ①中心区域可划分为150170 ②偏左区域可划分为120150、90120、6090、3060、030 ③偏右区域可划分为170200、200230、230260、260290、290320 即可根据不同位置发送不同指令。单片机段根据不同指令执行不同程度的回正操作。
示例如下 def Send_X(err):if(err150 and err170):uart.write(F)elif(err120 and err150):uart.write(0)elif(err90 and err120):uart.write(1)elif(err60 and err90):uart.write(2)elif(err30 and err60):uart.write(3)elif(err0 and err30):uart.write(4)elif(err170 and err200):uart.write(5)elif(err200 and err230):uart.write(6)elif(err230 and err260):uart.write(7)elif(err260 and err290):uart.write(8)elif(err290 and err320):uart.write(9)其中Err表示踩到的X坐标根据不同坐标区域发送不同指令在单片机端接收操作如下 if( openmv_rxF ){} //偏向左边else if( openmv_rx0 ){}else if( openmv_rx1 ){}else if( openmv_rx2 ){}......//偏向右边else if( openmv_rx5 ){}else if( openmv_rx6 ){}......三、舵机转向
舵机转向问题在学习较为常用的为180°舵机这里我以180°数字舵机进行简单介绍
常用的舵机大多都分为3根线其中俩根为VCC和GND也就是电源线剩下一根为信号线也就是控制舵机的线
舵机控制 关于舵机的控制说的通俗易懂点就是控制信号线的脉宽通过控制不同脉冲舵机转动不同角度如下所示 20ms为例0.5ms ------------ 0度1.0ms ------------ 45度1.5ms ------------ 90度2.0ms ------------ 135度2.5ms ------------ 180度设一个PWM周期为20ms则控制有效电平为0.5ms也就是一百分之一的时候舵机保持0°依次类推。 实时转向 可根据上面巡线返回的信号进行转向如当接收到信号F时表示在中心区域则舵机保持直线行驶状态也就是90°若接收到1-4信号则舵机向左偏向120°、150°、180°等如接收到5-9信号则舵机向右偏向60°、30°、0°等。 舵机初始化 这里以定时器A0的通道三为例如下代码 /*初始化引脚*/MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6, GPIO_PRIMARY_MODULE_FUNCTION);Timer_A_PWMConfig TimA0_PWMConfig;/*定时器PWM初始化*/TimA0_PWMConfig.clockSource TIMER_A_CLOCKSOURCE_SMCLK; //时钟源TimA0_PWMConfig.clockSourceDivider psc; //时钟分频 范围1-64TimA0_PWMConfig.timerPeriod ccr0; //自动重装载值ARRTimA0_PWMConfig.compareRegister TIMER_A_CAPTURECOMPARE_REGISTER_3; //通道三TimA0_PWMConfig.compareOutputMode TIMER_A_OUTPUTMODE_TOGGLE_SET; //输出模式 MAP_Timer_A_generatePWM(TIMER_A0_BASE, TimA0_PWMConfig); /* 初始化比较寄存器以产生 PWM1 */ 角度控制
void SG90_angle(int a)
{int pwm5002000/180*a;MAP_Timer_A_setCompareValue(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_3, pwm);
} 四、停止线识别
方法一 通过判断有效色块的面积或者宽度因为在巡线中都是1cm1cm的虚线组成而停止线为5cm1cm所以可通过色块的面积或者宽度等其他因素进行识别返回停止信号。
wmax_ID.w()
if w80:uart.write(S)方法二 因为整个赛图小车走的路程是固定的则也可用通过小车走的路程进行停止。
if(sum1)
{Stop();PID_SetPoint(L_pid,0);PID_SetPoint(R_pid,0);
}五、技术交流
疑难解答或技术交流联系下方wx即可