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
}
```
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]