2014-03-19 63 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