Forum: Mikrocontroller und Digitale Elektronik Solarnachfolgung mit 2 Servos in C


von Ludwig Pott (Gast)


Lesenswert?

Hallo,

für die Schule muss mein Team im Rahmen eines Projektes
Solarnachfolgung über einen Microcontroller realisieren. Zum Schluss
soll ein Modell einer Lichtquelle in x- und z-Richtung folgen,also
rechts und links schwenken und sich hoch und runter bewegen.

Für die Bewegungungen sorgen 2 Servos. Die Position der Lichtquelle
Wird durch 3 Photowiederstände bestimmt, von denen für die x- und
z-Richtung je 2 verglichen werden. Die werte gehen vorher durch den AD
Wandler. Die Servos sollen über die Ports 2.0-2.7 angesteuert werden,
wobei 2.0-2.3 schon ausreichen, oder?  Der Microcontroller mit dem wir
arbeiten heißt 80c51 und ist auf irgend einem Board befestigt.

Ich hab dummerweise wenig Ahnung vom Programmieren und nachdem meine
Lösungsversuche kläglich gescheitert sind läuft mir die Zeit so langsam
aus. Darum schreib ich jetzt hier um etwas Hilfe zu erbitten.

Das Problem ist nicht das Einlesen der daten, sondern die Steuerung der
Servos. Die Bsp-Programme hier hab ich mir angeschaut, aber ich komm
damit nicht klar.

Danke im Voraus
Ludwig

von Hannes L. (hannes)


Lesenswert?

Kennst du denn wenigstens die Eckdaten zur Ansteuerung eines Servos?

Also weißt du, auf welche Art man die Daten (die Position, wo das Servo
hinfahren soll) zum Servo überträgt?

...

von mr.chip (Gast)


Lesenswert?

Du solltest vielleicht etwas genauer sage, was_ du schon hast und _wo
es jetzt genau klemmt. Sonst kann man dir kaum helfen ;-)

Für Probleme mit den Servos: Schau z.B. mal ins Roboternetz.de, im Wiki
haben die AFAIK einen guten Beitrag, wie man die ansteuert.

von der inoffizielle WM-Rahul (Gast)


Lesenswert?

Die Aufgabe in Teilaufgaben aufteilen und die Teilaufgaben lösen und
dann zusamenführen.
Eine Aufgabe sind die AD-Wandler, eine andere die Servo-Steuerung.
Mich würde der bisherige Stand interessieren.
Die Aufgabe selbst ist tirvial (auch "Pippifax" genannt).

von thkais (Gast)


Lesenswert?

Jep, nicht schwer. Zeig mal, was Du bislang hast, wo es genau klemmt.
Ohne Eigeninitiative wirst Du es aber schwer haben hier, wir machen
nicht gerne Hausaufgaben ;)
Nur so als Tipp: Servos werden mit Impulsen angesteuert. Also brauchst
Du nur 2 Portpins, nicht 4.
Wie oft wird der A/D-Wandler abgefragt? Soll nur jede Minute eine
Aktualisierung stattfinden oder in schnelleren / langsameren Abständen?
In welcher Sprache wird programmiert?

von Sven Johannes (Gast)


Lesenswert?

Moin...

Hm, kenn ich doch das Problem.
Bei 8(4) vorgesehenen Pins würde ich allerdings mal drauf tippen das
ihr Schrittmotoren habt? Wäre ein bischen komplexer in der
Ansteuerung.

Servos (zumindestens die aus dem Modellbau) orientieren sich
ausschließlich an der Breite des Steuerimpulses. 1ms ist das Minimum,
2ms Maximum, 1,5ms die Mittelstellung. Dieser Impuls sollte dann auch
mal wiederholt werden, 20ms soll wohl allgemein akzeptabel sein.
Zauberworte sind Timer, Countern und Comparator. Damit ist es möglich
diese Signale zu generieren, ein 8051 sollte da was haben.

Mach dich mal dran einen 1,5ms Impuls gezielt per Timer/Counter zu
erzeugen. Dann die Länge verändern und zum Abschluß die Pause.
Kontrolle per Oszi! NICHT gleich den Servon dranklemmen. Einige haben
drastisch selbstmörderische Absichten wenn die Signale nicht stimmen!
Wenn das einlesen der Daten schon klappt ist der Rest danach ein
Selbstgänger.
--
 SJ

von Hannes L. (hannes)


Lesenswert?

Ich denke, wir sollten Ludwigs Antwort abwarten, bevor wir weitere
Basics vermitteln.

Aber vielleicht ist er ja inzwischen bei www.hausaufgaben.de gelandet.

...

von Marcel (Gast)


Lesenswert?

Schöne Arbeit, sowas änliches musste ich mit einem Freund allerdings mit
einer WebCam und MatLab realisieren. Lichtquelle musste die Sonne sein.
Matlab bildete die Sonne ab mit Mittelpunkt-Koordinaten. Beim schwenken
der WebCam wurde die "Bewegung der Sonne aufgezeichnet"
Ein anderes Team sollte die Daten verarbeiten und mit Servos der Sonne
Nachfahren so wie du. Hat aber glaub nicht so gut geklappt bei denen
;-)

von Ludwig Pott (Gast)


Lesenswert?

Also, ich versuch mal alle noch offenen fragen zu beantworten.

Bis gerade eben war ich mit der Servosteuerung noch auf dem Holzweg,
jetzt denk Ich hab ich es verstanden. Allerdings gehen vom Servo 3
Kabel ab, ich hab keine Ahnung wie man die anschließt, ist aber auch
nicht mein Problem.

Was ich bis jetzt habe: Ich hab 3 Unterprogramme geschrieben die
jeweils einen Photowiederstandswert digitalisiert zurück geben. Ich
habe meinen Code nicht hier, aber die sehen etwa so aus:

#include <adda.c>
extern unsigned char ain(unsigned char);

unsigned char  PW1()
{
unsigned char wert;
wert=ain(0);
return wert;
}

Im Hauptprogramm werden die Werte in Variablen gespeichert, damit die
Werte sich nicht so schnell aktualisieren, danach werden 2 mal 2 dieser
Werte verglichen und das ergebnis in 2 Variablen gespeichert.

Soweit bin ich, was fehlt ist dass sich die Servos bewegen, und zwar
ein vordefiniertes Stück, danach sollen alle Werte erneut Ausgelesen
und Verglichen werden und die Servos bewegt werden. Ich vermute, dass
sich die Platte mit den Photowiederständen so Ständig bewegt, aber das
ist egal.

Das gesammte Projekt wurde in einen Hardware, einen Software und einen
Modellbauteil eingeteil, der Hardwareteil welcher aus dem Bau einer
Schrittmotorsteuerung bestand wurde verworfen, stattdessen benutzen wir
jetzt Servos, das Modell ist soweit ich weis fertig. Der Softwareteil
ist meine Aufgabe, den Hab ich in 3 Teile eingeteilt
1. Werte einlesen
2. Werte Vergleichen und Zeit berechnen
3. Motor steuern

Das mit den 2 Portpins ist richtig, war mein Fehler, es ist auch
Tatsächlich ein Servo, programier wird in micro c.

von Karl heinz B. (kbucheg)


Lesenswert?

> Allerdings gehen vom Servo 3 Kabel ab,

eines davon ist rot. Das ist +
ein anderes ist entweder gelb oder weiss: da kommt dein Signal drauf
das dritte ist entweder braun oder schwarz: da ist -

Ich denke du hast einen Denkfehler:
So ein Servo will ständig Pulse haben! Das heist du
brauchst einen Programmteil der laufend Pulse an das
Servo schickt. Dazu benutzt du einen Timer, der Timer
greift in seiner Programmierung ständig auf eine globale
Variable zu und erzeugt daraus einen Puls mit einer
definierten Länge der (auf der gelben Leitung) zum Servo
geschickt wird.

Der Teil 'Motor steuern' beschränkt sich dann einfach nur
darauf, in diese globale Variable neue Werte hinein zu
schreiben. Die Timer-Logik arbeitet den dann völlig
selbstständig in das Puls-Telegramm zum Servo ein.

So. Und jetzt durchsuchst du nochmal das Forum um Beiträge
zu finden, wie man den Timer aufsetzt und wie die Interrupt-
Funktionen aussehen müssen, damit das gewünschte
Impulstelegramm entsteht. Genau diese Fragestellung taucht
im Mittel geschätzte 2 mal pro Woche auf.

von Karl heinz B. (kbucheg)


Lesenswert?

zb. ist dieser Thread

http://www.mikrocontroller.net/forum/read-1-321320.html#new

schon ganz gut.
Wenn wir der guten Steffi das alles beibringen konnten,
dann wirst du das auch schaffen.

von der inoffizielle WM-Rahul (Gast)


Lesenswert?

Noch ein paar Vereinfachungen:
Den AD-Wandler kann man erst mal mit einem Poti stimulieren. Damit kann
man dann die AD-Wandlungsfunktion ausprobieren.
(LED bei über- oder unterschreiten eines bestimten Wertes ein- oder
ausschalten).
Das kann man dann auch mit dem Foto-Sensor ausprobieren (Spannung des
gewünschten Schaltpunktes messen und dann in den Vergleichswert
umrechnen...)
Die Verfolgung der Lichtquelle kann man dann erst mal auf eine
Dimension beschränken.

Die Aufgabe ist sooo einfach (aus meiner Sicht)...
Übrigens haben Widerstände etwas mit "dagegen" und nichts mit "und
noch einmal" zutun...

von Ludwig Pott (Gast)


Lesenswert?

Ich gebs jetzt auf, Morgen ist Abgabe, in den letzten Stunden hab ich
Versucht die Timer-Interrupts zu verstehen und mir die DA-Wandler Sache
nochmal genau angeschaut. Ich bin jetzt noch viel verwirrter als vorher.
Es ist halt zu viel um alles auf einmal zu SChaffen, hab hier auch keine
gescheite Entwicklungsumgebung, eigentlich nur einen Editor mit
Syntaxhighlighting und das Board oder einen Oszi hab ich genau so wenig
hier. Aber ist egal, ist ja nicht euer Problem. Ich wollt nur allen
Danken die mir geantwortet haben und sagen dass das hier erledigt ist.

Allerdings hab ich ein gewisses Interesse an der Sache gewonnen, Morgen
gibts die letzten Noten bei mir, wenn es dann etwas weniger Stressig ist
beschäfftige ich mich vielleicht mit dem Thema und versuch mich nochmal
daran.

Tschüss

von Profi (Gast)


Lesenswert?

Willst Du jetzt aufgeben??
Das ganze Programm sind vielleicht 10 Zeilen.

Ich weiß jetzt nicht, ob Dein µC Prescaler und cascadierbare Zähler hat
und PWM hat, wenn ja, dann beschreibst Du 5 Register, und die Hardware
macht die komplette Servoansteuerung (ohne Interrupts).

Dann brauchst Du nur noch den ADC auslesen, den Wert anpassen und ins
PWM-Register schreiben, das war's.

Mein Vorschlag ist, Du setzt Dich jetzt 1-2 Stunden hin und gemeinsam
hacken wir das rein.

von thkais (Gast)


Lesenswert?

Öhm - ich weiß ja nicht, was Du von einer Entwicklungsumgebung
erwartest. Aber ein Editor mit Syntax-Highlighting ist schon Luxus ;)
Ich kann Dir nur raten: Bleib am Ball. Schreib doch mal, was Du bislang
verstanden hast und was genau nicht.

von MikroMan (Gast)


Lesenswert?

Hallo,

mich wundert es, daß der optische Sensor aus DREI Lichtempfindlichen
Zellen besteht. Mit der Zahl 3 macht man sich das Leben doch nur
unnötig schwer, weil man ständig mit Winkelfunktionen eine
Koordinatentransformation durchführen muß.

Ich würde vier Sensoren an den Ecken eines Quadrats nehmen und davor
eine Kreuzschlitzblende. (Genauso einen Sensor zum Solartracken habe
ich in der Praxis schon gesehen.) Dann wird erst die eine Achse
nachgeführt und anschließend die andere, bis die Flächennormale auf die
Sonne zeigt.

von der inoffizielle WM-Rahul (Gast)


Lesenswert?

Wenn man nur drei benutzt, und diese im Winkel von 90° anordnet, dann
ist die Auswertung ziemlich simpel:
Einer der drei ist für die übrigen beiden der ezugspunkt. Einer der
übrigen beiden ist seitlich zum Bezugssensor angeordnet, der andere
über oder unter dem Bezugssensor.
Jetzt muß man "nur" die Sensoren so aussrichten, dass zwei Optima
eingestellt werden. Fertig ist die Laube.
Wenn man der Sache noch eine Hysterese verpasst, dann "zappelt" der
Aufbau auch nicht so doll...
Schade, dass Ihr Euch erst so spät ans Forum gewandt habt, anderen
Schülergruppen konnten wir schon besser helfen.

von Karl H. (kbuchegg)


Lesenswert?

Noch ein Tip (auch wenn es jetzt schon zu spät ist)

Die Hardware muss bei Zeiten fertig werden. Man kann
Software-Entwicklung im Simulator vorbereiten. Aber
irgendwann kommt immer der Sprung ins kalte Wasser
und dann muss das Programm auf der echten Hardware
laufen. Vom Zeitpunkt an dem die Hardware das erste
mal aktiviert wird, bis zum endgültigen Programm ist
normalerweise noch ein weiter Weg.
Und mehr Spass macht es ausserdem, wenn sich da was
Reales rührt.

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.