开发板连接方式如下图:
马达 | 马达驱动板 |
---|---|
马达1(右轮)接近地面引脚 | OUT1 |
马达1(右轮)接近底板引脚 | OUT2 |
马达2(左轮)接近地面引脚 | OUT3 |
马达2(左轮)接近底板引脚 | OUT4 |
马达驱动板 | Arduino开发板 |
---|---|
IN1 | 4 |
IN2 | 5 |
IN3 | 6 |
IN4 | 7 |
马达驱动板 | 外接电源 |
---|---|
VCC | 电源正极 |
GND | 电源负极和Arduino GND |
5V | Arduino Vin引脚 |
JoyStick手柄 | Arduino开发板 |
---|---|
INX | D2 |
INY | D3 |
VCC | 5V |
GND | GND |
小车组装效果图如下:
上部:
底部:
对应代码如下:
//使用L298N驱动板
// IN1连接引脚4
// IN2连接引脚5
// IN3连接引脚6
// IN4连接引脚7
int IN1=4;
int IN2=5;
int IN3=6;
int IN4=7;
//连接PS2摇杆
// INX连接引脚2
// INX连接引脚3
int INX = 2;
int INY = 3;
const int WHEEL_MOVE_IDEL = 0;
const int WHEEL_MOVE_FORWARD = 1;
const int WHEEL_MOVE_BACKWARD = 2;
void setup() {
//初始化电机不动
pinMode(IN1, OUTPUT);
digitalWrite(IN1, HIGH);
pinMode(IN2, OUTPUT);
digitalWrite(IN2, HIGH);
pinMode(IN3, OUTPUT);
digitalWrite(IN3, HIGH);
pinMode(IN4, OUTPUT);
digitalWrite(IN4, HIGH);
}
void loop() {
//读取摇杆输入信息
int v = analogRead(INX);
int h = analogRead(INY);
bool shouldMove = false;
bool shouldTurn = false;
//左右运动优先判定
if(h<300) {
//向右转
Serial.println("turn right");
turnRight();
shouldTurn = true;
return;
}
else if(h>800) {
//向左转
Serial.println("turn left");
turnLeft();
shouldTurn = true;
return;
} else {
shouldTurn = false;
}
if(v<300) {
//向前运动
goForward();
shouldMove = true;
Serial.println("forward");
return;
}
else if(v>800) {
//向后运动
goBackward();
shouldMove = true;
Serial.println("backward");
return;
} else {
shouldMove = false;
}
if(!shouldTurn && !shouldMove){
//没有按摇杆,停止运动
keepIdle();
}
}
void keepIdle() {
rightMove(WHEEL_MOVE_IDEL);
leftMove(WHEEL_MOVE_IDEL);
}
void goForward() {
rightMove(WHEEL_MOVE_FORWARD);
leftMove(WHEEL_MOVE_FORWARD);
}
void goBackward() {
rightMove(WHEEL_MOVE_BACKWARD);
leftMove(WHEEL_MOVE_BACKWARD);
}
void turnLeft(){
rightMove(WHEEL_MOVE_FORWARD);
leftMove(WHEEL_MOVE_IDEL);
}
void turnRight(){
rightMove(WHEEL_MOVE_IDEL);
leftMove(WHEEL_MOVE_FORWARD);
}
void rightMove(int state) {
switch(state){
case WHEEL_MOVE_FORWARD:
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
break;
case WHEEL_MOVE_BACKWARD:
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
break;
case WHEEL_MOVE_IDEL:
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
break;
}
}
void leftMove(int state) {
switch(state){
case WHEEL_MOVE_FORWARD:
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
break;
case WHEEL_MOVE_BACKWARD:
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
break;
case WHEEL_MOVE_IDEL:
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
break;
}
}