arduino软硬件问题

专家,帮我看看这段代码,为啥舵机只能转两个方向

#include <Servo.h>

// 定义舵机引脚
Servo myservo;
int servoPin = 10;

// 定义光敏电阻引脚
int ldrPins[] = {A0, A1, A2, A3};
int numLDRs = 4;
int ldrValues[4];

// 太阳能板追踪函数
void trackSun() {
  // 获取光敏电阻读数
  for(int i=0; i<numLDRs; i++) {
    ldrValues[i] = analogRead(ldrPins[i]);
  }

  // 计算最大值所在的角度
  int maxValIdx = 0;
  int maxVal = 0;
  for(int i=0; i<numLDRs; i++) {
    if(ldrValues[i] > maxVal) {
      maxVal = ldrValues[i];
      maxValIdx = i;
    }
  }

  // 根据最大值所在的角度控制舵机
  int angle;
  switch(maxValIdx) {
    case 0:
      angle = 0; // 0°角度
      break;
    case 1:
      angle = 45; // 45°角度
      break;
    case 2:
      angle = 90; // 90°角度
      break;
    case 3:
      angle = 135; // 135°角度
      break;
  }
  myservo.write(angle); // 控制舵机旋转到目标角度


  Serial.print("LDR values: ");
  for(int i=0; i<numLDRs; i++) {
    Serial.print(ldrValues[i]);
    Serial.print(", ");
  }
  Serial.print("Target angle: ");
  Serial.println(angle);

  delay(1000); // 
}


void setup() {
  myservo.attach(servoPin);
  myservo.write(90); // 
  Serial.begin(9600);
}
void loop() {
  trackSun(); 
}


我有四个光敏电阻依次隔了45°,我想舵机转向光强最大值的方向,但是始终只能转向四个方向中的两个方向,剩下两个方向有ldr的值变化,但是target angle不变。每个光敏电阻我都串联了一个电阻

  • 以下回答由chatgpt基于相关博客总结生成:

    这个问题的根源在于舵机只能转向四个方向中的两个方向,大概率是由于舵机连续旋转功能的限制(Arduino servo库默认是连续旋转模式)。同时,串联了电阻的光敏电阻可能导致阻值变化而不能完全准确地测量光强度。解决方案如下:

    1. 舵机不能转向四个方向中的两个方向的问题:可以尝试使用Arduino Servo库中的writeMicroseconds()函数来精确控制舵机旋转的角度,需要得到最大延迟时间和最小延迟时间的值,具体可以使用示波器测量两个方向电压波形的周期和占空比,根据信号周期和占空比计算得到延迟时间值。

    2. 光敏电阻的阻值变化问题:可以尝试增加数字电位器进行调节和校准,找到一个合适的电位器阻值,来补偿电阻变化所带来的误差。此外,可以尝试使用光电二极管和光敏三极管来替代光敏电阻进行测量,它们对光的变化更加敏感和准确。

    3. 另外,还可以尝试使用槽型光