mirror of
https://github.com/undera/pylgbst.git
synced 2020-11-18 19:37:26 -08:00
Documenting motors
This commit is contained in:
parent
df9af9e8da
commit
cfc0a64ffe
55
README.md
55
README.md
@ -47,10 +47,62 @@ good practice is to unsubscribe, especially when used with `DebugServer`
|
|||||||
|
|
||||||
Only one, very last subscribe mode is in effect, with many subscriber callbacks allowed.
|
Only one, very last subscribe mode is in effect, with many subscriber callbacks allowed.
|
||||||
|
|
||||||
### Motors
|
### Controlling Motors
|
||||||
|
|
||||||
|
MoveHub provides motors via following fields:
|
||||||
|
- `motor_A`
|
||||||
|
- `motor_B`
|
||||||
|
- `motor_AB`
|
||||||
|
- `motor_external` - if external motor is attached to port C or D
|
||||||
|
|
||||||
|
Methods to activate motors are:
|
||||||
|
- `constant(speed_primary, speed_secondary)`
|
||||||
|
- `timed(time, speed_primary, speed_secondary)`
|
||||||
|
- `angled(angle, speed_primary, speed_secondary)`
|
||||||
|
- `stop()`
|
||||||
|
|
||||||
|
All these methods are synchronous by default, except `stop()`. You can pass `async` parameter to any of them to switch into asynchronous, which means command will return immediately, without waiting for rotation to complete.
|
||||||
|
|
||||||
|
An example:
|
||||||
|
```python
|
||||||
|
from pylgbst import MoveHub
|
||||||
|
import time
|
||||||
|
|
||||||
|
hub = MoveHub()
|
||||||
|
|
||||||
|
hub.motor_A.timed(0.5, 0.8)
|
||||||
|
hub.motor_A.timed(0.5, -0.8)
|
||||||
|
|
||||||
|
hub.motor_B.angled(90, 0.8)
|
||||||
|
hub.motor_B.angled(-90, 0.8)
|
||||||
|
|
||||||
|
hub.motor_AB.timed(1.5, 0.8, -0.8)
|
||||||
|
hub.motor_AB.angled(90, 0.8, -0.8)
|
||||||
|
|
||||||
|
hub.motor_external.constant(0.2)
|
||||||
|
time.sleep(2)
|
||||||
|
hub.motor_external.stop()
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### Motor Rotation Sensors
|
### Motor Rotation Sensors
|
||||||
|
|
||||||
|
Any motor allows to subscribe to its rotation sensor. Two sensor modes are available: rotation angle (`EncodedMotor.SENSOR_ANGLE`) and rotation speed (`EncodedMotor.SENSOR_SPEED`). Example:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from pylgbst import MoveHub, EncodedMotor
|
||||||
|
import time
|
||||||
|
|
||||||
|
def callback(angle):
|
||||||
|
print("Angle: %s" % angle)
|
||||||
|
|
||||||
|
hub = MoveHub()
|
||||||
|
|
||||||
|
hub.motor_A.subscribe(callback, mode=EncodedMotor.SENSOR_ANGLE)
|
||||||
|
time.sleep(60) # rotate motor A
|
||||||
|
hub.motor_A.unsubscribe(callback)
|
||||||
|
```
|
||||||
|
|
||||||
### Tilt Sensor
|
### Tilt Sensor
|
||||||
|
|
||||||
MoveHub's internal tilt sensor is available through `tilt_sensor` field. There are several modes to subscribe to sensor, providing 2-axis, 3-axis and bump detect data.
|
MoveHub's internal tilt sensor is available through `tilt_sensor` field. There are several modes to subscribe to sensor, providing 2-axis, 3-axis and bump detect data.
|
||||||
@ -123,7 +175,6 @@ You can obtain colors are present as constants `COLOR_*` and also a map of avail
|
|||||||
|
|
||||||
Additionally, you can subscribe to LED color change events, using callback function as shown in example below.
|
Additionally, you can subscribe to LED color change events, using callback function as shown in example below.
|
||||||
|
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from pylgbst import MoveHub, COLORS, COLOR_NONE, COLOR_RED
|
from pylgbst import MoveHub, COLORS, COLOR_NONE, COLOR_RED
|
||||||
import time
|
import time
|
||||||
|
@ -43,8 +43,8 @@ class MoveHub(object):
|
|||||||
self.motor_A = None
|
self.motor_A = None
|
||||||
self.motor_B = None
|
self.motor_B = None
|
||||||
self.motor_AB = None
|
self.motor_AB = None
|
||||||
self.tilt_sensor = None
|
|
||||||
self.color_distance_sensor = None
|
self.color_distance_sensor = None
|
||||||
|
self.tilt_sensor = None
|
||||||
self.motor_external = None
|
self.motor_external = None
|
||||||
self.port_C = None
|
self.port_C = None
|
||||||
self.port_D = None
|
self.port_D = None
|
||||||
|
@ -155,9 +155,9 @@ class EncodedMotor(Peripheral):
|
|||||||
ANGLED_GROUP = 0x0C
|
ANGLED_GROUP = 0x0C
|
||||||
|
|
||||||
# MOTORS
|
# MOTORS
|
||||||
MOTOR_MODE_SOMETHING1 = 0x00
|
SENSOR_SOMETHING1 = 0x00 # TODO: understand it
|
||||||
MOTOR_MODE_SPEED = 0x01
|
SENSOR_SPEED = 0x01
|
||||||
MOTOR_MODE_ANGLE = 0x02
|
SENSOR_ANGLE = 0x02
|
||||||
|
|
||||||
def _speed_abs(self, relative):
|
def _speed_abs(self, relative):
|
||||||
if relative < -1:
|
if relative < -1:
|
||||||
@ -228,24 +228,24 @@ class EncodedMotor(Peripheral):
|
|||||||
self._wrap_and_write(self.SOME_SINGLE, b"", speed_primary, speed_secondary)
|
self._wrap_and_write(self.SOME_SINGLE, b"", speed_primary, speed_secondary)
|
||||||
self._wait_sync(async)
|
self._wait_sync(async)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self, async=True):
|
||||||
self.constant(0, async=True)
|
self.constant(0, async=async)
|
||||||
|
|
||||||
def handle_port_data(self, data):
|
def handle_port_data(self, data):
|
||||||
if self._port_subscription_mode == self.MOTOR_MODE_ANGLE:
|
if self._port_subscription_mode == self.SENSOR_ANGLE:
|
||||||
rotation = unpack("<l", data[4:8])[0]
|
rotation = unpack("<l", data[4:8])[0]
|
||||||
self._notify_subscribers(rotation)
|
self._notify_subscribers(rotation)
|
||||||
elif self._port_subscription_mode == self.MOTOR_MODE_SOMETHING1:
|
elif self._port_subscription_mode == self.SENSOR_SOMETHING1:
|
||||||
# TODO: understand what it means
|
# TODO: understand what it means
|
||||||
rotation = unpack("<B", data[4])[0]
|
rotation = unpack("<B", data[4])[0]
|
||||||
self._notify_subscribers(rotation)
|
self._notify_subscribers(rotation)
|
||||||
elif self._port_subscription_mode == self.MOTOR_MODE_SPEED:
|
elif self._port_subscription_mode == self.SENSOR_SPEED:
|
||||||
rotation = unpack("<b", data[4])[0]
|
rotation = unpack("<b", data[4])[0]
|
||||||
self._notify_subscribers(rotation)
|
self._notify_subscribers(rotation)
|
||||||
else:
|
else:
|
||||||
log.debug("Got motor sensor data while in unexpected mode: %s", self._port_subscription_mode)
|
log.debug("Got motor sensor data while in unexpected mode: %s", self._port_subscription_mode)
|
||||||
|
|
||||||
def subscribe(self, callback, mode=MOTOR_MODE_ANGLE, granularity=1, async=False):
|
def subscribe(self, callback, mode=SENSOR_ANGLE, granularity=1, async=False):
|
||||||
super(EncodedMotor, self).subscribe(callback, mode, granularity)
|
super(EncodedMotor, self).subscribe(callback, mode, granularity)
|
||||||
|
|
||||||
|
|
||||||
@ -319,7 +319,7 @@ class ColorDistanceSensor(Peripheral):
|
|||||||
OFF2 = 0x07
|
OFF2 = 0x07
|
||||||
COLOR_DISTANCE_FLOAT = 0x08
|
COLOR_DISTANCE_FLOAT = 0x08
|
||||||
LUMINOSITY = 0x09
|
LUMINOSITY = 0x09
|
||||||
SOME_20BYTES = 0x0a # TODO: understand it
|
SOME_20BYTES = 0x0a # TODO: understand it
|
||||||
|
|
||||||
def __init__(self, parent, port):
|
def __init__(self, parent, port):
|
||||||
super(ColorDistanceSensor, self).__init__(parent, port)
|
super(ColorDistanceSensor, self).__init__(parent, port)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user