pupillenmodulation

Hallo!

wir machen in der Schule gerade ein Projekt, bei dem wir die Pupille simulieren sollen.
Dabei haben wir in einem Karton einen Lichtabhängigenwiderstand, der mit dem Arduino verbunden ist. Vor dem Karton befestigen wir ein Stück Pappe an einem Servomotor. Je nachdem ob viel Licht oder wenig einfällt, muss die Pappe durch den Servomotor mehr oder weniger von der Karton-Öffnung verdecken.
Wir müssen einen LDR (also ein Potentiometer?), einen Servomotor und einen seriellen Monitor verwenden.
Ich habe ein Programm geschrieben (im anhang) und würde nun gerne wissen, ob es stimmt.
Es wäre toll wenn ihr mir sagen könntet, ob etwas fehlt oder falsch gedacht ist.

Vielen Dank!

Programminfo.odt (4.97 KB)

#include <Servo.h>                             //bibliothek zur ansteuerung von servomotor einbinden
Servo servoMotor;                             //erzeugt eine Servo-motor-objekt
int winkel =0;                               //variable die den winkel enthält

void setup()
{
  servoMotor.attach (9);                    //steuerleitung muss an pin 9 servoMotor
  pinMode (11, OUTPUT);                    //pin 11 als ausgang für die steuerung Potentiometer
  Serial.begin (9600);                     // serielle kommunikation mit rechner starten
}

void loop ()
{
  int PotiWert = analogRead (0);          //analogen Wert auslesen
  Serial.print ("Poti = ");                //auf dem seriellen Monitor ausgebn
  Serial.println (PotiWert);                //"
  delay (100);                             //warte 100ms
  int MotorWert = PotiWert /4;              // Für Motorsteuerung in Wertebereich 0 bis 255 anpassen
  analogWrite (9, MotorWert);              // auf analogen pin 9 schreiben
  if (PotiWert == 0)                      //wenn LDR 0
  {
    winkel = 0;                               
    servoMotor.write (winkel);                //servo motor auf 0°
  }
  if (PotiWert == 127)                    //wenn LDR 127
  {
    winkel = 22;
    servoMotor.write (winkel);                //servoMotor auf 22°
  }
  if (PotiWert == 255)                   //wenn LDR 255
  {
    winkel = 45;
    servoMotor.write (winkel);                //servoMotor auf 45°
  }
  if (PotiWert == 383)                   //wenn Ldr 383
  {
    winkel = 67;
    servoMotor.write (winkel);                //servoMotor auf 67°
  }
  if (PotiWert == 511)                   //wenn ldr auf 511
  {
    winkel = 90;
    servoMotor.write (winkel);                //servoMotor auf 90°
  }
  if (PotiWert == 639)                   //wenn ldr auf 639
  {
    winkel =112;
    servoMotor.write (winkel);                 //servoMotor auf 112°
  }
  if (PotiWert == 767)                   //wenn ldr auf 767
  {
    winkel = 135;
    servoMotor.write (winkel);                 //sevoMotor auf 135°
  }
  if (PotiWert == 895)                   //wenn ldr auf 895
  {
    winkel = 157;
    servoMotor.write (winkel);                 //servoMotor auf 157°
  }
  if (PotiWert == 1023)                  //wnn ldr auf 1023
  {
    winkel = 180;
    servoMotor.write (winkel);                 //servoMotor auf 180°
  }
}

Ich war mal so frei, den Sketch einfach mal hier reinzukopieren. Der Sketch wird wohl nicht so funktionieren, wie du dir das vorstellst: Zum einen fragst du einen Analogwert an Pin 0 ab, das dürfte wohl eher A0 sein. Den Wert über die serielle Schnittstelle auszugeben erfüllt ja schon mal einen Teil der Aufgabenstellung. Aber hast du tatsächlich ein Poti angeschlossen? Oder eher einen Spannungsteiler aus Festwiderstand und LDR? In dem Fall ist die Variablenbezeichnung Potiwert sehr ungünstig gewählt.
Das analogWrite erschließt sich mir nicht, an Pin 9 hängt doch der Servo, der über servoMotor.write angesteuert werden soll. Das versuchst du zumindest mit deinen if-Abfragen, wertest aber neben 0, 127, 255, 383, 511, 637, 967 und 1023 keine Zwischenwerte aus! Spricht irgendwas gegen die Nutzung der map()-Funktion?
Hast du noch den passenden Schaltplan bzw. ein Foto vom Aufbau parat?

Hallo,

vielen danke für die Antwort.
Wir schließen einen LDR an. Ich frage mich allerdings ob ich noch zusätzlich ein Potentiometer benötige.
Für einen Wert, den der LDR ermittelt hat, will ich eine Grad-zahl auf den Servomotor schreiben, der an Pin 9 hängt. Deshalb habe ich mit einzelne Werte des LDR rausgesucht und ihnen eine Grad-zahl zu geordnet. Da es hier aber wie gesagt keine Zwischenschritte gibt, ist das nicht günstig.
map() haben wir bis jetzt in der Schule nicht kennengelernt. Ich finde für diesen befehl leider nicht in den Referenzen erklärt.

http://arduino.cc/en/Reference/Map

Also wie beschrieben, baut man einen Spannungsteiler auf. Dazu braucht man den LDR (also einen lichtempfindlichen Widerstand) und einen zweiten Widerstand (hier kann man auch ein Poti als veränderbaren Widerstand) nehmen. Ich würde dir empfehlen, die Analogwerte für hell und dunkel probeweise zu ermitteln.
Anhand dieser Maximalwerte kannst du dann über die map()-Funktion den Drehwinkel einstellen.
Versuchs es erst einmal selbst, bei Fragen kannst du ruhig nochmal hier nachhaken.

Deine Aufgabe ist fast das gleiche wie das Beispiel: http://arduino.cc/en/Tutorial/Knob
Der Unterschied ist daß Du kein Potentiometer verwendest sondern einen Fotowiderstand (LDR) und einen Widerstand.
http://communityofrobots.com/tutorial/kawal/how-use-ldr-arduino

Du mußt nur die Parameter der Werteumformung mittels map() an Dein Projekt angleichen.
http://arduino.cc/en/Reference/Map

Jetzt hast Du alle Infos mit denen Du Dein Projekt realisieren kannst.

Viel Grüße Uwe

Danke für die antworten.
ich schau mal, ob es funktioniert.