0

私は楽しみのためだけにホームプロジェクトを行っており、Arduinoにはかなり慣れていませんが、基本は知っています。

暗くなると開き、明るくなると閉じる自動ベネチアンブラインドを作成しています。

そのため、ベネチアン ブラインドのスラットは、光センサーが暗闇を検出すると開いた位置に回転し、光センサーが光を検出すると閉じた位置に回転します。

私は使用しています:

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);  
}   
4

1 に答える 1

1

連続サーボモーターを使用すると、位置情報が失われます。(詳細は、このPolouのページを参照してください。) これは、リミット スイッチも追加しない限り、ブラインドがいつ開閉位置に達したかがわからないことを意味します。スイッチを使用すると、連続サーボが機能します。より良い解決策は、AdaFruit のこのような小さなギアヘッド ステッピング モーターである可能性があります。トルクはありますが、連続サーボよりもはるかに低速です。

重要なことは、モーターに継続的に通電したくないということです (これは、標準的なサーボが位置を維持する方法です)。それは無駄であり、ブラインドアプリケーションのようなもので、毎日毎日モーターを焼き尽くします. タスクを実行してから、状態 (アプリの光レベル) が変化するまで loop() で待ちます。そのため、最後の光レベルを追跡する必要があり、次に loop() で現在の光レベルが異なるかどうか (および、テストを通じて決定する必要があるしきい値よりも大きいかどうか) を確認してから、ブラインドの状態を変更して保存します。その最後のレベル。

于 2014-03-20T01:14:46.627 に答える