ros怎么跑小车_如何搭建ROS小车底盘(一)
搭建前準備
需要的硬件清單:
樹梅派2或3代
帶編碼器測速JGA25-371減速電機一對
小車輪子一對
萬向輪一個
小車亞克力板底板一套
Arduino MEGA2560 R3開發板一塊:用于控制電機驅動,接收上位機指令并把傳感器
L298N電機驅動板模塊
12V充電電池塊
電池分壓模塊
需要的軟件列表:
Unbuntu 14.04
indigo版本ROS系統
indigo版本 ros_arduino_bridge
搭建步驟
搭建小車底盤分兩步:
首先,我們把JGA25-371減速電機和輪子連接,然后和萬向輪一起固定到小車亞克力板底板上。這一步比較簡單,我們就不再詳細介紹。
然后,我們重點要考慮JGA25-371減速電機、L298N電機驅動板模塊、Arduino MEGA2560 R3、樹梅派和電池之間如何連接。
主要部件的介紹
JGA25-371減速電機
JGA25-371帶編碼器測速碼盤的電機由兩部分組成:直流減速電機和雙通道霍爾效應編碼器。如下圖所示:
直流減速電機的工作電壓:6-24VDC。根據在額定電壓12V時每分鐘空載轉速不同, JGA25-371系列電機分為如下幾個型號:977rpm 463rpm 201rpm 126rpm 95rpm 55rpm 41rpm 25rpm 19rpm 11rpm 8.6rpm。如下圖所示。
轉速越快,做出來來小車的速度就會越快,但轉速快的小車扭矩就小,小車的載重就隨之變小,并且小車在上坡或越過障礙物時就顯得動力不足。我們建議購買型號為126rpm轉速的電機。
測速的編碼器是雙通道霍爾效應編碼器,它包含一個磁柵和磁敏檢測電路,輸出兩個通道正交相位角為90度的方波。如下圖所示。
該編碼器單路每圈脈沖13CPR(Counts Per Revolution,每轉脈沖的個數)。一方面由于每圈又可以分一個上升沿和一個下降沿,另一方面該編碼器擁有A B雙路輸出,所以每轉一圈,該編碼器的雙路上下沿總共可以輸出52CPR。那么小車輪子轉一圈,最多只能產生52個脈沖信號嗎?不對,還要考慮減速比,以轉速為126rpm 的型號電機為例,它的減速比為1:34,也就是說,編碼器側轉34圈,小車的輪子才轉一圈。所以,小車輪子轉一圈,可以產生52*34=1768個脈沖信號。
另外,還可以根據A B雙路輸出的信號,確定輪子是正轉還是反轉。
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模塊來驅動,所以再講JGA25-371電機連線之前,先來介紹下L298N模塊。
L298N電機驅動模塊
L298N電機驅動模塊如下圖所示。
驅動電壓5v~35v, 邏輯電壓5v. 內置的78M05通過驅動電源部分取電工作, 當使用大于12V驅動電壓的時候,為了避免穩壓芯片損壞, 請使用外置的5V邏輯供電。
ENA:OUT1和OUT2的使能端,默認情況下,跳線帽接上時,高電平有效,低電平禁止;如果需要PWM調速,就需要拔掉跳線帽.
驅動直流電機
由于本模塊是2路的H橋驅動,所以可以同時驅動兩個電機
使能ENA ENB之后,
可以分別從IN1 IN2輸入PWM信號驅動電機1的轉速和方向
可以分別從IN3 IN4輸入PWM信號驅動電機2的轉速和方向
信號如圖所示
驅動步進電機
由于本模塊是2路的H橋驅動,所以可以同時驅動兩個電機,
使能ENA ENB之后,
可以分別從IN1 IN2輸入PWM信號驅動電機1的轉速和方向
可以分別從IN3 IN4輸入PWM信號驅動電機2的轉速和方向
如果L298N和arduino使用不同的電源供電的話,那么需要將arduino的GND和模塊上的GND連接在一起,只有這樣單片機上過來的邏輯信號才有個參考0點。此點非常重要,請大家注意。
兩種接線方式。
方式一:
通過IN1和IN2控制電機轉動方向(正轉或反轉), 通過ENA控制電機的轉速。
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控制電機轉動的方向和
轉速。
總結
以上是生活随笔為你收集整理的ros怎么跑小车_如何搭建ROS小车底盘(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 状态同步 和 帧同步
- 下一篇: 十大免费字体