2014-03-19 65 views
0

我做一个家庭项目只是为了好玩,我很熟悉Arduino,但我知道基本知识。Arduino项目 - LDR和伺服电机同步和旋转

我创建了一个自动百叶帘,它在黑暗时打开,在明亮时关闭。

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

im使用:

Arduino的UNO R3/ 连续伺服电机/ LED/ LDR(光传感器)/ 10K电阻/

此代码为一个标准伺服电机。我希望它能够连续使用伺服电机,因为您可以“更好地控制它”和我拥有的那个。

我想我需要一个if语句是这样的:

如果光传感器检测暗然后旋转伺服马达到一定程度,然后停止 如果光传感器探测到光然后旋转伺服电机一定程度然后停下来。

#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

使用连续伺服电机时,放弃位置信息。 (有关详细信息,请参见此Polou页面。)这意味着除非您还添加了限位开关,否则您将无法知道百叶窗何时到达其打开/关闭位置。如果你使用开关,那么连续伺服就可以工作。一个更好的解决方案可能是一个小齿轮箱步进电机like this one from AdaFruit。他们有扭矩,但他们比连续舵更慢

关键是你不想让电机持续通电(这是标准伺服器如何保持位置)。这太浪费了,一天到晚都会像百叶窗应用程序一样烧毁电机。您希望它执行任务,然后在循环()中等待状态(应用程序中的亮度级别)更改。因此,您需要跟踪最后一个灯光级别,然后在循环()中检查当前灯光级别是否不同(并且大于您必须通过测试确定的某个阈值),然后更改百叶窗的状态并存储最后一级。

+0

您可能希望查看步进电机系统而不是伺服器。我已经使用hal efffet传感器来确定连接到连续伺服电机的物品的位置。百叶窗中的磁铁 – alexmac