mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-17 13:23:26 +00:00
Adding driver for rotary encoder support
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
[](https://pkg.go.dev/tinygo.org/x/drivers) [](https://github.com/tinygo-org/drivers/actions/workflows/build.yml)
|
[](https://pkg.go.dev/tinygo.org/x/drivers) [](https://github.com/tinygo-org/drivers/actions/workflows/build.yml)
|
||||||
|
|
||||||
|
|
||||||
This package provides a collection of 101 different hardware drivers for devices such as sensors and displays that can be used together with [TinyGo](https://tinygo.org).
|
This package provides a collection of 102 different hardware drivers for devices such as sensors and displays that can be used together with [TinyGo](https://tinygo.org).
|
||||||
|
|
||||||
For the complete list, please see:
|
For the complete list, please see:
|
||||||
https://tinygo.org/docs/reference/devices/
|
https://tinygo.org/docs/reference/devices/
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package encoders
|
||||||
|
|
||||||
|
type QuadratureDevice struct {
|
||||||
|
cfg QuadratureConfig
|
||||||
|
impl quadratureImpl
|
||||||
|
}
|
||||||
|
|
||||||
|
type QuadratureConfig struct {
|
||||||
|
Precision int
|
||||||
|
}
|
||||||
|
|
||||||
|
type quadratureImpl interface {
|
||||||
|
configure(cfg QuadratureConfig) error
|
||||||
|
readValue() int
|
||||||
|
writeValue(int)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (enc *QuadratureDevice) Configure(cfg QuadratureConfig) error {
|
||||||
|
if cfg.Precision < 1 {
|
||||||
|
cfg.Precision = 4
|
||||||
|
}
|
||||||
|
enc.cfg = cfg
|
||||||
|
return enc.impl.configure(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Position returns the stored int value for the encoder
|
||||||
|
func (enc *QuadratureDevice) Position() int {
|
||||||
|
return enc.impl.readValue() / enc.cfg.Precision
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetPosition overwrites the currently stored value with the specified int value
|
||||||
|
func (enc *QuadratureDevice) SetPosition(v int) {
|
||||||
|
enc.impl.writeValue(v * enc.cfg.Precision)
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
//go:build tinygo && (rp2040 || stm32 || k210 || esp32c3 || nrf || (avr && (atmega328p || atmega328pb)))
|
||||||
|
|
||||||
|
// Implementation based on:
|
||||||
|
// https://gist.github.com/aykevl/3fc1683ed77bb0a9c07559dfe857304a
|
||||||
|
|
||||||
|
// Note: build constraints in this file list targets that define machine.PinToggle.
|
||||||
|
// If this is supported for additional targets in the future, they can be added above.
|
||||||
|
|
||||||
|
package encoders
|
||||||
|
|
||||||
|
import (
|
||||||
|
"machine"
|
||||||
|
"runtime/volatile"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
states = []int8{0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewQuadratureViaInterrupt returns a rotary encoder device that uses GPIO
|
||||||
|
// interrupts and a lookup table to keep track of quadrature state changes.
|
||||||
|
//
|
||||||
|
// This constructur is only available for TinyGo targets for which machine.PinToggle
|
||||||
|
// is defined as a valid interrupt type.
|
||||||
|
func NewQuadratureViaInterrupt(pinA, pinB machine.Pin) *QuadratureDevice {
|
||||||
|
return &QuadratureDevice{impl: &quadInterruptImpl{pinA: pinA, pinB: pinB, oldAB: 0b00000011}}
|
||||||
|
}
|
||||||
|
|
||||||
|
type quadInterruptImpl struct {
|
||||||
|
pinA machine.Pin
|
||||||
|
pinB machine.Pin
|
||||||
|
|
||||||
|
// precision int
|
||||||
|
|
||||||
|
oldAB int
|
||||||
|
value volatile.Register32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (enc *quadInterruptImpl) configure(cfg QuadratureConfig) error {
|
||||||
|
enc.pinA.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
|
||||||
|
enc.pinA.SetInterrupt(machine.PinToggle, enc.interrupt)
|
||||||
|
|
||||||
|
enc.pinB.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
|
||||||
|
enc.pinB.SetInterrupt(machine.PinToggle, enc.interrupt)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (enc *quadInterruptImpl) interrupt(pin machine.Pin) {
|
||||||
|
aHigh, bHigh := enc.pinA.Get(), enc.pinB.Get()
|
||||||
|
enc.oldAB <<= 2
|
||||||
|
if aHigh {
|
||||||
|
enc.oldAB |= 1 << 1
|
||||||
|
}
|
||||||
|
if bHigh {
|
||||||
|
enc.oldAB |= 1
|
||||||
|
}
|
||||||
|
enc.writeValue(enc.readValue() + int(states[enc.oldAB&0x0f]))
|
||||||
|
}
|
||||||
|
|
||||||
|
// readValue gets the value using volatile operations and returns it as an int
|
||||||
|
func (enc *quadInterruptImpl) readValue() int {
|
||||||
|
return int(enc.value.Get())
|
||||||
|
}
|
||||||
|
|
||||||
|
// writeValue set the value to the specified int using volatile operations
|
||||||
|
func (enc *quadInterruptImpl) writeValue(v int) {
|
||||||
|
enc.value.Set(uint32(v))
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
//go:build macropad_rp2040
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"machine"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/encoders"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
enc = encoders.NewQuadratureViaInterrupt(machine.ROT_A, machine.ROT_B)
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
enc.Configure(encoders.QuadratureConfig{
|
||||||
|
Precision: 4,
|
||||||
|
})
|
||||||
|
|
||||||
|
for oldValue := 0; ; {
|
||||||
|
if newValue := enc.Position(); newValue != oldValue {
|
||||||
|
println("value: ", newValue)
|
||||||
|
oldValue = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -129,6 +129,7 @@ tinygo build -size short -o ./build/test.hex -target=microbit ./examples/ndir/ma
|
|||||||
tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/ndir/main_ndir.go
|
tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/ndir/main_ndir.go
|
||||||
tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/mpu9150/main.go
|
tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/mpu9150/main.go
|
||||||
tinygo build -size short -o ./build/test.hex -target=macropad-rp2040 ./examples/sh1106/macropad_spi
|
tinygo build -size short -o ./build/test.hex -target=macropad-rp2040 ./examples/sh1106/macropad_spi
|
||||||
|
tinygo build -size short -o ./build/test.hex -target=macropad-rp2040 ./examples/encoders/quadrature-interrupt
|
||||||
# network examples (espat)
|
# network examples (espat)
|
||||||
tinygo build -size short -o ./build/test.hex -target=challenger-rp2040 ./examples/net/ntpclient/
|
tinygo build -size short -o ./build/test.hex -target=challenger-rp2040 ./examples/net/ntpclient/
|
||||||
# network examples (wifinina)
|
# network examples (wifinina)
|
||||||
|
|||||||
Reference in New Issue
Block a user