Seite 1 von 1

Servo als Uhr

Verfasst: Freitag 17. Juli 2020, 19:49
von JasonB
Hi,

ich versuche mich neu mit Python und starte damit den Servo drehen zu lassen. Soweit klappt das.

Nun dachte ich "wie könnte der Servo auf die volle Stunde drehen". Also 3 Uhr 90 Grad; 6 180 Grad; 20 Uhr dazwischen usw...

Wie liesst man die Stunde in Python ein? - Vielleicht hat jemand sowas schon gemacht?

Als Grund-Skript hab ich dieses zum erlernen benutzt:

import RPi.GPIO as gpio
import time

# Servo-GPIO (PWM-GPIO 18, Pin 12)
servopin = 18

# GPIO initialisieren
gpio.setmode(gpio.BCM)
gpio.setup(servopin, gpio.OUT)

# PWM-Frequenz auf 50 Hz setzen
servo = gpio.PWM(servopin, 50)

# PWM starten, Servo auf 0 Grad
servo.start(2.5)

# Umrechnung Grad in Tastverhaeltnis
def setservo(winkel):
if winkel < 0:
winkel = 0
if winkel > 180:
winkel = 180
pwm = winkel/18 + 2.5
servo.ChangeDutyCycle(pwm)

try:
# Endlosschleife Servoansteuerung
while True:
# 90 Grad
setservo(90)
time.sleep(1)
# 180 Grad
setservo(180)
time.sleep(1)
# 0 Grad
setservo(0)
time.sleep(1)

except KeyboardInterrupt:
# Abbruch mit [Strg][C],
# Servo auf 0 Grad, PWM beenden
servo.ChangeDutyCycle(2.5)
servo.stop()
gpio.cleanup()


Quelle: http://www.netzmafia.de/skripten/hardwa ... index.html


Danke für jeden Tipp
JB

Re: Servo als Uhr

Verfasst: Freitag 17. Juli 2020, 21:46
von __blackjack__
@JasonB: Schau Dir mal das `datetime`-Modul an.

Re: Servo als Uhr

Verfasst: Samstag 18. Juli 2020, 13:15
von Sirius3
@JasonB: eingerückt wird mit 4 Leerzeichen pro Ebene, nicht zwei.
Konstanten schreibt man komplett gross: SERVO_PIN
Man sollte nicht ausführbaren Code und Funktionsdefinitionen mischen und alles in Funktionen packen.
Der Kommentar vor der Funktion setservo ist falsch, da die Funktion ja tatsächlich das macht, was der Funktionsname sagt.
Man sollte immer aufräumen, nicht nur, bei Strg+C.

Code: Alles auswählen

import RPi.GPIO as gpio
import time

# Servo-GPIO (PWM-GPIO 18, Pin 12)
SERVO_PIN = 18
SERVO_ZERO = 2.5

# Umrechnung Grad in Tastverhaeltnis
def setservo(servo, winkel):
    if winkel < 0:
        winkel = 0
    if winkel > 180:
        winkel = 180
    pwm = winkel / 18 + SERVO_ZERO
    servo.ChangeDutyCycle(pwm)

def main():
    # GPIO initialisieren
    gpio.setmode(gpio.BCM)
    gpio.setup(SERVO_PIN, gpio.OUT)

    # PWM-Frequenz auf 50 Hz setzen
    servo = gpio.PWM(SERVO_PIN, 50)
    servo.start(SERVO_ZERO)

    try:
        # Endlosschleife Servoansteuerung
        while True:
            # 90 Grad
            setservo(90)
            time.sleep(1)
            # 180 Grad
            setservo(180)
            time.sleep(1)
            # 0 Grad
            setservo(0)
            time.sleep(1)
    except KeyboardInterrupt:
        # Abbruch mit [Strg][C],
        pass
    finally:
        # Servo auf 0 Grad, PWM beenden
        servo.ChangeDutyCycle(SERVO_ZERO)
        servo.stop()
        gpio.cleanup()

if __name__ == "__main__":
    main()

Re: Servo als Uhr

Verfasst: Montag 20. Juli 2020, 17:35
von JasonB
Hi,

danke für Eure Hinweise und Korrekturen. Dies sind meine allerersten eigenen Zeilen und ich lerne die Konventionen (noch).

Habe nun mal raus, wie ich eine Stunde als Integer definiere und dann den Winkel berechne.

Code: Alles auswählen

import time
stunde=time.strftime('%H', time.localtime())
intstunde=int(stunde)
winkel=intstunde*15
print (winkel)
Also Servo soll bei 18 Uhr auf 270 Grad drehen z.B. - versuche als nächsten Schritt den Servo entsprechend zu bewegen.
Irgendwie muss nun die Variable "winkel" zum Servo. Mmmm ;-) - Widme mich nun dem Code von oben dazu. Hoffe das wird. Sorry, wenn ich noch so untechnisch bin...

Danke nochmals - werde weiter hier stöbern..
JB

Re: Servo als Uhr

Verfasst: Montag 20. Juli 2020, 18:14
von __blackjack__
@JasonB: Man formatiert die Stunde nicht erst als Zeichenkette nur um die dann wieder in eine Zahl umzuwandeln. Man kann auch mit dem `time`-Modul die einzelnen Bestandteile eines Zeitpunkts als Zahlen bekommen, aber da würde ich gleich das `datetime`-Modul verwenden.

Re: Servo als Uhr

Verfasst: Montag 20. Juli 2020, 18:30
von Sirius3

Code: Alles auswählen

import datetime
stunde = datetime.datetime.now().hour
winkel = stunde * 15
Dein Servo kann anscheinend nur 0º bis 180º, wie willst Du Da 270º erreichen?

Re: Servo als Uhr

Verfasst: Dienstag 21. Juli 2020, 14:34
von JasonB
@Sirius3: Wieder etwas gelernt.

Wegen dem Servo habe ich keine Sorgen, denn dann baue ich die Uhr auf "Halbkreis" und verteile die Zeit auf 180 Grad.

(360 Grad-Servos erkennen wohl nicht die aktuelle Gradzahl ohne weiteres, so dass mir das als LernProjekt reicht.)

Schöne Woche
JB

Re: Servo als Uhr

Verfasst: Dienstag 21. Juli 2020, 15:49
von __deets__
Man kann das Servo ja auch übersetzen, wenn man will. Ist dann natürlich mechanisch etwas aufwändiger.