Files
PekingGripper/class_sensorcmd.py
Brunsmeier 111c9bab8a init repo
2026-07-16 14:56:43 +08:00

274 lines
10 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import time
from class_ch341 import *
from enum import *
class ClassSensorCmd:
def __init__(self, ch341):
# 命令定义
self.CMD_GET_CHANNEL_NUM = 0x01 # 读取通道数量
self.CMD_GET_SENSOR_CAP_DATA = 0x60 # 读取传感器数据
self.CMD_SET_SENSOR_UART_SEND_TYPE = 0x61 # 设置串口输出模式
self.CMD_GET_SENSOR_CHANNEL = 0x62 # 读取通道数量
self.CMD_SET_SENSOR_AUTO_DAC = 0x63 # 自动dac
self.CMD_GET_SENSOR_ERR_CODE = 0x64 # 读取错误码
self.CMD_SET_SENSOR_CHANNEL_CALIBRATE = 0x65 # 设置通道重量标定
self.CMD_GET_SENSOR_CHANNEL_CALIBRATE = 0x66 # 读取通道重量标定
self.CMD_SET_SENSOR_AUTO_THRESHOLD = 0x67 # 设置自动阈值
self.CMD_GET_SENSOR_THRESHOLD = 0x68 # 读取自动阈值
self.CMD_SET_SENSOR_THRESHOLD = 0x69 # 设置通道阈值
self.CMD_SET_SENSOR_TOUCH_THRESHOLD = 0x6A # 设置压力阈值
self.CMD_SET_SENSOR_CHANNEL_CALIBRATE_QUICK = 0x6B # 最大力快速标定
self.CMD_GET_SENSOR_TEST_HZ = 0x6C # 读取采样率
self.CMD_GET_SENSOR_CALI_N_LIST = 0x6D # 读取标定列表
self.CMD_SET_SENSOR_CHANNEL_GROUP_CALIBRATE = 0x6E # 设置通道组重量标定
self.CMD_SET_SENSOR_IIC_ADDR = 0x70 # 设置传感器IIC地址
self.CMD_GET_SENSOR_IIC_ADDR = 0x71 # 读取传感器IIC地址
self.CMD_SET_SENSOR_CDC_SYNC = 0x72 # 采集停止,用于同步
self.CMD_SET_SENSOR_CDC_START_OFFSET = 0x73 # 设置电容开始偏移
self.CMD_GET_SENSOR_TEMP = 0x74 # 读取温度
self.CMD_SET_SENSOR_CDC_CFG_SAVE = 0x75 # 保存cdc配置
self.CMD_SET_SENSOR_FACTOR = 0x76 # 恢复出厂设置
self.CMD_SET_SENSOR_RESTART = 0x77 # 软件复位
self.CMD_SET_SENSOR_WEIGHT_CALIBRATE = 0x78 # 设置重量标定参数
self.CMD_SET_SENSOR_BASE_RESET = 0x79 # 基线复位
self.CMD_SET_SENSOR_UNIFORMIZATION = 0x7A # 归一化
self.CMD_SET_SENSOR_CHANNEL_ENABLE = 0x7B # 通道使能
self.CMD_SET_SENSOR_CHANNEL_BASE_RESET = 0x7C # 单独通道复位
self.CMD_GET_SENSOR_WEIGHT_CALIBRATE = 0x7D # 读取重量标定参数
self.CMD_GET_SENSOR_CHANNEL_STATE = 0x7E # 读取电容通道状态
self.CMD_SET_SENSOR_SEND_TYPE = 0x7F # 数据传输类型
self.CMD_GET_VERSION = 0xA0 # 读取软件版本
self.CMD_SOFT_RESTART = 0xA1 # 软件复位
self.CMD_GET_TYPE = 0xA2 # 读取设备类型
self.CMD_SET_TYPE = 0xA3 # 设置设备类型
self.CMD_SET_INF = 0xA5 # 设置输出接口
self.CMD_GET_PRG = 0xA6 # 获取项目类型
self._ch341 = ch341
self.sendTimePre = list()
self.sendTimePre.append(time.time())
self.sendTimePre.append(time.time())
self.sendTimeNow = list()
self.sendTimeNow.append(time.time())
self.sendTimeNow.append(time.time())
self.sendCnt = list()
self.sendCnt.append(0)
self.sendCnt.append(0)
# 计算校验和
# pack 数据
def calcSum(self, pack):
if len(pack) <= 5:
return 0
_sum = 0
for i in range(0, len(pack)):
_sum += (pack[i] & 0xFF)
pack.append(_sum & 0xFF)
pack.append(_sum >> 8)
# 检查校验值
# pack要检查的数据
# return 0校验值不一致
# 1:校验值一致
def checkSum(self, pack):
if len(pack) <= 5:
return False
_sum = 0
for i in range(0, len(pack) - 2):
_sum += (pack[i] & 0xFF)
chkL = _sum & 0xFF
chkH = (_sum >> 8) & 0xFF
rchkL = pack[len(pack) - 2] & 0xFF
rchkH = pack[len(pack) - 1] & 0xFF
if chkL == rchkL and chkH == rchkH:
return True
else:
return False
# 设置传感器iic地址
# addr当前地址
# new_addr系地址
# return读取的地址
def setAddr(self, addr, new_addr):
_pack = list()
_pack.append(0xAA)
_pack.append(0x55)
_pack.append(0x03)
_pack.append(self.CMD_SET_SENSOR_IIC_ADDR)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(new_addr)
_pack.append(0x00)
self.calcSum(_pack)
self._ch341.write(addr, _pack)
_pack.clear()
_pack.extend(list(range(11)))
time.sleep(0.01)
self._ch341.read(new_addr, _pack)
checksum = self.checkSum(_pack)
if checksum == True and ((self.CMD_SET_SENSOR_IIC_ADDR|0x80) == c_uint8(_pack[3]).value):
return _pack[7] & 0xFF
return 0
def getAddr(self, addr):
_pack = list()
_pack.append(0xAA)
_pack.append(0x55)
_pack.append(0x03)
_pack.append(self.CMD_GET_SENSOR_IIC_ADDR)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
self.calcSum(_pack)
self._ch341.write(addr, _pack)
_pack.clear()
_pack.extend(list(range(11)))
time.sleep(0.01)
self._ch341.read(addr, _pack)
if self.checkSum(_pack) == True:
return _pack[7] & 0xFF
return 0
def getSensorVersion(self, addr):
pass
# 读取电容通道数
# addr传感器地址
def getSensorNum(self, addr):
_pack = list()
_pack.append(0xAA)
_pack.append(0x55)
_pack.append(0x03)
_pack.append(self.CMD_GET_CHANNEL_NUM)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
self.calcSum(_pack)
self._ch341.write(addr, _pack)
_pack.clear()
_pack.extend(list(range(15)))
time.sleep(0.01)
self._ch341.read(addr, _pack)
if self.checkSum(_pack) == True:
return (_pack[5] & 0xFF) + (_pack[6] & 0xFF) * 256
return 0
# 读取项目编号
# addr传感器地址
def getSensorProjectIdex(self, addr):
_pack = list()
_pack.append(0xAA)
_pack.append(0x55)
_pack.append(0x03)
_pack.append(self.CMD_GET_PRG)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
self.calcSum(_pack)
self._ch341.write(addr, _pack)
_pack.clear()
_pack.extend(list(range(11)))
time.sleep(0.01)
self._ch341.read(addr, _pack)
if self.checkSum(_pack) == True:
return (_pack[7] & 0xFF) + (_pack[8] & 0xFF) * 256
return 0
# 设置发送类型
# addr传感器地址
def setSensorSendType(self, addr, sendType):
_pack = list()
_pack.append(0xAA)
_pack.append(0x55)
_pack.append(0x03)
_pack.append(self.CMD_SET_SENSOR_SEND_TYPE)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(sendType)
_pack.append(0x00)
self.calcSum(_pack)
self._ch341.write(addr, _pack)
_pack.clear()
_pack.extend(list(range(11)))
time.sleep(0.01)
self._ch341.read(addr, _pack)
if (self.checkSum(_pack) == True) and ((self.CMD_SET_SENSOR_SEND_TYPE|0x80) == c_uint8(_pack[3]).value):
return True
return False
# 设置采集偏置
# addr传感器地址
def setSensorCapOffset(self, addr, offset):
_pack = list()
_pack.append(0xAA)
_pack.append(0x55)
_pack.append(0x03)
_pack.append(self.CMD_SET_SENSOR_CDC_START_OFFSET)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(offset)
_pack.append(0x00)
self.calcSum(_pack)
self._ch341.write(addr, _pack)
_pack.clear()
_pack.extend(list(range(6)))
time.sleep(0.01)
self._ch341.read(addr, _pack)
checksum = self.checkSum(_pack)
if (checksum == True) and ((self.CMD_SET_SENSOR_CDC_START_OFFSET|0x80) == c_uint8(_pack[3]).value):
return True
return False
# 读取电容数据
# addr传感器地址
def getSensorCapData(self, addr, buf):
tarLen = len(buf)
err = self._ch341.read(addr, buf)
if(err == 0):
print("get data err")
checkSum = self.checkSum(buf)
if(tarLen != len(buf)):
buf.clear()
buf.extend(range(tarLen))
# try:
if (len(buf) == tarLen and buf[0] & 0xFF) == 0x55 and (buf[1] & 0xFF) == 0xAA and checkSum == True:
return True
else:
#print(f"time={time.time()},len(buf) = {len(buf)}, tarLen={tarLen}, buf[0]={buf[0]}, buf[1]={buf[1]}, sum={checkSum}")
pass
return False
# 设置采集同步
# addr传感器地址
def setSensorSync(self, addr):
_pack = list()
_pack.append(0xAA)
_pack.append(0x55)
_pack.append(0x03)
_pack.append(self.CMD_SET_SENSOR_CDC_SYNC)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
_pack.append(0x00)
self.calcSum(_pack)
self._ch341.write(addr, _pack)
return True