arbeite gerade an einem Programm, dass auf einem ESP32 zwei Servos steuert. Dieses läuft richtig. Habe es dann (um es wie eine Bibliothek importieren zu können), als Klasse definiert, damit ich in einem anderen Programm ein Objekt davon erzeugen kann. Jetzt gibt es aber eine Fehlermeldung, die den (vorher laufenden) Funktionsaufruf innerhalb dieser neuen Klasse betrifft.
Code: Alles auswählen
from machine import Pin,PWM
import time
class Rotor:
# Konstruktor, default azPin = 33, elPin = 32
def __init__(self, azPin, elPin):
self.elevation = PWM(Pin(elPin, mode=Pin.OUT))
self.elevation.freq(50)
self.azimut = PWM(Pin(azPin, mode=Pin.OUT))
self.azimut.freq(50)
# Nullstellung
def nullstellung(self):
self.elevation.duty(22) # 0° Elevation
time.sleep(2)
self.azimut.duty(70) # Sueden = 90°-Stellung in Motorkoordinaten
print("Nullstellung: 0° Elevation, Azimuth = 180° Süden")
time.sleep(2)
# Umrechnung Winkel auf duty-Wert für MGG996R als Elevationsmotor
def elwinkel(self, x):
d = int(22+x/180*96)
#print("Elevation: "+ str(x)+"° / "+str(d))
return d
# Umrechnung Winkel auf duty-Wert für MGG996R als Azimutmotor
# mit Berücksichtigung der umgekehrten Drehrichtung
def azwinkel(self, x):
d = int(118-x/180*96)
#d = int(22+x/180*96)
#print("Azimut: "+str(x)+"° / "+str(d))
return d
# setze auf Position ohne Berücksichtigung von El<0 oder
# Azimutumrechnung, wird nur von pointTo(..) aufgerufen
def setTo(self, a,e):
self.azimut.duty(azwinkel(a))
time.sleep(1)
self.elevation.duty(elwinkel(e))
time.sleep(1)
# Ausrichtung auf Az, El für SatPosition
# mit "flipover": wenn az<90 oder az>270, dann Elevationüber 90°
# beim az immer 90° subtrahieren, da Motor im Osten 0°-Stellung hat
# wenn El < 0, dann zeigen auf (az,0)
def pointTo(self, az, el):
if el<0:
el = 0
if az<90:
a = az + 180-90
e = 180 - el
elif az > 270:
a = az - 180-90
e = 180 - el
else:
a = az-90
e = el
print("Az: "+str(a)+"° / "+str(azwinkel(a))+" // El: "+str(e)+"° / "+str(elwinkel(e)))
self.setTo(a,e)
# Testprogramm zum Test der o. a. Funktionen
def test(self):
self.nullstellung()
self.pointTo(35,-10)
self.pointTo(45,10)
self.pointTo(65,15)
self.pointTo(90,20)
self.pointTo(140,30)
self.pointTo(180,45)
self.pointTo(240,30)
self.pointTo(270,20)
self.pointTo(290,10)
self.pointTo(320,0)
self.pointTo(350,-20)
self.nullstellung(self)
Code: Alles auswählen
from rotorlib import *
mein_rotor = Rotor(33, 32)
mein_rotor.test()
Code: Alles auswählen
>>> %Run -c $EDITOR_CONTENT
Nullstellung: 0° Elevation, Azimuth = 180° Süden
Traceback (most recent call last):
File "<stdin>", line 6, in <module>
File "rotorlib.py", line 68, in test
NameError: name 'pointTo' isn't defined
Man beachte, dass die erste Zeile der Funktion test (also der Aufruf der Funktion nullstellung) ausgeführt wird.
Das OOP-Konzept ist mir aus Java bekannt. Ich finde keinen Ansatzpunkt, wie ich an den Fehler herangehen soll.