当前位置:   article > 正文

OpenMV与STM32实现通信(包成功的)_stm32与openmv通信

stm32与openmv通信

目录

实验结果展示

1.1OpenMV端

1.2STM32端

1.3硬件接线

Openmv端

2.1理论部分

2.2通信代码

2.3完整代码

STM32端

3.1理论部分

3.2完整代码


前言:我是想做一下OpenMV追踪目标颜色的二维云台,这其中通信是我去年电赛遇到的难题,现在我把它分享出来。

❗❗❗:源码链接链接:https://pan.baidu.com/s/1A-lwarGYlRM31pa8ZRnoXg?pwd=cyy6 
提取码:cyy6

实验结果展示

1.1OpenMV端

1.2STM32端

1.3硬件接线

OpenMV使用p4端口发送消息,且与32共地。32的GPIOA9连接串口工具的接收口RXD且与32共地,三个设备的电源单独给。

Openmv端

2.1理论部分

视觉的逻辑采用了番茄哥的思维(参考原文http://t.csdnimg.cn/yCY7s

将图像分为5部分区域,在不同的区域发送不同的数据信号。

2.2通信代码

❗:这里为什么要对字符串进行操作呢,是为了与STM32数据格式有一致结尾标识,STM32好判断数据发送是否结束

  1. def get_region_code(blob):
  2. x, y, w, h = blob[0:4]
  3. cx = blob[5]
  4. cy = blob[6]
  5. # 判断物体所在的区域
  6. if x_1 <= cx <= x_2 and y_1 <= cy <= y_2:
  7. data_to_send = "0"
  8. data_to_send_with_return = data_to_send + "\r\n"
  9. uart.write(data_to_send_with_return)
  10. return '0' # 中心区域
  11. elif cx < x_1 and cy < y_1:
  12. data_to_send = "1"
  13. data_to_send_with_return = data_to_send + "\r\n"
  14. uart.write(data_to_send_with_return)
  15. return '1' # 左上区域
  16. elif cx < x_1 and cy > y_2:
  17. data_to_send = "2"
  18. data_to_send_with_return = data_to_send + "\r\n"
  19. uart.write(data_to_send_with_return)
  20. return '2' # 左下区域
  21. elif cx > x_2 and cy < y_1:
  22. data_to_send = "3"
  23. data_to_send_with_return = data_to_send + "\r\n"
  24. uart.write(data_to_send_with_return)
  25. return '3' # 右上区域
  26. elif cx > x_2 and cy > y_2:
  27. data_to_send = "4"
  28. data_to_send_with_return = data_to_send + "\r\n"
  29. uart.write(data_to_send_with_return)
  30. return '4' # 右下区域

uart基本配置

  1. uart = UART(3, 115200)# 通信初始化配置
  2. uart.init(115200, bits=8, parity=None, stop=1)
2.3完整代码
  1. import sensor, image, time
  2. from pyb import UART
  3. CYY_threshold = (0, 100, -128, 127, 21, 127)
  4. #(100, 21, -128, 127, 33, 127)
  5. #(100, 0, -127, 127, 25, 127)
  6. #(20, 100, -128, 127, 5, 127)
  7. #(0, 100, -128, 127, 21, 127)
  8. uart = UART(3, 115200)# 通信初始化配置
  9. uart.init(115200, bits=8, parity=None, stop=1)
  10. sensor.reset() # 初始化摄像头
  11. sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
  12. sensor.set_framesize(sensor.QVGA) # 使用 QQVGA 速度快一些
  13. sensor.skip_frames(time=2000) # 跳过2000ms,使新设置生效,并自动调节白平衡
  14. sensor.set_auto_gain(False) # 关闭自动增益。在颜色识别中,一定要关闭白平衡。
  15. sensor.set_auto_whitebal(False) # 关闭白平衡。在颜色识别中,一定要关闭白平衡。
  16. clock = time.clock() # 追踪帧率
  17. def find_max(blobs):
  18. max_size = 0
  19. max_blob = None
  20. for blob in blobs:
  21. if blob.pixels() > max_size:
  22. max_blob = blob
  23. max_size = blob.pixels()
  24. return max_blob
  25. def get_region_code(blob):
  26. x, y, w, h = blob[0:4]
  27. cx = blob[5]
  28. cy = blob[6]
  29. # 判断物体所在的区域
  30. if x_1 <= cx <= x_2 and y_1 <= cy <= y_2:
  31. data_to_send = "0"
  32. data_to_send_with_return = data_to_send + "\r\n"
  33. uart.write(data_to_send_with_return)
  34. return '0' # 中心区域
  35. elif cx < x_1 and cy < y_1:
  36. data_to_send = "1"
  37. data_to_send_with_return = data_to_send + "\r\n"
  38. uart.write(data_to_send_with_return)
  39. return '1' # 左上区域
  40. elif cx < x_1 and cy > y_2:
  41. data_to_send = "2"
  42. data_to_send_with_return = data_to_send + "\r\n"
  43. uart.write(data_to_send_with_return)
  44. return '2' # 左下区域
  45. elif cx > x_2 and cy < y_1:
  46. data_to_send = "3"
  47. data_to_send_with_return = data_to_send + "\r\n"
  48. uart.write(data_to_send_with_return)
  49. return '3' # 右上区域
  50. elif cx > x_2 and cy > y_2:
  51. data_to_send = "4"
  52. data_to_send_with_return = data_to_send + "\r\n"
  53. uart.write(data_to_send_with_return)
  54. return '4' # 右下区域
  55. x_max = 320
  56. x_min = 0
  57. x_1 = 135 # 中心区域左边界
  58. x_2 = 175 # 中心区域右边界
  59. y_max = 240
  60. y_min = 0
  61. y_1 = 110 # 中心区域上边界
  62. y_2 = 130 # 中心区域下边界
  63. flag = 0 # 位置信息标志
  64. while(True):
  65. clock.tick() # Track elapsed milliseconds between snapshots().
  66. img = sensor.snapshot() # 从感光芯片获得一张图像
  67. blobs = img.find_blobs([CYY_threshold])
  68. if blobs:
  69. max_blob = find_max(blobs)
  70. img.draw_rectangle(max_blob[0:4]) # rect
  71. img.draw_cross(max_blob[5], max_blob[6]) # cx, cy
  72. flag = get_region_code(max_blob) # 获取区域代号
  73. print(clock.fps())
  74. print(f"Region Flag: {flag}")

STM32端

3.1理论部分

该部分代码采用的正点原子哥的代码改的,他的配置哪些我本人不懂,我直接用的他的工程改的主函数的代码

3.2完整代码
  1. #include "delay.h"
  2. #include "usart.h"
  3. #include "led.h"
  4. #include "key.h"
  5. int main(void)
  6. {
  7. u8 len;
  8. HAL_Init(); //初始化HAL库
  9. Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
  10. delay_init(72); //初始化延时函数
  11. uart_init(115200); //初始化串口
  12. LED_Init(); //初始化LED
  13. KEY_Init(); //初始化按键
  14. while(1)
  15. {
  16. if(USART_RX_STA&0x8000)
  17. {
  18. len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  19. printf("\r\n您发送的消息为:\r\n");
  20. HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据
  21. while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET); //等待发送结束
  22. printf("\r\n\r\n");//插入换行
  23. USART_RX_STA=0;
  24. }
  25. }
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/881108
推荐阅读
相关标签
  

闽ICP备14008679号