我的代码很简单,当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();
}
}
答案 0 :(得分:1)
我发现您的代码存在多个问题。
它将始终返回到something()
,因为您的arduino代码比python代码运行得更快,因此您的arduino检查Serial.available()
的频率要高于python代码可以输出新字符的次数。因此,当在缓冲区中看不到新字符时,它将返回到something()
。最后,请尝试在track()
函数中添加一个小的延迟以解决此问题。
您永远不会更新prevX
和prevY
,因此每次都会执行if (prevX != x || prevY != y)
。还有这部分
servoX = min(servoX, 180);
servoX = max(servoX, 0);
servoY = min(servoY, 180);
servoY = max(servoY, 0);
实际上什么也没做,它将始终输出serveoX
和servoY
但是要找出执行python代码所需的时间,并添加比track()
函数中更长的延迟。