Servos不会因为卡在其他功能中而跟踪人脸

时间:2020-01-18 20:50:22

标签: python arduino servo

我的代码很简单,当Serial.available()等于0时,意味着没有数据通过,执行函数 something()。但是,当Serial.read()获得任何其他数字时,这意味着检测到面部,应该停止执行功能 something(),并开始跟踪面部,然后执行功能 track()。

当我运行代码,并且相机没有检测到脸部时,它会按照我想要的方式进行操作,从而使伺服器来回旋转。但是一旦伺服器检测到人脸,伺服器就会忽略与人脸一起移动,并继续运行 something()函数。

如何在检测到人脸时让它跟随我的脸,然后在没有检测到人脸时返回来回旋转。如果我放弃了 something()函数,则代码可以正常工作,并且舵机相对于我的脸部位置进行移动。但是,当我添加 something()函数时,即使检测到人脸也不会离开该函数。

*。ino

var_list

*。py

#include <Servo.h> 

Servo servoVer; //Vertical Servo
Servo servoHor; //Horizontal Servo
int x;
int y;
int prevX;
int prevY;
int pos = 0;


void setup()
{
  Serial.begin(9600);
  servoVer.attach(5); //Attach Vertical Servo to Pin 5
  servoHor.attach(6); //Attach Horizontal Servo to Pin 6
  servoVer.write(90);
  servoHor.write(90);
} 

void Pos()
{
  if (prevX != x || prevY != y)
  {
    int servoX = map(x, 450, 0, 0, 180);
    int servoY = map(y, 450, 0, 180, 0);
    servoX = min(servoX, 180);
    servoX = max(servoX, 0);
    servoY = min(servoY, 180);
    servoY = max(servoY, 0);
    servoHor.write(servoX);
    servoVer.write(servoY);
  }
}

void something(){
   for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    servoHor.write(pos);              // tell servo to go to position in variable 'pos'
    delay(5);                       // waits 15ms for the servo to reach the position
  }
}

void track(){
    if(Serial.available() > 0);
    {
      if (Serial.read() == 'X')
      {
        x = Serial.parseInt();
        if (Serial.read() == 'Y')
        {
          y = Serial.parseInt();
          Pos();
        }
      }
      while (Serial.available() > 0)
      {
        Serial.read();
      }
    }
  }

void loop()
{
  if ( ! Serial.available() ) 
  {
    something();
  }
  else
  {
    track();
  }
}





1 个答案:

答案 0 :(得分:1)

我发现您的代码存在多个问题。

  1. 它将始终返回到something(),因为您的arduino代码比python代码运行得更快,因此您的arduino检查Serial.available()的频率要高于python代码可以输出新字符的次数。因此,当在缓冲区中看不到新字符时,它将返回到something()。最后,请尝试在track()函数中添加一个小的延迟以解决此问题。

  2. 您永远不会更新prevXprevY,因此每次都会执行if (prevX != x || prevY != y)。还有这部分 servoX = min(servoX, 180); servoX = max(servoX, 0); servoY = min(servoY, 180); servoY = max(servoY, 0);

    实际上什么也没做,它将始终输出serveoXservoY

  3. 的原始值

但是要找出执行python代码所需的时间,并添加比track()函数中更长的延迟。