DFRobot_GR10_30 Modbus直接输出结果

2023-07-012426
AI 快速预览详细 收起
本文介绍了如何在Windows 11环境下,使用Golang实现DFRobot_GR10_30的Modbus-rtu手势识别。通过读取0x0007寄存器,可以实时检测并输出多种手势,如向上、向下、向左、向右等。文章提供了详细的代码示例,帮助开发者轻松实现手势控制功能。
# 硬件
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
}

```


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(1)
BiS
BiS
作者

[code]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)
}
}
[/code]
- 没有更多了 -