请先阅读《常用电机介绍以及用法》,了解清楚自己现使用的电机参数、接线方式、供电电压。以免造成烧坏主板或者电机的后果。
I2C与串口通讯不能共用,只能选择其中一个。
电机 | 四路电机驱动板(Motor) |
---|---|
M2 | M- |
V | 3V3 |
A | H1A |
B | H1B |
G | GND |
M1 | M+ |
四路电机驱动板 | Jetson NANO B01(物理引脚) |
---|---|
SDA | 3 |
SCL | 5 |
GND | 6 |
5V | 4 |
使用文件传输软件,例如WinSCP,软件需要自行搜索下载。将py文件通过软件传输到主板的根目录下,然后打开终端,运行指令:
sudo python3 ~/IIC.py
如果终端弹出缺少smbus模块的报错:
就先使用下面的指令来安装此模块后,再次尝试运行:
xxxxxxxxxx
sudo apt update
sudo apt install python3-smbus
xUPLOAD_DATA = 1 #1:接收总的编码器数据 2:接收实时的编码器
#1: Receive total encoder data 2: Receive real-time encoder
MOTOR_TYPE = 1 #1:520电机 2:310电机 3:测速码盘TT电机 4:TT直流减速电机 5:L型520电机
#1:520 motor 2:310 motor 3:speed code disc TT motor 4:TT DC reduction motor 5:L type 520 motor
如果是需要驱动电机并观察数据,只修改程序开头的这两个数字就可以了,代码的其余部分不需要做任何更改。
xxxxxxxxxx
def set_motor_parameter():
if MOTOR_TYPE == 1:
set_motor_type(1) # 配置电机类型
time.sleep(0.1)
set_pluse_phase(30) # 配置减速比,查电机手册得出
time.sleep(0.1)
set_pluse_line(11) # 配置磁环线,查电机手册得出
time.sleep(0.1)
set_wheel_dis(67.00) # 配置轮子直径,测量得出
time.sleep(0.1)
set_motor_deadzone(1900) # 配置电机死区,实验得出
time.sleep(0.1)
elif MOTOR_TYPE == 2:
set_motor_type(2)
time.sleep(0.1)
set_pluse_phase(20)
time.sleep(0.1)
set_pluse_line(13)
time.sleep(0.1)
set_wheel_dis(48.00)
time.sleep(0.1)
set_motor_deadzone(1600)
time.sleep(0.1)
elif MOTOR_TYPE == 3:
set_motor_type(3)
time.sleep(0.1)
set_pluse_phase(45)
time.sleep(0.1)
set_pluse_line(13)
time.sleep(0.1)
set_wheel_dis(68.00)
time.sleep(0.1)
set_motor_deadzone(1250)
time.sleep(0.1)
elif MOTOR_TYPE == 4:
set_motor_type(4)
time.sleep(0.1)
set_pluse_phase(48)
time.sleep(0.1)
set_motor_deadzone(1000)
time.sleep(0.1)
elif MOTOR_TYPE == 5:
set_motor_type(1)
time.sleep(0.1)
set_pluse_phase(40)
time.sleep(0.1)
set_pluse_line(11)
time.sleep(0.1)
set_wheel_dis(67.00)
time.sleep(0.1)
set_motor_deadzone(1900)
time.sleep(0.1)
这里用于存储本店在售电机的参数,通过修改上方的MOTOR_TYPE参数,就可以实现一键配置。正常情况下使用本店的电机不要修改此处的代码。如果使用的是自己的电机,或者说某项数据需要根据自己的需求来修改,那么可以查看文档《4路电机驱动板控制指令》来了解每一项指令的具体含义。
xxxxxxxxxx
if __name__ == "__main__":
try:
t = 0
print("please wait...")
set_motor_parameter() # 设置自己的电机参数 Set your own motor parameters
while True:
t += 10
M1 = t
M2 = t
M3 = t
M4 = t
if MOTOR_TYPE == 4:
control_pwm(M1*2, M2*2, M3*2, M4*2)
else:
control_speed(M1, M2, M3, M4)#直接发送命令控制电机 Send commands directly to control the motor
if t> 1000 or t < -1000:
t = 0
if UPLOAD_DATA == 1:
now_string = read_all_encoder() # 读取累计编码器数据 Read the accumulated encoder data
print(now_string)
elif UPLOAD_DATA == 2:
offset_string = read_10_encoder() # 读取实时编码器数据 Read real-time encoder data
print(offset_string)
time.sleep(0.1)
主程序循环会将四个电机的速度从0开始慢慢加到1000,如果电机类型选择的是4,即无编码器的电机,那就是直接控制电机的pwm。同时读取驱动板发送上来的数据,并一边将数据打印出来。
xxxxxxxxxx
# 读取编码器数据 Read encoder data
def read_10_encoder():
global encoder_offset
formatted_values = []
for i in range(4):
reg = READ_TEN_M1_ENCODER_REG + i
buf = i2c_read(MOTOR_MODEL_ADDR, reg, 2)
encoder_offset[i] = (buf[0] << 8) | buf[1]
if encoder_offset[i] & 0x8000: # 检查最高位(符号位)是否为 1 Check if the highest bit (sign bit) is 1
encoder_offset[i] -= 0x10000 # 将其转为负数 Turn it into a negative number
formatted_values.append("M{}:{}".format(i + 1, encoder_offset[i]))
return ", ".join(formatted_values)
def read_all_encoder():
global encoder_now
formatted_values = []
for i in range(4):
high_reg = READ_ALLHIGH_M1_REG + (i * 2)
low_reg = READ_ALLLOW_M1_REG + (i * 2)
high_buf = i2c_read(MOTOR_MODEL_ADDR, high_reg, 2)
low_buf = i2c_read(MOTOR_MODEL_ADDR, low_reg, 2)
high_val = high_buf[0] <<8 | high_buf[1]
low_val = low_buf[0] <<8 | low_buf[1]
encoder_val = (high_val << 16) | low_val
# 处理符号扩展,假设 32 位有符号整数 Handles sign extension, assuming 32-bit signed integers
if encoder_val >= 0x80000000: # 如果大于 2^31,说明应该是负数 If it is greater than 2^31, it should be a negative number
encoder_val -= 0x100000000 # 将其转为负数 Turn it into a negative number
encoder_now[i] = encoder_val
formatted_values.append("M{}:{}".format(i + 1, encoder_now[i]))
return ", ".join(formatted_values)
从驱动板获取数据后,对它进行移位处理,需要移位才能获取正确数据。
接线正确后,将程序放置于根目录,然后运行指令sudo python3 ~/IIC.py
,可以看见电机会逐渐变快,然后又停下,重复如此。同时在终端里能看见打印的电机数值在不断的变化。