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 4 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
54 changes: 54 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,59 @@ 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: Minimum amount of microseconds allowed. Varies depending on type of servo.
:param int max_pulse: Maximum amount of microseconds allowed. Varies depending on type of servo.
Copy link
Member

Choose a reason for hiding this comment

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

You might want to state what min_pulse and max_pulse correspond to angle wise.

Copy link
Member Author

Choose a reason for hiding this comment

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

Changed to state how the uS correspond to the angle

:param int min_pulse: Pulse width (microseconds) for the absolute minimum angle on the servo.

:param int max_pulse: Pulse width (microseconds) for the absolute maximum angle on the servo.

Copy link
Member

Choose a reason for hiding this comment

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

You are assuming that the servo ranges from 0 to 180 degrees correct? Why not just say that?

Copy link
Member Author

Choose a reason for hiding this comment

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

Good point. Reworded as:

Pulse width (microseconds) corresponding to 180 degrees
and
Pulse width (microseconds) corresponding to 0 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
self._angle = 90
self._microseconds = 0
Copy link
Member

Choose a reason for hiding this comment

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

This isn't needed anymore.

Copy link
Member Author

Choose a reason for hiding this comment

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

Deleted.


@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 detach(self):
Copy link
Member

Choose a reason for hiding this comment

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

Copy link
Member Author

Choose a reason for hiding this comment

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

changed to
self.pwm.deinit()

Copy link
Member

Choose a reason for hiding this comment

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

I meant the Servo method itself too.

Copy link
Member

Choose a reason for hiding this comment

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

Rename this to deinit please

Copy link
Member Author

Choose a reason for hiding this comment

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

Done!

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

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