Mercurial > tote-had
view python/robot.py @ 19:455a46355e72 default tip
Add freq to i2c init
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Thu, 14 Apr 2016 00:05:31 +0200 |
| parents | 5c99ed631554 |
| children |
line wrap: on
line source
from machine import I2C, Pin from pyb import delay import ustruct import math I2C_ADDRESS = 0x09 class Leg: base = 70 # cm from the center of the robot to the (0,0) of the leg def __init__(self, i2c, index, x_dir, y_dir): self.index = index self.i2c = i2c self.x = 0 self.y = 0 self.z = 0 self.x_dir = x_dir self.y_dir = y_dir def move_to(self, x, y, z): self.x = min(127, max(-127, int(x))) self.y = min(127, max(-127, int(y))) self.z = min(127, max(-127, int(z))) def move_by(self, dx=0, dy=0, dz=0): self.move_to(self.x + dx, self.y + dy, self.z + dz) def rotate_by(self, radians): x = self.x + self.base y = self.y + self.base nx = x * math.cos(radians) - y * math.sin(radians) - self.base ny = x * math.sin(radians) + y * math.cos(radians) - self.base self.move_to(nx, ny, self.z) class Robot: def __init__(self): self.i2c = I2C(sda=Pin(0), scl=Pin(2), freq=10000) self.legs = ( Leg(self.i2c, 0, -1, 1), Leg(self.i2c, 1, -1, -1), Leg(self.i2c, 2, 1, -1), Leg(self.i2c, 3, 1, 1), ) def move_by(self, dx=0, dy=0, dz=0): for leg in self.legs: leg.move_by(dx * leg.x_dir, dy * leg.y_dir, dz) def rotate_by(self, radians): for leg in self.legs: leg.rotate_by(radians) def update(self): data = ustruct.pack( "Bbbbbbbbbbbbb", 0, self.legs[0].x, self.legs[0].y, self.legs[0].z, self.legs[1].x, self.legs[1].y, self.legs[1].z, self.legs[2].x, self.legs[2].y, self.legs[2].z, self.legs[3].x, self.legs[3].y, self.legs[3].z, ) while True: try: self.i2c.writeto(I2C_ADDRESS, data) except OSError: print("OSError!") else: break delay(20)
