mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
d224b5d648
Signed-off-by: deadprogram <ron@hybridgroup.com>
84 lines
2.4 KiB
Go
84 lines
2.4 KiB
Go
//go:build baremetal
|
|
|
|
package easystepper
|
|
|
|
import (
|
|
"errors"
|
|
"machine"
|
|
"time"
|
|
|
|
"tinygo.org/x/drivers"
|
|
"tinygo.org/x/drivers/internal/legacy"
|
|
)
|
|
|
|
// New returns a new single easystepper driver given a DeviceConfig
|
|
func New(config DeviceConfig) (*Device, error) {
|
|
if config.StepCount == 0 || config.RPM == 0 {
|
|
return nil, errors.New("config.StepCount and config.RPM must be > 0")
|
|
}
|
|
return &Device{
|
|
pins: [4]drivers.PinOutputFunc{config.Pin1.Set, config.Pin2.Set, config.Pin3.Set, config.Pin4.Set},
|
|
stepDelay: time.Second * 60 / time.Duration((config.StepCount * config.RPM)),
|
|
stepMode: config.Mode,
|
|
config: func() {
|
|
legacy.ConfigurePinOut(config.Pin1)
|
|
legacy.ConfigurePinOut(config.Pin2)
|
|
legacy.ConfigurePinOut(config.Pin3)
|
|
legacy.ConfigurePinOut(config.Pin4)
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
// Configure configures the pins of the Device
|
|
func (d *Device) Configure() {
|
|
if d.config == nil {
|
|
panic(legacy.ErrConfigBeforeInstantiated)
|
|
}
|
|
d.config()
|
|
}
|
|
|
|
// Configure configures the pins of the DualDevice
|
|
func (d *DualDevice) Configure() {
|
|
d.devices[0].Configure()
|
|
d.devices[1].Configure()
|
|
}
|
|
|
|
// NewDual returns a new dual easystepper driver given 8 pins, number of steps and rpm
|
|
func NewDual(config DualDeviceConfig) (*DualDevice, error) {
|
|
// Create the first device
|
|
dev1, err := New(config.DeviceConfig)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// Create the second device
|
|
config.DeviceConfig.Pin1 = config.Pin5
|
|
config.DeviceConfig.Pin2 = config.Pin6
|
|
config.DeviceConfig.Pin3 = config.Pin7
|
|
config.DeviceConfig.Pin4 = config.Pin8
|
|
dev2, err := New(config.DeviceConfig)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// Return composite dual device
|
|
return &DualDevice{devices: [2]*Device{dev1, dev2}}, nil
|
|
}
|
|
|
|
// DeviceConfig contains the configuration data for a single easystepper driver
|
|
type DeviceConfig struct {
|
|
// Pin1 ... Pin4 determines the pins to configure and use for the device
|
|
Pin1, Pin2, Pin3, Pin4 machine.Pin
|
|
// StepCount is the number of steps required to perform a full revolution of the stepper motor
|
|
StepCount uint
|
|
// RPM determines the speed of the stepper motor in 'Revolutions per Minute'
|
|
RPM uint
|
|
// Mode determines the coil sequence used to perform a single step
|
|
Mode StepMode
|
|
}
|
|
|
|
// DualDeviceConfig contains the configuration data for a dual easystepper driver
|
|
type DualDeviceConfig struct {
|
|
DeviceConfig
|
|
// Pin5 ... Pin8 determines the pins to configure and use for the second device
|
|
Pin5, Pin6, Pin7, Pin8 machine.Pin
|
|
}
|