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
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? ...
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.
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).
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?
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
Ich denke, wir sollten Ludwigs Antwort abwarten, bevor wir weitere Basics vermitteln. Aber vielleicht ist er ja inzwischen bei www.hausaufgaben.de gelandet. ...
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 ;-)
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.
> 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.
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.
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...
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
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.
Ö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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.