Aktionen

BP

BP:Astronomiezeiger

Aus Physik und ihre Didaktik Wiki


In diesem Projekt soll ein Zeiger gebaut werden, der die aktuelle Position verschiedener astronomischer Objekte am Himmel anzeigt. Der Zeiger besteht aus insgesamt drei 180°-Servomotoren, zwei Motoren steuern den Azimut des Objektes an und der dritte Motor den Höhenwinkel. Die Winkel eines Objektes werden mit einem Python-Program ermittelt und mit Hilfe eines Arduinos an die entsprechenden Servomotoren übermittelt.

Kompletter Aufbau des Astronomiezeigers verbunden mit Arduino und Laptop


Benötigtes Material

Folgende Materialien werden benötigt:

  • Zeiger (möglicherweiße selbstbauen)
  • Arduino Uno
  • kleines Steckbrett
  • 9 längere Steckbrückenkabel (für Verbindung von Servomotoren mit dem Arduino)
  • USB-B zu USB Kabel (für die Verbindung von Arduino mit dem Laptop)
  • Laptop zum Programmieren
  • Arduino IDE (Link zur Arduino Software)
  • Programm um mit Python zu arbeiten (Beispielsweise Jupyter)
  • Laserdiode (optional)


Aufbauanleitung

Genauere Beschreibung des Versuchsaufbaus. Hier können auch einzelne Schritte beschrieben werden. Gerne zu jedem Schritt Bilder einfügen.

Schritt 1
Als erstes werden die Servomotoren mittels der Steckbrückenkabel (wie in der Skizze....Skizze wird noch nachgeliefert) mit dem Arduino verkabelt. Anschließend den Arduino mit dem Laptop verbinden.
Schritt 2
Über die Software Arduino IDE muss als nächstes Firmata auf den Arduino geladen werden. Dazu über File/Examples/Firmata die Datei StandardFirmata aufrufen und auf den Arduino hochladen. Dieser Arduino-Sketch dient dazu, dass die Servomotoren mit Python angesteuert werden können.
Schritt 3
Servomotoren in den 3D-Druck einfügen und alles zusammenbauen. Dabei auf eine einheitliche Ausrichtung nach Norden achten. (Bild)
Schritt 4
Über Python den unten angegebenen Code einfügen, eventuell anpassen. Eingabe der Sterne oder Planeten, die man sehen möchte (darauf achten, ob man sie über den Code ansteuren kann).
Schritt 5
Eventuell Laserdiode in den Zeiger einbauen.


Aufbauanleitung Zeiger

Der Zeiger, in dem hier beschrieben Projekt, besteht aus vier 3D-gedruckten Bauteilen, einer [Bodenplatte], einer [Servobox], einem [Arm] und einem [Pfeil], und drei 180°-Servomotoren mit passenden Servohörnern.

ACHTUNG
Beim Einbauen der Servos, darauf achten, dass diese sich in der Nullstellung befinden.
Schritt 1
Als erstes werden die Servohörner so an die Unterseiten vom Pfeil, dem Arm und der Servobox verklebt, dass die Servohörner über die vorgesehenen Löcher in den Bauteilen mit einer Schraube an den Servos geschraubt werden können.
Schritt 2
Nun wird ein Servo, so in der Bodenplatte eingesetzt und verklebt, dass die Drehachse des Servos im Mittelpunkt der Bodenplatte liegt. Anschließend wird die Servobox auf dem Servo in der Bodenplatte so platziert und verschraubt, dass die Servobox genau über dem Servo liegt.
Schritt 3
Ein weitere Servo wird dann in die Servobox so eingesetzt und verklebt, dass das Anschlusskabel durch die vorgesehene seitliche Öffnung liegt. Der letzte Servo wird so im Loch am Arm verklebt, dass das Anschlusskabel des Servos nach unten zeigt.
Schritt 4
Den Pfeil nun so an den Servo am Arm schrauben, dass dieser nach unten zeigt. Den Arm mit dem Servo in der Servobox so verschrauben, dass bei einer Ausrichtung Richtung Norden, der Arm nach Westen zeigt. (siehe Bild)


Nahaufnahme des Zeigers um die Position des Arms in den Nullstellungen des Servomotors zu zeigen.

Versuchsdurchführung

Achte auf eine saubere Eingabe der Namen der Himmelsobjekte (hier kleingeschrieben und auf englisch). Verwende einen Laser mit möglichst wenig Leistung und stecke ihn am besten erst am Ende an, sodass er nicht im Raum herumstrahlt.

Programmcode

Im Nachfolgenden ist der komplette Programmcode zur Ausrichtung des Pfeils aufgeführt:

import pyfirmata
import time
import astropy.units as u
import astropy.coordinates as coord
from astropy.coordinates import AltAz, EarthLocation, SkyCoord, solar_system_ephemeris
from astropy.time import Time
from datetime import datetime


standort = EarthLocation(lat=48.7758*u.deg, lon=9.1829*u.deg, height=260*u.m)   # Hier müssen der Breiten- und Längengrad vom aktuellen Standort in Grad angegeben werden (Aktuell Stuttgart)
time1 = Time(datetime.now(), format='datetime')                                 # Zeit aus dem PC
timeUTC = datetime.utcnow()

'Einrichten des Arduinos'
port = 'COM5'
board = pyfirmata.Arduino(port)

'Einrichten der Servo'
PinAlt = 9              #Servo für den Höhenwinkel
PinAz1  = 10            #oberer Servo für Azimut
PinAz2  = 11            #unterer Servo für Azimut
horizont = 88           #Ausgangsposition für den Winkel des Altitude-Servos, damit der Horizont=0° ist

ServoAlt = board.get_pin(f'd:{PinAlt}:s')
ServoAz1  = board.get_pin(f'd:{PinAz1}:s')
ServoAz2  = board.get_pin(f'd:{PinAz2}:s')

'Funktionen, die die Servos bewegen'
def rotate_alt(angle):               #Rotiert Altitude-Servo
    if angle >= 88:
        for i in range(horizont, angle+1):
            ServoAlt.write(i)
            time.sleep(0.015)        #Rotationsgeschwindigkeit, je größer die Zeit, umso langsamer rotiert der Servo
    else:
        for i in reversed(range(angle, horizont+1)):
            ServoAlt.write(i)
            time.sleep(0.015)

def reverse_alt(angle):              # Rotiert den Altitude-Servo wieder auf die Höhe des Horizonts
    if angle >= 88:
        for i in reversed(range(horizont, angle+1)):
            ServoAlt.write(i)
            time.sleep(0.015)        #Rotationsgeschwindigkeit, je größer die Zeit, umso langsamer rotiert der Servo
    else:
        for i in range(angle, horizont+1):
            ServoAlt.write(i)
            time.sleep(0.015)
            
def rotate_az(angle):                #Rotiert den Azimut-Servo in gewünschte Position
    if angle < 180:
        angleS1 = angle
        angleS2 = 0
    elif angle >= 180:
        angleS1 = 179
        angleS2 = angle - 179
    for i in range(angleS1 +1):
        ServoAz1.write(i)
        time.sleep(0.015)
    for j in range(angleS2 +1):
        ServoAz2.write(j)
        time.sleep(0.015)           #Rotationsgeschwindigkeit, je größer die Zeit, umso langsamer rotieren die Servos
    
def reverse_az(angle):              # Rotiert die Azimut-Servo wieder nach Norden      
    if angle < 180:
        angleS1 = angle
        angleS2 = 0
    elif angle >= 180:
        angleS1 = 179
        angleS2 = angle - 179
    for i in reversed(range(angleS1 +1)):
        ServoAz1.write(i)
        time.sleep(0.015)
    for j in reversed(range(angleS2 +1)):
        ServoAz2.write(j)
        time.sleep(0.015)

def ausrichten(variable):           #Abfrage was Angezeigt werden soll und durchführen der Rotationen
    i=0
    j=0
    try:
        while i==0:
            objekt = str(input("Bitte eingeben ob Planet (Eingabe 'Planet') oder Objekt aus SIMBAD (Eingabe 'SIMBAD') beobachtet werden soll:"))
            if objekt == 'Planet' :
                while j==0:
                    obj = str(input("Bitte Planetenname eingeben (engl. & kleingeschrieben):"))
                    if obj in solar_system_ephemeris.bodies:
                        body = coord.get_body(obj, time1)
                        j=j+1
                    else:
                        print("Falsche Eingabe. Bitte erneut eingeben")
                i = i+1
            elif objekt == 'SIMBAD' :
                obj = str(input("Bitte SIMBAD-identifier eingeben:"))
                body = SkyCoord.from_name(obj)
                i = i+1
                
        bodyaltaz = body.transform_to(AltAz(obstime=timeUTC, location=standort))
        altitude = int(bodyaltaz.alt.deg)
        azimuth = 360 - int(bodyaltaz.az.deg)
        rotate_alt(horizont + altitude)
        rotate_az(azimuth)
        
        print(f"Im Horizontsystem lauten die Koordinaten für das Objekt {obj}:")
        print(f"Der Höhenwinkel beträgt {altitude}°.")
        print(f"Das Azimut beträgt {int(bodyaltaz.az.deg)}°")
        reset = str(input("Soll ein weiteres Objekt betrachtet werden?(y/n):"))
        if reset == 'y':
            reverse_alt(altitude + horizont)
            reverse_az(azimuth)
            ausrichten(0)
        elif reset =='n':
            reverse_alt(altitude + horizont)
            reverse_az(azimuth)
            board.exit()
        
    except :
        board.exit()
 
'Mit dem folgendem Kommando wird das Program gestartet'
'Den Servo für den Höhenwinkel auf den Horizont ausrichten(0°)'

rotate_alt(horizont)
rotate_az(0)
ausrichten(0)


Mögliche Probleme und ihre Lösungen

Es werden hier 3 Servomotoren mit 180° benutzt, 2 für die horizontale Achse und einer für die vertikale Achse, für eine genauere Ansteuerung der Himmelsobjekte. Bei einem 360° Motor treten Probleme auf: - Er lässt sich nur über die Drehgeschwindigkeit und Zeitdauer in eine Richtung steuern. Diese sind nicht immer gleich und hängen von der Spannung ab, die der Arduino bekommt. - D.h. es können keinen genaue Winkel angesteuert werden und die Ausgangsposition ändert sich. Deswegen ist hier zu einem 360° Motor abzuraten.

Der Augbau kann etwas wackeln, wenn die Motoren sich bewegen. Hierzu entweder den Aufbau befestigen, ein Gegengewicht anfügen oder ihn groß genug drucken lassen.


Fotos

  • slide 1
        Kompletter Aufbau des Astronomozeigers.
    
  • slide 2
         Nahaufnahme des Astronomiezeigers.
    
88x31.png Universität Stuttgart, 5. Physikalisches Institut, AG Physik und ihre Didaktik, lizenziert unter CC BY-NC-SA 4.0