带有2个LDRS的Arduino控制伺服器

时间:2019-10-17 20:31:43

标签: arduino servo

我试图让伺服器朝最亮的光源方向移动,并在它们彼此相等时停止,但是我一直遇到问题。它似乎只是随机移动,有时几乎不起作用。

我尝试设置范围(如果它们彼此在此范围内)。我尝试将LDR值四舍五入到最接近的100,这虽然有帮助,但是它仍然提交过多。我试图摆脱所有延迟功能,以防万一他们弄乱了它,但随后它开始在整个地方抽动。更改我正在使用的电阻器的值(当前为220欧姆,但尝试了其他电阻器,没有效果)。

google.cloud.datastore.entity.Entity

目标是使伺服器朝最亮的光源方向旋转,并在指向它时停止。但是相反,它只是使看起来似乎是随机的运动。有时,它几乎无法工作约一秒钟,然后又恢复到随机运动。

1 个答案:

答案 0 :(得分:0)

我看到两个大问题,

  1. 是这一行:

    if(leftRoundedValue> rightRoundedValue){     myServo.write(0);   }   否则if(leftRoundedValue

如果光的一侧比另一侧更亮,则您要告诉它完全移动。从您的描述看来,您真正想要做的只是稍微移动一下并再次测试灯。如果灯在位置120,则此代码永远找不到。它将转到180,看到灯光在左侧,然后转到0,看到灯光在右侧,然后转到180。它将永远无法转到任何其他位置。

更糟糕的是,如果它确实找到了灯光并且两个值相等,则您不会告诉它停留在那儿,而是告诉它移动到92,这又一次可能不是灯光所在的位置。

另一个是这一行:

leftRoundedValue = 100*((leftAnalogValue + 50) / 100); 

如果模拟值大于277,则第一部分可能会溢出。由于所有内容都为int,因此数学将以16位带符号数学进行,而100 * 328将溢出并为int并给出负数。改为这样:

leftRoundedValue = 100ul*((leftAnalogValue + 50) / 100); 

这将强制将右侧处理为32位无符号。它不会溢出,然后结果应该适合一个int值。