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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Gabriel T. (gt_111)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Gabriel T. schrieb:

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

Kannst Du keine mechanische Übersetzung machen?

von Gabriel T. (gt_111)


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

lg Gabriel

von Gabriel T. (gt_111)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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?

: Bearbeitet durch User
von Paul B. (paul_baumann)


Bewertung
-1 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.