日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ros怎么跑小车_如何搭建ROS小车底盘(一)

發(fā)布時間:2024/3/24 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ros怎么跑小车_如何搭建ROS小车底盘(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

搭建前準備

需要的硬件清單:

樹梅派2或3代

帶編碼器測速JGA25-371減速電機一對

小車輪子一對

萬向輪一個

小車亞克力板底板一套

Arduino MEGA2560 R3開發(fā)板一塊:用于控制電機驅(qū)動,接收上位機指令并把傳感器

L298N電機驅(qū)動板模塊

12V充電電池塊

電池分壓模塊

需要的軟件列表:

Unbuntu 14.04

indigo版本ROS系統(tǒng)

indigo版本 ros_arduino_bridge

搭建步驟

搭建小車底盤分兩步:

首先,我們把JGA25-371減速電機和輪子連接,然后和萬向輪一起固定到小車亞克力板底板上。這一步比較簡單,我們就不再詳細介紹。

然后,我們重點要考慮JGA25-371減速電機、L298N電機驅(qū)動板模塊、Arduino MEGA2560 R3、樹梅派和電池之間如何連接。

主要部件的介紹

JGA25-371減速電機

JGA25-371帶編碼器測速碼盤的電機由兩部分組成:直流減速電機和雙通道霍爾效應編碼器。如下圖所示:

直流減速電機的工作電壓:6-24VDC。根據(jù)在額定電壓12V時每分鐘空載轉(zhuǎn)速不同, JGA25-371系列電機分為如下幾個型號:977rpm 463rpm 201rpm 126rpm 95rpm 55rpm 41rpm 25rpm 19rpm 11rpm 8.6rpm。如下圖所示。

轉(zhuǎn)速越快,做出來來小車的速度就會越快,但轉(zhuǎn)速快的小車扭矩就小,小車的載重就隨之變小,并且小車在上坡或越過障礙物時就顯得動力不足。我們建議購買型號為126rpm轉(zhuǎn)速的電機。

測速的編碼器是雙通道霍爾效應編碼器,它包含一個磁柵和磁敏檢測電路,輸出兩個通道正交相位角為90度的方波。如下圖所示。

該編碼器單路每圈脈沖13CPR(Counts Per Revolution,每轉(zhuǎn)脈沖的個數(shù))。一方面由于每圈又可以分一個上升沿和一個下降沿,另一方面該編碼器擁有A B雙路輸出,所以每轉(zhuǎn)一圈,該編碼器的雙路上下沿總共可以輸出52CPR。那么小車輪子轉(zhuǎn)一圈,最多只能產(chǎn)生52個脈沖信號嗎?不對,還要考慮減速比,以轉(zhuǎn)速為126rpm 的型號電機為例,它的減速比為1:34,也就是說,編碼器側(cè)轉(zhuǎn)34圈,小車的輪子才轉(zhuǎn)一圈。所以,小車輪子轉(zhuǎn)一圈,可以產(chǎn)生52*34=1768個脈沖信號。

另外,還可以根據(jù)A B雙路輸出的信號,確定輪子是正轉(zhuǎn)還是反轉(zhuǎn)。

JGA25-371電機和編碼器的接線如下圖所示。

接線按上圖片從右到左分是M+、M-、Hgnd、Hvcc、HoutA、 HoutB。

M+(紅線) 電機電源+

M-(黑線) 電機電源-

Hgnd(綠線) 編碼器地線

Hvcc(藍線) 編碼器電源(接5V電壓)

HoutA(黃線) 信號A輸出

HoutB(白線) 信號B輸出

測速編碼的連線

arduino測試代碼:

#define BAUDRATE 115200

#define LEFT 0

#define RIGHT 1

#define FORWARDS true

#define BACKWARDS false

volatile long encoderLeft = 0L;

volatile long encoderRight = 0L;

void initEncoders(){

pinMode(2, INPUT);

pinMode(3, INPUT);

attachInterrupt(0, encoderLeftISR, CHANGE);

attachInterrupt(1, encoderRightISR, CHANGE);

}

void encoderLeftISR(){

encoderLeft++;

}

void encoderRightISR(){

encoderRight++;

}

long readEncoder(int i) {

long encVal = 0L;

if (i == LEFT) {

noInterrupts();

//detachInterrupt(0);

encVal = encoderLeft;

interrupts();

//attachInterrupt(0, Code_left, FALLING);

}

else {

noInterrupts();

//detachInterrupt(1);

encVal = encoderRight;

interrupts();

//attachInterrupt(1, Code_right, FALLING);

}

return encVal;

}

/* Wrap the encoder reset function */

void resetEncoder(int i) {

if (i == LEFT){

noInterrupts();

encoderLeft = 0L;

interrupts();

}else {

noInterrupts();

encoderRight = 0L;

interrupts();

}

}

/* Wrap the encoder reset function */

void resetEncoders() {

resetEncoder(LEFT);

resetEncoder(RIGHT);

}

void setup() {

Serial.begin(BAUDRATE);

initEncoders();

resetEncoders();

}

void loop() {

long lval=readEncoder(0);

long rval=readEncoder(1);

Serial.print("left: ");

Serial.print(lval);

Serial.print("; right: ");

Serial.println(rval);

delay(30);

}

測試結果如下:

由于JGA25-371電機需要L298N模塊來驅(qū)動,所以再講JGA25-371電機連線之前,先來介紹下L298N模塊。

L298N電機驅(qū)動模塊

L298N電機驅(qū)動模塊如下圖所示。

驅(qū)動電壓5v~35v, 邏輯電壓5v. 內(nèi)置的78M05通過驅(qū)動電源部分取電工作, 當使用大于12V驅(qū)動電壓的時候,為了避免穩(wěn)壓芯片損壞, 請使用外置的5V邏輯供電。

ENA:OUT1和OUT2的使能端,默認情況下,跳線帽接上時,高電平有效,低電平禁止;如果需要PWM調(diào)速,就需要拔掉跳線帽.

驅(qū)動直流電機

由于本模塊是2路的H橋驅(qū)動,所以可以同時驅(qū)動兩個電機

使能ENA ENB之后,

可以分別從IN1 IN2輸入PWM信號驅(qū)動電機1的轉(zhuǎn)速和方向

可以分別從IN3 IN4輸入PWM信號驅(qū)動電機2的轉(zhuǎn)速和方向

信號如圖所示

驅(qū)動步進電機

由于本模塊是2路的H橋驅(qū)動,所以可以同時驅(qū)動兩個電機,

使能ENA ENB之后,

可以分別從IN1 IN2輸入PWM信號驅(qū)動電機1的轉(zhuǎn)速和方向

可以分別從IN3 IN4輸入PWM信號驅(qū)動電機2的轉(zhuǎn)速和方向

如果L298N和arduino使用不同的電源供電的話,那么需要將arduino的GND和模塊上的GND連接在一起,只有這樣單片機上過來的邏輯信號才有個參考0點。此點非常重要,請大家注意。

兩種接線方式。

方式一:

通過IN1和IN2控制電機轉(zhuǎn)動方向(正轉(zhuǎn)或反轉(zhuǎn)), 通過ENA控制電機的轉(zhuǎn)速。

arduino的代碼:

int enA = 5;

int in1 = 7;

int in2 = 8;

// motor two

int enB = 6;

int in3 = 9;

int in4 = 10;

void setup()

{

// set all the motor control pins to outputs

pinMode(enA, OUTPUT);

pinMode(enB, OUTPUT);

pinMode(in1, OUTPUT);

pinMode(in2, OUTPUT);

pinMode(in3, OUTPUT);

pinMode(in4, OUTPUT);

}

void demoOne()

{

// this function will run the motors in both directions at a fixed speed

// turn on motor A

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

// set speed to 200 out of possible range 0~255

analogWrite(enA, 200);

// turn on motor B

digitalWrite(in4, HIGH);

digitalWrite(in3, LOW);

// set speed to 200 out of possible range 0~255

analogWrite(enB, 200);

delay(2000);

// now change motor directions

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

digitalWrite(in4, LOW);

digitalWrite(in3, HIGH);

delay(2000);

// now turn off motors

digitalWrite(in1, LOW);

digitalWrite(in2, LOW);

digitalWrite(in3, LOW);

digitalWrite(in4, LOW);

}

void demoTwo()

{

// this function will run the motors across the range of possible speeds

// note that maximum speed is determined by the motor itself and the operating voltage

// the PWM values sent by analogWrite() are fractions of the maximum speed possible

// by your hardware

// turn on motors

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

digitalWrite(in3, LOW);

digitalWrite(in4, HIGH);

// accelerate from zero to maximum speed

for (int i = 0; i < 256; i++)

{

analogWrite(enA, i);

analogWrite(enB, i);

delay(20);

}

// decelerate from maximum speed to zero

for (int i = 255; i >= 0; --i)

{

analogWrite(enA, i);

analogWrite(enB, i);

delay(20);

}

// now turn off motors

digitalWrite(in1, LOW);

digitalWrite(in2, LOW);

digitalWrite(in3, LOW);

digitalWrite(in4, LOW);

}

void loop()

{

demoOne();

delay(1000);

demoTwo();

delay(1000);

}

ENA插帽不用拔掉,通過IN1和IN2輸入PWM控制電機轉(zhuǎn)動的方向和

轉(zhuǎn)速。

總結

以上是生活随笔為你收集整理的ros怎么跑小车_如何搭建ROS小车底盘(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。