1
0
mirror of https://github.com/hybridgroup/gobot.git synced 2025-04-27 13:48:56 +08:00
hybridgroup.gobot/platforms/gpio/servo_driver.go

91 lines
2.3 KiB
Go
Raw Normal View History

2014-04-27 19:34:16 -07:00
package gpio
import (
2014-11-19 15:05:16 -08:00
"errors"
2014-04-27 19:34:16 -07:00
"github.com/hybridgroup/gobot"
)
var _ gobot.Driver = (*ServoDriver)(nil)
2014-09-27 11:34:13 -07:00
// Represents a Servo
2014-04-27 19:34:16 -07:00
type ServoDriver struct {
name string
pin string
2014-11-29 11:02:10 -08:00
connection ServoWriter
gobot.Commander
2014-04-27 19:34:16 -07:00
CurrentAngle byte
}
2014-09-27 11:34:13 -07:00
// NewSerovDriver return a new ServoDriver given a Servo, name and pin.
//
// Adds the following API Commands:
// "Move" - See ServoDriver.Move
// "Min" - See ServoDriver.Min
// "Center" - See ServoDriver.Center
// "Max" - See ServoDriver.Max
2014-11-29 11:02:10 -08:00
func NewServoDriver(a ServoWriter, name string, pin string) *ServoDriver {
2014-06-11 17:41:04 -07:00
s := &ServoDriver{
name: name,
2014-11-29 11:02:10 -08:00
connection: a,
pin: pin,
Commander: gobot.NewCommander(),
2014-04-27 19:34:16 -07:00
CurrentAngle: 0,
}
2014-06-11 17:41:04 -07:00
2014-07-09 18:32:27 -07:00
s.AddCommand("Move", func(params map[string]interface{}) interface{} {
2014-06-11 17:41:04 -07:00
angle := byte(params["angle"].(float64))
return s.Move(angle)
2014-06-11 17:41:04 -07:00
})
2014-07-09 18:32:27 -07:00
s.AddCommand("Min", func(params map[string]interface{}) interface{} {
return s.Min()
2014-06-11 17:41:04 -07:00
})
2014-07-09 18:32:27 -07:00
s.AddCommand("Center", func(params map[string]interface{}) interface{} {
return s.Center()
2014-06-11 17:41:04 -07:00
})
2014-07-09 18:32:27 -07:00
s.AddCommand("Max", func(params map[string]interface{}) interface{} {
return s.Max()
2014-06-11 17:41:04 -07:00
})
return s
2014-04-27 19:34:16 -07:00
}
func (s *ServoDriver) Name() string { return s.name }
func (s *ServoDriver) Pin() string { return s.pin }
2014-11-29 11:02:10 -08:00
func (s *ServoDriver) Connection() gobot.Connection { return s.connection.(gobot.Connection) }
2014-09-27 11:34:13 -07:00
// Start starts the ServoDriver. Returns true on successful start of the driver.
func (s *ServoDriver) Start() (errs []error) { return }
2014-04-27 19:34:16 -07:00
2014-09-27 11:34:13 -07:00
// Halt halts the ServoDriver. Returns true on successful halt of the driver.
func (s *ServoDriver) Halt() (errs []error) { return }
2014-09-27 11:34:13 -07:00
// Move sets the servo to the specified angle
func (s *ServoDriver) Move(angle uint8) (err error) {
2014-04-27 19:34:16 -07:00
if !(angle >= 0 && angle <= 180) {
2014-11-19 15:05:16 -08:00
return errors.New("Servo angle must be an integer between 0-180")
2014-04-27 19:34:16 -07:00
}
s.CurrentAngle = angle
2014-11-29 11:02:10 -08:00
return s.connection.ServoWrite(s.Pin(), s.angleToSpan(angle))
2014-04-27 19:34:16 -07:00
}
2014-09-27 11:34:13 -07:00
// Min sets the servo to it's minimum position
func (s *ServoDriver) Min() (err error) {
return s.Move(0)
2014-04-27 19:34:16 -07:00
}
2014-09-27 11:34:13 -07:00
// Center sets the servo to it's center position
func (s *ServoDriver) Center() (err error) {
return s.Move(90)
2014-04-27 19:34:16 -07:00
}
2014-09-27 11:34:13 -07:00
// Max sets the servo to its maximum position
func (s *ServoDriver) Max() (err error) {
return s.Move(180)
2014-04-27 19:34:16 -07:00
}
func (s *ServoDriver) angleToSpan(angle byte) byte {
return byte(angle * (255 / 180))
}