由于之前写了一篇openmv与stm32串口通讯的博客,恰巧最近又突发奇想,想做一个用openmv视觉控制舵机转动的程序,于是便花了一个下午写成了这个代码,尝试用hal库完成代码的编写
以下内容包括:
- 所需要的元器件
- 整体思路
- 接线方式
- 完成效果
- Cube配置
- 代码解析
- 遇到的问题
- 总结
所需要的元器件
- stm32单片机
- stlink
- openmv
- 舵机
- 导线若干
整体思路
- 先编写openmv的代码,实现特定颜色识别,并把坐标值通过串口发送出去;
- 之后在cube上配置相关stm32的初始化设置,并生成代码;
- 在keil里编写串口中断接收函数,将串口1用于接收openmv发送来的数据,并编写舵机控制程序;
- 烧录程序实现效果,并改进出现的问题。
接线方式
- stm32通过uart1与openmv连接
- stm32通过sw与stlink连接
- stm32通过GND、VCC、PWM口连接舵机
完成效果
openmv识别特定颜色的物体,并把其坐标发送给stm32,单片机读取后控制舵机转动,实现定向跟随效果。
Cube配置
- 串口
2. 定时器
代码解析
- openmv颜色识别及坐标发送
import sensor, image, time
from pyb import UART
import json
threshold = [(6, 16, 19, 63, 4, 25)]
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000 )
sensor.set_auto_whitebal(False)
clock = time.clock()
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位、
while(True):
clock.tick()
img = sensor.snapshot()
blob = img.find_blobs(threshold, area_threshold=300)
if blob: #如果找到了目标颜色
FH = bytearray([0xb3,0xb4])
uart.write(FH)
for b in blob:
#迭代找到的目标颜色区域
img.draw_cross(b[5], b[6]) # cx, cy
img.draw_edges(b.min_corners(), color=(0,255,0))
x = b.cx()
y = b.cy()
data = bytearray([x,y])
uart.write(data)
end = bytearray([0x01,0x01,0xb5,0xb6])
uart.write(end)
- stm32串口中断接收
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //opmv-receive
{
if(huart==&huart1)
{
HAL_UART_Receive_IT(&huart1,&my_re_buf1[++pt_w1],1);
trans(my_re_buf1[pt_w1]);
}
}
- 舵机控制函数
void measure(void)
{
if(m>6){
if(x<130&&x>10){
if(servo_angle<90){
servo_angle+=5;
MG996R_Set_Angle(servo_angle); //SERVO
}
}else if(x>170&&x<300){
if(servo_angle>-90){
servo_angle-=5;
MG996R_Set_Angle(servo_angle); //SERVO
}
}
m=0;
}
m++;
}
- 数据帧头判断部分代码
static int state = 0;
if(state==0&&data==0xb3)
{
state=1;
opmvdata[0]=data;
}
else if(state==1&&data==0xb4)
{
state=2;
opmvdata[1]=data;
}
- 数据帧尾不符清除部分
else if(data != 0xb6)
{
state = 0;
for(i=0;i<8;i++)
{
opmvdata[i]=0x00;
}
}
遇到的问题
舵机控制的时候容易跑偏,后面发现是openmv代码里颜色识别容易对摄像头内多对象进行颜色识别,传回来的数据就会波动较大,因此改变了颜色识别的阈值,实现了较为稳定的颜色识别舵机跟随效果
总结
写程序的时候要注意多方面的问题,不能仅仅考虑当下的问题,因此经验总结很重要,不能忽视。