Servo als Uhr

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
JasonB
User
Beiträge: 3
Registriert: Freitag 17. Juli 2020, 19:43

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
Benutzeravatar
__blackjack__
User
Beiträge: 13938
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JasonB: Schau Dir mal das `datetime`-Modul an.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
JasonB
User
Beiträge: 3
Registriert: Freitag 17. Juli 2020, 19:43

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
Benutzeravatar
__blackjack__
User
Beiträge: 13938
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
JasonB
User
Beiträge: 3
Registriert: Freitag 17. Juli 2020, 19:43

@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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man kann das Servo ja auch übersetzen, wenn man will. Ist dann natürlich mechanisch etwas aufwändiger.
Antworten