觀察以下編碼馬達的介面:(原諒我這樣拍照,實在懶得把馬達拆下來了)
總共六根線,其中兩根是控制馬達轉速以及轉向的,也就是說和普通馬達完全相同,你需要找到這兩根線,應該會有註明,例如我的馬達上標註為:馬達線1
和馬達線2
。將這兩根線接入馬達驅動板,這裡我推薦tb6612模組,小巧又強大,也不算很貴,但是使用時一定要小心,我買回來的第乙個,剛一接線就燒了(不怪人家,是我把12v接上了5v的口)。
關於tb6612的使用,這裡簡單介紹一下,馬達的兩根線應該接入ao1和ao2(或bo1和bo2),pwma(或pwmb)接入arduino的某乙個pwm埠,這個是管馬達速度的。uno的pwm口其實蠻少的,做三輪車很吃緊,我直接用了mega。ain1和ain2(或bin1和bin2)分別接入arduino的非pwm的數字口,這兩個是管馬達轉向的。剩下的口一定要注意,千萬別接錯,否則就像我一樣,vm和隨便乙個gnd分別接大電源的正負極,大電源電壓盡量不要高於12v,不要低於8v,最好用個穩壓模組。vcc和另外乙個gnd口分別接入arduino的+5v和gnd口。stby可以直接接乙個+5v口,也可以接入數字口然後給高電平,這是使能端。
ok,終於把這個複雜的介面講完了,其實這一部分普通馬達和編碼馬達都是一樣的,**也都一樣,下面是我的習慣寫法:
void
motorcontrol
(float sp)
else
if(sp <0)
else
}
其中motor_sp是pwm口,而其他兩個則為控制轉向的介面。這些都和普通馬達一樣,也很好理解,這裡不再詳細解釋。
推薦你把它寫成個頭檔案放庫里,反正只要是做小車,都會用到它。
接下來這部分才是使用編碼馬達的「重頭戲」:讀取碼盤的資料。根據之前我們理解的碼盤的原理,我們只需要測量a相和b相的頻率以及相位差,即可測算出馬達的轉速和轉向。馬達的另外四根線,一根是a相,一根是b相,分別接入arduino的中斷埠(mega的中斷口有2, 3, 18, 19, 20, 21;uno只有2,3,如果是三輪車,看上去只能用mega了)和其他數字口,另外兩根則是編碼器的5v和gnd,接arduino的5v和gnd即可。
實際上碼盤返回的是計數,頻率需要自己測算,這就涉及到arduino的乙個功能:中斷。就好比你正在你家看電影,做著自己的事情,突然你朋友敲門來找你玩,於是你暫停電影,去給朋友開門並把他打發走,又回來繼續看電影。這就是中斷。arduino可以執行中,因為某些觸發時間而暫停,然後去執行其他任務,執行結束後在回來繼續當前的程式。
arduino中有乙個函式是
attachinterrupt
(digitalpintointerrupt
(pin)
,isr,mode)
;
其中各引數分別為:
如果學過數電,可以結合觸發器觸發條件的知識理解一下上面的觸發是怎麼個原理。
這裡有個很狗的一點是,中斷埠號並不是真正的引腳編號,也就是你插了mega的19引腳,實際上你應該寫4號,對應關係如下:
或者也可以直接寫digitalpintointerrupt(19),但無形中多寫了好多哇…(狗頭)
當a相上行時可以看到b相是高電平,我們定義這時電機為正轉,反轉時,它們的相位差是原來的相反數,也就是負九十度。這時,a相上行時b相為低電平,這樣即可簡單地判斷出電機轉動方向。也就是說,要判斷此時電機的轉向,我們需要先判斷a相是上行還是下行,之後在判斷此時b相是高電平還是低電平,這個其實很好判斷,幾個
if
完事。當我們判斷出電機是正轉時,我們就讓計數變數加1,證明碼盤掃過一格,否則減1,即反轉掃過一格。**如下:
void
count()
else
}
其中pps即為計數變數,它的含義其實就是碼盤轉過的格數,如果你知道碼盤一圈有幾格(比如我的電機是390,一般這個引數會被稱為精度),那你就可以算出目前電機轉過的角度。
注意把attachinterrupt()放在setup裡,比如我的a相接了19,對應的中斷口號為4,則我就在setup裡這麼寫:
attachinterrupt(4
, count1, change)
;
好了,至此你就已經可以順利讀出碼盤資料了,不過不知道你有沒有發現這個問題,有了碼盤轉動的資料,我們也只能算出位移
,如何計算速度
?
mstimer2::
set(t, speeddetection)
;
其中,t為時間間隔,也就是每隔這麼多時間中斷一次,第二個引數為中斷函式名,也就是中斷後去執行該函式的內容。看名字我已經取好了:speeddetection,速度檢測,顧名思義這個函式就是測速度的。
測速度的方法也很簡單,我們先用兩次間隔的pss之差計算出電機轉角,再用該轉角除以時間間隔t,即可求出角速度。
float
speeddetection()
pps =0;
//每次該函式最後將pps清零。
attachinterrupt(4
, count1, change)
;//不要忘了再開啟另一種中斷。
}
該函式中的速度和轉角計算公式正是考驗你數學功底的時候,值得注意的是,雖然我的電機精度為390(也就是碼盤一周有390個豁),但是我們在每次a相電平狀態改變時,不管上行還是下行都會記一次數,相當於乙個豁**們計兩次數,因此真正的精度其實是780。這是在計算時應該注意的。其他沒有什麼難理解的地方了。
當然之後還需要在setup裡寫:
mstimer2::
set(t, speeddetection)
;mstimer2::
start()
;//計時開始的意思
下面附上整個原始碼(三輪版本)
#include
//這是我自己寫的,在github上
#include
//引腳中斷庫
#include
//-------------埠定義---------------
#define pina_1 19
//a相
#define pinb_1 29
//b相
#define motor1_sp 13
//pwm埠
#define motor1_pin1 27
//in1
#define motor1_pin2 28
//in2
#define pina_2 2
#define pinb_2 23
#define motor2_sp 11
#define motor2_pin1 24
#define motor2_pin2 25
#define pina_3 3
#define pinb_3 26
#define motor3_sp 12
#define motor3_pin1 30
#define motor3_pin2 31
//------------------------------------
motor motor1
(pina_1, pinb_1, motor1_sp, motor1_pin1, motor1_pin2)
;motor motor2
(pina_2, pinb_2, motor2_sp, motor2_pin1, motor2_pin2)
;motor motor3
(pina_3, pinb_3, motor3_sp, motor3_pin1, motor3_pin2)
;//motor類是我自己在motor.h中定義的類,引數均為埠。
volatile
long m[3]
=;int pps[3]
=;float velocity[3]
=;int t =50;
intadjust
(int sp)
float
speeddetection()
for(
int i =
0; i <
3; i++
) pps[i]=0
;attachinterrupt(4
, count1, change)
;attachinterrupt(0
, count2, change)
;attachinterrupt(1
, count3, change);}
void
setup()
void
loop()
void
motorcontroltri
(float sp1,
float sp2,
float sp3)
void
count1()
else
}void
count2()
else
}void
count3()
else
}
三輪全向輪底盤SLAM挖坑系列 虛擬牆
虛擬牆是在turtlebot2那裡調包出來修改的,主要在rviz上面布置一些虛擬的牆體,並加進去虛擬的雷射,好讓虛擬的牆體也擁有膨脹區域,機械人到達虛擬牆體能夠進行避障。1 安裝好yocs virtual sensor的包,這個包需要安裝比較多的依賴檔案 git clone sudo apt get...
我曾是三輪車伕
我曾經是一名三輪車伕,對於這個事實,我毫不諱言。兩年前的時候,我帶著六百塊錢和一張從阜陽到長沙的火車票隻身來到了湖南師大。我當時腦海裡面考慮的只有一件事情,就是找到學校的領導,申請緩交學費,雖然這個願望最終沒有實現,但是已經無關緊要了。下火車之後的所有場景,我都那麼清晰的記得,就好像剛剛發生過的事情...
GDOI第三輪模擬總結
t1沒有想到乙個性質 插入點的父親是它的前驅和後繼中深度較大的那個。然後感覺十分不可做啊,於是就是打了個模擬spaly,結果有個地方忘記update。t2思路再在一次陷在莫隊中,以為資料會有梯度,就直接上了,一番卡常之後,還是只有暴力分。t3沒有什麼思路,就棄了。t4,30分暴力也需要計算幾何基礎,...