请先阅读《常用电机介绍以及用法》,了解清楚自己现使用的电机参数、接线方式、供电电压。以免造成烧坏主板或者电机的后果。
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模块的报错:

就先使用下面的指令来安装此模块后,再次尝试运行:
xxxxxxxxxxsudo apt updatesudo 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如果是需要驱动电机并观察数据,只修改程序开头的这两个数字就可以了,代码的其余部分不需要做任何更改。
xxxxxxxxxxdef 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路电机驱动板控制指令》来了解每一项指令的具体含义。
xxxxxxxxxxif __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 datadef 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,可以看见电机会逐渐变快,然后又停下,重复如此。同时在终端里能看见打印的电机数值在不断的变化。
