-
Notifications
You must be signed in to change notification settings - Fork 192
/
l293x.go
125 lines (106 loc) · 2.82 KB
/
l293x.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Package l293x provides a driver to the L293/L293D H-bridge chip
// typically used to control DC motors.
//
// Datasheet: https://www.ti.com/lit/ds/symlink/l293d.pdf
package l293x // import "tinygo.org/x/drivers/l293x"
import (
"machine"
)
// Device is a motor without speed control.
// a1 and a2 are the directional pins.
// en is the pin turns the motor on/off.
type Device struct {
a1, a2 machine.Pin
en machine.Pin
}
// New returns a new Motor driver for GPIO-only operation.
func New(direction1, direction2, enablePin machine.Pin) Device {
return Device{
a1: direction1,
a2: direction2,
en: enablePin,
}
}
// Configure configures the Device.
func (d *Device) Configure() {
d.a1.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.a2.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.en.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.Stop()
}
// Forward turns motor on in forward direction.
func (d *Device) Forward() {
d.a1.High()
d.a2.Low()
d.en.High()
}
// Backward turns motor on in backward direction.
func (d *Device) Backward() {
d.a1.Low()
d.a2.High()
d.en.High()
}
// Stop turns motor off.
func (d *Device) Stop() {
d.a1.Low()
d.a2.Low()
d.en.Low()
}
// PWM is the interface necessary for controlling the motor driver.
type PWM interface {
Configure(config machine.PWMConfig) error
Channel(pin machine.Pin) (channel uint8, err error)
Top() uint32
Set(channel uint8, value uint32)
SetPeriod(period uint64) error
}
// PWMDevice is a motor with speed control.
// a1 and a2 are the directional GPIO pins.
// en is the PWM pin that controls the motor speed.
type PWMDevice struct {
a1, a2 machine.Pin
spc uint8
pwm PWM
}
// NewWithSpeed returns a new PWMMotor driver that uses an already configured PWM channel
// to control speed.
func NewWithSpeed(direction1, direction2 machine.Pin, spc uint8, pwm PWM) PWMDevice {
return PWMDevice{
a1: direction1,
a2: direction2,
spc: spc,
pwm: pwm,
}
}
// Configure configures the PWMDevice. Note that the PWM interface and
// channel must already be configured, this function will not do it for you.
func (d *PWMDevice) Configure() error {
d.a1.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.a2.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.Stop()
return nil
}
// Forward turns motor on in forward direction at specific speed as a percentage.
func (d *PWMDevice) Forward(speed uint32) {
if speed > 100 {
speed = 100
}
d.a1.High()
d.a2.Low()
d.pwm.Set(d.spc, d.pwm.Top()*speed/100)
}
// Backward turns motor on in backward direction at specific speed as a percentage.
func (d *PWMDevice) Backward(speed uint32) {
if speed > 100 {
speed = 100
}
d.a1.Low()
d.a2.High()
d.pwm.Set(d.spc, d.pwm.Top()*speed/100)
}
// Stop turns motor off.
func (d *PWMDevice) Stop() {
d.a1.Low()
d.a2.Low()
d.pwm.Set(d.spc, 0)
}