Arduino项目 - LDR和ServoMotor同步和旋转

时间:2014-03-19 18:31:58

标签: arduino sensor light motordriver

我正在做一个家庭项目只是为了好玩而我是Arduino的新手,但我知道基础知识。

我正在创建一个自动百叶窗,它会在天黑时打开,在明亮时关闭。

因此,当光线传感器检测到黑暗时,百叶帘的板条将旋转到打开位置,当光线传感器检测到光线时,旋转到关闭位置。

我正在使用:

arduino uno r3 / 连续伺服电机/ LED/ LDR(光传感器)/ 10k电阻/

此代码适用于标准伺服电机。我希望它能够与连续伺服电机一起工作,因为你可以“更好地控制它”和我的那个。

我想我需要这样的if语句:

如果光传感器检测到黑暗,则将伺服电机a旋转到一定程度,然后停止 如果光传感器检测到光线,则将伺服电机旋转到一定程度,然后停止。

#include <Servo.h>

Servo servo1;

int sensorPin = A0;            // select the input pin for the ldr
int ledPin = 13;  
unsigned int sensorValue = 0;
int servoPin = 9;
int pos = 0;

void setup()
{
  //Start Serial port
  Serial.begin(9600);        // start serial for output - for testing
  servo1.attach(9);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  // For DEBUGGING - Print out our data, uncomment the lines below
  Serial.print("Cell = ");     // print the value (0 to 1024)
  Serial.println(analogRead(sensorPin));                   // print carriage return  

  pos = analogRead(sensorPin);
  pos = constrain (pos, 0, 1023);

  int servoPos = map(pos, 0, 1023, 255, 0);
  int servoDegree = map(servoPos, 255, 0, 0, 179);

  servo1.write(servoDegree);
  Serial.print("Servo Degree = ");
  Serial.println(servoDegree);


  int val = analogRead(sensorPin);
  val = constrain (val, 0, 1023);

  int ledLevel = map(val, 0, 1023, 255, 0);
  analogWrite (ledPin, ledLevel);  

  delay(50);  
}   

1 个答案:

答案 0 :(得分:1)

使用连续伺服电机,您可以放弃位置信息。 (有关详细信息,请参阅此Polou页面。)这意味着您不知道百叶窗何时到达打开/关闭位置,除非您还添加限位开关。如果你使用开关,那么连续伺服将起作用。更好的解决方案可能是小型齿轮箱步进电机like this one from AdaFruit。它们具有扭矩,但它们比连续伺服机构慢得多。

关键是你不想连续给电机充电(这就是标准伺服系统保持位置的方式)。这很浪费,每天都会像百叶窗应用那样烧坏电机。您希望它执行任务然后在循环()中等待状态(应用程序中的亮度级别)发生更改。因此,您需要跟踪最后一个亮度级别,然后在循环()中检查当前光照水平是否不同(并且大于某个阈值,您必须通过测试确定),然后更改百叶窗的状态并存储最后一级。