mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"machine"
|
|
"machine/usb/hid/mouse"
|
|
"math"
|
|
"time"
|
|
|
|
"tinygo.org/x/drivers/as560x"
|
|
)
|
|
|
|
func main() {
|
|
// Let's use the AS5600 to make the world's most useless mouse with just a single X-axis & no buttons (!)
|
|
machine.I2C0.Configure(machine.I2CConfig{
|
|
Frequency: machine.TWI_FREQ_400KHZ,
|
|
SDA: machine.GPIO4,
|
|
SCL: machine.GPIO5,
|
|
})
|
|
as5600 := as560x.NewAS5600(machine.I2C0)
|
|
as5600.Configure(as560x.Config{})
|
|
mouse := mouse.New()
|
|
|
|
lastAngle := -1
|
|
for {
|
|
time.Sleep(time.Millisecond * 10)
|
|
// Get the magnet status of the AS5600
|
|
magnetDetected, magnetStrength, err := as5600.MagnetStatus()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
// Get the raw angle from the AS5600
|
|
angle, _, err := as5600.RawAngle(as560x.ANGLE_NATIVE)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
str := ""
|
|
if !magnetDetected {
|
|
str += "NOT "
|
|
}
|
|
str += "detected. Strength is "
|
|
switch magnetStrength {
|
|
case as560x.MagnetTooWeak:
|
|
str += "too weak"
|
|
case as560x.MagnetTooStrong:
|
|
str += "too strong"
|
|
default:
|
|
str += "ok"
|
|
}
|
|
println("Raw angle:", angle, "Magnet was", str)
|
|
if lastAngle != -1 {
|
|
diff := int(angle) - lastAngle
|
|
// correct the zero crossover glitch
|
|
if diff < -0xc00 {
|
|
diff += 0xfff
|
|
} else if diff > 0xc00 {
|
|
diff -= 0xfff
|
|
}
|
|
// debounce the noise (could use the sensor's filters/hysteresis instead?)
|
|
if math.Abs(float64(diff)) > 2 {
|
|
// move the mouse x-axis in response to the AS5600
|
|
mouse.Move(diff, 0)
|
|
}
|
|
}
|
|
lastAngle = int(angle)
|
|
}
|
|
}
|