• 星瞳AI VISION软件内测!可以离线标注,训练,并生成OpenMV的模型。可以替代edge impulse https://forum.singtown.com/topic/8206
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • openMV通过串口向arduino传输信号,如果arduino启用I2C结果是串口用不了。



    • openMv的代码

      import sensor, image, time
      import json
      from pid import PID
      from pyb import Servo
      from pyb import UART
      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QQVGA)
      sensor.skip_frames(10)
      sensor.set_auto_whitebal(False)
      clock = time.clock()
      uart = UART(1, 9600)
      green_threshold   = (98, 42, -17, 2, -34, -14)
      size_threshold = 2000
      x_pid = PID(p=0.5, i=1, imax=100)
      h_pid = PID(p=0.05, i=0.1, imax=50)
      def find_max(blobs):
      	max_size=0
      	for blob in blobs:
      		if blob[2]*blob[3] > max_size:
      			max_blob=blob
      			max_size = blob[2]*blob[3]
      	return max_blob
      while(True):
      	clock.tick()
      	img = sensor.snapshot()
      	blobs = img.find_blobs([green_threshold])
      	if blobs:
      		max_blob = find_max(blobs)
      		x_error = max_blob[5]-img.width()/2
      		h_error = max_blob[2]*max_blob[3]-size_threshold
      		print("x error: ", x_error)
      		img.draw_rectangle(max_blob[0:4])
      		img.draw_cross(max_blob[5], max_blob[6])
      		x_output=x_pid.get_pid(x_error,1)
      		h_output=h_pid.get_pid(h_error,1)
      		pcx=-h_output-x_output
      		pcy=-h_output+x_output
      		data={
      		"cx":pcx,
      		"cy":pcy}
      		data_out = json.dumps(data)
      		uart.write(data_out +'\n')
      	else:
      		data={
      		"cx":50,
      		"cy":-50}
      		data_out = json.dumps(data)
      		uart.write(data_out +'\n')
      

      arduino的代码

      #include <Wire.h>
      #include "QGPMaker_MotorShield.h"
      #include <ArduinoJson.h>
      
      QGPMaker_MotorShield AFMS = QGPMaker_MotorShield();
      //QGPMaker_Servo *Servo4 = AFMS.getServo(3);
      QGPMaker_DCMotor *DCMotor_2 = AFMS.getMotor(2);
      QGPMaker_DCMotor *DCMotor_4 = AFMS.getMotor(4);
      QGPMaker_DCMotor *DCMotor_1 = AFMS.getMotor(1);
      QGPMaker_DCMotor *DCMotor_3 = AFMS.getMotor(3);
      
      volatile int cx=0;
      volatile int cy=0;
      volatile char z=0;
      String json="";
      
      float leftspeed=0;
      float rightspeed=0;
      
      void setup(){
        AFMS.begin(50);
        Serial2.begin(9600);
        Serial.begin(9600);
      }
      
      void loop(){
        if (Serial2.available() > 0) 
         {
          z = char(Serial2.read());
          json = String(json) + String(z);
          if (z == '}')
           {
            DynamicJsonDocument doc(200); //声明一个JsonDocument对象
            deserializeJson(doc, json);
            JsonObject obj = doc.as<JsonObject>();
            float cx = doc["cx"];
            float cy = doc["cy"];
            if (cx!=0&&cy!=0)
             {
              leftspeed=cx;
              rightspeed=cy;
              Serial.print("cx = ");
              Serial.print(cx);
              Serial.print("cy = ");
              Serial.println(cy);
              }
              json = "";
            }
          }
         //run1(leftspeed,rightspeed);
         if (leftspeed < 0){
          DCMotor_1->run(BACKWARD);
          DCMotor_2->run(BACKWARD);
        }else{
          DCMotor_1->run(FORWARD);
          DCMotor_2->run(FORWARD);}
          DCMotor_1->setSpeed(int(abs(leftspeed)));
          DCMotor_2->setSpeed(int(abs(leftspeed)));
        if (rightspeed < 0){
          DCMotor_3->run(BACKWARD);
          DCMotor_4->run(BACKWARD);
      }else{
          DCMotor_3->run(FORWARD);
          DCMotor_4->run(FORWARD);
      }
          DCMotor_3->setSpeed(int(abs(rightspeed)));
          DCMotor_4->setSpeed(int(abs(rightspeed)));
      }
      


    • 我没看懂,你的意思是Arduno上I2C和uart冲突?看上去是Arduino的问题,而不是OpenMV的问题。