Skip to content

Servo #15

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Aug 8, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions simpleio.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"""

import digitalio
import pulseio
import math
import time

Expand Down Expand Up @@ -101,6 +102,57 @@ def shift_out(dataPin, clock, value, msb_first=True):
tmpval = bool((value & (1 << i)))
dataPin.value = tmpval

class Servo:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please follow the Google Python Style (based on PEP8) for variable naming. https://google.github.io/styleguide/pyguide.html?showone=Naming#Naming

Copy link
Member Author

@brentru brentru Aug 3, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed servoMin/servoMax to

min_pulse

and

max_pulse

to conform with the Google Python Style Guide

"""
Easy control for hobby (3-wire) servos

:param ~microcontroller.Pin pin: PWM pin where the servo is located.
:param int min_pulse: Pulse width (microseconds) corresponding to 0 degrees.
:param int max_pulse: Pulse width (microseconds) corresponding to 180 degrees.

Example for Metro M0 Express:

.. code-block:: python

import simpleio
import time
from board import *

pwm = simpleio.Servo(D9)

while True:
pwm.angle = 0
print("Angle: ", pwm.angle)
time.sleep(2)
pwm.angle = pwm.microseconds_to_angle(2500)
print("Angle: ", pwm.angle)
time.sleep(2)
"""
def __init__(self, pin, min_pulse = 0.5, max_pulse = 2.5):
self.pwm = pulseio.PWMOut(pin, frequency = 50)
self.min_pulse = min_pulse
self.max_pulse = max_pulse

@property
def angle(self):
return self._angle

@angle.setter
def angle(self, degrees):
"""Writes a value in degrees to the servo"""
self._angle = max(min(180, degrees), 0)
pulseWidth = 0.5 + (self._angle / 180) * (self.max_pulse - self.min_pulse)
dutyPercent = pulseWidth / 20.0
self.pwm.duty_cycle = int(dutyPercent * 65535)

def microseconds_to_angle(self, us):
"""Converts microseconds to a degree value"""
return map_range(us, 500, 2500, 0, 180)

def deinit(self):
"""Detaches servo object from pin, frees pin"""
self.pwm.deinit()

class DigitalOut:
"""
Simple digital output that is valid until soft reset.
Expand Down