Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/add as5600 support #806

Draft
wants to merge 6 commits into
base: dev
Choose a base branch
from
Draft
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add: publish RAW ANGLE register
  • Loading branch information
Daniel Fraile authored and danifv27 committed Dec 8, 2021
commit 86c992970c81c1a84ce3acbac3d238852eae6aa2
135 changes: 86 additions & 49 deletions drivers/i2c/as5600_driver.go
Original file line number Diff line number Diff line change
@@ -1,62 +1,66 @@
package i2c

import "gobot.io/x/gobot"
import (
"encoding/binary"

"gobot.io/x/gobot"
)

const (
// DefaultAddress is the default I2C address for the as5600
as5600Address = 0x36

as5600ZMCO = 0x00
// zero position
as5600ZPOSMSB = 0x01
as5600ZPOSLSB = 0x02
//maximum position
as5600MPOSMSB = 0x03
as5600MPOSLSB = 0x04
// maximum angle
as5600MANGMSB = 0x05
as5600MANGLSB = 0x06
// Customize the device
as5600CONFMSB = 0x07
as5600CONFLSB = 0x08
// as5600ZMCO = 0x00
// // zero position
// as5600ZPOSMSB = 0x01
// as5600ZPOSLSB = 0x02
// //maximum position
// as5600MPOSMSB = 0x03
// as5600MPOSLSB = 0x04
// // maximum angle
// as5600MANGMSB = 0x05
// as5600MANGLSB = 0x06
// // Customize the device
// as5600CONFMSB = 0x07
// as5600CONFLSB = 0x08
//Unscaled and unmodified angle
as5600RAWANGLEMSB = 0x0C
as5600RAWANGLELSB = 0x0D
// Scaled output value
as5600ANGLEMSB = 0x0E
as5600ANGLELSB = 0x0F
// // Scaled output value
// as5600ANGLEMSB = 0x0E
// as5600ANGLELSB = 0x0F
// Current state (basically strength of magnet)
as5600STATUS = 0x0B
// Automatic Gain Control
as5600AGC = 0x1A
// Magnitude value of the internal cordic
as5600MAGNITUDEMSB = 0x1B
as5600MAGNITUDELSB = 0x1C
// Burn commands
as5600BURN = 0xFF
// // Automatic Gain Control
// as5600AGC = 0x1A
// // Magnitude value of the internal cordic
// as5600MAGNITUDEMSB = 0x1B
// as5600MAGNITUDELSB = 0x1C
// // Burn commands
// as5600BURN = 0xFF
)

// AS5600 Power Mode
const (
as5600PowerModeNorm = iota
as5600PowerModeLPM1
as5600PowerModeLPM2
as5600PowerModeLPM3
)

// AS5600 Hysteresis
const (
as5600HysteresisNorm = iota
as5600Hysteresis1LSB
as5600Hysteresis2LSB
as5600Hysteresis3LSB
)

const (
as5600OutputStageAnalogFull = iota
as5600OutputStageAnalogReduced
as5600OutputStageDigitalPWM
)
// // AS5600 Power Mode
// const (
// as5600PowerModeNorm = iota
// as5600PowerModeLPM1
// as5600PowerModeLPM2
// as5600PowerModeLPM3
// )

// // AS5600 Hysteresis
// const (
// as5600HysteresisNorm = iota
// as5600Hysteresis1LSB
// as5600Hysteresis2LSB
// as5600Hysteresis3LSB
// )

// const (
// as5600OutputStageAnalogFull = iota
// as5600OutputStageAnalogReduced
// as5600OutputStageDigitalPWM
// )

const (
_ = 1 << iota
@@ -67,9 +71,12 @@ const (
as5600StatusMDBit
)

//go:generate stringer -type=AS5600StatusType
type AS5600StatusType uint16

// Magnet status
const (
as5600NoMagnetDetected = iota
as5600MagnetNotDetected AS5600StatusType = iota
as5600MagnetTooWeak
as5600MagnetOk
as5600MagnetTooStrong
@@ -93,6 +100,7 @@ type AS5600Driver struct {
// i2c.WithAddress(int): address to use with this driver
//
func NewAS5600Driver(a Connector, options ...func(Config)) *AS5600Driver {

as := &AS5600Driver{
name: gobot.DefaultName("AS5600"),
connector: a,
@@ -149,6 +157,7 @@ func (as *AS5600Driver) DetecMagnet() (bool, error) {
var err error

magStatus, err = as.connection.ReadByteData(as5600STATUS)

if err != nil {
return false, err
}
@@ -157,16 +166,16 @@ func (as *AS5600Driver) DetecMagnet() (bool, error) {
}

// GetMagnetStrength returns if the magnet is detected
func (as *AS5600Driver) GetMagnetStrength() (int, error) {
func (as *AS5600Driver) GetMagnetStrength() (AS5600StatusType, error) {
var magStatus uint8
var err error

magStatus, err = as.connection.ReadByteData(as5600STATUS)
if err != nil {
return as5600MagnetUnknown, err
}
if magStatus&as5600StatusMDBit != 0 {
return as5600NoMagnetDetected, nil
if magStatus&as5600StatusMDBit == 0 {
return as5600MagnetNotDetected, nil
}
if magStatus&as5600StatusMHBit != 0 {
return as5600MagnetTooStrong, nil
@@ -177,3 +186,31 @@ func (as *AS5600Driver) GetMagnetStrength() (int, error) {

return as5600MagnetOk, nil
}

func (as *AS5600Driver) GetRawAngle() (uint16, error) {
var angle []byte
var err error
var rc uint16

angle, err = as.read(as5600RAWANGLEMSB, 2)
if err != nil {
return 0x0, err
}
rc = binary.LittleEndian.Uint16(angle[0:])

return rc & 0x0fff, nil
}

func (as *AS5600Driver) read(address byte, n int) ([]byte, error) {

if _, err := as.connection.Write([]byte{address}); err != nil {
return nil, err
}
buf := make([]byte, n)
bytesRead, err := as.connection.Read(buf)
if bytesRead != n || err != nil {
return nil, err
}

return buf, nil
}
32 changes: 32 additions & 0 deletions drivers/i2c/as5600_driver_test.go
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ package i2c

import (
"bytes"
"fmt"
"testing"

"gobot.io/x/gobot"
@@ -102,3 +103,34 @@ func TestAS5600DriverMagnetTooStrong(t *testing.T) {
gobottest.Assert(t, err, nil)
gobottest.Assert(t, magnet, as5600MagnetTooStrong)
}

func TestAS5600DriverGetRawAngle(t *testing.T) {
as, adaptor := initTestAS5600DriverWithStubbedAdaptor()
adaptor.i2cReadImpl = func(b []byte) (int, error) {
buf := new(bytes.Buffer)
tmp := make([]byte, len(b))
if adaptor.written[len(adaptor.written)-1] == as5600RAWANGLEMSB {
tmp[0] = as5600RAWANGLEMSB
} else if adaptor.written[len(adaptor.written)-1] == as5600RAWANGLELSB {
tmp[0] = as5600RAWANGLELSB
}
for i := 1; i < len(b); i++ {
tmp[i] = byte(i)
}
buf.Write(tmp)
copy(b, buf.Bytes())

return buf.Len(), nil
}
adaptor.i2cWriteImpl = func(b []byte) (int, error) {
if b[0] == as5600RAWANGLEMSB {
return 1, nil
}

return 0, fmt.Errorf("0x%x wrong register", b[0])
}
as.Start()
angle, err := as.GetRawAngle()
gobottest.Assert(t, err, nil)
gobottest.Assert(t, angle, uint16(0x010c))
}
27 changes: 27 additions & 0 deletions drivers/i2c/as5600statustype_string.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -29,8 +29,8 @@ require (
github.com/veandco/go-sdl2 v0.3.3
go.bug.st/serial v1.1.1
gocv.io/x/gocv v0.21.0
golang.org/x/net v0.0.0-20200822124328-c89045814202
golang.org/x/sys v0.0.0-20201126233918-771906719818 // indirect
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f
golang.org/x/tools v0.1.8 // indirect
periph.io/x/periph v3.6.2+incompatible
tinygo.org/x/bluetooth v0.2.0
)
17 changes: 17 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -110,6 +110,7 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
github.com/veandco/go-sdl2 v0.3.3 h1:4/TirgB2MQ7oww3pM3Yfgf1YbChMlAQAmiCPe5koK0I=
github.com/veandco/go-sdl2 v0.3.3/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.bug.st/serial v1.0.0 h1:ogEPzrllCsnG00EqKRjeYvPRsO7NJW6DqykzkdD6E/k=
go.bug.st/serial v1.0.0/go.mod h1:rpXPISGjuNjPTRTcMlxi9lN6LoIPxd1ixVjBd8aSk/Q=
go.bug.st/serial v1.1.1 h1:5J1DpaIaSIruBi7jVnKXnhRS+YQ9+2PLJMtIZKoIgnc=
@@ -128,14 +129,19 @@ golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 h1:6KET3Sqa7fkVfD63QnAM81ZeYg5n4HwApOJkufONnHA=
golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -159,13 +165,24 @@ golang.org/x/sys v0.0.0-20201024232916-9f70ab9862d5 h1:iCaAy5bMeEvwANu3YnJfWwI0k
golang.org/x/sys v0.0.0-20201024232916-9f70ab9862d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201028094953-708e7fb298ac h1:bplbaOojU0hnrC9nvWJ5Nvp/gPIWKFMiGBFI9Cpp16I=
golang.org/x/sys v0.0.0-20201028094953-708e7fb298ac/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201126233918-771906719818 h1:f1CIuDlJhwANEC2MM87MBEVMr3jl5bifgsfj90XAF9c=
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w=
golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=