from machine import Pin, PWM
from time import sleep
# 1. Initialisatie (Nieuwe stijl)
servo = PWM(Pin(2))
servo.freq(50) # Servo's werken bijna altijd op 50Hz (20ms periode)
while True:
# Positie 1: -90 graden (1 ms puls)
# 1 milliseconde = 1.000.000 nanoseconden
print("\nLinks (-90 graden) -> 1ms")
servo.duty_ns(1000000)
sleep(2)
# Positie 2: 0 graden / Midden (1.5 ms puls)
print("\nMidden (0 graden) -> 1.5ms")
servo.duty_ns(1500000)
sleep(2)
# Positie 3: +90 graden (2 ms puls)
print("\nRechts (+90 graden) -> 2ms")
servo.duty_ns(2000000)
sleep(2)
print("\n\n")
sleep(2)
# 1. duty_u16(waarde)
#
# De Nieuwe Standaard (Aanrader!)
# Dit is de methode die je altijd zou moeten gebruiken.
# Betekenis: "Duty cycle als unsigned 16-bit integer".
# Bereik: Altijd 0 tot 65535.
# Waarom: Dit is de "Unified API". Of je nu een ESP32, een Raspberry Pi Pico of een STM32 gebruikt, 65535 is altijd 100%. MicroPython rekent dit op de achtergrond zelf om naar wat de hardware echt aankan.
# Documentatie: MicroPython docs - machine.PWM
#
# 2. duty_ns(waarde)
#
# Voor Tijd-precisie
# Betekenis: "Duty cycle in nanoseconden".
# Bereik: Tijd in nanoseconden dat de puls "hoog" is.
# Gebruik: Vooral handig voor Servo motoren. Een servo wil bijvoorbeeld een puls van precies 1500µs (1.500.000ns) hebben om in het midden te staan. Met duty_ns stel je die tijd exact in, ongeacht de frequentie.
#
# 3. duty(waarde)
#
# De Oude Manier (Legacy)
# Betekenis: De "oude" manier om duty cycle in te stellen, oorspronkelijk gemaakt voor de ESP8266.
# Bereik: Op de ESP32 is dit standaard 0 tot 1023 (10-bit).
# Het probleem: Je vindt nergens een instelling om die resolutie te wijzigen, omdat deze hardcoded is in de MicroPython firmware voor ESP32 om compatibel te blijven met oude scripts.
# Nadeel: Als je code verhuist naar een ander bordje (zoals een Arduino Nano Connect), kan het bereik daar ineens anders zijn. Daarom wordt duty() afgeraden.