Ein 2 Servo Problem

Hallo zusammen, ich bastel gerade an einer Servosteuerung, die über nen Fotowiderstand gesteuert werden soll. Die Problematik liegt darin, das 2 Servos über eine Lichtquelle angesteuert werden sollen. Heist bei Licht an passiert gar nix, Servos bleiben in ihrer vorher definierten Grundstellung. Beim ersten mal Licht ausschalten soll Servo 1 eine andere Stellung anfahren und dort bleiben. Nach einem erneuten einschalten wechselt die Schaltung zu Servo 2, der nach einer vorgegeben Anzahl an Aus.- und Einschaltungen des Lichtes(Anzahl sollte einstellbar sein) ebenfalls in seine andere Stellung fährt.
Der eine funktioniert ja schon, beim anderen dachte ich an einen Zähler der nach Einstellung Servo 2 schaltet. Leider bin ich wohl zu blöd dafür. Hat jemand eine verständliche lösung für mich? Danke schonmal im Voraus.


#include <Servo.h>

Servo myservo_1;
Servo myservo_2;

int photosensor_voltage;


#define PIN_PHOTO_SENSOR  A6        // Eingang Fotowiderstand
#define PIN_SERVO_1         3         // Servo PWM D3
#define PIN_SERVO_2         5         // Servo PWM D5
#define PIN_LED           13        // Platinen LED

#define INPUT_VOLTAGE_RELEASE     400   // Haltewiderstand
#define INPUT_VOLTAGE_HOLD        100    // Freigabewiderstand

#define SERVO_1_POSITION_RELEASE      150    // Servo Rechts Armstellung für halten und Freigabe
#define SERVO_1_POSITION_HOLD         90
#define SERVO_2_POSITION_RELEASE      30    // Servo Links Armstellung für halten und Freigabe
#define SERVO_2_POSITION_HOLD         90

void setup()
{
  pinMode(PIN_PHOTO_SENSOR, INPUT);
  pinMode(PIN_LED, OUTPUT);


     
	myservo_1.attach(PIN_SERVO_1);
  myservo_2.attach(PIN_SERVO_2);

    // definierte Servopositionen 
  
  digitalWrite(PIN_LED,LOW);
  myservo_1.write(SERVO_1_POSITION_HOLD);
  myservo_2.write(SERVO_2_POSITION_HOLD);
}

void loop()
{
  photosensor_voltage = analogRead(PIN_PHOTO_SENSOR); 
  Serial.println(photosensor_voltage);


  if (photosensor_voltage < INPUT_VOLTAGE_RELEASE)
  {
      digitalWrite(PIN_LED,HIGH);
      myservo_1.write(SERVO_1_POSITION_RELEASE);
  }
  else if (photosensor_voltage >= INPUT_VOLTAGE_HOLD)
  {
      digitalWrite(PIN_LED,LOW);
      myservo_1.write(SERVO_1_POSITION_HOLD);
  }
  
delay(100);

if (photosensor_voltage < INPUT_VOLTAGE_RELEASE)
  {
      digitalWrite(PIN_LED,HIGH);
      myservo_2.write(SERVO_2_POSITION_RELEASE);
  }
  else if (photosensor_voltage >= INPUT_VOLTAGE_HOLD)
  {
      digitalWrite(PIN_LED,LOW);
      myservo_2.write(SERVO_2_POSITION_HOLD);
  }
  
delay(100);
  
}

Was sagt die Serielle?

Als erstes würde ich fragen wo ist das 2.Servo im Porg :wink:

Willkommen im Forum!

Bei zwei Servos würde ich auch zwei Pindefinitionen und zwei Instanzen von Servo erwarten. Außerdem sehe ich keinen Zähler für die Anzahl. Hilfreich wäre eine Variable, die den aktuellen Zustand des Systems abbildet und je nach Ereignis verändert wird (Stichwort state machine)

Hatte ich versucht einzubauen ging aber nicht und der code war zerschossen, musste dann wieder bei hier anfangen

Dann schreibe doch Deine Logik erstmal ohne Servo nur auf die serielle Schnittstelle. Wenn das tut, ergänzt du die später.

habs jetzt etwas ergänzt....bei der Abfrage komm ich nicht weiter

also für mich sieht das aus du möchtest eine State Machine.
Dazu definierst du dir welche Status es gibt, und wodurch man von einem Status in den anderen kommt.

Bisher hast du ca so etwas textlich beschrieben:

Jetzt kann man das noch kritisch würdigen und feststellen, was beim letzten Lichtwechsel zu ein mit Servo 1 passieren soll, weil aktuell würde der in StellungA verharren.

Kann man aber mittels State Machine ändern.
Und übersichtlich ist es meines erachtens auch.

Hab ich das richtig verstanden?
Dann müsste jetzt bei jedem Mal Licht aus, irgendwas passieren.

#include <Servo.h>

Servo myservo_1;
Servo myservo_2;

constexpr byte PIN_PHOTO_SENSOR  {A6};        // Eingang Fotowiderstand
constexpr byte PIN_SERVO_1         {3};         // Servo PWM D3
constexpr byte PIN_SERVO_2         {5};         // Servo PWM D5
constexpr byte PIN_LED           {13};        // Platinen LED

constexpr uint16_t INPUT_VOLTAGE_RELEASE     {400};   // Haltewiderstand
constexpr uint16_t INPUT_VOLTAGE_HOLD        {100};    // Freigabewiderstand

constexpr uint16_t SERVO_1_POSITION_RELEASE      {150};    // Servo Rechts Armstellung für halten und Freigabe
constexpr uint16_t SERVO_1_POSITION_HOLD         {90};
constexpr uint16_t SERVO_2_POSITION_RELEASE      {30};    // Servo Links Armstellung für halten und Freigabe
constexpr uint16_t SERVO_2_POSITION_HOLD         {90};


uint16_t photosensor_voltage;


byte switchStep;
constexpr bool an {HIGH};
constexpr bool aus {!an};

void setup()
{
  pinMode(PIN_PHOTO_SENSOR, INPUT);
  pinMode(PIN_LED, OUTPUT);
  myservo_1.attach(PIN_SERVO_1);
  myservo_2.attach(PIN_SERVO_2);
  // definierte Servopositionen
  digitalWrite(PIN_LED, aus);
  myservo_1.write(SERVO_1_POSITION_HOLD);
  myservo_2.write(SERVO_2_POSITION_HOLD);
}

void loop()
{
  photosensor_voltage = analogRead(PIN_PHOTO_SENSOR);
  Serial.println(photosensor_voltage);
  if (digitalRead(PIN_LED) == aus)
  {
    if (photosensor_voltage < INPUT_VOLTAGE_RELEASE)
    {
      digitalWrite(PIN_LED, an);
    }
  }
  else if (photosensor_voltage >= INPUT_VOLTAGE_HOLD)
  {
    digitalWrite(PIN_LED, aus);
    switchStep++;
  }
  switch (switchStep)
  {
    case 1:
      myservo_1.write(SERVO_1_POSITION_RELEASE);
      break;
    case 2:
      myservo_1.write(SERVO_1_POSITION_HOLD);
      break;
    case 3:
      myservo_2.write(SERVO_2_POSITION_RELEASE);
      break;
    case 4:
      myservo_2.write(SERVO_2_POSITION_HOLD);
      break;
    default:
      switchStep = 0;
      break;
  }
}

Wenn jetzt in dem Diagramm noch zu sehen wäre, wann der Wert von n verändert wird, könnte ich es eventuell sogar verstehen.

Wo hast du die Skizze gemacht? Gib mir mal ein Programmnamen, dann mal ich das auch mal auf....

Das Problem ist folgendes, ich muss mit 1nem Licht das ich aus und einschalten kann 2 verschiedene Servos dazu bewegen eine Bewegung aus zu führen....beim einschalten der Schaltung müssen beide Servos in Hold Position bleiben, beim 1. Licht ausschalten der 1. Servo eine Bewegung machen, aber der 2. Servo darf die Bewegung erst nach dem 3. oder definierten Wert die bewegung machen.

Ich will wissen, ob der Code etwas macht und ob Du das beschreiben kannst.
Was dann daraus wird, schaun wa ma.
Das nennt sich dann Schrittkette - oder wie an anderer Stelle erwähnt StateMachine.

mit meiner Variante vom FSM Coder: FSM Coder

1x Licht aus löst die Schaltstellung beim 1. Servo aus. Mehrmals Licht aus(definierbarer Wert) löst den 2. Servo aus.

Nochmal: Ich will wissen, was MEIN Code macht, wenn DU den bei Dir einspielst und den Sensor auslöst.

Entschuldige bitte.....hab ich jetzt erst gerafft was du meinst.......sorry.
Hab aber gerade ein anderes Problem....

avrdude: ser_open(): can't set com-state for "\.\COM9"
Fehlgeschlagenes Hochladen: Hochladefehler: exit status 1

Ich hab's mal gebaut - mit einem Uno, also A5 statt A6 für den Photowiderstand und einem delay(500) in der loop():

1 Like

Die Meldung lässt darauf schliessen, dass der port belegt ist.
Was ist das für ein UNO? Zeig mal Link.

Ich kann das nicht testen - aber ich vertraut drauf, dass Du das getestet hast und es zumindest irgendwas macht :slight_smile:

Bin noch unterwegs....