gobot.io/x/gobot@v1.16.0/drivers/gpio/servo_driver.go (about) 1 package gpio 2 3 import "gobot.io/x/gobot" 4 5 // ServoDriver Represents a Servo 6 type ServoDriver struct { 7 name string 8 pin string 9 connection ServoWriter 10 gobot.Commander 11 CurrentAngle byte 12 } 13 14 // NewServoDriver returns a new ServoDriver given a ServoWriter and pin. 15 // 16 // Adds the following API Commands: 17 // "Move" - See ServoDriver.Move 18 // "Min" - See ServoDriver.Min 19 // "Center" - See ServoDriver.Center 20 // "Max" - See ServoDriver.Max 21 func NewServoDriver(a ServoWriter, pin string) *ServoDriver { 22 s := &ServoDriver{ 23 name: gobot.DefaultName("Servo"), 24 connection: a, 25 pin: pin, 26 Commander: gobot.NewCommander(), 27 CurrentAngle: 0, 28 } 29 30 s.AddCommand("Move", func(params map[string]interface{}) interface{} { 31 angle := byte(params["angle"].(float64)) 32 return s.Move(angle) 33 }) 34 s.AddCommand("Min", func(params map[string]interface{}) interface{} { 35 return s.Min() 36 }) 37 s.AddCommand("Center", func(params map[string]interface{}) interface{} { 38 return s.Center() 39 }) 40 s.AddCommand("Max", func(params map[string]interface{}) interface{} { 41 return s.Max() 42 }) 43 44 return s 45 46 } 47 48 // Name returns the ServoDrivers name 49 func (s *ServoDriver) Name() string { return s.name } 50 51 // SetName sets the ServoDrivers name 52 func (s *ServoDriver) SetName(n string) { s.name = n } 53 54 // Pin returns the ServoDrivers pin 55 func (s *ServoDriver) Pin() string { return s.pin } 56 57 // Connection returns the ServoDrivers connection 58 func (s *ServoDriver) Connection() gobot.Connection { return s.connection.(gobot.Connection) } 59 60 // Start implements the Driver interface 61 func (s *ServoDriver) Start() (err error) { return } 62 63 // Halt implements the Driver interface 64 func (s *ServoDriver) Halt() (err error) { return } 65 66 // Move sets the servo to the specified angle. Acceptable angles are 0-180 67 func (s *ServoDriver) Move(angle uint8) (err error) { 68 if !(angle >= 0 && angle <= 180) { 69 return ErrServoOutOfRange 70 } 71 s.CurrentAngle = angle 72 return s.connection.ServoWrite(s.Pin(), angle) 73 } 74 75 // Min sets the servo to it's minimum position 76 func (s *ServoDriver) Min() (err error) { 77 return s.Move(0) 78 } 79 80 // Center sets the servo to it's center position 81 func (s *ServoDriver) Center() (err error) { 82 return s.Move(90) 83 } 84 85 // Max sets the servo to its maximum position 86 func (s *ServoDriver) Max() (err error) { 87 return s.Move(180) 88 }