Forum: Mikrocontroller und Digitale Elektronik Schulprojekt, Servo nur max. 180° drehen


von Gabriel T. (Gast)


Lesenswert?

Hallo zusammen :)

Ich bin für die Berufsschule an einem Projekt. Es geht um einen 
Solartracker, welcher ich jetzt programmiert habe. Dies funktioniert. 
Doch ich habe leider noch keine 360° Servos. Nur 180°. Und wenn die 
Servos an einen bestimmten Punkt angelangt sind, möchten sie eigentlich 
noch weiterdrehen, doch dies geht nicht, weils ja nur 180° Servos sind. 
Wie kann ich jetzt im Script festlegen, dass sich diese nur maximal 180° 
drehen?

Danke für eure Hilfe!

lg Gabriel

Hier ist noch der Code.


#include <Servo.h> // include Servo library

Servo horizontal; // horizontal servo
int servoh = 90; // stand horizontal servo

Servo vertical; // vertical servo
int servov = 90; // stand vertical servo

// LDR pin connections
// name = analogpin;
int ldrlt = 0; //LDR top left
int ldrrt = 1; //LDR top rigt
int ldrld = 2; //LDR down left
int ldrrd = 3; //ldr down rigt

void setup()
{
  Serial.begin(9600);
// servo connections
// name.attacht(pin);
  horizontal.attach(9);
  vertical.attach(10);
}

void loop()
{
  int lt = analogRead(ldrlt); // top left
  int rt = analogRead(ldrrt); // top right
  int ld = analogRead(ldrld); // down left
  int rd = analogRead(ldrrd); // down rigt

  int dtime = analogRead(4)/20; // read potentiometers
int tol = analogRead(5)/4;

int avt = (lt + rt) / 2; // average value top
int avd = (ld + rd) / 2; // average value down
int avl = (lt + ld) / 2; // average value left
int avr = (rt + rd) / 2; // average value right

int dvert = avt - avd; // check the diffirence of up and down
int dhoriz = avl - avr;// check the diffirence og left and rigt

if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the 
tolerance else change vertical angle
{
if (avt > avd)
{
servov = ++servov;
if (servov > 180)
{
servov = 180;
}
}
else if (avt < avd)
{
servov= --servov;
if (servov < 0)
{
servov = 0;
}
}
vertical.write(servov);
}

if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in 
the tolerance else change horizontal angle
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < 0)
{
servoh = 0;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > 180)
{
servoh = 180;
}
}
else if (avl == avr)
{
// nothing
}
horizontal.write(servoh);
}
delay(dtime);
}

von Viktor B. (coldlogic)


Lesenswert?

Ich nehme mal an, das Ganze ist in einem Arduino implementiert worden? 
Da kenn ich mich nicht so gut aus, aber: du übermittelst an dein Servo 
keinen Winkel, sondern einen Puls einer bestimmten Länge. Heißt also, du 
müsstest am Oszi nachschauen, ob dein Puls länger als 2ms und/oder 
kürzer als 1ms ist und per UART o.Ä. die Variablen servoh/servov 
ausgeben. So wie es aussieht, sind diese in deinem Code schon begrenzt.

Und schau mal in der Library Servo.c, ob es da Defines gibt, an denen 
man etwas schrauben könnte. Verschiedene Servos haben leicht 
unterschiedliche Standards, was das Verhältnis Pulseweite zu Winkel 
angeht.

MfG, Viktor

von Harald W. (wilhelms)


Lesenswert?

Gabriel T. schrieb:

> Doch ich habe leider noch keine 360° Servos. Nur 180°.

Kannst Du keine mechanische Übersetzung machen?

von Gabriel T. (Gast)


Lesenswert?

Ja ich arbeite mit Arduino. Danke dir für deine Antwort! Das werde ich 
mir mal anschauen:

lg Gabriel

von Gabriel T. (Gast)


Lesenswert?

Harald W. schrieb:
> Gabriel T. schrieb:
>
>> Doch ich habe leider noch keine 360° Servos. Nur 180°.
>
> Kannst Du keine mechanische Übersetzung machen?

Doch, das kommt noch, doch zuerst gehts mal um einen Vor-Prototyp, bei 
dem nur der Code funktionieren muss^^

von Stefan F. (Gast)


Lesenswert?

Gemäß der Anleitung
https://www.arduino.cc/en/Reference/Servo
gibst du bei der write() Funktion vom Servo den Winkel im Bereich 0 bis 
180 an. Wie du da hin kommst, ist reine Mathematik.

Bedenke, dass Modellbau Servos analog arbeiten. Da verhält sich jeder 
ein bisschen anders. Vielleicht kannst du nur den Bereich von 5 bis 175 
ausnutzen.

Auf den ersten Blick sehe diese Fragemente schonmal nicht schlecht aus:
1
if (servoh < 0)
2
{
3
    servoh = 0;
4
}
5
6
if (servoh > 180)
7
{
8
    servoh = 180;
9
}
Hast du das kopiert oder selbst geschrieben?

Vielleicht stehen die Befehle an der falschen Stelle oder du musst den 
Winkel noch weiter einschränken. Aber so schlecht, wie dein Programm da 
oben formatiert ist, mag ich gar nicht genauer rein schauen.

Bevor du demnächst Quelltext postest, lies die Anleitung vom Forum. Sie 
erscheint direkt über dem Eingabefeld.

Anleitungen lesen hilft darauf muss man seltsamerweise immer öfter 
hinweisen. Warum nur?

von Paul B. (paul_baumann)


Lesenswert?

Stefan U. schrieb:
> Anleitungen lesen hilft darauf muss man seltsamerweise immer öfter
> hinweisen. Warum nur?

Warum? Da hilft nur das Lesen der Anleitung: "Wie verstehe ich 
Anleitungen richtig?"

SCNR
Paul

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.