Skip to content

Commit 0b7b702

Browse files
committed
add wheels.md as simplified chinese
1 parent 6327c43 commit 0b7b702

1 file changed

Lines changed: 125 additions & 0 deletions

File tree

培训文档/4_wheels/wheels.md

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# 匹配轮子和麦轮运动控制
2+
3+
## 开始让车车跑起来吧!!!
4+
5+
### 这次的培训主要是让大家来实现thuei-1/MecanumControl/Car_Forward_Demo.py这个文件来确认轮子的编号
6+
7+
- 先把文件中第26行的
8+
```
9+
chassis = mecanum.MecanumChassis(wheel_init_dir=[1, 1, 1, 1], wheel_init_map=[2, 4, 1, 3])
10+
```
11+
改成
12+
```
13+
chassis = mecanum.MecanumChassis(wheel_init_dir=[1, 1, 1, 1], wheel_init_map=[1, 2, 3, 4])
14+
```
15+
- 马达转向配置
16+
```
17+
wheel_init_dir=[1,1,1,1]
18+
```
19+
1是正转(顺时针)-1是反转(逆时针)
20+
21+
- 轮子编号对应马达编号
22+
```
23+
wheel_init_map=[1, 2, 3, 4]
24+
```
25+
1-左前轮、2-右前轮、3-左后轮、4-右后轮
26+
27+
![修改文档](輪子編號.jpg)
28+
29+
- 注意要确认轮子的接线顺序和方向是不是正确
30+
31+
32+
33+
## I2C
34+
I2C(Inter-Integrated Circuit)序列通讯总线(一种串列通讯协定)
35+
36+
简单来说:只用两条线就能让多个IC芯片彼此通讯👇
37+
38+
那爲什麽我们要用i2c?
39+
40+
- 如果要接很多传感器或者马达驱动器,传统的方法每一个都要接很多线会很复杂
41+
- 而i2c只需要2根线就好:串列资料线(SDA)和串列时钟线(SCL)
42+
- 分爲主节点Master和从节点Slave
43+
- Master(香橙派)负责去发问、传资料、决定时钟
44+
- Slave(麦轮的马达驱动器)等着被叫地址,然后回答
45+
46+
简单的流程
47+
- Master发出start的讯号,表示「我要讲话了」
48+
- Master呼叫其中一个Slave的地址
49+
- 被呼叫到的Slave回应
50+
- 开始传送资料
51+
- 传送完毕,Master发出Stop的讯号,通讯结束
52+
53+
想多了解i2c的原理可以参考:https://zh.wikipedia.org/wiki/I%C2%B2C
54+
55+
## 如果运行上面的Car_Forward_Demo.py出现问题的话 请查看I2C
56+
57+
### 如何查看I2C编号
58+
```
59+
i2cdetect -l
60+
```
61+
然后就会列出系统里面所有的I2C bus
62+
63+
### 如何查看I2C地址
64+
```
65+
sudo i2cdetect -y -a -r 7
66+
```
67+
命令扫描I2C总线上的所有设备的地址
68+
- -y表示不提示确认
69+
- -a表示显示所有地址(包括保留地址)
70+
- -r表示使用快速模式
71+
- 树莓派默认编号1 香橙派默认编号7
72+
73+
![i2c地址](i2c地址.jpg)
74+
75+
### 请记得修改thuei-1/HiwonderSDK/Sonar.py里面的第34行
76+
```
77+
self.i2c=7
78+
```
79+
![Sonar](修改sonar.jpg)
80+
81+
## with 写法(语法糖)
82+
```
83+
try...finally的用法:
84+
f = open("data.txt", "r")
85+
try:
86+
    content = f.read()
87+
finally:
88+
    f.close()  
89+
```
90+
确保不管发生什么,最后一定关闭
91+
92+
## 使用signal模块捕获SIGINT信号(MotorControlDemo.py)
93+
- SIGINT(Signal Interrupt)
94+
在Linux或Unix系统中,按下Ctrl+C的时候,系统会给正在运行的程序发送一个SIGINT,预设行爲是立刻退出
95+
- 如果直接Ctrl+C终端程序的话,马达可能会卡在保持输出的状态,也就是说车子可能会乱跑
96+
- 所以要拦截SIGINT,在程序退出前释放资源(停止马达转动、关闭GPIO等等)
97+
- MotorControlDemo.py中的这一部分
98+
```
99+
start = True
100+
101+
def Stop(signum, frame):
102+
    global start
103+
    start = False
104+
    print('关闭中...')
105+
    MotorStop()  # 停止所有电机
106+
107+
signal.signal(signal.SIGINT, Stop)
108+
```
109+
就是用signal.signal捕获SIGINT来关闭所有马达(电机)【安全地退出】
110+
- MotorControlDemo.py用来测试马达可不可以正常运转、速度控制有没有反应
111+
112+
113+
## 常见问题
114+
- 如果遇到 [Errno 5] Input/output error 请检查I2C连接和电池电量
115+
- 如果轮子转的方向不对 请修改wheel_init_dir
116+
- 如果小车不按照计划的方向走 请检查马达编号wheel_init_map
117+
118+
119+
## 使用SMBus类创建I2C总线对象,__i2c参数指定总线编号
120+
```python
121+
from smbus import SMBus
122+
    with SMBus(__i2c) as bus
123+
```
124+
I2C编号=Linux里面注册的I2C控制器的顺序
125+

0 commit comments

Comments
 (0)