BiS 发表于 2023-7-1 15:29:15

DFRobot_GR10_30 Modbus直接输出结果

# 硬件
DFRobot_GR10_30

# 开发环境
Windows 11, Golang (20230701)

# 运行效果
```
starting
PAG悬停
PAG向下
PAG向上
PAG向左
PAG向右
PAG向左
PAG向右
PAG向左
PAG向右
PAG向左
PAG向右
```
# 协议
Modbus-rtu

# 设备地址
HEX: 0x73
<p>
DEC: 115

# 使用到的寄存器
0x0018 复位寄存器,开始的时候先复位
<p>
0x0007 输出寄存器,读这个就可以

# 对应位和手势的关系,见代码
```azure
const (
   PAGUp PAGRegister = 1 << iota // PAG向上
   PAGDown                     // PAG向下
   PAGLeft                     // PAG向左
   PAGRight                      // PAG向右
   PAGForward                  // PAG向前
   PAGBackward                   // PAG向后
   PAGClockwise                  // PAG顺时针旋转
   PAGCounterclockwise         // PAG逆时针旋转
   PAGWave                     // PAG挥手
   PAGHover                      // PAG悬停
   PAGUnknown                  // PAG未知
   PAGObjectAppearDisappear      // PAG目标出现/消失(保留)
   PAGHLModeChange               // PAG高低模式切换(保留)
   PAGProximity                  // PAG接近(保留)
   PAGClockwiseContinuous      // PAG顺时针连续旋转
   PAGCounterclockwiseContinuous // PAG逆时针连续旋转
)

func (r PAGRegister) Has(flag PAGRegister) bool {
   return r&flag != 0
}

```


BiS 发表于 2023-7-1 15:30:58



package main

import (
        "encoding/binary"
        "fmt"
        "log"
        "time"

        "github.com/goburrow/serial"

        modbus "github.com/things-go/go-modbus"
)



type PAGRegister uint16

const (
        PAGUp PAGRegister = 1 << iota // PAG向上
        PAGDown                     // PAG向下
        PAGLeft                     // PAG向左
        PAGRight                      // PAG向右
        PAGForward                  // PAG向前
        PAGBackward                   // PAG向后
        PAGClockwise                  // PAG顺时针旋转
        PAGCounterclockwise         // PAG逆时针旋转
        PAGWave                     // PAG挥手
        PAGHover                      // PAG悬停
        PAGUnknown                  // PAG未知
        PAGObjectAppearDisappear      // PAG目标出现/消失(保留)
        PAGHLModeChange               // PAG高低模式切换(保留)
        PAGProximity                  // PAG接近(保留)
        PAGClockwiseContinuous      // PAG顺时针连续旋转
        PAGCounterclockwiseContinuous // PAG逆时针连续旋转
)

func (r PAGRegister) Has(flag PAGRegister) bool {
        return r&flag != 0
}

func main() {
        p := modbus.NewRTUClientProvider(modbus.WithEnableLogger(),
                modbus.WithSerialConfig(serial.Config{
                        Address:"COM4",
                        BaudRate: 9600,
                        DataBits: 8,
                        StopBits: 1,
                        Parity:   "N",
                        Timeout:modbus.SerialDefaultTimeout,
                }))

        client := modbus.NewClient(p)
        client.LogMode(false)

        err := client.Connect()
        if err != nil {
                fmt.Println("connect failed, ", err)
                return
        }
        defer client.Close()

        fmt.Println("starting")
        //复位传感器
        client.WriteSingleRegister(0x73,0x0018,1)

        var lastPag PAGRegister

        for {


                // 读取0x0007地址的输入寄存器
                results, err := client.ReadInputRegistersBytes(0x73,0x0007,2)
                if err != nil {
                        log.Fatal(err)
                }

                //fmt.Printf("%b\n", results)

                // 解析PAG寄存器的值
                pag := PAGRegister(binary.BigEndian.Uint16(results))

                // 比较当前值和上次值是否相同,相同则跳过
                if pag == lastPag {
                        continue
                }
                lastPag = pag

                //跳过未知和保留的姿势
                if pag.Has(PAGUnknown) || pag.Has(PAGObjectAppearDisappear) ||pag.Has(PAGHLModeChange) ||pag.Has(PAGProximity){
                        continue
                }

                // 输出解析后的PAG值和时间标记
                now := time.Now().Format("2006-01-02 15:04:05.000") // 格式化当前时间
                fmt.Printf("[%s] ", now)

                // 输出解析后的PAG值
                if pag.Has(PAGUp) {
                        fmt.Println("PAG向上")
                }
                if pag.Has(PAGDown) {
                        fmt.Println("PAG向下")
                }
                if pag.Has(PAGLeft) {
                        fmt.Println("PAG向左")
                }
                if pag.Has(PAGRight) {
                        fmt.Println("PAG向右")
                }
                if pag.Has(PAGForward) {
                        fmt.Println("PAG向前")
                }
                if pag.Has(PAGBackward) {
                        fmt.Println("PAG向后")
                }
                if pag.Has(PAGClockwise) {
                        fmt.Println("PAG顺时针旋转")
                }
                if pag.Has(PAGCounterclockwise) {
                        fmt.Println("PAG逆时针旋转")
                }
                if pag.Has(PAGWave) {
                        fmt.Println("PAG挥手")
                }
                if pag.Has(PAGHover) {
                        fmt.Println("PAG悬停")
                }
                //if pag.Has(PAGUnknown) {
                //        fmt.Println("PAG未知")
                //}
                //if pag.Has(PAGObjectAppearDisappear) {
                //        fmt.Println("PAG目标出现/消失(保留)")
                //}
                //if pag.Has(PAGHLModeChange) {
                //        fmt.Println("PAG高低模式切换(保留)")
                //}
                //if pag.Has(PAGProximity) {
                //        fmt.Println("PAG接近(保留)")
                //}
                if pag.Has(PAGClockwiseContinuous) {
                        fmt.Println("PAG顺时针连续旋转")
                }
                if pag.Has(PAGCounterclockwiseContinuous) {
                        fmt.Println("PAG逆时针连续旋转")
                }


                // 等待1毫秒
                time.Sleep(1 * time.Millisecond)
        }
}

页: [1]
查看完整版本: DFRobot_GR10_30 Modbus直接输出结果