舵机转向小车-红外遥控版本2.0

准备工作:
材料:
序号 | 元器件名称 | 规格型号 | 数量 |
1 | Arduino Uno主控板 | 标准版 | 1 |
2 | L298N电机驱动模块 | 直流电机驱动 | 1 |
3 | MG995舵机 | 180°大扭力 | 1 |
4 | HX1838红外接收模块 | 万能红外接收 | 1 |
5 | 红外遥控器 | 普通家电遥控器 | 1 |
6 | 直流减速电机+车轮 | 小车专用 | 2 |
7 | 小车车架 | 两驱小车车架 | 1 |
8 | 杜邦线 | 公对母、公对公 | 若干 |
9 | 外部6V电源/电池盒 | 5V/2A | 1 |
硬件引脚接线定义





1. 红外接收模块(HX1838)
- VCC → Arduino 5V
- GND → Arduino GND
- OUT → Arduino D11
2. 转向舵机(MG995)
- 红线 → 外部5V正极
- 棕线 → 公共GND
- 橙线(信号线)→ Arduino D3
3. L298N电机驱动模块
- ENA → D5
- IN1 → D6
- IN2 → D7
- ENB → D9
- IN3 → D10
- IN4 → D12
- L298N外接电源:12V电池/5V电源供电,GND与Arduino共地
接线注意事项

- 严禁引脚冲突:D11引脚固定分配给红外接收器
- 必须共地:舵机、电机驱动、Arduino所有设备的GND必须连接在一起,否则信号紊乱、舵机抖动、电机乱转。
- 禁止板载供电:MG995舵机和电机工作电流大,Arduino Uno板载5V电流不足以负载,必须外部独立供电,解决抖动、死机问题。
- 接线顺序规范:先接GND地线,再接电源线,最后接信号线;避免带电插拔杜邦线,防止烧毁芯片。
- 舵机限位保护:程序内置45°~135°角度限位,接线安装时禁止机械硬掰舵机,防止齿轮损坏。
- 电机接线区分正反转:若前进后退反向,直接调换电机两根接线即可,无需修改程序。
程序

软件环境配置
打开Arduino IDE,选择开发板为 Arduino Uno,选择对应COM端口;安装依赖库:Servo库、IRremote 4.7.1版本红外库,等待库安装完成无报错。
粘贴最终优化版程序,点击上传;上传成功后小车自动初始化,舵机自动归中90°中位,待机等待红外指令。
功能调试
打开串口监视器,查看红外按键码:
- 按键0x45:舵机快速左转
- 按键0x46:舵机快速右转
- 按键0x44:小车全速前进
- 按键0x40:小车全速后退
调试无误后,固定所有线材,整理走线,完成整体制作。
完整程序:
/*
Arduino Uno 红外遥控小车
IRremote 4.x 适配版本
红外接收信号脚 D11
按键定义:
0X45 → 舵机左转
0X46 → 舵机右转
0X44 → 小车全速前进
0X40 → 小车全速后退
松开按键电机停止
*/
#include <Servo.h>
#include <IRremote.hpp> //4.x新版头文件
/************************** 引脚定义 **************************/
const int irRecvPin = 11; //红外接收器信号引脚
// L298N电机驱动
const int ENA = 5;
const int IN1 = 6;
const int IN2 = 7;
const int ENB = 9;
const int IN3 = 10;
const int IN4 = 12; //D11分配给红外,IN4接到D12
const int servoPin = 3; //转向舵机
/************************** 全局变量 **************************/
Servo steeringServo;
const int servoMin = 45;
const int servoMid = 90;
const int servoMax = 135;
int servoAngle = servoMid;
const int servoStep = 6; //原值3,翻倍,舵机响应加快2倍
const int FULL_SPEED = 255; //电机直接全速
int motorSpeed = 0;
/************************** 初始化 **************************/
void setup() {
Serial.begin(9600);
//L298N引脚初始化
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
//舵机初始化
steeringServo.attach(servoPin);
steeringServo.write(servoMid);
delay(500);
//启动红外接收
IrReceiver.begin(irRecvPin, DISABLE_LED_FEEDBACK);
Serial.println("红外遥控小车初始化完成!");
Serial.println("按键:0x45左转舵机 0x46右转舵机 0x44前进 0x40后退");
}
/************************** 主循环 **************************/
void loop() {
bool keyPressed = false;
if (IrReceiver.decode()) {
uint8_t cmd = IrReceiver.decodedIRData.command;
Serial.print("收到按键命令: 0x");
Serial.println(cmd, HEX);
keyPressed = true;
switch (cmd) {
case 0x45: //舵机左转
servoAngle -= servoStep;
break;
case 0x46: //舵机右转
servoAngle += servoStep;
break;
case 0x44: //全速前进
motorSpeed = FULL_SPEED;
setMotorDir(1);
break;
case 0x40: //全速后退
motorSpeed = FULL_SPEED;
setMotorDir(0);
break;
default:
break;
}
IrReceiver.resume(); //准备接收下一条红外信号
}
//无按键按下,电机停止
if (!keyPressed) {
motorSpeed = 0;
setMotorDir(2);
}
//限制舵机角度范围,防止机械堵转
servoAngle = constrain(servoAngle, servoMin, servoMax);
steeringServo.write(servoAngle);
//输出电机速度
analogWrite(ENA, motorSpeed);
analogWrite(ENB, motorSpeed);
delay(30);
}
/************************** 电机控制函数 **************************/
//dir:1前进,0后退,2停止
void setMotorDir(int dir) {
switch (dir) {
case 1: //前进
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 0: //后退
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
case 2: //停止
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
}
}
调试完成




0
0
0
qq空间
微博
复制链接
分享
0