Arduino專題製作 part 3

2020-07-15
Project

發現其實移植到Nano板上面沒什麼好講的,就講講機械手臂跟我遇到的困難好了。

這個機械手臂其實是上課老師做出來的公制版本,而我把重心放在加速度器測距跟藍芽傳輸,所以我沒自己用一個出來。
(機械手臂 圖)
這個機械手臂總共有四個馬達,第一個馬達在最下面,負責xy平面(桌面)的旋轉;第二個馬達在中間,負責垂直xy平面的旋轉,第三個、第四個負責比較細部的操作,這邊就沒用到了。

接著要做的是加速器測距,這個就令我感到困難重重了…

考慮到感測器可以在短時間取得加速度資料,可以直接使用黎曼積分,不用使用什麼很複雜的公式,只需要國中物理的程度就好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int8_t dt = 1; // ms

double a[3], v[3], d[3]; //Acceleration, Velocity, Displacement

void loop()
{
get_Acce(); //接受加速度器資料

for (int8_t i = 0; i < 3; ++i)
{
d[i] += 0.5 * a[i] * dt * 0.0001 * dt * 0.0001 + v[i] * 0.0001;
v[i] += a[i] * dt * 0.0001;
}

blth(d[0], d[1], d[2]); //傳送回控制機械手臂的版子
}

因為這個加速度器其實蠻(不精準的…放在桌上不動xy軸還是會有值出現。
所以我在get_Acce()中加上很多過濾雜質的步驟,比如說直接向下取整之類的,但是在過程中也會讓很多資訊消失@@

最後的結果就是測出來的距離很不準,如果可以多加幾個感測器去校準說不定可以更好? 但是我沒時間做QAQ

接著是因為這個機械手臂的構造是用旋轉來位移,牽涉到兩個軸,而不是只要動一軸就好,而且機械手臂要接收的角度,這就需要用反三角函數了。

r是機械手臂的臂長,L是某個平面上的位移量。
根據$2r sin \frac{\theta}{2} = L$這個等式,可以得到$\theta = 2sin^{-1} \frac{L}{2r}$。

基本上就是這樣了,因為加速度器的誤差以及機械手臂的構造,導致最終成品…差強人意吧(。ŏ_ŏ)

(我每次都沒拍照,害我都沒圖放 (´-ι_-`)