2023-7-1 15:29:15 [显示全部楼层]
915浏览
查看: 915|回复: 1

DFRobot_GR10_30 Modbus直接输出结果

[复制链接]
# 硬件
DFRobot_GR10_30

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

# 运行效果
```
starting
[2023-07-01 14:45:31.026] PAG悬停
[2023-07-01 14:45:33.140] PAG向下
[2023-07-01 14:45:34.569] PAG向上
[2023-07-01 14:45:35.775] PAG向左
[2023-07-01 14:45:37.070] PAG向右
[2023-07-01 14:45:38.292] PAG向左
[2023-07-01 14:45:39.281] PAG向右
[2023-07-01 14:45:40.250] PAG向左
[2023-07-01 14:45:41.082] PAG向右
[2023-07-01 14:45:42.025] PAG向左
[2023-07-01 14:45:42.685] 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



  1. package main
  2. import (
  3.         "encoding/binary"
  4.         "fmt"
  5.         "log"
  6.         "time"
  7.         "github.com/goburrow/serial"
  8.         modbus "github.com/things-go/go-modbus"
  9. )
  10. type PAGRegister uint16
  11. const (
  12.         PAGUp PAGRegister = 1 << iota // PAG向上
  13.         PAGDown                       // PAG向下
  14.         PAGLeft                       // PAG向左
  15.         PAGRight                      // PAG向右
  16.         PAGForward                    // PAG向前
  17.         PAGBackward                   // PAG向后
  18.         PAGClockwise                  // PAG顺时针旋转
  19.         PAGCounterclockwise           // PAG逆时针旋转
  20.         PAGWave                       // PAG挥手
  21.         PAGHover                      // PAG悬停
  22.         PAGUnknown                    // PAG未知
  23.         PAGObjectAppearDisappear      // PAG目标出现/消失(保留)
  24.         PAGHLModeChange               // PAG高低模式切换(保留)
  25.         PAGProximity                  // PAG接近(保留)
  26.         PAGClockwiseContinuous        // PAG顺时针连续旋转
  27.         PAGCounterclockwiseContinuous // PAG逆时针连续旋转
  28. )
  29. func (r PAGRegister) Has(flag PAGRegister) bool {
  30.         return r&flag != 0
  31. }
  32. func main() {
  33.         p := modbus.NewRTUClientProvider(modbus.WithEnableLogger(),
  34.                 modbus.WithSerialConfig(serial.Config{
  35.                         Address:  "COM4",
  36.                         BaudRate: 9600,
  37.                         DataBits: 8,
  38.                         StopBits: 1,
  39.                         Parity:   "N",
  40.                         Timeout:  modbus.SerialDefaultTimeout,
  41.                 }))
  42.         client := modbus.NewClient(p)
  43.         client.LogMode(false)
  44.         err := client.Connect()
  45.         if err != nil {
  46.                 fmt.Println("connect failed, ", err)
  47.                 return
  48.         }
  49.         defer client.Close()
  50.         fmt.Println("starting")
  51.         //复位传感器
  52.         client.WriteSingleRegister(0x73,0x0018,1)
  53.         var lastPag PAGRegister
  54.         for {
  55.                 // 读取0x0007地址的输入寄存器
  56.                 results, err := client.ReadInputRegistersBytes(0x73,0x0007,2)
  57.                 if err != nil {
  58.                         log.Fatal(err)
  59.                 }
  60.                 //fmt.Printf("%b\n", results)
  61.                 // 解析PAG寄存器的值
  62.                 pag := PAGRegister(binary.BigEndian.Uint16(results))
  63.                 // 比较当前值和上次值是否相同,相同则跳过
  64.                 if pag == lastPag {
  65.                         continue
  66.                 }
  67.                 lastPag = pag
  68.                 //跳过未知和保留的姿势
  69.                 if pag.Has(PAGUnknown) || pag.Has(PAGObjectAppearDisappear) ||pag.Has(PAGHLModeChange) ||pag.Has(PAGProximity)  {
  70.                         continue
  71.                 }
  72.                 // 输出解析后的PAG值和时间标记
  73.                 now := time.Now().Format("2006-01-02 15:04:05.000") // 格式化当前时间
  74.                 fmt.Printf("[%s] ", now)
  75.                 // 输出解析后的PAG值
  76.                 if pag.Has(PAGUp) {
  77.                         fmt.Println("PAG向上")
  78.                 }
  79.                 if pag.Has(PAGDown) {
  80.                         fmt.Println("PAG向下")
  81.                 }
  82.                 if pag.Has(PAGLeft) {
  83.                         fmt.Println("PAG向左")
  84.                 }
  85.                 if pag.Has(PAGRight) {
  86.                         fmt.Println("PAG向右")
  87.                 }
  88.                 if pag.Has(PAGForward) {
  89.                         fmt.Println("PAG向前")
  90.                 }
  91.                 if pag.Has(PAGBackward) {
  92.                         fmt.Println("PAG向后")
  93.                 }
  94.                 if pag.Has(PAGClockwise) {
  95.                         fmt.Println("PAG顺时针旋转")
  96.                 }
  97.                 if pag.Has(PAGCounterclockwise) {
  98.                         fmt.Println("PAG逆时针旋转")
  99.                 }
  100.                 if pag.Has(PAGWave) {
  101.                         fmt.Println("PAG挥手")
  102.                 }
  103.                 if pag.Has(PAGHover) {
  104.                         fmt.Println("PAG悬停")
  105.                 }
  106.                 //if pag.Has(PAGUnknown) {
  107.                 //        fmt.Println("PAG未知")
  108.                 //}
  109.                 //if pag.Has(PAGObjectAppearDisappear) {
  110.                 //        fmt.Println("PAG目标出现/消失(保留)")
  111.                 //}
  112.                 //if pag.Has(PAGHLModeChange) {
  113.                 //        fmt.Println("PAG高低模式切换(保留)")
  114.                 //}
  115.                 //if pag.Has(PAGProximity) {
  116.                 //        fmt.Println("PAG接近(保留)")
  117.                 //}
  118.                 if pag.Has(PAGClockwiseContinuous) {
  119.                         fmt.Println("PAG顺时针连续旋转")
  120.                 }
  121.                 if pag.Has(PAGCounterclockwiseContinuous) {
  122.                         fmt.Println("PAG逆时针连续旋转")
  123.                 }
  124.                 // 等待1毫秒
  125.                 time.Sleep(1 * time.Millisecond)
  126.         }
  127. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail