本文介绍一种基于ros_arduino_bridge功能包以及SLAM的自主导航小车的制作过程
1、材料清单
1、arduino nano
2、10cm长母对母杜邦线若干
3、TB6612FNG电机驱动模块
4、2.54单排针1*40
5、1x15P单排母座若干
6、1x8P单排母座若干
7、7x9cm单面万能版
8、JGA37直流减速电机,减速比1/43 (2)
9、JGB37电机固定座 L型支架(2)
10、六角联轴器 配套小车轮子使用6cm(2)
11、机器人轮胎 68mm轮胎(2)
12、2寸万向轮
13、12V锂电池 12V 4000mAh
14、思岚激光雷达 RPLIDAR A1
15、树莓派4代RaspberryPi4B
16、电烙铁,焊锡丝
2、 控制板制作
如图所示是控制板的布局草图,最左边是arduino nano,arduino nano通过单排母座插在控制板上,紧挨着arduino nano的是一列VCC和一列GND。再右边是TB6612电机驱动板,最右边是左右电机的接线排针。12V电源接线排针位于控制板的最上方。
通过虚拟机安装ubuntu18.04,并在ubuntu系统上安装ros melodic版本,ubuntu系统以及ros的安装请自行百度。建立一个ros工作空间,然后通过网址将ros_arduino_bridge功能包下载在工作空间的src目录下。进入ros_arduino_bridge功能包的ros_arduino_firmware/src/libraries/RSOArduinoBridge/目录下,利用arduino IDE打开RISArduinoBridge.ino。修改以下代码
#define USE_BASE // Enable the base controller code
//#undef USE_BASE // Disable the base controller code
/* Define the motor controller and encoder library you are using */
#ifdef USE_BASE
/* The Pololu VNH5019 dual motor driver shield */
//#define POLOLU_VNH5019
/* The Pololu MC33926 dual motor driver shield */
//#define POLOLU_MC33926
/* The RoboGaia encoder shield */
//#define ROBOGAIA
/* Encoders directly attached to Arduino board */
#define ARDUINO_ENC_COUNTER
/* L298 Motor driver*/
#define L298_MOTOR_DRIVER
#endif
//#define USE_SERVOS // Enable use of PWM servos as defined in servos.h
#undef USE_SERVOS // Disable use of PWM servos
因为ros_arduino_bridge的代码是适用于L298电机驱动板的,我们使用的是TB6612电机驱动板,所以需要将电机驱动程序修改成适用于TB6612的程序。首先打开motor_driver.h,修改代码
#ifdef L298_MOTOR_DRIVER
#define RIGHT_MOTOR_BACKWARD 11
#define LEFT_MOTOR_BACKWARD 9
#define RIGHT_MOTOR_FORWARD 12
#define LEFT_MOTOR_FORWARD 8
#define RIGHT_MOTOR_PWM 6
#define LEFT_MOTOR_PWM 5
#define STBY 10
#endif
打开motor_driver.ino,修改代码
#elif defined L298_MOTOR_DRIVER
void initMotorController() {
digitalWrite(STBY, HIGH);
}
void setMotorSpeed(int i, int spd) {
unsigned char reverse = 0;
if (spd < 0)
{
spd = -spd;
reverse = 1;
}
if (spd > 255)
spd = 255;
if (i == RIGHT) {
if (reverse == 0) {
digitalWrite(RIGHT_MOTOR_FORWARD, HIGH); digitalWrite(RIGHT_MOTOR_BACKWARD, LOW); analogWrite(RIGHT_MOTOR_PWM, spd); }
else if (reverse == 1) {
digitalWrite(RIGHT_MOTOR_BACKWARD, HIGH); digitalWrite(RIGHT_MOTOR_FORWARD, LOW); analogWrite(RIGHT_MOTOR_PWM, spd); }
}
else /*if (i == RIGHT) //no need for condition*/ {
if (reverse == 0) {
digitalWrite(LEFT_MOTOR_FORWARD, HIGH); digitalWrite(LEFT_MOTOR_BACKWARD, LOW); analogWrite(LEFT_MOTOR_PWM, spd); }
else if (reverse == 1) {
digitalWrite(LEFT_MOTOR_BACKWARD, HIGH); digitalWrite(LEFT_MOTOR_FORWARD, LOW); analogWrite(LEFT_MOTOR_PWM, spd); }
}
}
查看已经修改好的motor_driver.h,以及encoder_driver.h,按照程序定义的引脚进行连线
连好线后,最好用万用表测一下电路是否存在短路,短路的情况,如果电路没问题,可将程序烧录到arduino nano中
最终结果
纸糊的自主导航小车