Skip to content

Commit 818d762

Browse files
authored
Merge pull request #8 from yuchiao0222/main
添加輪子說明文檔和相關圖片
2 parents e4b936c + 6327c43 commit 818d762

5 files changed

Lines changed: 129 additions & 0 deletions

File tree

14.8 KB
Loading

培训文档/4_wheels/wheel.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
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+
34+
## I2C
35+
I2C(Inter-Integrated Circuit)序列通訊匯流排(一種串列通訊協定)
36+
37+
簡單來説:只用兩條綫就能讓多個IC晶片彼此通訊👇
38+
39+
那爲什麽我們要用i2c?
40+
41+
- 如果要接很多感測器或者馬達驅動器,傳統的方法每一個都要接很多綫會很複雜
42+
- 而i2c只需要2根綫就好:串列資料綫(SDA)和串列時鐘綫(SCL)
43+
- 分爲主節點Master和從節點Slave
44+
- Master(香橙派)負責去發問、傳資料、決定時鐘
45+
- Slave(麥輪的馬達驅動器)等著被叫地址,然後回答
46+
47+
簡單的流程
48+
- Master發出start的訊號,表示「我要講話了」
49+
- Master呼叫其中一個Slave的地址
50+
- 被呼叫到的Slave回應
51+
- 開始傳送資料
52+
- 傳送完畢,Master發出Stop的訊號,通訊結束
53+
54+
想多了解i2c的原理可以參考:https://zh.wikipedia.org/wiki/I%C2%B2C
55+
56+
57+
## 如果運行上面的Car_Forward_Demo.py出現問題的話 請查看I2C
58+
59+
### 如何查看I2C編號
60+
```
61+
i2cdetect -l
62+
```
63+
然後就會列出系統裏面所有的I2C bus
64+
65+
### 如何查看I2C地址
66+
```
67+
sudo i2cdetect -y -a -r 7
68+
```
69+
命令掃描I2C總綫上的所有設備的地址
70+
- -y表示不提示確認
71+
- -a表示顯示所有地址(包括保留地址)
72+
- -r表示使用快速模式
73+
- 樹莓派默認編號1 香橙派默認編號7
74+
75+
![i2c地址](i2c地址.jpg)
76+
77+
### 請記得修改thuei-1/HiwonderSDK/Sonar.py裏面的第34行
78+
```
79+
self.i2c=7
80+
```
81+
![Sonar](修改sonar.jpg)
82+
83+
84+
## with 寫法(語法糖)
85+
```
86+
try...finally的用法:
87+
f = open("data.txt", "r")
88+
try:
89+
content = f.read()
90+
finally:
91+
f.close()
92+
```
93+
確保不管發生什麼,最後一定關閉
94+
95+
## 使用signal模塊捕獲SIGINT信號(MotorControlDemo.py)
96+
- SIGINT(Signal Interrupt)
97+
在Linux或Unix系統中,按下Ctrl+C的時候,系統會給正在運行的程式發送一個SIGINT,預設行爲是立刻退出
98+
- 如果直接Ctrl+C終端程式的話,馬達可能會卡在保持輸出的狀態,也就是説車子可能會亂跑
99+
- 所以要攔截SIGINT,在程式退出前釋放資源(停止馬達轉動、關閉GPIO等等)
100+
- MotorControlDemo.py中的這一部分
101+
```
102+
start = True
103+
104+
def Stop(signum, frame):
105+
global start
106+
start = False
107+
print('关闭中...')
108+
MotorStop() # 停止所有電機
109+
110+
signal.signal(signal.SIGINT, Stop)
111+
```
112+
就是用signal.signal捕獲SIGINT來關閉所有馬達(電機)【安全地退出】
113+
- MotorControlDemo.py用來測試馬達可不可以正常運轉、速度控制有沒有反應
114+
115+
116+
117+
## 常見問題
118+
- 如果遇到 [Errno 5] Input/output error 請檢查I2C連接和電池電量
119+
- 如果輪子轉的方向不對 請修改wheel_init_dir
120+
- 如果小車不按照計劃的方向走 請檢查馬達編號wheel_init_map
121+
122+
123+
124+
## 使用SMBus類創建I2C總綫對象,__i2c參數指定總綫編號
125+
```python
126+
from smbus import SMBus
127+
with SMBus(__i2c) as bus
128+
```
129+
I2C編號=Linux裏面注冊的I2C控制器的順序
154 KB
Loading
102 KB
Loading
31.1 KB
Loading

0 commit comments

Comments
 (0)